【问题标题】:Tensorflow: Confusion regarding the adam optimizerTensorflow:关于亚当优化器的困惑
【发布时间】:2016-10-17 00:14:24
【问题描述】:

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

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

但是当我调用这个函数时,我会给它一个学习率。而且我不会调用该函数,比如说,做一个时代(隐式调用 # 迭代以完成我的数据训练)。我明确地为每个批次调用函数

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

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

假设它是某种生成器类型的东西并且学习率正在无形地降低:我怎样才能在不衰减学习率的情况下运行 adam 优化器?在我看来 RMSProp 基本上是一样的,我唯一要做的就是让它相等(忽略学习率)是改变超参数 momentumdecay 以匹配 beta1 和 @分别为 987654328@。对吗?

【问题讨论】:

    标签: python tensorflow


    【解决方案1】:

    我发现文档很清楚,我将这里的算法粘贴为伪代码:

    您的参数

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

      epsilon 的默认值 1e-8 通常可能不是一个好的默认值。例如,在 ImageNet 上训练 Inception 网络时,当前较好的选择是 1.0 或 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 &gt; 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
    

    【讨论】:

    • 我没有意识到学习率并没有衰减而是归一化。非常感谢。
    • 我明白了。是的,保持动量和保持梯度的移动平均值是有区别的。谢谢。
    • 我可能错了,但不是sqrt(1 - beta1^t) / (1 - beta2^t)
    • 这些值意味着如果gradient 在所有迭代中都保持不变,那么variable 的更新也是不变的。
    【解决方案2】:

    RMS_PROP 和 ADAM 都具有自适应学习率。

    基本的 RMS_PROP

    cache = decay_rate * cache + (1 - decay_rate) * dx**2
    x += - learning_rate * dx / (np.sqrt(cache) + eps)
    

    你可以看到原来这有两个参数decay_rate & eps

    然后我们可以添加动量使我们的梯度更稳定然后我们可以写

    cache = decay_rate * cache + (1 - decay_rate) * dx**2
    **m = beta1*m + (1-beta1)*dx**  [beta1 =momentum parameter in the doc ]
    x += - learning_rate * dx / (np.sqrt(cache) + eps)
    

    现在你可以在这里看到如果我们保持 beta1 = o 那么它就是没有动量的 rms_prop 。

    然后是ADAM基础

    cs-231 Andrej Karpathy最初是这样描述亚当的

    Adam 是最近提出的更新,看起来有点像 RMSProp 动力

    所以是的!那么这与具有动量的 rms_prop 有何不同呢?

    m = beta1*m + (1-beta1)*dx
    v = beta2*v + (1-beta2)*(dx**2)
    **x += - learning_rate * m / (np.sqrt(v) + eps)**
    

    他在更新方程中再次提到m,v更平滑

    因此,与 rms_prop 的区别在于更新噪音较小。

    是什么产生了这种噪音?

    在初始化过程中,我们将 m 和 v 初始化为零。

    m=v=0

    为了减少这种初始化效果,总是要进行一些热身。那么方程就像

    m = beta1*m + (1-beta1)*dx          beta1 -o.9 beta2-0.999
    **mt = m / (1-beta1**t)**
    v = beta2*v + (1-beta2)*(dx**2)
    **vt = v / (1-beta2**t)**
    x += - learning_rate * mt / (np.sqrt(vt) + eps)
    

    现在我们运行它几次迭代。明显注意粗线,你可以看到t在增加(迭代次数)之后发生在mt上,

    mt = m

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-09
      • 1970-01-01
      • 1970-01-01
      • 2017-03-28
      • 2018-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多