我们如何获得 Adam [Tensorflow] 的有效学习率?

How do we have access to the effective learning rate of Adam [Tensorflow]?

我对 Adam 的有效学习率很感兴趣。我们知道 Adam 大致是由 initial/constant 学习率除以损失的过去梯度之和形成的(详见 here)。问题的关键是它有一个适应性的贡献,它作用于一个恒定的初始学习率。

从优化器定义开始:

my_optimizer = tf.keras.optimizers.Adam(initial_learning_rate, beta_1 = my_beta_1, beta_2 = my_beta_2)

使用以下几行我们可以轻松打印 Adam 学习率的常数部分。

或者我们可以通过以下方式修改学习率值:

keras.backend.set_value(my_optimizer.lr, my_new_learning_rate) 

这些表达式适用于固定学习率优化器,如随机梯度下降。

in which 使用Adam的定义直接计算学习率的值。我一直在寻找一种更简单的方法,就像上面提到的表达式一样,因为, 正如我在问题标题中所说,我想要 printmodify 有效学习率。

我的问题是:让您获得 Adam 有效学习率值的张量流函数是什么?

打印是因为我想监控,修改是因为我想对其变体添加约束,因为 Adam 有时会不稳定(因为它是自适应的)。

在当前的实现中似乎不可能。

看到了,tf.keras.optimizers.Adam is implemented using OptimizerV2 interface, with the main computation apparently happening in the _resource_apply_dense and _resource_apply_sparse functions. The first function relies on C++ implementations such as ResourceApplyAdam::Compile,第二个是用Tensorflow写的。至关重要的是,这两个函数都计算有效学习率并执行梯度步骤,因此没有地方可以改变 return 值。

例如,查看密集变量的 C++ 实现:

xla::XlaOp alpha = lr * xla::Sqrt(one - beta2_power) / (one - beta1_power);
auto m_t = m + (grad - m) * (one - beta1);
v = v + (xla::Square(grad) - v) * (one - beta2);
if (use_nesterov_) {
  var = var - alpha * (m_t * beta1 + (one - beta1) * grad) /
                  (xla::Sqrt(v) + epsilon);
} else {
  var = var - m_t * alpha / (xla::Sqrt(v) + epsilon);
}

任何地方都没有“计算有效学习率”函数调用,它甚至没有存储在任何变量中。

因此,您最好的选择是重新实现优化器(可能通过分叉原始代码),并自行添加您感兴趣的功能。