📚 什么是梯度下降?
🎯 生活化理解
想象你在一个山谷里,眼睛被蒙住,想要找到最低点:
- 👣 你每走一步,用脚感受地面是向上还是向下
- 📉 地面向下(梯度向下),你就朝那个方向走
- 🔄 重复这个过程,一步一步向下走
- ✨ 梯度下降就是找到损失函数"山谷"的最低点!
定义
梯度下降(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) 早停(验证集不再改善)