梯度下降是简单的,但是在学习算法中,常常不会使用原始的梯度下降方法,而是采取批量、随即梯度下降的模式进行更新参数。此外还发展了一些方法,如动量法,自适应学习率法(AdaGrad),RMSProp,Adam方法等变种。下面我们对此进行一一介绍。本文主要内容由DeepSeek R1生成。
以下是梯度下降方法及其变种的详细介绍,包括原理、数学公式、优缺点和适用场景。
1. 批量梯度下降(Batch Gradient Descent, BGD)
原理
批量梯度下降在每次参数更新时使用整个训练集计算损失函数关于参数的梯度。它精确计算全局梯度方向,但计算成本较高。
数学公式
-
损失函数:
J ( θ ) = 1 N ∑ i = 1 N L ( y ( i ) , f θ ( x ( i ) ) ) J(\theta) = \frac{1}{N} \sum_{i=1}^N L\left(y^{(i)}, f_\theta(x^{(i)})\right) J(θ)=N1i=1∑NL(y(i),fθ(x(i)))
或者在值函数估计的强化学习人物中,采取占用度量的方式写成:
J ( θ ) : = 1 2 ∑ s ∈ S μ ( s ) ⋅ [ V π ( s ) − V π θ ( s ) ] 2 = E π [ 1 2 ( V π ( s ) − V π θ ( s ) ) 2 ] J(\theta):=\frac{1}{2}\sum_{s\in S} \mu(s)\cdot \left[{V_{\pi}(s) - V_{\pi}^{\theta}(s)}\right]^{2} = \mathbb{E}_{\pi}\left[\frac{1}{2}({V_{\pi}}(s)-V_{\pi}^{\theta}(s))^{2}\right] J(θ):=21s∈S∑μ(s)⋅[Vπ(s)−Vπθ(s)]2=Eπ[21(Vπ(s)−Vπθ(s))2] -
参数更新:
θ t + 1 = θ t − α ⋅ ∇ θ J ( θ ) = θ t − α ⋅ 1 N ∑ i = 1 N ∇ θ L ( y ( i ) , f θ ( x ( i ) ) ) \theta_{t+1} = \theta_t - \alpha \cdot \nabla_\theta J(\theta) = \theta_t - \alpha \cdot \frac{1}{N} \sum_{i=1}^N \nabla_\theta L\left(y^{(i)}, f_\theta(x^{(i)})\right) θt+1=θt−α⋅∇θJ(θ)=θt−α⋅N1i=1∑N∇θL(y(i),fθ(x(i)))
其中 α \alpha α 是学习率, N N N 是样本总数。
优点
- 稳定性高:梯度计算基于所有样本,方向准确,收敛路径平滑。
- 理论保证:严格遵循凸优化理论,对凸函数保证收敛到全局最优。
缺点
- 计算成本高:每次更新需遍历全部数据,不适合大规模数据集。
- 内存需求大:无法在单次迭代中处理超出内存的数据。
- 易陷入局部最优:对非凸函数可能收敛到局部极小值。
适用场景
- 小规模数据集或特征维度较低的问题。
- 需要精确梯度方向的研究场景(如理论分析)。
2. 随机梯度下降(Stochastic Gradient Descent, SGD)
原理
每次参数更新时仅使用单个样本计算梯度。通过引入随机性跳出局部最优,但梯度方向方差较大。
数学公式
- 随机采样:随机选择一个样本 ( x ( i ) , y ( i ) ) (x^{(i)}, y^{(i)}) (x(i),y(i))。
- 参数更新:
θ t + 1 = θ t − α ⋅ ∇ θ L ( y ( i ) , f θ ( x ( i ) ) ) \theta_{t+1} = \theta_t - \alpha \cdot \nabla_\theta L\left(y^{(i)}, f_\theta(x^{(i)})\right) θt+1=θt−α⋅∇θL(y(i),fθ(x(i)))
优点
- 计算高效:单样本更新,适合大规模数据。
- 逃离局部最优:随机性有助于跳出非凸函数的局部极小值。
- 在线学习:支持流式数据(逐样本更新),这一点对于强化学习特别友好。
缺点
- 高方差:梯度方向不稳定,收敛路径震荡。
- 收敛速度慢:需更谨慎地调节学习率。
- 可能不收敛:需满足Robbins-Monro条件(如学习率衰减)。
适用场景
- 大规模数据集训练(如深度学习)。
- 在线学习或实时更新模型。
3. 小批量梯度下降(Mini-batch Gradient Descent)
原理
折中方案:每次更新使用一小批样本(如32、64个样本)计算梯度。平衡了BGD的稳定性和SGD的效率。
数学公式
- 批量大小: B B B(通常为2的幂次)。
- 参数更新:
θ t + 1 = θ t − α ⋅ 1 B ∑ i = 1 B ∇ θ L ( y ( i ) , f θ ( x ( i ) ) ) \theta_{t+1} = \theta_t - \alpha \cdot \frac{1}{B} \sum_{i=1}^B \nabla_\theta L\left(y^{(i)}, f_\theta(x^{(i)})\right) θt+1=θt−α⋅B1i=1∑B∇θL(y(i),fθ(x(i)))
优点
- 计算效率高:利用硬件并行加速(如GPU)。
- 梯度方差低:比SGD更稳定。
- 内存友好:可控制批量大小适应内存限制。
缺点
- 需调节批量大小:过小导致震荡,过大接近BGD速度慢。
- 仍可能局部最优:对非凸问题无法保证全局最优。
适用场景
- 深度学习的主流方法(如训练神经网络)。
- 需要平衡速度和稳定性的场景。
4. 动量法(Momentum)
原理
引入动量项累积历史梯度方向,抑制震荡,加速收敛。
数学公式
- 动量累积:
v t = β v t − 1 + ( 1 − β ) ∇ θ J ( θ t ) v_{t} = \beta v_{t-1} + (1-\beta) \nabla_\theta J(\theta_t) vt=βvt−1+(1−β)∇θJ(θt) - 参数更新:
θ t + 1 = θ t − α ⋅ v t \theta_{t+1} = \theta_t - \alpha \cdot v_t θt+1=θt−α⋅vt
其中 β \beta β 是动量系数(通常取0.9)。
优点
- 加速收敛:在梯度方向一致的维度上累积速度。
- 减少震荡:动量平滑随机梯度噪声。
缺点
- 需调节动量系数:过大可能导致超调。
- 对初始梯度敏感:初期动量可能误导方向。
适用场景
- 高维非凸优化(如神经网络训练)。
- 梯度方向变化较大的问题。
5. AdaGrad(Adaptive Gradient)
原理
自适应调节学习率:对频繁更新的参数减小步长,对稀疏参数增大步长。
数学公式
- 梯度平方累积:
G t = G t − 1 + ( ∇ θ J ( θ t ) ) 2 G_t = G_{t-1} + (\nabla_\theta J(\theta_t))^2 Gt=Gt−1+(∇θJ(θt))2 - 参数更新:
θ t + 1 = θ t − α G t + ϵ ⋅ ∇ θ J ( θ t ) \theta_{t+1} = \theta_t - \frac{\alpha}{\sqrt{G_t + \epsilon}} \cdot \nabla_\theta J(\theta_t) θt+1=θt−Gt+ϵα⋅∇θJ(θt)
其中 ϵ \epsilon ϵ 是平滑项(防止除零)。
优点
- 自适应学习率:适合稀疏数据。
- 无需手动调节全局学习率。
缺点
- 累积梯度平方单调增长:学习率过早衰减至零。
- 不适合非凸问题后期:无法重新放大已衰减的学习率。
适用场景
- 自然语言处理(稀疏特征)。
- 推荐系统(长尾分布特征)。
6. RMSProp
原理
改进AdaGrad:使用指数加权移动平均(EMA)替代累积梯度平方,解决学习率过早衰减问题。
数学公式
- EMA梯度平方:
E t = β E t − 1 + ( 1 − β ) ( ∇ θ J ( θ t ) ) 2 E_t = \beta E_{t-1} + (1-\beta)(\nabla_\theta J(\theta_t))^2 Et=βEt−1+(1−β)(∇θJ(θt))2 - 参数更新:
θ t + 1 = θ t − α E t + ϵ ⋅ ∇ θ J ( θ t ) \theta_{t+1} = \theta_t - \frac{\alpha}{\sqrt{E_t + \epsilon}} \cdot \nabla_\theta J(\theta_t) θt+1=θt−Et+ϵα⋅∇θJ(θt)
其中 β \beta β 通常取0.9。
优点
- 缓解学习率衰减:EMA赋予近期梯度更高权重。
- 适合非平稳目标函数(如非凸优化)。
缺点
- 仍需手动设置初始学习率。
适用场景
- 深度学习(常与动量法结合使用)。
7. Adam(Adaptive Moment Estimation)
原理
结合动量法和RMSProp,同时计算梯度的一阶矩(均值)和二阶矩(方差),并校正偏差。
数学公式
- 动量项:
m t = β 1 m t − 1 + ( 1 − β 1 ) ∇ θ J ( θ t ) m_t = \beta_1 m_{t-1} + (1-\beta_1)\nabla_\theta J(\theta_t) mt=β1mt−1+(1−β1)∇θJ(θt) - 二阶矩项:
v t = β 2 v t − 1 + ( 1 − β 2 ) ( ∇ θ J ( θ t ) ) 2 v_t = \beta_2 v_{t-1} + (1-\beta_2)(\nabla_\theta J(\theta_t))^2 vt=β2vt−1+(1−β2)(∇θJ(θt))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 + 1 = θ t − α ⋅ m ^ t v ^ t + ϵ \theta_{t+1} = \theta_t - \frac{\alpha \cdot \hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon} θt+1=θt−v^t+ϵα⋅m^t
默认值: β 1 = 0.9 , β 2 = 0.999 , ϵ = 1 e − 8 \beta_1=0.9, \beta_2=0.999, \epsilon=1e-8 β1=0.9,β2=0.999,ϵ=1e−8。
优点
- 自适应学习率:适合高维参数空间。
- 鲁棒性强:对超参数选择不敏感。
缺点
- 可能错过最优解:自适应机制可能抑制后期更新。
适用场景
- 深度学习中的默认优化器(广泛适用)。
总结表格
方法 | 核心思想 | 优点 | 缺点 | 适用场景 |
---|---|---|---|---|
BGD | 全量数据计算梯度 | 稳定,理论收敛性好 | 计算慢,内存需求大 | 小数据集,理论分析 |
SGD | 单样本随机更新 | 高效,适合在线学习 | 高方差,收敛慢 | 大规模数据,在线学习 |
Mini-batch GD | 小批量样本更新 | 平衡速度与稳定性 | 需调节批量大小 | 深度学习主流方法 |
Momentum | 累积历史梯度方向 | 加速收敛,减少震荡 | 需调节动量系数 | 非凸优化,高维问题 |
AdaGrad | 自适应稀疏参数学习率 | 适合稀疏特征 | 学习率过早衰减 | NLP,推荐系统 |
RMSProp | EMA平滑梯度平方 | 缓解学习率衰减 | 依赖初始学习率 | 非平稳目标函数 |
Adam | 动量 + 自适应学习率 + 偏差校正 | 鲁棒性强,广泛适用 | 可能错过最优解 | 深度学习默认优化器 |
如何选择优化方法?
- 默认选择:优先尝试 Adam,尤其对超参数调节经验不足时。
- 资源有限:使用 Mini-batch GD 并调节批量大小。
- 理论分析:用 BGD 观察精确收敛性。
- 稀疏数据:尝试 AdaGrad 或 RMSProp。
- 简单模型:SGD + Momentum 可能更优(如线性模型)。
希望这份总结能帮助你系统理解梯度下降及其变种!