文章目录
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=(∂x1∂f,∂x2∂f,...,∂xn∂f)
这里, ∂ f ∂ x i \frac{\partial f}{\partial x_i} ∂xi∂f 表示函数 f f f 关于变量 x i x_i xi 的偏导数。因此,梯度本质上是由函数关于所有输入变量的偏导数组成的向量。
在不同的文献或教材中,梯度也可能会用 grad ( f ) \text{grad}(f) grad(f) 来表示,但 ∇ f \nabla f ∇f 是最常用的表示方法。
2. 梯度下降算法的数学原理
- 梯度下降算法的目标:找到参数,使得目标函数值(损失函数)最小化;
- 目标函数小值在每个点梯度(斜率)的反方向;
- 迭代优化:每次从自身位置位置出发,往梯度的反方向移动,不断移动到达函数最小值。

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=1∑n(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) ∂w∂L=−n2i=1∑nxi(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) ∂b∂L=−n2i=1∑n(yi−(wxi+b))
步骤 4: 更新参数
使用梯度下降更新规则来调整参数
w
w
w 和
b
b
b:
w
:
=
w
−
η
∂
L
∂
w
w := w - \eta \frac{\partial L}{\partial w}
w:=w−η∂w∂L
b
:
=
b
−
η
∂
L
∂
b
b := b - \eta \frac{\partial L}{\partial b}
b:=b−η∂b∂L
这里,
η
\eta
η 是学习率,决定了每次更新的步长大小。
示例
假设我们有以下数据点:
| x | y |
|---|---|
| 1 | 2 |
| 2 | 4 |
| 3 | 6 |
初始参数设置为 w = 0.5 w = 0.5 w=0.5 和 b = 0 b = 0 b=0,学习率 η = 0.01 \eta = 0.01 η=0.01。
-
第一次迭代:
- 根据当前参数计算每个数据点的预测值,然后计算损失函数及其关于 w w w 和 b b b 的梯度。
- 使用计算出的梯度更新 w w w 和 b b b。
-
后续迭代:
- 重复上述过程多次,直到损失函数不再显著减少或达到预设的迭代次数为止。
在这个例子中,随着每一次迭代, 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=Gt−1,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=θt−1,i−Gt,i+ϵη∇θJ(θi)
- 梯度累积:
这里, G t , i G_{t, i} Gt,i 是到时间 t t t 为止所有先前梯度的平方和, η \eta η 是初始学习率, ϵ \epsilon ϵ 是为了数值稳定性而添加的小常数(通常设为 1 0 − 8 10^{-8} 10−8), ∇ θ 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]t−1+(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=θt−1−E[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=β1mt−1+(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=β2vt−1+(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=θt−1−v^t+ϵηm^t
- 一阶矩(Mean, 期望值):
其中, β 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=1∑nxi2
注意,这里讨论的是未中心化方差
759

被折叠的 条评论
为什么被折叠?



