优化器有以下几种:
- Stochastic Gradient Descent(SGD)
- Momentum
- AdaGrad
- RMSProp
- Adam
越复杂的神经网络,越多的数据,我们需要在训练神经网络的过程上花费的时间也就越多。原因很简单,就是因为计算量太大了。可是往往有时候为了解决复杂的问题,复杂的结构和大数据又是不能避免的,所以我们需要寻找一些方法,让神经网络聪明起来,快起来。
Stochastic Gradient Descent(SGD)
最基础的方法就是SGD,一般不用优化的训练方法是,把整块的data直接全部放入神经网络NN进行训练,这样消耗的计算资源会很大。
如果我们把这些数据拆分成小批小批的,然后再分批不断放入NN中计算,这就是我们常说的SGD的正确打开方式了。每次使用批数据,虽然不能反映整体数据的情况,不过却很大程度上加速了NN的训练过程,而且也不会丢失太多准确率。
事实证明,SGD并不是最快速的训练方法,红色的线是SGD,但它到达学习目标的时间是在这些方法中最长的一种。
Momentum更新方法
W += -Learning rate * dx
传统的参数W的更新是把原始的W累加上一个符的学习率(learning rate)乘以校正值(dx)。这种方法可能会让学习过程曲折无比,看起来像喝醉的人回家时,摇摇晃晃走了很多了弯路。
Momentum参数更新公式:
m = b1 * m - Learning rate * dx
W += m
相当于我们把这个人从平地放到了一个斜坡上,只要他往下坡的方向走一点点,由于向下的惯性,他不自觉地就一直往下走,走的弯路也就变少了。
AdaGrad更新方法
这种方法是在学习率上面动手脚,使得每一个参数更新都会有自己与众不同的学习率。
他的作用和momentum类似, 不过不是给喝醉酒的人安排另一个下坡, 而是给他一双不好走路的鞋子, 使得他一摇晃着走路就脚疼, 鞋子成为了走弯路的阻力, 逼着他往前直着走. 他的数学形式是这样的.
RMSProp更新方法
有了momentum的惯性原则,加上adagrad的对错误方向的阻力,我们就能合并成这样。
但是RMSProp中少了momentum中的这一部分。
RMSProp公式
v = b1 * v + (1 - b1) * dx^2
W += -Learning rate * dx / sqrt(v)
Adam更新方法
计算m时有momentum下坡的属性,计算v时有adagrad阻力的属性,然后再更新参数时把m和v都考虑进去。实验证明,大多数时候,使用adam都能又快又好的达到目标,迅速收敛。
Adam公式
m = b1 * m + (1-b1) * dx -> Momentum
v = b2 * v + (1-b2) * dx^2 -> AdaGrad
W += -Learning rate * m / sqrt(v)