我想看看培训期间的学习率如何变化(打印出来或创建摘要并在张量板上可视化)。
这是到目前为止的代码片段:
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)
Run Code Online (Sandbox Code Playgroud)
如果我运行代码,我会不断获得初始学习率(1e-3),即看不到任何变化。
如何获得每一步的学习率的正确方法是什么?
我想补充一点,这个问题确实与我的相似。但是,由于我没有足够的代表,因此无法在评论部分中发布我的发现。
我问自己同样的问题,并想知道为什么它不会改变。通过查看原始论文(第 2 页),我们发现算法需要self._lr步长(alpha论文中设计的),但从未更新过。我们还看到,每个步骤都有一个alpha_t更新t,并且应该与该self._lr_t属性相对应。但事实上,正如您所观察到的,在训练期间的任何时刻评估张量的值self._lr_t总是返回初始值,即_lr。
因此,据我了解,您的问题是如何获取alpha_tTensorFlow 的 AdamOptimizer,如本文第 2 节和相应的TF v1.2 API 页面中所述:
alpha_t = alpha * sqrt(1-beta_2_t) / (1-beta_1_t)
正如您所观察到的,_lr_t张量不会在整个训练过程中发生变化,这可能会导致优化器不适应的错误结论(这可以通过切换到具有相同的香草 来轻松测试)。事实上,其他值确实会发生变化:快速查看优化器会显示以下键:。GradientDescentOptimizeralpha__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更新。
进一步检查优化器的代码,在第 211 行,我们看到以下更新:
update_beta1 = self._beta1_power.assign(
self._beta1_power * self._beta1_t,
use_locking=self._use_locking)
Run Code Online (Sandbox Code Playgroud)
这基本上意味着_beta1_power用初始化的_beta1,在每次迭代后都会乘以_beta_1_t,同样用 初始化beta_1_t。
但令人困惑的部分是:_beta1_t和_beta2_t永远不会更新,因此它们在整个训练过程中有效地保持初始值 (_beta1和),以与和_beta2类似的方式与论文的符号相矛盾。我想这是有原因的,但我个人不知道为什么,无论如何,这是实现的受保护/私有属性(因为它们以下划线开头)并且不属于公共接口(它们甚至可能会改变) TF 版本之间)。_lrlr_t
因此,在这个小背景之后,我们可以看到_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)
Run Code Online (Sandbox Code Playgroud)
该变量at保存alpha_t当前训练步骤的 。
我找不到一种仅通过使用优化器界面来获取此值的更干净的方法,但请告诉我它是否存在!我想没有,这实际上使绘图的有用性受到质疑alpha_t,因为它不依赖于数据。
此外,为了完善这些信息,本文的第 2 节还给出了权重更新的公式,该公式更能说明问题,但也更情节密集。对于一个非常漂亮且美观的实现,您可能想看看您链接的帖子中的这个很好的答案。
希望能帮助到你!干杯,
安德烈斯
| 归档时间: |
|
| 查看次数: |
3072 次 |
| 最近记录: |