我对 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基本相同,我唯一要做的就是改变超参数 momentum
和 decay
以匹配 beta1
和 beta2
分别。对吗?
最佳答案
我觉得文档很清楚,我把算法伪代码贴在这里:
您的参数:
learning_rate
:在 1e-4 和 1e-2 之间是标准的beta1
:默认为 0.9beta2
:默认为 0.999epsilon
:默认为 1e-08The 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_t
和 v_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_t
与 learning_rate
有点不同,因为对于早期迭代,移动平均数还没有收敛,所以我们必须通过乘以 sqrt( 1 - beta2^t)/(1 - beta1^t)
。当t
很高时(t > 1./(1.-beta2)
),lr_t
几乎等于learning_rate
要回答你的问题,你只需要传递一个固定学习率,保持beta1
和beta2
默认值,也许修改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/