前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何加速我们的神经网络?

如何加速我们的神经网络?

作者头像
云时之间
发布2018-04-11 13:28:13
3.3K0
发布2018-04-11 13:28:13
举报
文章被收录于专栏:云时之间云时之间

各位老哥们大家好,双击喜欢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算法可以说功不可没。

这些就是这一篇文章所想要解释的一些内容,但是因为时间仓促,一定要很多的纰漏,也希望大家可以多多提出意见,以此来促进我们的共同提升!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.03.14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档