梯度下降专题

声明:θ 和 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$:

  1. 每次随机挑一个样本 $i$
  2. 计算该样本最新梯度 $\nabla L_i(w_t)$ 并更新记忆 $g_i$
  3. 参数更新用所有 $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}
$$

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

收敛三阶段

  1. 下坡:梯度方向一致,动量迅速累积,速度越来越快
  2. 靠近谷底:梯度变小,动量提供阻尼平滑,抵抗停滞
  3. 到达极小值:梯度为零,$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 工业主流默认