因此,由于我对Adam的了解有限(主要是通过这篇文章:https://towardsdatascience.com/adam-latest-trends-in-deep-learning-optimization-6be9a291375c),我发现Adam优化器为网络中每个参数计算单独的学习率。
但是在Keras文档(https://keras.io/optimizers/)中,Adam优化器采用了学习率参数。
我的问题是,由Adam对象获取的学习率参数如何与这些计算出的学习率相关?据我所知,链接的帖子中没有涉及(或者是,但这超出了我的脑袋)。
答案 0 :(得分:1)
由于这是一个非常具体的问题,因此我不会讨论亚当的任何数学细节。我猜在这篇文章中,行可以计算出不同参数的单独学习率,让您脱颖而出。
这是https://arxiv.org/pdf/1412.6980.pdf论文中提出的实际亚当算法的屏幕截图
亚当保持过去梯度的指数衰减平均值,因此它的行为就像带有摩擦的沉重的球一样,有助于更快地收敛和稳定。
但是,如果您研究算法,则有一个 alpha (步长),这是我们提供的学习率= 0.001的keras等效值。因此,该算法需要一个步长来更新参数(简单来说,这是权重更新的缩放因子)。至于学习率的变化(或更新),您可以看到最后一个方程式(它使用 m_t 和 v_t ,它们在循环中更新),但 alpha 在整个算法中保持不变。这是我们必须提供的keras学习率。
因为,alpha保持不变,所以有时我们必须使用学习率调度,实际上是在几个时期之后我们实际上降低了学习率。还有其他一些变化,我们先提高学习率,然后降低。
答案 1 :(得分:1)
只是想添加此内容,以防一维中的实现/示例阐明任何内容:
import numpy as np
import matplotlib.pyplot as plt
from math import sqrt
eps = 1e-6
delta = 1e-6
MAX_ITER = 100000
def f(x):
return (np.square(x) / 10) - 2*np.sin(x)
def df(x):
return (f(x) - f(x - delta))/delta
def main():
x_0 = -13 # initial position
a = 0.1 # step size / learning rate
x_k = x_0
B_1 = 0.99 # first decay rate
B_2 = 0.999 # second decay rate
i = 0
m_k = df(x_k)
d_k = df(x_k)**2
while True:
# update moment estimates and parameters
m_k = B_1 * m_k + (1 - B_1) * df(x_k)
d_k = B_2 * d_k + (1 - B_2) * (df(x_k)**2)
x_k = x_k - a * m_k / sqrt(d_k + eps)
# termination criterion
if abs(df(x_k)/df(x_0)) <= eps:
break
if i > MAX_ITER:
break
i = i+1