我对Adam优化器在TensorFlow中的实际工作方式感到困惑。
我读到的方式是,每次梯度下降迭代,学习率都会改变。
但是当我调用函数时,我会给它一个学习率。我不调用函数,比如说,做一个时代(隐式调用迭代,以便通过我的数据培训)。我为每个批显式调用函数,就像
for epoch in epochs
for batch in data
sess.run(train_adam_step, feed_dict={eta:1e-3})
所以我的预计到达时间不能改变。我不会传递时间变量。或者这是某种生成器类型的事情,在会话创建时,每次调用优化器时,
t
都是递增的吗?假设它是某种生成器类型的东西,并且学习速度正在被无形地降低:如何在不降低学习速度的情况下运行Adam优化器?在我看来,docs基本上是一样的,我唯一要做的就是改变超参数
momentum
和decay
来分别匹配beta1
和beta2
。对吗? 最佳答案
我发现文档相当清晰,我将在这里粘贴伪代码中的算法:
您的参数:
1e-4和1e-2之间是标准的。learning_rate
:0.9默认beta1
:默认为0.999
默认情况下为:1e-08
epsilon的缺省值1e-8一般来说可能不是一个好的缺省值。例如,在IMAGENET上培训初始网络时,当前的好选择是1.0或0.1。
初始化:
m_0 <- 0 (Initialize initial 1st moment vector)
v_0 <- 0 (Initialize initial 2nd moment vector)
t <- 0 (Initialize timestep)
对于网络的每个参数,
beta2
和epsilon
将跟踪梯度及其平方的移动平均值。(因此,如果您有1百万个参数,那么Adam将在内存中多保存2百万个参数)在每次迭代时,对于模型的每个参数:
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)
这里,
m_t
与v_t
有点不同,因为对于早期迭代,移动平均值尚未收敛,因此我们必须通过乘以t
来规范化。当lr_t
高(learning_rate
)时,sqrt(1 - beta2^t) / (1 - beta1^t)
几乎等于t
要回答你的问题,你只需要通过一个固定的学习率,保持
t > 1./(1.-beta2)
和lr_t
的默认值,也许可以修改learning_rate
,亚当会变魔术:)与rmsprop链接
Adam with
beta1
等于rmsprop withbeta2
。Adam的参数epsilon
与rmsprop的参数beta1=1
相同。然而,rmsprop并不能保持梯度的移动平均值。但它可以保持一种势头,就像妈妈的增效剂。
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/