Bootstrap

AI学习指南深度学习篇-带动量的随机梯度下降法的数学原理

AI学习指南深度学习篇 - 带动量的随机梯度下降法的数学原理

在深度学习的优化过程中,随机梯度下降法(SGD)是最常用的一种算法。然而,直接使用SGD可能会面临收敛速度慢、震荡等问题。为了解决这些问题,带动量的随机梯度下降法(Momentum SGD)应运而生。本文将深入探讨动量法的数学原理,包括动量项的计算和作用,以及它如何影响梯度更新的方向和速度,从而避免震荡。

1. 引言

在机器学习和深度学习中,优化算法用于更新模型参数以最小化损失函数。其中,随机梯度下降法因其简单和高效,成为了很受欢迎的选择。然而,单纯的SGD在处理高维数据时,易受复杂的损失景观影响,导致收敛缓慢或震荡。动量法利用物理学中动量的概念,通过引入历史梯度信息,来加速SGD的收敛速度并减少震荡。

在深入讨论动量法之前,让我们首先回顾一下标准的随机梯度下降法的基本原理。

2. 随机梯度下降法(SGD)

随机梯度下降法的更新规则如下:

θ t + 1 = θ t − η ∇ J ( θ t ; x ( i ) , y ( i ) ) \theta_{t+1} = \theta_t - \eta \nabla J(\theta_t; x^{(i)}, y^{(i)}) θt+1=θtηJ(θt;x(i),y(i))

其中:

  • θ \theta θ 表示模型参数
  • η \eta η 表示学习率
  • J ( θ ; x ( i ) , y ( i ) ) J(\theta; x^{(i)}, y^{(i)}) J(θ;x(i),y(i)) 表示损失函数
  • x ( i ) , y ( i ) x^{(i)}, y^{(i)} x(i),y(i) 是训练数据中的一个样本

由于SGD使用的是单个样本的梯度,这可以导致更新的方向出现较大的波动,特别是在非凸损失函数中。这种波动可能会导致参数的更新陷入某些区域,从而无法快速收敛。

3. 动量法的引入

动量法引入一个动量项,根据历史梯度来加权计算梯度更新。动量的更新规则如下:

  1. 首先更新动量:

v t + 1 = β v t + ( 1 − β ) ∇ J ( θ t ; x ( i ) , y ( i ) ) v_{t+1} = \beta v_t + (1 - \beta) \nabla J(\theta_t; x^{(i)}, y^{(i)}) vt+1=βvt+(1β)J(θt;x(i),y(i))

  1. 然后使用动量更新参数:

θ t + 1 = θ t − η v t + 1 \theta_{t+1} = \theta_t - \eta v_{t+1} θt+1=θtηvt+1

其中 β \beta β 是动量的衰减率,通常取值范围在 ( 0 , 1 ) (0, 1) (0,1) 之间。

3.1 动量项的计算

动量项 v v v 是一个与梯度有关的累积量。在每次更新中,它会结合当前的梯度和上一次更新时的动量,形成新的动量。这种方式可以帮助我们在更新过程中,保持一定的方向性,并加速收敛。

动量的计算过程实际上是一种指数衰减平均,具有以下特性:

  • 如果当前梯度同方向,动量将增大,使得更新更大;
  • 如果当前梯度与之前的梯度相反,动量会逐渐减小,反映出“惯性”的特性。

3.2 动量的影响

动量对梯度更新的方向和速度产生了显著影响:

  • 更新方向:动量会将历史的梯度信息纳入考虑,使得模型不会仅仅依赖于当前的梯度,特别是在面对噪声和局部极小值时,动量可凭借历史信息引导更新朝着全局最优的方向。
  • 更新速度:动量允许更大幅度的更新,从而加快收敛,尤其是在靠近局部极小值时,可以避免陷入平坦区域的震荡。

4. 数学推导

4.1 动量的数学性质

假设我们在某一个点 t t t,当前的参数为 θ t \theta_t θt。则动量可以被定义为:

v t = β v t − 1 + ( 1 − β ) g t v_{t} = \beta v_{t-1} + (1 - \beta) g_{t} vt=βvt1+(1β)gt

其中 g t = ∇ J ( θ t ) g_t = \nabla J(\theta_t) gt=J(θt) 是当前的梯度。每次迭代时,动量都会更新。这个公式隐含了历史梯度的影响,导致微分方程的解形式具有惯性。

我们可以将动量视为一个带有动力学属性的系统。若将其方程重新整理为:

d v d t = − η ∇ J ( θ ) \frac{dv}{dt} = -\eta \nabla J(\theta) dtdv=ηJ(θ)

动量的引入使系统在时间 t t t 的演化更加平滑,并有效避免了因梯度波动所导致的震荡。

4.2 相较于SGD的优势

和标准的SGD相比,动量法更能保持更新的稳定性和一致性。当面对局部极小值时,动量的引入能够使得参数在更新的过程中不至于停滞不前。例如,在深度网络训练过程中,若损失函数的局部极小值较多,SGD可能在某个极小值上来回震荡,而动量法则可能顺势绕开这些区域。

4.3 示例分析

为了具体演示动量的效果,我们可以考虑一个简单的二次函数作为损失函数:

