Tensorflow:关于Adam优化器的困惑

发布于 2021-01-29 15:18:41

关于亚当优化器实际上如何在张量流中工作,我感到困惑。

我阅读文档的方式说,学习率在每次梯度下降迭代中都会改变。

但是当我调用该函数时,会给它一个学习率。而且我不调用该函数来说一个历元(隐式调用#迭代以便进行数据训练)。我为每个批次明确调用函数

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

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

假设这是某种发电机类型的东西,并且学习率无形中降低了:我如何才能在不降低学习率的情况下运行亚当优化器?在我看来,像RMSProp基本上是相同的,我必须做的唯一的事情,以使其等于(学习率无视)是改变超参数momentumdecay匹配beta1,并beta2分别。那是对的吗?

关注者
0
被浏览
157
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    我发现文档非常清楚,我将算法伪代码粘贴到此处:

    您的参数

    • 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_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


    要回答你的问题,你只需要通过一个 固定的学习速度 ,保持beta1beta2默认值,可能修改epsilon,而亚当也将这样做魔术:)


    与RMSProp链接

    Adam与beta1=1等同于RMSProp与momentum=0。这个论点beta2亚当和参数decayRMSProp的是相同的。

    但是,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
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看