Tensorflow:关于adam优化器的困惑

Nim*_*z14 15 python tensorflow

关于adam优化器如何在tensorflow中实际工作,我感到很困惑.

我阅读文档的方式是,每次梯度下降迭代都会改变学习速度.

但是当我调用该函数时,我给它一个学习率.我并没有把这个函数称为,做一个时代(隐式地调用#iterations以便进行我的数据训练).我明确地调用每个批次的函数

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

所以我的eta无法改变.而且我没有传入时间变量.或者这是某种生成器类型的东西,t每当我调用优化器时,会话创建会增加吗?

假设它是一些生成器类型的东西,并且学习率正在无形地降低:如何在不降低学习速率的情况下运行adam优化器?在我看来,像RMSProp基本上是相同的,我必须做的唯一的事情,以使其等于(学习率无视)是改变超参数momentumdecay匹配beta1,并beta2分别.那是对的吗?

Oli*_*rot 23

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

你的参数:

  • 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)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

这里lr_t有点不同,learning_rate因为对于早期迭代,移动平均线尚未收敛,因此我们必须通过乘以来进行归一化sqrt(1 - beta2^t) / (1 - beta1^t).什么时候t是高(t > 1./(1.-beta2)),lr_t几乎等于learning_rate


要回答你的问题,你只需要传递一个固定的学习率,保持beta1beta2默认值,也许修改epsilon,亚当将做魔术:)


与RMSProp联系

亚当与beta1=1RMSProp相当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
Run Code Online (Sandbox Code Playgroud)