6.1 参数的更新
神经网络的学习的目的是找到使损失函数的值尽可能小的参数。这是寻找最优参数的问题,解决这个问题的过程称为最优化。
SGD
使用参数的梯度,沿梯度方向更新参数,并重复这个步骤多次,从而逐渐靠近最优参数。
数学公式:
W ← W − η ∂ L ∂ W W \leftarrow W-\eta\frac{\partial L}{\partial W} W←W−η∂W∂L
代码:
class SGD:
def __init__(self, lr = 0.01):
self.lr = lr
def update(self, params, grads):
for key in params.keys():
params[key] -= self.lr * grads[key]
SGD缺点:
如果函数的形状非均向,搜索路径就会非常抵消
SGD低效的根本原因,梯度的方向并没有指向最小值的方向。
6.1.4 Momentum
动量梯度下降法讲解
数学式表达:
v ← α v − η ∂ L ∂ W W ← W + v v \leftarrow \alpha v - \eta \frac{\partial L}{\partial W} \\ W \leftarrow W + v v←αv−η∂W∂LW←W+v
- 式中。
v
表示速度, 0 ≤ α < 1 0 \leq \alpha < 1 0≤α<1,当 α \alpha α等于0 时,动量法等价于小批量随机梯度下降。
class Momentum:
def __init__(self, lr = 0.01, momentum = 0.9):
self.lr = lr
self.momentum = momentum
self.v = None
def update(self, params, grads):
# 初始化
if self.v is None:
self.v = {
}
for key, val in params.items():
self.v[key] = np.zeros_like(val)
# 对应上面的公式
for key in params.keys():
self.v[key] = self.momentum*self.v[key] - self.lr * grads[key]
params[key] += self.v[key]
6.1.5 AdaGrad
学习率衰减: 随着学习的进行,使学习率逐渐减小。
- AdaGrad:会为参加的每个元素适当地调增学习率
数学公式:
h ← h + ∂ L ∂ W ⨀ ∂ L ∂ W W ← W − η 1 h ∂ L ∂ W h \leftarrow h + \frac{\partial L}{\partial W} \bigodot \frac{\partial L}{\partial W} \\ W \leftarrow W-\eta \frac{1}{\sqrt{h}} \frac{\partial L}{\partial W} h←h+∂W∂L⨀∂W