摘要: 这些方法可让深度学习跑在你的手机上!git
计算机具备高储量的硬盘和强大的CPU和GPU。可是智能手机却没有,为了弥补这个缺陷,咱们须要技巧来让智能手机高效地运行深度学习应用程序。github
æºè½ææºè½ä¸å¼ºå¤§çæå¡å¨é群ç«äºåï¼ 服务器
介绍网络
深度学习是一个使人难以置信的灵活且强大的技术,但运行的神经网络能够在计算方面须要很是大的电力,且对磁盘空间也有要求。这一般不是云空间可以解决的问题,通常都须要大硬盘服务器上运行驱动器和多个GPU模块。架构
不幸的是,在移动设备上运行神经网络并不容易。事实上,即便智能手机变得愈来愈强大,它们仍然具备有限的计算能力、电池寿命和可用磁盘空间,尤为是对于咱们但愿保持尽量轻的应用程序。这样作能够实现更快的下载速度、更小的更新时间和更长的电池使用时间,这些都是用户所欣赏的。学习
为了执行图像分类、人像模式摄影、文本预测以及其余几十项任务,智能手机须要使用技巧来快速,准确地运行神经网络,而无需使用太多的磁盘空间。优化
在这篇文章中,咱们将看到一些最强大的技术,使神经网络可以在手机上实时运行。编码
使神经网络变得更小更快的技术对象
基本上,咱们对三个指标感兴趣:模型的准确性、速度以及它在手机上占用的空间量。因为没有免费午饭这样的好事,因此咱们必须作出妥协。blog
对于大多数技术,咱们会密切关注咱们的指标并寻找咱们称之为饱和点的东西。这是一个指标的收益中止而其余指标损失的时刻。经过在饱和点以前保持优化值,咱们能够得到最佳值。
在这个例子中,咱们能够在不增长错误的状况下显着减小昂贵的操做次数。可是,在饱和点附近,错误变得过高而没法接受。
1.避免彻底链接的层
彻底链接的层是神经网络最多见的组成部分之一,它们曾经创造奇迹。然而,因为每一个神经元都链接到前一层的全部神经元,所以它们须要存储和更新众多参数。这对速度和磁盘空间是不利的。
卷积层是利用输入中的局部一致性(一般是图像)的层。每一个神经元再也不链接到前一层的全部神经元。这有助于在保持高精度的同时减小链接/重量的数量。
彻底链接层中的链接/权重比卷积层中多得多。
使用不多或没有彻底链接的层能够减小模型的大小,同时保持高精度。这能够提升速度和磁盘使用率。
在上面的配置中,具备1024个输入和512个输出的彻底链接层,这个彻底链接层大约有500k个参数。若是是具备相同特征和32个卷积层特征映射,那么它将只具备50K参数,这是一个10倍的改进!
2.减小通道数量和内核大小
这一步表明了模型复杂性和速度之间的一个很是直接的折衷。卷积层中有许多通道容许网络提取相关信息,但需付出代价。删除一些这样的功能是节省空间并使模型变得更快的简单方法。
咱们能够用卷积运算的接受域来作一样的事情。经过减少内核大小,卷积对本地模式的了解较少,但涉及的参数较少。
较小的接受区域/内核大小计算起来更便宜,但传达的信息较少。
在这两种状况下,经过查找饱和点来选择地图/内核大小的数量,以便精度不会下降太多。
3.优化缩减采样(Optimizing the downsampling)
对于固定数量的层和固定数量的池操做,神经网络能够表现得很是不一样。这来自于一个事实,即表示该数据以及计算量的依赖于在池操做完成:
· 当池化操做提前完成时,数据的维度会下降。越小的维度意味着网络处理速度越快,但意味着信息量越少,准确性越差。
· 当联网操做在网络后期完成时,大部分信息都会保留下来,从而具备很高的准确性。然而,这也意味着计算是在具备许多维度的对象上进行的,而且在计算上更昂贵。
· 在整个神经网络中均匀分布下采样做为一个经验有效的架构,并在准确性和速度之间提供了一个很好的平衡。
早期的池化速度很快,晚期的池化是准确的,均匀间隔的池化是有点二者。
4.修剪重量(Pruning the weights)
在训练完成的神经网络中,一些权重对神经元的激活起着强烈做用,而另外一些权重几乎不影响结果。尽管如此,咱们仍然对这些弱权重作一些计算。
修剪是彻底去除最小量级链接的过程,以便咱们能够跳过计算。这可能会下降了准确性,但使网络更轻、更快。咱们须要找到饱和点,以便尽量多地删除链接,而不会过多地损害准确性。
除去最薄弱的链接以节省计算时间和空间。
5.量化权重(Quantizing the weights)
为了将网络保存在磁盘上,咱们须要记录网络中每一个单一权重的值。这意味着为每一个参数保存一个浮点数,这表明了磁盘上占用的大量空间。做为参考,在C中,一个浮点占用4个字节,即32个比特。一个参数在数亿的网络(例如GoogLe-Net或VGG-16)能够轻松达到数百兆,这在移动设备上是不可接受的。
为了保持网络足迹尽量小,一种方法是经过量化它们来下降权重的分辨率。在这个过程当中,咱们改变了数字的表示形式,使其再也不可以取得任何价值,但至关受限于一部分数值。这使咱们只能存储一次量化值,而后参考网络的权重。
量化权重存储键而不是浮动。
咱们将再次经过查找饱和点来肯定要使用多少个值。更多的值意味着更高的准确性,但也是更大的储存空间。例如,经过使用256个量化值,每一个权重能够仅使用1个字节 即 8个比特来引用。与以前(32位)相比,咱们已将大小除以4!
6.编码模型的表示
咱们已经处理了关于权重的一些事情,可是咱们能够进一步改进网络!这个技巧依赖于权重不均匀分布的事实。一旦量化,咱们就没有相同数量的权值来承载每一个量化值。这意味着在咱们的模型表示中,一些引用会比其余引用更频繁地出现,咱们能够利用它!
霍夫曼编码是这个问题的完美解决方案。它经过将最小占用空间的密钥归属到最经常使用的值以及最小占用空间的值来实现。这有助于减少设备上模型的偏差,最好的结果是精度没有损失。
最频繁的符号仅使用1 位的空间,而最不频繁的使用3 位。这是由后者不多出如今表示中的事实所平衡的。
这个简单的技巧使咱们可以进一步缩小神经网络占用的空间,一般约为30%。
注意:量化和编码对于网络中的每一层都是不一样的,从而提供更大的灵活性
7.纠正准确度损失(Correctiong the accuracy loss)
使用咱们的技巧,咱们的神经网络已经变得很是粗糙了。咱们删除了弱链接(修剪),甚至改变了一些权重(量化)。虽然这使得网络超级轻巧,并且速度很是快,但其准确度并不是如此。
为了解决这个问题,咱们须要在每一步迭代地从新训练网络。这只是意味着在修剪或量化权重后,咱们须要再次训练网络,以便它可以适应变化并重复这个过程,直到权重中止变化太多。
结论
虽然智能手机不具有老式桌面计算机的磁盘空间、计算能力或电池寿命,但它们仍然是深度学习应用程序很是好的目标。借助少数技巧,并以几个百分点的精度为代价,如今能够在这些多功能手持设备上运行强大的神经网络。这为数以千计的激动人心的应用打开了大门。
阅读更多干货好文,请关注扫描如下二维码: