⛰️ 梯度下降

机器学习中最核心的优化算法

📚 什么是梯度下降?

🎯 生活化理解

想象你在一个山谷里,眼睛被蒙住,想要找到最低点:

  • 👣 你每走一步,用脚感受地面是向上还是向下
  • 📉 地面向下(梯度向下),你就朝那个方向走
  • 🔄 重复这个过程,一步一步向下走
  • 梯度下降就是找到损失函数"山谷"的最低点!

定义

梯度下降(Gradient Descent)是一种用于寻找函数最小值的优化算法。在机器学习中,它用于找到使损失函数最小的参数值。

核心思想:沿着损失函数梯度的反方向(下降最快的方向)更新参数,逐步接近最优解

更新公式

$$\theta_{new} = \theta_{old} - \alpha \cdot \nabla J(\theta)$$

其中:

  • $\theta$:参数(如权重 $w$ 和偏置 $b$)
  • $\alpha$:学习率(步长)
  • $\nabla J(\theta)$:损失函数对参数的梯度(导数)

🎮 交互式演示:梯度下降可视化

2D 损失函数曲面

下面展示了一个损失函数的2D视图。红色点表示当前参数值,观察它如何沿着梯度方向下降!

0.10
3.0
3.0

当前信息:

1D 梯度下降动画

下面是一个更简单的1D示例,展示梯度下降如何找到函数的最小值。

📊 学习率的影响

学习率太小 vs 太大

❌ 学习率太小

  • 收敛太慢
  • 需要很多步
  • 可能陷入局部最优

✅ 学习率适中

  • 快速收敛
  • 稳定下降
  • 找到最优解

❌ 学习率太大

  • 可能"跳过"最优点
  • 震荡或不收敛
  • 损失值反而增大

比较不同学习率的效果

🔄 梯度下降的变种

1. 批量梯度下降 (Batch Gradient Descent)

使用所有训练样本计算梯度:

$$\theta = \theta - \alpha \cdot \frac{1}{m}\sum_{i=1}^{m}\nabla J_i(\theta)$$
  • ✅ 稳定,收敛平滑
  • ❌ 计算量大,内存消耗多

2. 随机梯度下降 (Stochastic Gradient Descent, SGD)

每次只使用一个训练样本:

$$\theta = \theta - \alpha \cdot \nabla J_i(\theta)$$
  • ✅ 快速,内存需求小
  • ❌ 波动大,可能不收敛

3. 小批量梯度下降 (Mini-batch Gradient Descent)

使用一小批样本(如32、64个):

$$\theta = \theta - \alpha \cdot \frac{1}{b}\sum_{i=1}^{b}\nabla J_i(\theta)$$
  • ✅ 平衡了速度和稳定性
  • ✅ 最常用的方法

❓ 常见问题

🤔 Q: 如何选择学习率?

A: 通常从0.01或0.1开始尝试。可以使用学习率衰减:开始时用较大的学习率快速下降,然后逐渐减小学习率精细调整。

🤔 Q: 为什么梯度下降可能找不到全局最优?

A: 梯度下降只能找到局部最优。如果损失函数有多个"山谷",可能陷入局部最小值。解决方法:多次随机初始化,选择最好的结果。

🤔 Q: 什么时候停止训练?

A: 通常当损失值不再显著下降时停止。可以设置:1) 最大迭代次数 2) 损失值变化阈值 3) 早停(验证集不再改善)