梯度下降算法是机器学习和深度学习中最常用的优化算法之一。其基本思想是通过反复调整模型参数,以最小化损失函数(误差函数)。梯度下降的原理是沿着损失函数的梯度方向,以一定步长逐步迭代,直到找到最优解或达到收敛条件。
梯度下降算法有多种变体,主要包括以下几类:
1. 批量梯度下降(Batch Gradient Descent,BGD)
原理:
- 每次迭代时,使用所有的训练数据来计算损失函数的梯度。
- 然后根据这个梯度更新模型的参数。
更新公式:
θ
=
θ
−
η
⋅
1
N
∑
i
=
1
N
∇
θ
L
(
x
i
,
y
i
)
\theta = \theta - \eta \cdot \frac{1}{N} \sum_{i=1}^N \nabla_{\theta} L(x_i, y_i)
θ=θ−η⋅N1i=1∑N∇θL(xi,yi)
其中:
- θ \theta θ 是模型的参数。
- η \eta η 是学习率。
- ∇ θ L ( x i , y i ) \nabla_{\theta} L(x_i, y_i) ∇θL(xi,yi) 是对参数 θ \theta θ 计算的梯度。
- N N N 是训练样本的数量。
优点:
- 全局的、稳定的收敛过程。
- 每次迭代都准确地指向损失函数下降的方向。
缺点:
- 每次迭代需要计算所有样本的梯度,计算开销大,尤其在大数据集上,时间开销较高。
- 由于每次使用整个数据集,可能会导致内存使用量过大。
2. 随机梯度下降(Stochastic Gradient Descent,SGD)
原理:
- 每次迭代只使用一个样本来计算梯度,并立即更新参数。
更新公式:
θ
=
θ
−
η
⋅
∇
θ
L
(
x
i
,
y
i
)
\theta = \theta - \eta \cdot \nabla_{\theta} L(x_i, y_i)
θ=θ−η⋅∇θL(xi,yi)
其中:
- x i x_i xi 和 y i y_i yi 是训练集中某个随机样本。
优点:
- 每次只使用一个样本,计算效率高,特别是在大数据集上能节省时间。
- 更快地对每个样本做出响应,使得它在实时应用中非常有效。
- 由于每次使用一个样本,增加了一定的随机性,可能有助于跳出局部最优解。
缺点:
- 更新过程具有较大的波动性,因为每次只使用一个样本,可能无法保证梯度更新的稳定性。
- 收敛速度可能较慢,且容易受到学习率选择的影响。
3. 小批量梯度下降(Mini-batch Gradient Descent)
原理:
- 结合了批量梯度下降和随机梯度下降的优点,每次迭代使用一小部分数据(称为小批量)来计算梯度,并更新参数。
更新公式:
θ
=
θ
−
η
⋅
1
m
∑
i
=
1
m
∇
θ
L
(
x
i
,
y
i
)
\theta = \theta - \eta \cdot \frac{1}{m} \sum_{i=1}^m \nabla_{\theta} L(x_i, y_i)
θ=θ−η⋅m1i=1∑m∇θL(xi,yi)
其中:
- m m m 是小批量的大小。
- 其余符号的意义与之前相同。
优点:
- 减少了计算开销,比批量梯度下降更快。
- 波动性比随机梯度下降小,因此更新更平稳。
- 小批量大小可以调节,以适应内存和性能。
缺点:
- 尽管相较于 SGD 波动性小,但仍然有一定的随机性,可能导致收敛路径不稳定。
4. 动量梯度下降(Gradient Descent with Momentum)
原理:
- 在普通梯度下降的基础上引入“动量”概念。动量会在每次更新时保留一部分上一次的更新方向,并在下次迭代中加以利用,从而加速收敛,尤其是在有很多局部最小值的非凸优化问题中。
更新公式:
v
=
γ
v
+
η
⋅
∇
θ
L
(
x
,
y
)
v = \gamma v + \eta \cdot \nabla_{\theta} L(x, y)
v=γv+η⋅∇θL(x,y)
θ = θ − v \theta = \theta - v θ=θ−v
其中:
- v v v 是动量向量,代表累积的梯度变化。
- γ \gamma γ 是动量系数(通常取 0.9)。
优点:
- 减少了梯度更新中的震荡,尤其是在凹凸形状的表面上。
- 能加速梯度下降的收敛,特别是在长而平的曲面上。
缺点:
- 需要调节额外的超参数(动量系数),并且对初始化较为敏感。
5. RMSProp(Root Mean Square Propagation)
原理:
- RMSProp 会调整学习率,使得每次更新的步长自适应于不同参数的变化速度。通过对过去的梯度平方进行指数加权平均,来动态调整学习率,使得参数更新更加平滑。
更新公式:
E
[
g
2
]
t
=
γ
E
[
g
2
]
t
−
1
+
(
1
−
γ
)
g
t
2
E[g^2]_t = \gamma E[g^2]_{t-1} + (1-\gamma) g_t^2
E[g2]t=γE[g2]t−1+(1−γ)gt2
θ = θ − η E [ g 2 ] t + ϵ g t \theta = \theta - \frac{\eta}{\sqrt{E[g^2]_t + \epsilon}} g_t θ=θ−E[g2]t+ϵηgt
其中:
- E [ g 2 ] t E[g^2]_t E[g2]t 是梯度平方的加权平均。
- ϵ \epsilon ϵ 是防止分母为零的常数。
- γ \gamma γ 是指数加权平均的衰减率,通常取 0.9。
优点:
- 自适应学习率,有效应对学习率不适的问题。
- 在非凸优化问题中表现优异。
缺点:
- 超参数 γ \gamma γ 和 η \eta η 仍需要调节。
6. Adam(Adaptive Moment Estimation)
原理:
- Adam 结合了动量法和 RMSProp,既使用了梯度的一阶矩估计(动量),也使用了梯度的二阶矩估计(RMSProp 中的平方梯度)。通过对一阶和二阶矩进行修正,Adam 可以提供一个更平滑的更新过程。
更新公式:
m
t
=
β
1
m
t
−
1
+
(
1
−
β
1
)
g
t
m_t = \beta_1 m_{t-1} + (1 - \beta_1) g_t
mt=β1mt−1+(1−β1)gt
v t = β 2 v t − 1 + ( 1 − β 2 ) g t 2 v_t = \beta_2 v_{t-1} + (1 - \beta_2) g_t^2 vt=β2vt−1+(1−β2)gt2
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
θ = θ − η v ^ t + ϵ m ^ t \theta = \theta - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \hat{m}_t θ=θ−v^t+ϵηm^t
其中:
- m t m_t mt 和 v t v_t vt 分别是梯度的动量和平方动量。
- β 1 \beta_1 β1 和 β 2 \beta_2 β2 是一阶矩和二阶矩的衰减率(通常取 0.9 和 0.999)。
- ϵ \epsilon ϵ 是一个小常数,用于防止分母为零。
优点:
- 具有自适应学习率,可以处理稀疏梯度。
- 结合动量和 RMSProp 的优点,更新更加平滑和稳定。
- 是目前深度学习中最常用的优化算法之一。
缺点:
- 在某些情况下可能会产生较大的步长,导致模型的过拟合。
总结:
- 批量梯度下降:使用所有样本更新参数,收敛稳定,但速度较慢。
- 随机梯度下降:每次更新一个样本,速度快,但收敛波动较大。
- 小批量梯度下降:折中方案,每次使用小批量样本,平衡速度与稳定性。
- 动量法:通过累积梯度加速收敛。
- RMSProp:通过调整学习率应对不同参数的变化速度。
- Adam:结合动量和 RMSProp,提供自适应的学习率更新。