声明:θ 和 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)
最坚持古法的设计,最本源的算法,最凶狠的计算。
坚持定义,全量计算。

以 MSE 为例:

对于单个样本点 $(wx - y)^2$ 求偏导很容易得到 $2(wx - y)x$,常数 2 统一到学习率里。所有维度的数据都会参与计算,全量计算量巨大。
2. 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 个梯度存储(内存开销) |
| 梯度方差 | 大,”蛇皮走位” | 压低方差,路径更平滑 |
| 本质 | 赌徒,每次只看当下运气 | 精算师,参考所有历史数据 |
五、收敛的优化

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

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

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$ 指数衰减归零,稳定驻留
数学证明:动量项 $v_t = \beta v_{t-1}$,由于 $\beta < 1$,动量指数衰减,算法必然收敛。
六、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 | 工业主流默认 |
推荐视频
【5分钟深度学习】#01 梯度下降算法 — 通俗易懂的梯度下降入门讲解