python - Tensorflow:关于 adam 优化器的困惑

标签 python tensorflow

我对 adam 优化器在 tensorflow 中的实际工作方式感到困惑。

我阅读 docs 的方式,它表示每次梯度下降迭代都会改变学习率。

但是当我调用函数时,我给它一个学习率。而且我不会调用该函数来让我们说,做一个时代(隐式调用 # 迭代以便完成我的数据训练)。我为每个批处理显式调用函数,如

for epoch in epochs
     for batch in data
          sess.run(train_adam_step, feed_dict={eta:1e-3})

所以我的预计到达时间不能改变。而且我没有传递时间变量。或者这是某种生成器类型的东西,在每次调用优化器时创建 session t 都会递增?

假设它是某种生成器类型的东西并且学习率正在无形中降低:我怎样才能在不降低学习率的情况下运行 adam 优化器?在我看来像RMSProp基本相同,我唯一要做的就是改变超参数 momentumdecay 以匹配 beta1beta2 分别。对吗?

最佳答案

我觉得文档很清楚,我把算法伪代码贴在这里:

您的参数:

  • learning_rate:在 1e-4 和 1e-2 之间是标准的
  • beta1:默认为 0.9
  • beta2:默认为 0.999
  • epsilon:默认为 1e-08

    The default value of 1e-8 for epsilon might not be a good default in general. For example, when training an Inception network on ImageNet a current good choice is 1.0 or 0.1.


初始化:

m_0 <- 0 (Initialize initial 1st moment vector)
v_0 <- 0 (Initialize initial 2nd moment vector)
t <- 0 (Initialize timestep)

m_tv_t 将为网络的每个参数跟踪梯度及其平方的移动平均值。 (所以如果你有 1M 个参数,Adam 会在内存中多保留 2M 个参数)


在每次迭代 t 时,对于模型的每个参数:

t <- t + 1
lr_t <- learning_rate * sqrt(1 - beta2^t) / (1 - beta1^t)

m_t <- beta1 * m_{t-1} + (1 - beta1) * gradient
v_t <- beta2 * v_{t-1} + (1 - beta2) * gradient ** 2
variable <- variable - lr_t * m_t / (sqrt(v_t) + epsilon)

这里的 lr_tlearning_rate 有点不同,因为对于早期迭代,移动平均数还没有收敛,所以我们必须通过乘以 sqrt( 1 - beta2^t)/(1 - beta1^t)。当t 很高时(t > 1./(1.-beta2)),lr_t 几乎等于learning_rate


要回答你的问题,你只需要传递一个固定学习率,保持beta1beta2默认值,也许修改epsilon,Adam 会施展魔法 :)


与 RMSProp 链接

beta1=1 的 Adam 等价于 momentum=0 的 RMSProp。 Adam的参数beta2和RMSProp的参数decay相同。

但是,RMSProp 不保留梯度的移动平均值。但它可以保持动力,如 MomentumOptimizer。

rmsprop 的详细描述。

  • 保持梯度平方的移动(贴现)平均值
  • 将梯度除以这个平均值的根
  • (能保持势头)

伪代码如下:

v_t <- decay * v_{t-1} + (1-decay) * gradient ** 2
mom = momentum * mom{t-1} + learning_rate * gradient / sqrt(v_t + epsilon)
variable <- variable - mom

关于python - Tensorflow:关于 adam 优化器的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37842913/

相关文章:

python - 为什么神经网络在自己的训练数据上预测错误?

python - 如何加载放置在不同位置的 jar 文件和支持文件

python - 在 matplotlib 中保存 .imshow() 之后的子图

python - 是否可以使用正交投影用 matplotlib basemap 显示地球的 'back side'?

python - 在联接中轻松替换分隔符

python - 使用 Tensorflow 后端时,如何打印 Keras 的 SGD 优化器变体的中间状态

android - Tensorflow Android 应用训练模型

python - 这些模型是否等效?

tensorflow - 如何在 Tensorflow 中将变量重用设置回 False?

python - 使用神经网络进行函数逼近 - 损失 0