“等蹬等灯”...神经网络训练为何总是如此耗时?这三个原因为你答疑解惑
相信每个小伙伴都经历过训练算法时在电脑前默默苦等的日子,看着损失像乌龟一样一点点的减小。很多时候不禁在想,训练网络怎么会这么久啊!这篇文章的作者从优化的角度道出了神经网络训练耗时的根源,并阐述了减小非线性优化问题串行复杂度的一系列障碍。
在八十年代的时候,训练卷积神经网络进行手写数字识别的工作需要耗时一周甚至更长时间,今天顶级会议对论文算法进行评估的训练数据ImageNet也需要在单卡高端GPU上进行一周左右的训练时间。人们为了不断提高算法的性能,不断榨取硬件的计算能力并将训练时间不断延长。谷歌的工程师甚至利用10PFlop的TPU来进行MINST手写字符识别算法的训练,人们总是会找到办法穷尽硬件所有的算力来训练更高的算法,这也意味着更长的时间。
然而导致神经网络训练时间高涨的根源却值得我们仔细的思考,让我们先来看看下面这段代码:
上面这个优化过程看似简单,但即使随着晶体管的数量指数级上升、如果你需要串行运行300万个循环,很多晶体管也只能袖手旁观你的训练速度只会局限在单线程的水平,而单线程的计算能力这些年却没有显著的增加。
从图中我们可以看出,串行计算能力的峰值在2007年达到顶峰随后下降,作者发现三年的老笔记本上训练Atari强化学习模型比在新的因特尔至强芯片上还快。
为了处理单线程越来越差的表现人们开始着力于减少优化迭代的次数,但循环次数却受以下三方面原因的制约。
一、非线性
如果我们的优化问题如下图所示,由于梯度下降法依赖局部信息,需要一定的迭代次数才能够寻找到局域最小值。
非线性可由目标函数组成部分之间的相互作用表示出来,神经网络中的层数越多其非线性表示能力就越强。
让我们来看一个例子,将一系列的随机举证相乘并用任意的输入ab来归一化结果:
我们看到即使对这样纯粹的线性神经网络,层数变多了优化也演变成非线性问题。
所以我们得到结论,层数越多的神经网络非线性就越强:
二、局部条件数(输入敏感性)
让我们来考虑一个形如椭圆方程的最小化问题:
这一问题的难点在于梯度并不指向最小值的方向,梯度下降法在使用过程中会形成“之”字形轨迹:
为了衡量梯度下降法对于这类问题的处理难度,人们提出了一个成为“条件数”的指标来衡量,它定义为梯度问题中最长轴和最短轴的比值,随着条件数的增加,需要优化的步数也线性增加。
下图分别是条件数为1和10 的情况:
神经网络的优化为题造成了很差的条件数,参数越多使得条件数越差,需要的优化步骤也越多。详细内容可以参照文末论文1。
三、梯度噪音的程度
神经网络使用的优化算法是梯度下降法,随机梯度下降法由于条件数的原因得不到准确的下降方向,而后又被噪音不断稀释造成了很大的影响!
下图数噪音对于Rosenbrock方程最小值的优化过程影响:
没噪声
有噪声
噪声的增加源于参数空间不断增加的维度,最简单的情况下可以视为高斯噪声,均方根误差随着维度的平方根而增加。具体请看文末参考误差。
对于这种形式的问题,我们可以使用不断增加的三极管数量来并行计算并最终求取平均值,而且误差随着样本数量的增加是可以缩小的:
基于噪音和均值公式的平方根我们发现为了避免额外的噪声我们需要在保持参数不变的情况下增大每一次batch的数量。总结来说就是越多参数越多噪音,但是对于并行计算来说,越大的batch越多样本的平均则噪音也就越小。
总 结
对于这三种拉低神经网络训练速度的障碍提出了不同的解决办法,对于第一种我们要减小非线性,利用Resnet和ReLU激活函数是其中一种先进的方法;对于第二个障碍我们需要对神经网络采取先进的线性估计方法如KFAC;对于第三种障碍,可以采用更多的计算设备集成来克服。同时下一代针对深度学习更为高效的晶体管可以同时改善这三个方面。