各位老哥们大家好,双击喜欢666。今天我们来聊一聊本萌新最新学习的一些知识。让我们一起来想一下怎么样来加速我们的神经网络的训练过程。
通常我们知道,越复杂的神经网络,越多的训练数据。我们所花费在训练这些实验数据上所消费的时间也就越多。原因很简单,因为你在计算的过程中需要计算的数据量太大了。但是往往在实际的过程中,复杂的数据和海量的数据往往是不可避免的。这个时候,我们就需要找到一些方法,让神经网络变得聪明起来,变得快起来。
所以,人们找出了一个最基础的方法SGD(Stochastic Gradient Descent)
现在想想红色方块是我们所要训练的data,如果要按照以前整套的流程和写法,就需要把整套的数据一次一次的放入到神经网络中进行学习,放入到NN中进行训练。在这个过程中所消耗的资源会很大。这个时候我们需要换一种思维方式。假如现在我们先将这些数据分拆成一小批一小批的,然后再不断地分批放入NN中进行计算。这个就是我们常说的SGD的正确打开方式了。在每一次的过程中,每次使用分量数据,虽然不能反映整体的情况,但是却在很大的程度上大大加速了NN的训练过程,并且在这个过程中也不会减少NN的准确率。但是如果即便是使用了SGD,你还是觉得训练的速度太慢,那应该怎么办?
没事!满足你,经过科学家们的反复研究,事实证明,SGD并不是最快的实践方法,在下图中我们可以看到,当SGD到达实验目标的时候,它所消耗的实践是最长的一种,这跟我昨天写的文章中对于问题求解的最佳路径显然是矛盾的。与之相对的,我们还有很多的途径来加速训练。其余的大多数方法都是在更新神经网络参数的时候动手脚。
对于公式W+=-Learning rate*dx。传统参数W的更新是将原始的学习参数上累加上一个负的学习效率Learning rate乘以矫正值dx。虽然这个学习过程的道路会曲折务必,做出来的折线图也像是一个喝醉了的大汉摇摇晃晃走出的路一样。走了很多弯路,所以我们将这个人从平地上放到一个下坡上,只要这个人往下坡上走一点点,他就会不自觉地往下走,走的弯路也就相应的变少。这也就是所谓的Momentum的更新方法。他们的数学形式也就是m=b1*m-Learning rate*dx W+=m
另外一种学习方法也就是AdaGrad方法,这一种方法其实是在学习率上动动手脚,最后使得每一个参数的更新都会有与众不同的效应。这个方法其实和Momentum有一点类似,不过这个方法不是给一个喝醉的大汉安排一个下坡,而是给他一双较小的鞋子,这样他走路的时候就会发现自己的脚疼,这样就会变成一个走弯路的阻力,就会逼着他直着走。
那么这个时候你可能会像,如果把下坡和不好走的鞋子结合起来会不会有更好的效果呢?
没错,你的想法是对的。这样的情况下,我们就有了RMSProp的方法。因为有了Momentum对于错误方向的轨迹,加上AdaGrad对于错误方向上的阻力,这样就让RMSProp有了他们两种同时的优势。现在的数学公式如下
V =b1*v +(1-b1)*dx^2
W+= -Learning rate*dx/v
不过这个时候有细心地同学一定可以发现RMSProp并不是AdaGrad和Momentu两组公式的相加,其实缺少了Momentu中的-Learning rate*dx中的这一个部分,所以我们就引出了这个算法Adam,并且在Adam中引出这个公式:
Momentu:m =b1*m+(1-b1)*dx
AdaGrad:V =b1*v +(1-b1)*dx^2
W+= -Learning rate*dx/v
经过试验证明,在大多数情况下使用Adam可以迅速的达到收敛的目标,又快又好的完成任务。在神经网络训练过程中,Adam算法可以说功不可没。
这些就是这一篇文章所想要解释的一些内容,但是因为时间仓促,一定要很多的纰漏,也希望大家可以多多提出意见,以此来促进我们的共同提升!
mm��� ��$