gpt4 book ai didi

tensorflow - TensorFlow 中 AdamOptimizer 的学习率不会改变

转载 作者:行者123 更新时间:2023-12-04 20:34:13 24 4
gpt4 key购买 nike

我想看看学习率在训练期间是如何变化的(打印出来或创建一个摘要并在 tensorboard 中可视化)。

这是我到目前为止的代码片段:

optimizer = tf.train.AdamOptimizer(1e-3)
grads_and_vars = optimizer.compute_gradients(loss)
train_op = optimizer.apply_gradients(grads_and_vars, global_step=global_step)

sess.run(tf.initialize_all_variables())

for i in range(0, 10000):
sess.run(train_op)
print sess.run(optimizer._lr_t)

如果我运行代码,我会不断获得初始学习率(1e-3),即我看不到任何变化。

在每一步获得学习率的正确方法是什么?

我想补充一下 this question真的和我的很像。但是,由于我没有足够的代表,我无法在评论部分发布我的发现。

最佳答案

我问自己同样的问题,想知道为什么它不会改变。通过查看 original paper (第 2 页),可以看到 self._lr算法需要stepsize(在论文中使用alpha 设计),但从未更新。我们还看到有一个 alpha_tt 更新一次步骤,并且应该对应于 self._lr_t属性。但事实上,正如你所观察到的,评估 self._lr_t 的值训练过程中任何点的张量总是返回初始值,即 _lr .

因此,据我了解,您的问题是 如何获得 alpha_t对于 TensorFlow 的 AdamOptimizer,如论文第 2 节和相应的 TF v1.2 API page 中所述 :

alpha_t = alpha * sqrt(1-beta_2_t) / (1-beta_1_t)



背景

正如您所观察到的, _lr_t张量在训练过程中没有改变,这可能会导致优化器不适应的错误结论(这可以通过切换到具有相同 GradientDescentOptimizer 的原版 alpha 轻松测试)。而且,事实上,其他值确实发生了变化:快速查看优化器的 __dict__显示以下键: ['_epsilon_t', '_lr', '_beta1_t', '_lr_t', '_beta1', '_beta1_power', '_beta2', '_updated_lr', '_name', '_use_locking', '_beta2_t', '_beta2_power', '_epsilon', '_slots'] .

通过培训检查他们,我注意到 仅限 _beta1_power , _beta2_power_slots获取更新 .

进一步检查 the optimizer's code ,在第 211 行,我们看到以下更新:
update_beta1 = self._beta1_power.assign(
self._beta1_power * self._beta1_t,
use_locking=self._use_locking)

这基本上意味着 _beta1_power ,即 initialized with _beta1 , 将乘以 _beta_1_t每次迭代后, is also initialized with beta_1_t .

但令人困惑的部分来了: _beta1_t_beta2_t永远不会更新 ,因此它们在整个训练过程中有效地保持了初始值( _beta1_beta2),以与 _lr 类似的方式与论文的符号相矛盾。和 lr_t做。我想这是有原因的,但我个人不知道为什么,无论如何这是实现的 protected /私有(private)属性(因为它们以下划线开头)并且不属于公共(public)接口(interface)(它们甚至可能会改变在 TF 版本中)。

所以在这个小背景之后,我们可以看到 _beta_1_power_beta_2_power是对当前训练步骤求幂的原始 beta 值,即与 beta_t 所指的变量等价。在论文中。回到 alpha_t 的定义在本文的第 2 节中,我们看到,有了这些信息,实现起来应该非常简单:

解决方案
optimizer = tf.train.AdamOptimizer()
# rest of the graph...

# ... somewhere in your session
# note that a0 comes from a scalar, whereas bb1 and bb2 come from tensors and thus have to be evaluated
a0, bb1, bb2 = optimizer._lr, optimizer._beta1_power.eval(), optimizer._beta2_power.eval()
at = a0* (1-bb2)**0.5 /(1-bb1)
print(at)

变量 at持有 alpha_t对于当前的训练步骤。

免责声明

仅使用优化器的界面,我找不到一种更简洁的方法来获取此值,但如果它存在,请告诉我!我想没有,这实际上质疑了绘制 alpha_t 的有用性, 自 它不依赖于数据 .

此外,为了完成这些信息,论文的第 2 部分还给出了权重更新的公式,这更能说明问题,但情节也更密集。对于一个非常漂亮和好看的实现,你可能想看看 this nice answer从您链接的帖子中。

希望能帮助到你!干杯,
安德烈斯

关于tensorflow - TensorFlow 中 AdamOptimizer 的学习率不会改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38882593/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com