第6章 与学习相关的技巧

6.1 参数的更新

神经网络的学习的目的是找到使损失函数的值尽可能小的参数。这是寻找最优参数的问题,解决这个问题的过程称为最优化。

SGD

使用参数的梯度,沿梯度方向更新参数,并重复这个步骤多次,从而逐渐靠近最优参数。

数学公式:

W ← W − η ∂ L ∂ W W \leftarrow W-\eta\frac{\partial L}{\partial W} WWηWL

代码:

class SGD:def __init__(self, lr = 0.01):self.lr = lrdef 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ηWLWW+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 = lrself.momentum = momentumself.v = Nonedef 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} hh+WLW