动手实现深度学习(9):第四篇:optimization的实现

神经网络的学习目的是找到使得损失函数的值尽可能小的参数,这个寻找最优参数的过程称为最优化(optimization)。本章会介绍4中优化函数,给出实现代码和测例。

测例方面,首先会用函数做测试,观察是否可以逼近极小值;然后会用mnist数据集做测试观察是否能够收敛。

所测试的函数公式如下:

在前几篇两篇中一直使用同一种的方法修改权重。这种方法为了寻找最优参数,将参数的梯度(导数)作为依据,根据参数的梯度,就知道梯度的方向,并沿着梯度的方向更新参数。通过不断的更新迭代上述步骤,从而逐渐接近最优参数。这个过程称为随机梯度下降(stochastic gradient descent, SGD), 前面几篇的训练中一直使用的是SGD。SGD的数学表达式如下:

虽然实现简单,也能得到优化参数。 但是SGD有很多缺点 , 比较明显的一个就是梯度的方向并没有指向最小值的方向,有可能得到的最优解是局部最优解。

因此我们还应该实现其他的优化参数的方法。 不过在此之前,需要对程序做修改,之前代码的耦合性很高,先把SGD独立抽出来,写成一个class,代码如下。

PS: 2/3里面均是采用SGD寻找最优参数,我们也可以从代码中找到,优化代码结构。

在第3篇的mnist数据集训练手写体:

第二篇里的2.4节,mnist数据集训练手写体:

测试SGD:

与之前测试梯度的方法类似:给出一个函数公式,求它的梯度。但这次会将每次梯度下降的点绘制出来。

针对SGD的缺点,添加动量v,对应物理上的速度。这样公式类似于物理上的瞬时速度的公式,对应物理上的阻力。

是加速度,一般是常量0.9

代码测试:

参考资料:

AdaGrad又称为学习率衰减。在神经网络的训练过程中,学习率的设置很重要,如果学习设置过小,导致学习的时间很长;学习率过大导致不能收敛。

针对以上的这种情况,有人提出了learning rate decay的方法:可以让学习率一开始比较大,随着训练的次数增加,学习率不断减少。AdaGrad(Adaptive Grad)会对每个元素的学习率进行适当的调整。AdaGrad的数学表达式如下:

表示损失函数关于的梯度;

表示学习率

由于保存了以前所有梯度值的 平方和,所以在更新参数的时候需要对除以才可以。这样一来,参数元素中变动较大的元素的学习率会降低。可以看做按照参数的元素进行学习率的衰减,使得变动较大的参数的学习率减小。

AdaGrad会记录所有梯度的平方和,然后在减去对应的梯度的权重,因此学习越深入,更新的幅度会越小。

测试代码:

参考资料:

从公式上看AdaGrad会迭代更新权重,这意味着会记录过去所有的平方和。可能会存在学习越深入更新的幅度会越小,甚至到最后几乎为0的情况。从上图可以看出确实出现了这种情况。

RMSProp可以改善这种情况。

RMSProp不是将过去的所有梯度都一视同仁的相加,而是逐渐的遗忘过去的梯度。

这里的代码实现就不给出了;, 具体可以从github上获取:

Adam的思路是将adaGrad和momnentum结合在一起。论文中Adam会设置3个参数:学习率,一次动量系数,二次动量系数。

测试代码:

参考资料:

P.S:这里面把RMSprop也放进来做参考了。

在网上找到了一些资料:

Original: https://www.cnblogs.com/greentomlee/p/16686799.html
Author: 修雨轩陈
Title: 动手实现深度学习(9):第四篇:optimization的实现

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/566244/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球