越复杂的神经网络 , 越多的数据 , 使得在训练神经网络时花费的时间也就越多。 原因很简单, 是因为计算量太大了,所以我们需要寻找一些方法, 让神经网络的训练快起来。
1、Stochastic Gradient Descent (SGD)
把数据分成小批小批的,然后再分批进行计算。每次使用批数据,虽然不能反映整体数据的情况,但是也可以很大的程度的加速训练过程,并且不会丢失过多的准确率。
2、Momentum 更新方法
- 传统的参数更新:原始的 W 累加【一个负的学习率 × 校正值(dx)】。这种方法会让学习过程曲折无比。好比一个喝醉的人回家时,摇摇晃晃走了很多弯路。
- Momentum参数更新:把这个人从平地上放到了一个斜坡上, 只要他往下坡的方向走一点点, 由于向下的惯性, 他不自觉地就一直往下走, 走的弯路也变少了。
3、AdaGrad 更新方法
- 在学习率上进行优化, 使得每一个参数更新都会得到不同的学习率。好比给他一双不好走路的鞋子, 使得他一摇晃着走路就脚疼, 鞋子成为了走弯路的阻力, 逼着他往前直着走。
4、RMSProp 更新方法
合并【部分的 Momentum 的惯性原则】以及 【AdaGrad 的对错误方向的阻力】,让其同时具备两种方法的优势。
5、Adam 更新方法
计算m 时有 momentum 下坡的属性, 计算 v 时有 adagrad 阻力的属性, 然后再更新参数时 把 m 和 V 都考虑进去。实验证明, 大多数使用 Adam 都能又快又好的达到目标, 迅速收敛。
上面已经介绍了几种优化器,那么我们现在编写代码来看一下各种优化器的效果图
1、准备伪数据
输出结果:
2、创建神经网络
为了更好的对比出每一种优化器,需要给他们各自创建一个神经网络。
3、优化器 Optimizer
创建不同的优化器,用来训练不同的网络。
4、训练
5、代码整合
输出结果:
1)会输出轮数0-11。
2)图示,四种优化器的对比图