声明:θ 和 w 只是两套符号,本质是同一个东西。
- 传统机器学习、梯度下降入门课多用 $\theta$
- 深度学习、写代码框架里统一用 $w$(权重)+ $b$(偏置)
一、为什么需要梯度下降?
正规方程求解极值在数据维度较小时往往比较合适,但随着特征数量上升,求解会变得非常复杂。这时就引入了梯度下降算法。
二、损失函数
MAE(平均绝对误差)
定义:预测值与真实值之差的绝对值的平均值。
$$
\text{MAE} = \frac{1}{m} \sum_{i=1}^{m} |y_i - \hat{y}_i|
$$
特点:
- 对异常值不敏感,因为绝对值不会放大误差
- 量纲与原数据相同,解释直观(如预测房价,MAE=10 万代表平均偏差 10 万)
- 缺点是梯度在零点处不可导,优化时不如 MSE 平滑
MSE(均方误差)
定义:预测值与真实值之差的平方的平均值。
$$
\text{MSE} = \frac{1}{m} \sum_{i=1}^{m} (y_i - \hat{y}_i)^2
$$
特点:
- 对异常值非常敏感,平方会放大极端误差(误差 10 → 放大为 100)
- 量纲是原数据量纲的平方,解释性稍弱
- 数学性质优良,处处可导,凸函数,是线性回归等模型的首选
RMSE(均方根误差)
定义:MSE 的平方根,量纲回归原数据。
$$
\text{RMSE} = \sqrt{\text{MSE}} = \sqrt{\frac{1}{m} \sum_{i=1}^{m} (y_i - \hat{y}_i)^2}
$$
特点:
- 保留 MSE 放大较大误差的特性,对异常值敏感
- 量纲与原数据相同,应用最常用的回归评估指标之一
三、最小化损失函数
为了拟合效果尽可能还原数据,需要让损失函数最小化。两种方式:
| 方式 | 说明 |
|---|---|
| 正规方程 | 对原函数求导,求得极值点即最低点 |
| 梯度下降 | 沿着梯度的反向,找到下降最快的方向 |
在一维线性回归 $y = ax + b$ 中带入求解比较简单,但多维意味着巨大计算量,因此采用梯度下降。
核心公式
$$
\theta = \theta - \eta \nabla J(\theta)
$$
- $\theta$ 是参数向量
- $\eta$ 是学习率(步长)
- $\nabla J(\theta)$ 是梯度
以 MSE 为例,对单个样本 $(wx - y)^2$ 求偏导得到 $2(wx - y)x$,常数 2 统一到学习率里。
四、几种梯度下降算法
1. FGD(全梯度下降 / BGD)
最坚持古法的设计,最本源的算法,最凶狠的计算。
每次迭代使用全部样本计算梯度。数据量大时计算量巨大,内存爆炸。
2. SGD(随机梯度下降)
每次只用一个样本,速度快,但震荡厉害,收敛不稳,梯度方差大。
3. MBGD(小批量梯度下降)⭐ 工业最常用
折中方案:每次取一小批 $b$ 个样本(如 32/64/128)。
- $1 < b < m$,兼顾 BGD 稳定与 SGD 速度
- 梯度平滑,震荡小
- 并行计算提速,框架默认
4. SAG(随机平均梯度下降)
核心思想:让算法”长记性”。
为每个训练样本维护一个历史梯度向量 $g_1, g_2, …, g_N$:
- 每次随机挑一个样本 $i$
- 计算该样本最新梯度 $\nabla L_i(w_t)$ 并更新记忆 $g_i$
- 参数更新用所有 $N$ 个样本梯度的平均值:
$$
w_{t+1} = w_t - \frac{\eta}{N} \left( \nabla L_i(w_t) + \sum_{j \neq i} g_j \right)
$$
| 维度 | SGD | SAG |
|---|---|---|
| 梯度来源 | 只用当前样本(健忘症) | 当前样本 + 所有历史记忆 |
| 收敛性 | 慢,需精心调学习率 | 线性收敛,更稳定 |
| 计算成本 | 低 | 需维护 $N$ 个梯度存储 |
| 梯度方差 | 大,”蛇皮走位” | 压低方差,路径更平滑 |
五、收敛的优化
深度学习网络的损失函数可能是非凸函数,传统 SGD 难以很好收敛。
Momentum(动量随机梯度下降)
解决的痛点:
- 梯度震荡:峡谷状损失面中,方向剧烈摇摆,”反复横跳”
- 平缓区域缓慢:梯度趋于零时进展停滞
核心思想:小球下坡不仅看脚下坡度,还继承过去所有梯度信息的”惯性”。
$$
\begin{aligned}
v_t &= \beta v_{t-1} + (1 - \beta) g_t \
\theta_{t+1} &= \theta_t - \alpha v_t
\end{aligned}
$$
| 对比 | 普通 SGD | Momentum SGD |
|---|---|---|
| 更新方向 | 仅当前梯度,方向变化剧烈 | 历史梯度加权平均,方向稳定 |
| 收敛速度 | 平缓区域慢 | 依靠惯性仍能较快前进 |
| 比喻 | 近视徒步者,只看脚下 | 推下坡的雪球,惯性越来越大 |
NAG(Nesterov Accelerated Gradient)
Momentum 的改进——“向前看一步“:
先根据当前动量预估未来位置,在预估位置计算梯度,再进行修正。
$$
\begin{aligned}
\theta_{lookahead} &= \theta_t - \alpha \beta v_{t-1} \
g_t &= \nabla J(\theta_{lookahead}) \
v_t &= \beta v_{t-1} + (1 - \beta) g_t \
\theta_{t+1} &= \theta_t - \alpha v_t
\end{aligned}
$$
如同滑雪高手提前判断前方坡道来调整重心,而非只看脚下。
收敛三阶段:
- 下坡:梯度方向一致,动量迅速累积,速度越来越快
- 靠近谷底:梯度变小,动量提供阻尼平滑,抵抗停滞
- 到达极小值:梯度为零,$v_t = \beta^t v_0$ 指数衰减归零,稳定驻留
六、AdaGrad vs RMSprop(学习率自适应)
共同思想
对每个参数单独自适应学习率:历史梯度波动大的参数,自动减小更新步长。
通用公式:
$$
\theta = \theta - \frac{\alpha}{\sqrt{\text{缓存}} + \varepsilon} g
$$
AdaGrad
缓存规则:梯度平方永久累加 $G_t = G_{t-1} + g_t^2$
- ✅ 稀疏特征效果优秀,无需手动衰减学习率
- ❌ 缓存只增不减,分母过大 → 学习率趋近 0,提前停止训练
RMSprop(改进 AdaGrad)
缓存规则:梯度平方指数滑动平均
$$
E[g^2]t = \gamma E[g^2]{t-1} + (1 - \gamma) g_t^2
$$
- ✅ 解决学习率过早归零问题,全程稳定更新,深度学习常用
- ❌ 无动量机制,梯度震荡场景弱于带动量算法
七、Adam ⭐ 工业主流
结合了 Momentum + RMSprop,本质拼装但好用。
$$
\begin{aligned}
m_t &= \beta_1 m_{t-1} + (1 - \beta_1) g_t \quad &\text{(动量)} \
v_t &= \beta_2 v_{t-1} + (1 - \beta_2) g_t^2 \quad &\text{(自适应学习率)} \
\hat{m}_t &= \frac{m_t}{1 - \beta_1^t} \quad &\text{(偏差修正)} \
\hat{v}t &= \frac{v_t}{1 - \beta_2^t} \
\theta{t+1} &= \theta_t - \frac{\alpha \hat{m}_t}{\sqrt{\hat{v}_t} + \varepsilon}
\end{aligned}
$$
总结
| 算法 | 核心思想 | 适用场景 |
|---|---|---|
| BGD | 全量梯度 | 小数据 |
| SGD | 单样本随机 | 大数据在线学习 |
| MBGD | 小批量折中 | 工业最常用 |
| SAG | 历史梯度记忆平均 | 强凸光滑问题 |
| Momentum | 惯性加速 | 峡谷/震荡地形 |
| NAG | 向前看修正 | Momentum 改进 |
| AdaGrad | 梯度平方累加自适应 | 稀疏数据 |
| RMSprop | 滑动平均缓存 | 深度学习常用 |
| Adam | Momentum + RMSprop | 工业主流默认 |