J ( θ ) = 1 2 ( θ − 2 ) 2 J(\theta) = \frac{1}{2}(\theta - 2)^2 J(θ)=21(θ2)2

4.3.1 SGD的更新步骤

首先,让我们使用标准SGD来更新参数。假设我们初始设置 θ 0 = 0 \theta_0 = 0 θ0=0,学习率 η = 0.1 \eta = 0.1 η=0.1

  1. 迭代 t = 0 t=0 t=0:

    • 梯度: g 0 = ∇ J ( 0 ) = 0 − 2 = − 2 g_0 = \nabla J(0) = 0 - 2 = -2 g0=J(0)=02=2
    • 更新: θ 1 = 0 − 0.1 × ( − 2 ) = 0.2 \theta_1 = 0 - 0.1 \times (-2) = 0.2 θ1=00.1×(2)=0.2
  2. 迭代 t = 1 t=1 t=1:

    • 梯度: g 1 = ∇ J ( 0.2 ) = 0.2 − 2 = − 1.8 g_1 = \nabla J(0.2) = 0.2 - 2 = -1.8 g1=J(0.2)=0.22=1.8
    • 更新: θ 2 = 0.2 − 0.1 × ( − 1.8 ) = 0.38 \theta_2 = 0.2 - 0.1 \times (-1.8) = 0.38 θ2=0.20.1×(1.8)=0.38

经过多次迭代,SGD的更新会频繁地改变方向,可能导致不稳定的收敛过程。

4.3.2 动量法的更新步骤

现在我们使用带动量的SGD优化上述损失函数。假设动量值初始为 v 0 = 0 v_0 = 0 v0=0,动量衰减率 β = 0.9 \beta = 0.9 β=0.9

  1. 迭代 t = 0 t=0 t=0:

    • 梯度: g 0 = ∇ J ( 0 ) = − 2 g_0 = \nabla J(0) = -2 g0=J(0)=2
    • 动量: v 1 = 0.9 × 0 + 0.1 × ( − 2 ) = − 0.2 v_1 = 0.9 \times 0 + 0.1 \times (-2) = -0.2 v1=0.9×0+0.1×(2)=0.2
    • 更新: θ 1 = 0 − 0.1 × ( − 0.2 ) = 0.02 \theta_1 = 0 - 0.1 \times (-0.2) = 0.02 θ1=00.1×(0.2)=0.02
  2. 迭代 t = 1 t=1 t=1:

    • 梯度: g 1 = ∇ J ( 0.02 ) = − 1.98 g_1 = \nabla J(0.02) = -1.98 g1=J(0.02)=1.98
    • 动量: v 2 = 0.9 × ( − 0.2 ) + 0.1 × ( − 1.98 ) = − 0.418 v_2 = 0.9 \times (-0.2) + 0.1 \times (-1.98) = -0.418 v2=0.9×(0.2)+0.1×(1.98)=0.418
    • 更新: θ 2 = 0.02 − 0.1 × ( − 0.418 ) = 0.0618 \theta_2 = 0.02 - 0.1 \times (-0.418) = 0.0618 θ2=0.020.1×(0.418)=0.0618

在这种情况下,动量法能更平滑地走向极小值,避免SGD在梯度变化大的时候造成的剧烈震荡。

5. 实践中的动量法

在实际应用中,动量法已经被广泛使用于深度学习框架中,例如 TensorFlow 和 PyTorch。动量法也可扩展为 Nesterov 动量法,它在计算梯度时使用了预估的动量位置,以进一步提高收敛速度。

5.1 Nesterov 动量法

Nesterov 动量法在传统动量法的基础上,引入了一个前向的定义,先计算预估的更新,然后再利用这个预估值来计算梯度:

θ t " = θ t + β v t \theta_{t}^{"} = \theta_t + \beta v_t θt"=θt+βvt

然后通过预估的参数计算梯度:

g t = ∇ J ( θ t " ) g_t = \nabla J(\theta^{"}_t) gt=J(θt")

接下来,更新动量和参数:

v t + 1 = β v t + ( 1 − β ) g t θ t + 1 = θ t − η v t + 1 v_{t+1} = \beta v_t + (1 - \beta) g_t \\ \theta_{t+1} = \theta_t - \eta v_{t+1} vt+1=βvt+(1β)gtθt+1=θtηvt+1

这种方法可在保持动量带来的收敛优势的同时,进一步提升优化过程的有效性。

5.2 超参数调整

对于实际应用中的超参数选择,动量的衰减率 β \beta β 通常设置在 0.9 0.9 0.9 0.99 0.99 0.99。学习率 η \eta η 的选择也至关重要,一般来说,应通过交叉验证等方法来选择合适的学习率,避免模型不收敛或过早收敛。

6. 小结与展望

动量法是随机梯度下降法的一种有效扩展,它通过引入历史梯度的影响,在优化过程中提供了更加平滑与加速的更新过程。动量法有效减少了SGD的震荡现象,并在深度学习等应用中广泛使用。

未来,随着深度学习研究的深入,动量法及其变种仍将继续发展,将会有更多新的优化算法被提出,以满足日益增长的复杂模型训练需求。

;