$\large\star$ 梯度下降 gradient descent

重复计算损失函数的梯度然后对参数进行更新,这一过程称为梯度下降,如代码:

1
2
3
4
5
# 普通的梯度下降

while True:
weights_grad = evaluate_gradient(loss_fun, data, weights)
weights += - step_size * weights_grad # 进行梯度更新

可见简写公式:

$$\large\ W _ { t + 1 } = W _ { t } - \eta \nabla L ( W _ { t } )$$

其中: - Wt:当前参数; - ∇L(Wt):当前梯度; - η:学习率; - Wt + 1:更新后的参数。

梯度决定往哪里走,学习率决定一步走多远

随机梯度下降 stochastic gradient descent (SGD)

小批量数据梯度下降(Mini-batch gradient descent):大规模应用中,训练数据是大量的,如果计算整个训练集,来获得仅仅一个参数的更新,过于浪费。一个常用的方法是计算训练集中的小批量(batches)数据。如代码:

1
2
3
4
5
6
# 普通的小批量数据梯度下降

while True:
data_batch = sample_training_data(data, 256) # 256个数据
weights_grad = evaluate_gradient(loss_fun, data_batch, weights)
weights += - step_size * weights_grad # 参数更新

小批量数据策略有个极端情况,当每个批量中只有 1 个数据样本,这种策略被称为 SGD,有时候也被称为在线梯度下降。以后均以 SGD 作最宽泛的描述!

SGD 的三个问题

一、不同方向的曲率差异大

陡峭方向震荡;平缓方向前进慢

二、梯度为 0,SGD 卡死

遇到局部极小或鞍点,不能继续移动

三、梯度存在噪声

小批量采样时每个 mini-batch 包含数据不同,计算出梯度不同,导致梯度不准,更新方向抖动

Momentum (动量法)

普通 SGD 只使用当前梯度:

Wt + 1 = Wt − ηgt

Momentum 会保留过去的运动趋势:

vt + 1 = βvt + gt

Wt + 1 = Wt − η vt + 1

其中: - vt:当前速度; - β:动量系数; - η:学习率; - gt:当前梯度。

常用:

β = 0.9

(此方法不利于收敛)

RMSProp

RMSProp 用梯度平方的指数加权平均来逐参数自适应地缩放学习率,从而缓解”不同方向曲率差异大”的问题:

st + 1 = βst + (1 − β)gt2

$$W_{t+1} = W_t - \frac{\eta}{\sqrt{s_{t+1}} + \epsilon} g_t$$

其中: - st:梯度平方的指数加权平均(梯度二阶矩); - β:衰减系数,常用 0.9; - ϵ:防止除零的小常数,常用 10−7; - η:学习率。

陡峭方向梯度平方大 → 有效学习率被自动压小;平缓方向梯度平方小 → 有效学习率被自动放大。


$\large\star$ 总结

方法 更新思想 主要缓解的问题
梯度下降 / SGD 沿当前梯度反方向更新,用 mini-batch 近似全量梯度 全量梯度计算代价过高
Momentum 累积历史梯度形成”速度”,抑制震荡 曲率差异大导致的震荡
RMSProp 用梯度平方的指数加权平均逐参数缩放学习率 不同方向曲率差异大

一句话总结:梯度决定往哪里走,学习率决定一步走多远;动量让方向更稳,自适应方法让步长更合理。

下一讲:CS231n(肆)——神经网络与反向传播