梯度下降
Gradient Descent
梯度下降是机器学习和深度学习中最常用、最基础的优化算法。其核心思想是,通过沿着损失函数(或目标函数)梯度的反方向,以迭代的方式调整模型参数,从而逐步逼近损失函数的局部最小值(或全局最小值)。
核心思想:下山寻谷
想象你身处一座大山(损失函数曲面)的某个位置,目标是找到山谷(损失函数的最小值)。由于你无法一眼望到整个山谷,最直观的方法就是:
- 确定当前位置的坡度 (梯度): 找到当前位置最陡峭的下降方向。
- 迈出一步: 沿着这个最陡峭的下降方向走一小步。
- 重复: 不断重复上述过程,直到到达山谷底部。
这个“坡度”就是损失函数对模型参数的梯度 (Gradient),它是一个向量,指向函数值增长最快的方向。因此,我们沿着梯度的反方向移动,就能使函数值减小。
数学公式
对于一个损失函数
其中:
是更新后的参数。 是当前参数。 是学习率 (Learning Rate),一个正的超参数,控制着每次更新的步长。 是损失函数 在当前参数 处的梯度。
学习率 (Learning Rate)
学习率
- 学习率过大: 可能导致算法在最小值附近来回震荡,甚至发散,无法收敛。
- 学习率过小: 导致算法收敛速度过慢,需要大量的迭代才能达到最小值。
在实践中,通常会采用学习率调度 (Learning Rate Scheduling) 策略,在训练过程中动态调整学习率,例如逐渐减小学习率。
主要变种
梯度下降有多种变种,主要区别在于每次更新参数时使用的数据量:
1. 批量梯度下降 (Batch Gradient Descent, BGD)
- 特点: 每次更新参数时,使用所有训练样本来计算梯度。
- 优点: 每次更新都沿着全局最优方向,收敛路径平稳,最终能收敛到局部最小值。
- 缺点: 对于大规模数据集,计算成本高,训练速度慢,内存消耗大。
2. 随机梯度下降 (Stochastic Gradient Descent, SGD)
- 特点: 每次更新参数时,只随机选择一个训练样本来计算梯度。
- 优点: 计算速度快,内存消耗小,可以处理大规模数据集。由于每次更新的随机性,有助于跳出局部最小值。
- 缺点: 梯度更新方向具有随机性,导致损失函数震荡剧烈,收敛路径不稳定,可能无法精确收敛到最小值。
3. 小批量梯度下降 (Mini-Batch Gradient Descent)
- 特点: 每次更新参数时,使用一小批 (Mini-Batch) 训练样本来计算梯度。这是实践中最常用的方法。
- 优点: 兼顾了BGD的稳定性和SGD的速度。通过批量计算,可以利用现代硬件的并行计算能力。
- 缺点: 批量大小的选择需要经验。
4. 自适应学习率优化器
为了进一步提高收敛速度和稳定性,研究者们开发了许多更高级的优化器,它们能够自适应地调整学习率:
- Adagrad: 根据参数的历史梯度平方和来调整学习率,对不频繁的参数给予更大的学习率。
- RMSprop: 解决了Adagrad学习率下降过快的问题,通过指数加权平均来计算历史梯度平方和。
- Adam (Adaptive Moment Estimation): 结合了Adagrad和RMSprop的优点,同时考虑了梯度的一阶矩(均值)和二阶矩(非中心方差),是目前最流行、最常用的优化器之一。
挑战
- 局部最小值与鞍点: 梯度下降可能陷入局部最小值或鞍点,无法达到全局最优。
- 收敛速度: 学习率的选择和损失函数曲面的形状会影响收敛速度。