我们如何获得 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 学习率的常数部分。
my_optimizer.learning_rate
my_optimizer.lr
keras.backend.get_value(my_optimizer.lr)
my_optimizer._decayed_lr(tf.float32)
或者我们可以通过以下方式修改学习率值:
keras.backend.set_value(my_optimizer.lr, my_new_learning_rate)
这些表达式适用于固定学习率优化器,如随机梯度下降。
有 in which 使用Adam的定义直接计算学习率的值。我一直在寻找一种更简单的方法,就像上面提到的表达式一样,因为,
正如我在问题标题中所说,我想要 print 和 modify 有效学习率。
我的问题是:让您获得 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);
}
任何地方都没有“计算有效学习率”函数调用,它甚至没有存储在任何变量中。
因此,您最好的选择是重新实现优化器(可能通过分叉原始代码),并自行添加您感兴趣的功能。
我对 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 学习率的常数部分。
my_optimizer.learning_rate
my_optimizer.lr
keras.backend.get_value(my_optimizer.lr)
my_optimizer._decayed_lr(tf.float32)
或者我们可以通过以下方式修改学习率值:
keras.backend.set_value(my_optimizer.lr, my_new_learning_rate)
这些表达式适用于固定学习率优化器,如随机梯度下降。
有
我的问题是:让您获得 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);
}
任何地方都没有“计算有效学习率”函数调用,它甚至没有存储在任何变量中。
因此,您最好的选择是重新实现优化器(可能通过分叉原始代码),并自行添加您感兴趣的功能。