【深度学习-基础知识】梯度下降算法(2分钟学会)

1. 什么是梯度

梯度(Gradient)是多元函数导数的一种推广形式,它描述了多变量函数在某一点处变化率最大的方向及其大小。梯度通常应用于标量场(即输出为单一数值的函数),并且是一个向量场,其中每个点的方向指向该点处函数值增加最快的方向,其长度表示这个最大增长率的值。

梯度的标准符号是希腊字母“nabla”,写作: ∇ \nabla 。对于一个定义在 R n \mathbb{R}^n Rn 上的标量函数 f ( x 1 , x 2 , . . . , x n ) f(x_1, x_2, ..., x_n) f(x1,x2,...,xn),其在某一点的梯度被记作:

∇ f = ( ∂ f ∂ x 1 , ∂ f ∂ x 2 , . . . , ∂ f ∂ x n ) \nabla f = \left( \frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, ..., \frac{\partial f}{\partial x_n} \right) f=(x1f,x2f,...,xnf)

这里, ∂ f ∂ x i \frac{\partial f}{\partial x_i} xif 表示函数 f f f 关于变量 x i x_i xi 的偏导数。因此,梯度本质上是由函数关于所有输入变量的偏导数组成的向量。

在不同的文献或教材中,梯度也可能会用 grad ( f ) \text{grad}(f) grad(f) 来表示,但 ∇ f \nabla f f 是最常用的表示方法。

2. 梯度下降算法的数学原理

  1. 梯度下降算法的目标:找到参数,使得目标函数值(损失函数)最小化;
  2. 目标函数小值在每个点梯度(斜率)的反方向;
  3. 迭代优化:每次从自身位置位置出发,往梯度的反方向移动,不断移动到达函数最小值。

2. 梯度下降算法基本步骤

步骤 1: 初始化参数

假设我们有一个简单的线性模型 y = w x + b y = wx + b y=wx+b,其中 w w w 是权重, b b b 是偏置项。首先,我们需要初始化这些参数,通常随机选择初始值。例如,设 w 0 = 0.5 w_0 = 0.5 w0=0.5 b 0 = 0 b_0 = 0 b0=0

步骤 2: 定义损失函数

为了评估模型的好坏,我们需要定义一个损失函数。对于线性回归问题,常用的损失函数是均方误差(MSE),定义为:
L ( w , b ) = 1 n ∑ i = 1 n ( y i − ( w x i + b ) ) 2 L(w, b) = \frac{1}{n} \sum_{i=1}^{n} \left( y_i - (wx_i + b) \right)^2 L(w,b)=n1i=1n(yi(wxi+b))2
这里, n n n 是样本数量, x i x_i xi y i y_i yi 分别是第 i i i 个样本的输入特征和真实值。

步骤 3: 计算梯度

计算损失函数关于每个参数的梯度,即求偏导数。对于我们的线性模型,需要计算 L L L 关于 w w w b b b 的偏导数:

  • 对于 w w w ∂ L ∂ w = − 2 n ∑ i = 1 n x i ( y i − ( w x i + b ) ) \frac{\partial L}{\partial w} = -\frac{2}{n} \sum_{i=1}^{n} x_i \left( y_i - (wx_i + b) \right) wL=n2i=1nxi(yi(wxi+b))
  • 对于 b b b ∂ L ∂ b = − 2 n ∑ i = 1 n ( y i − ( w x i + b ) ) \frac{\partial L}{\partial b} = -\frac{2}{n} \sum_{i=1}^{n} \left( y_i - (wx_i + b) \right) bL=n2i=1n(yi(wxi+b))

步骤 4: 更新参数

使用梯度下降更新规则来调整参数 w w w b b b
w : = w − η ∂ L ∂ w w := w - \eta \frac{\partial L}{\partial w} w:=wηwL
b : = b − η ∂ L ∂ b b := b - \eta \frac{\partial L}{\partial b} b:=bηbL
这里, η \eta η 是学习率,决定了每次更新的步长大小。

示例

假设我们有以下数据点:

xy
12
24
36

初始参数设置为 w = 0.5 w = 0.5 w=0.5 b = 0 b = 0 b=0,学习率 η = 0.01 \eta = 0.01 η=0.01

  1. 第一次迭代

    • 根据当前参数计算每个数据点的预测值,然后计算损失函数及其关于 w w w b b b 的梯度。
    • 使用计算出的梯度更新 w w w b b b
  2. 后续迭代

    • 重复上述过程多次,直到损失函数不再显著减少或达到预设的迭代次数为止。

在这个例子中,随着每一次迭代, w w w b b b 将逐渐接近最优值(本例中的 w = 2 w=2 w=2 b = 0 b=0 b=0),使得模型能够更好地拟合给定的数据点。

梯度下降算法的关键在于正确地设置学习率 η \eta η 和迭代次数,以及有效地计算梯度。在实践中,可能会使用更高级的变种如随机梯度下降(SGD)或mini-batch SGD来提高效率和效果。

3. 梯度下降算法里的模块

1. 随机梯度

  • 背景问题:如果参数很多,每个参数都要计算梯度,会有内存开销问题,导致更新速度慢。
  • 解决方法:每次随机选择一部分梯度代替所有梯度计算
  • 方法缺陷:引入一部分噪声

2. 动量

  • 背景问题:参数更新的方向完全依赖于当前批次数据计算出的梯度,在复杂的损失函数曲面上,简单的梯度下降可能无法有效逃离这些区域,且收敛速度较慢。
  • 解决方法:通过对过去的梯度进行加权平均,使得参数更新方向不仅取决于当前的梯度,还考虑了之前的更新方向和大小。
  • 方法缺陷:动量法引入了一个额外的超参数 γ \gamma γ,需要根据具体问题进行调优,增加了模型优化的复杂性。

