梯度下降专题

声明:θ 和 w 只是两套符号,本质是同一个东西。

  • 传统机器学习、梯度下降入门课多用 $\theta$
  • 深度学习、写代码框架里统一用 $w$(权重)+ $b$(偏置)

一、为什么需要梯度下降?

正规方程求解极值在数据维度较小时往往比较合适,但随着特征数量上升,求解会变得非常复杂。这时就引入了梯度下降算法。


二、损失函数

损失函数的分类:MAE、MSE、RMSE。其中 MSE 由于引入了平方会导致特殊点对损失函数造成巨大影响,但 MSE 的优势是可导方便计算,在求导时也会成为主导项。

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$ 带入求解比较简单,但多维意味着巨大计算量,因此采用梯度下降算法。

沿着梯度的反向即可以找到梯度下降最快的方向。各权重下降多少并非定长,而是给定一个权重被称作步长学习率

梯度下降公式

在这个公式中 θ 是一个向量,减去学习率和梯度就是下降的量。随着公式递减,在简单函数中梯度会逐渐趋近于 0 也就是最小值,因此会逐渐收敛。


四、几种梯度下降算法

1. FGD(全梯度下降 / BGD)

最坚持古法的设计,最本源的算法,最凶狠的计算。

坚持定义,全量计算。

FGD示意1

以 MSE 为例:

FGD示意2

对于单个样本点 $(wx - y)^2$ 求偏导很容易得到 $2(wx - y)x$,常数 2 统一到学习率里。所有维度的数据都会参与计算,全量计算量巨大。

2. SGD(随机梯度下降)

SGD示意

每次只用一个样本,速度快但震荡厉害,收敛不稳,梯度方差大。

3. MBGD(小批量梯度下降)⭐ 工业最常用

折中方案:每次从 m 个样本中取一小批 b 个样本(如 32/64/128)。

  • $1 < b < m$,兼顾 BGD 稳定与 SGD 速度
  • 梯度平滑,震荡小
  • 并行计算提速,框架默认

4. SAG(随机平均梯度下降)

要解决的痛点

  • BGD 痛点:每次迭代计算全量梯度,数据大了算不动,内存爆炸
  • SGD 痛点:每次只用一个样本,速度快但震荡厉害,收敛不稳,梯度方差大
  • MBGD 痛点:每一批梯度仍然只基于当前批次,本质上还是”健忘症患者”

SAG 的核心思想:让算法”长记性”。

核心原理:为每个训练样本维护一个历史梯度向量 $g_1, g_2, …, g_N$,初始都为 0。每次随机挑一个样本 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 个梯度存储(内存开销)
梯度方差 大,”蛇皮走位” 压低方差,路径更平滑
本质 赌徒,每次只看当下运气 精算师,参考所有历史数据

五、收敛的优化

非凸函数示意

深度学习网络可能是一个非凸函数:

非凸函数示意2

很可能不能很好收敛,因此诞生了一些算法:

优化算法示意

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}
$$

如同滑雪高手提前判断前方坡道调整重心,而非只看脚下。

收敛三阶段

  1. 下坡:梯度方向一致,动量迅速累积,速度越来越快
  2. 靠近谷底:梯度变小,动量提供阻尼平滑,抵抗停滞
  3. 到达极小值:梯度为零,$v_t = \beta^t v_0$ 指数衰减归零,稳定驻留

数学证明:动量项 $v_t = \beta v_{t-1}$,由于 $\beta < 1$,动量指数衰减,算法必然收敛。


六、AdaGrad vs RMSprop(学习率自适应)

共同思想

对每个参数单独自适应学习率 —— 历史梯度波动大的参数自动减小更新步长。

通用公式

$$
\theta = \theta - \frac{\alpha}{\sqrt{\text{缓存}} + \varepsilon} g
$$

AdaGrad

  1. 缓存规则:梯度平方永久累加 $G_t = G_{t-1} + g_t^2$
  2. ✅ 优点:稀疏特征效果好,无需手动衰减学习率
  3. ❌ 缺陷:缓存只增不减,后期分母过大 → 学习率趋近 0,提前停止训练

RMSprop(改进 AdaGrad)

  1. 缓存规则:梯度平方指数滑动平均 $E[g^2]t = \gamma E[g^2]{t-1} + (1 - \gamma) g_t^2$
  2. ✅ 优点:解决学习率过早归零问题,全程稳定更新,深度学习常用
  3. ❌ 缺陷:无动量机制,梯度震荡场景弱于带动量算法

七、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 工业主流默认

推荐视频

【5分钟深度学习】#01 梯度下降算法 — 通俗易懂的梯度下降入门讲解