ainatipen 发表于 2022-11-5 08:35

Adam,一个学习率自适应的优化算法

许多科学和工程领域的问题,都可以转化为一些标量参数化目标函数的优化问题,即针对某些参数的目标函数最大化或最小化问题。如果目标函数的参数是可微的,梯度下降法就是一种相对有效的优化方法。在机器学习中,目标函数经常是随机的,即目标函数由不同数据样本上计算的子函数的总和组成,在这种情况下,可以通过对单个子函数执行梯度下降,即随机梯度下降(SGD),来有效地优化问题。
Adam,是一种基于一阶梯度的随机优化方法,它的名字来自于adaptive moment estimation(自适应矩估计),该方法使用梯度的一阶和二阶矩估计值来调整神经网络不同参数的学习率。使用Adam的好处是,参数更新的幅度对梯度的缩放具有不变性,其步长近似地受到步长超参数约束,而不是完全与步长超参数相等。
<hr/>Moment(矩)
随机变量的n阶矩,就是该变量 n 次幂的期望:
m_n=E \tag{1}
随机变量的一阶矩就是期望,二阶矩是无中心方差,即计算过程不减去均值。
Adam 过程推导

机器学习中,目标函数的梯度可以视作随机变量,因为它通常是在数据的一个随机的mini-batch上计算得到的。 Adam首先要计算梯度的一阶矩和二阶矩,但是它使用的是梯度的移动平均值,即: m_t=\beta_1m_{t-1}+(1-\beta_1)g_t \\ v_t=\beta_2v_{t-1}+(1-\beta_2)g_t^2 \tag{2}其中m和 v 都是移动平均值,它们的初始值都是零, g是当前mini-batch的梯度, \beta_1 和 \beta_2 是超参数。(一般会采用的默认值为 \beta_1=0.9 , \beta_2=0.999 ,这个默认值几乎不需要修改。)
理想状态下(即没有偏差),我们希望梯度移动平均值的期望就等于梯度的期望,即: E=E \\ E=E \tag{3}如果上面公式(3)成立,我们得到的 m_t 和 v_t 的矩估计就是无偏估计,然而由于我们使用的是移动平均值,初始的 m_0 和 v_0 都是零,公式(3)之间存在一个偏差,我们现在就以 m_t 为例来计算一下这个偏差,同理也可以计算 v_t 的偏差。
我们将m的计算式多写几项: m_0=0 \\ m_1=\beta_1m_0+(1-\beta_1)g_1=(1-\beta_1)g_1 \\ m_2=\beta_1m_1+(1-\beta_1)g_2=\beta_1(1-\beta_1)g_1+(1-\beta_1)g_2 \\ m_3=\beta_1m_2+(1-\beta_1)g_3=\beta_1(\beta_1(1-\beta_1)g_1+(1-\beta_1)g_2)+(1-\beta_1)g_3\\= \beta_1^2(1-\beta_1)g_1+\beta_1(1-\beta_1)g_2+(1-\beta_1)g_3 \tag{4}
重新写一下 m 的表达式: m_t=(1-\beta_1)\sum_{i=1}^{t}\beta_1^{t-i}g_i \tag{5}
求 m 的期望: E=E[(1-\beta_1)\sum_{i=1}^{t}\beta_1^{t-i}g_i] \\ =E[(1-\beta_1)\sum_{i=1}^{t}\beta_1^{t-i}(g_t-g_t+g_i)] \\ =E(1-\beta_1)\sum_{i=1}^{t}\beta_1^{t-i}+(1-\beta_1)E[\sum_{i=1}^{t}\beta_1^{t-i}(g_i-g_t)] \tag{6}我们将式(6)的后一项记作 \xi ,式(6)可以写作: E=E(1-\beta_1)\sum_{i=}^{t}\beta_1^{t-i}+\xi \tag{7}利用因式分解: a^n-b^n=(a-b)(a^{n-1}+a^{n-2}b+...+ab^{n-2}+b^{n-1}) 公式(7)可以写为: E=E(1-\beta_1^t)+\xi \tag{8}同理可得: E=E(1-\beta_2^t)+\xi \tag{9}当梯度保持稳定时,即 g_i-g_t=0 ,此时 \xi=0,若 g_i-g_t\ne0 ,因为 1-\beta 是一个很小的值,所以 \xi 近似为0。
然后我们对 m_t 和 v_t 进行修正: \hat{m}_t=\frac{m_t}{1-\beta_1^t} \tag{10} \hat{v}_t=\frac{v_t}{1-\beta_2^t} \tag{11}
接下来就是利用修正后的梯度移动平均值对模型参数进行更新: w_t = w_{t-1}-\eta\frac{\hat{m}_t}{\sqrt{\hat{v}_t}+\epsilon} \tag{12} 其中, w 是模型参数, \eta 是超参数学习率, \epsilon 是数值稳定项。
Adam 的Python实现

for t in range(num_iterations):
    g = compute_gradient(x, y)
    m = beta_1 * m + (1 - beta_1) * g
    v = beta_2 * v + (1 - beta_2) * np.power(g, 2)
    m_hat = m / (1 - np.power(beta_1, t))
    v_hat = v / (1 - np.power(beta_2, t))
    w = w - step_size * m_hat / (np.sqrt(v_hat) + epsilon)<hr/>参考文献

[*]Adam: A Method for Stochastic Optimization
[*]Adam — latest trends in deep learning optimization.
[*]Adam 中文博客
页: [1]
查看完整版本: Adam,一个学习率自适应的优化算法