3. 学习率自适应

  • 背景问题:较大的学习率,网络易出现震荡。
  • 解决方法:根据梯度自动调整学习率,梯度大的时候学习率小,梯度小的时候学习率大。

4. 梯度下降算法

1. AdaGrad算法(2011)

核心思想:AdaGrad是一种自适应学习率的方法,它对每个参数根据其历史梯度平方和调整学习率。对于频繁更新的参数,AdaGrad使用较小的学习率;而对于不常更新的参数,则允许更大的学习率。

  • 公式
    • 梯度累积:
      G t , i = G t − 1 , i + ( ∇ θ J ( θ i ) ) 2 G_{t, i} = G_{t-1, i} + \left( \nabla_\theta J(\theta_i) \right)^2 Gt,i=Gt1,i+(θJ(θi))2
    • 参数更新:
      θ t , i = θ t − 1 , i − η G t , i + ϵ ∇ θ J ( θ i ) \theta_{t, i} = \theta_{t-1, i} - \frac{\eta}{\sqrt{G_{t, i}} + \epsilon} \nabla_\theta J(\theta_i) θt,i=θt1,iGt,i +ϵηθJ(θi)

这里, G t , i G_{t, i} Gt,i 是到时间 t t t 为止所有先前梯度的平方和 η \eta η 是初始学习率, ϵ \epsilon ϵ 是为了数值稳定性而添加的小常数(通常设为 1 0 − 8 10^{-8} 108), ∇ θ J ( θ i ) \nabla_\theta J(\theta_i) θJ(θi) 表示损失函数关于第 i i i 个参数的梯度。

2. RMSProp算法(2012)

核心思想:RMSProp是对AdaGrad的一种改进,通过使用指数加权平均来解决AdaGrad中学习率单调递减的问题。RMSProp能够更好地处理非平稳目标——即在训练过程中目标函数发生改变的情况。

  • 公式
    • 梯度平方的指数加权平均:
      E [ g 2 ] t = γ E [ g 2 ] t − 1 + ( 1 − γ ) ( ∇ θ J ( θ ) ) 2 E[g^2]_t = \gamma E[g^2]_{t-1} + (1-\gamma)\left( \nabla_\theta J(\theta) \right)^2 E[g2]t=γE[g2]t1+(1γ)(θJ(θ))2
    • 参数更新:
      θ t = θ t − 1 − η E [ g 2 ] t + ϵ ∇ θ J ( θ ) \theta_t = \theta_{t-1} - \frac{\eta}{\sqrt{E[g^2]_t + \epsilon}} \nabla_\theta J(\theta) θt=θt1E[g2]t+ϵ ηθJ(θ)

这里, E [ g 2 ] t E[g^2]_t E[g2]t 是梯度平方的指数加权平均 γ \gamma γ 是衰减率(通常设置为0.9),其余符号含义同上。

3. Adam算法(2014)

核心思想:Adam结合了动量法和RMSProp的优点,不仅使用一阶矩估计(即梯度的均值)也使用二阶矩估计(即梯度的未中心化方差)。Adam能够在训练开始时快速收敛,并且对参数初始化不敏感。

  • 公式
    • 一阶矩(Mean, 期望值):
      m t = β 1 m t − 1 + ( 1 − β 1 ) ∇ θ J ( θ ) m_t = \beta_1 m_{t-1} + (1-\beta_1)\nabla_\theta J(\theta) mt=β1mt1+(1β1)θJ(θ)
    • 二阶矩(Variance, 未中心化方差):
      v t = β 2 v t − 1 + ( 1 − β 2 ) ( ∇ θ J ( θ ) ) 2 v_t = \beta_2 v_{t-1} + (1-\beta_2)\left( \nabla_\theta J(\theta) \right)^2 vt=β2vt1+(1β2)(θJ(θ))2
    • 偏差修正后的第一、第二时刻估计:
      m ^ t = m t 1 − β 1 t , v ^ t = v t 1 − β 2 t \hat{m}_t = \frac{m_t}{1-\beta_1^t}, \quad \hat{v}_t = \frac{v_t}{1-\beta_2^t} m^t=1β1tmt,v^t=1β2tvt
    • 参数更新:
      θ t = θ t − 1 − η v ^ t + ϵ m ^ t \theta_t = \theta_{t-1} - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \hat{m}_t θt=θt1v^t +ϵηm^t

其中, β 1 \beta_1 β1 β 2 \beta_2 β2 分别是用于计算移动平均的第一和第二时刻估计的衰减率(默认分别为0.9和0.999),其余符号与上述算法相同。

这些算法各自针对特定问题提出了有效的解决方案,使得模型训练过程更加高效和稳定。选择合适的优化算法可以显著影响模型的性能和训练效率。

二阶矩涉及数据的方差或未中心化方差。方差衡量了数据点围绕其均值的分散程度。对于未中心化方差(即不减去均值),二阶矩计算为所有数据点平方的平均值。对于一组数值 x 1 , x 2 , . . . , x n x_1, x_2, ..., x_n x1,x2,...,xn,其未中心化方差(二阶矩)计算为:
σ 2 = 1 n ∑ i = 1 n x i 2 \sigma^2 = \frac{1}{n} \sum_{i=1}^{n} x_i^2 σ2=n1i=1nxi2
注意,这里讨论的是未中心化方差

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值