如何让你的深度神经网络跑得更快

本文为 AI 研习社编译的技术博客,原标题 :Making Deep Neural Networks Faster

翻译 | 酱番梨、永恒如新的日常、灰灰在学习、康奈尔•斯摩

校对|酱番梨整理 | 菠萝妹

https://medium.com/@datafineass/compressing-and-accelerating-high-dimensional-neural-networks-6b501983c0c8

由于内存和计算能力有限,随着网络变得越来越深,对包括移动设备在内的有严格时延要求的有限资源平台而言,神经网络压缩就成为一个关键问题。就降低性能和加快深度网络之间达到平衡,引发了很多研究。本文将作为能够高效利用资源的深度网络的压缩、加速的引言介绍。

在本篇博文中,在某种程度上会包含下面的主题。为了你更好地理解所描述到的方法,建议你最好浏览原文(见文末的参考文献):

·剪枝和共享

·低秩分解

·紧凑卷积滤波器

·知识蒸馏

参数修剪和共享

剪枝:通过移除多余的或不想要的部分从而减少某物的长度

简单来说,剪枝就是移除对模型性能影响不大的参数。参数的冗余和稀疏特性对模型性能的影响甚微,而剪枝正好利用了这一特性。对剪枝技术可以进一步划分为三类:

量化和二进制化:量化就是将无限域的值转化为有限域离散值的过程。假设我们有一张灰度图像。量化(N级)就是将图像中的每个像素点的颜色用N份权重来表示。而二进制化只会给出图像的两个灰度级别(灰或非灰)。

网络量化通过减少表示每个权重所需的比特数来压缩原始网络。量化限制了可用于我们内核中的不同权重数目。对于N个比特位,可以表示2的N次方个权重。我们的目的是修改内核中的权重只能取2的N次方个值。因此,低于四个比特位参数量化虽然准确率没有受到很大损失,但却很难表示权重。

在测试过程中权重和激活受限于固定的精度

在训练过程中权重和激活受限于固定的精度

观察发现的好情况是,在训练过程中量化对准确率影响并不显著。可悲的是,量化就推理而言也没有任何学习的余地。

假设我们已经训练了一个32比特位的网络,并打算将它的权重量化为4比特位用作见小规模的后期处理步骤。再向前传递过程中,所有的核心权重会得到量化。但是一旦权重被量化,就会返回平的或为零的梯度值,这意味着我们的没有学习。为了在反向传播中避免这一问题,我们使用了STE(Straight Through Estimator)。STE并未修改顶端节点的量化值。接着再次进行前向传播和反向传播。

还有一些设计8比特位、4比特位、2比特位以及1比特位的优秀文章。查阅参考文献通过原文会进一步理解量化。

我很想谈谈二分神经网络,但是这里已经囊括了许多篇优秀的文章。

修剪和共享:一个众所周知的网络修剪和重量共享的的方法如下。

我们首先在网络中找中每层的标准差,以了解层的权重分布。

一旦我们知道分布的标准偏差,我们就通过阈值处理过程去除较低的权重。通过将层的标准偏差与修剪率相乘来获得实用的阈值。不同层的修剪率来自于大量的实验。

重新训练修剪过的网络在权重到达最佳精度前将其移出。

在权重共享的阶段,具有小差异的权重被代表值替换。这些代表值被称为质心值,其根据层的重量分布而变化。线性距离计算后获得的这些质心值将通过再训练才能将其确定。

修剪过后

权重分享

低秩矩阵分解

低秩矩阵分解的主要思想为通过揭示数据中存在的潜结构,我们可以得到数据的压缩表征。LRMF将原始矩阵分解为低阶矩阵,同时保留了潜在结构,解决了稀疏性问题。

在深度网络CNN中,卷积层通常有着非常密集的计算。因此,通过减少卷积运算的数量,可以压缩网络,增加整体加速。

LRMF的工作原理是假设存在某个张量高度冗余的4维的卷积核,我们可以通过分解来减少冗余,因此全连接层可以被看作为2-D张量。

LRMF方法已经存在相当长的一段时间了,但是由于张量的分解通常是一个计算量很大的任务,因此它们具有严重的局限性。另外,非常重要的一点是对于具有不同信息的不同层,LRMF中的现有技术方法是通过逐层低秩近似,该方法无法进行全局参数压缩。

紧凑型卷积滤波器

使用紧凑卷积滤波器可以直接降低相关的计算成本。这种压缩方法可以在保持相当精度的同时实现整体加速,关键是利用用紧凑型滤波器代替过参型滤波器。你可能听起来有点难以理解?可能你需要看一下下面的例子。

Squeezenet以小于50分之一的参数和不到0.5 MB的模型大小实现了和Alexnet相同级别的性能。就这么说吧,它比Alexnet要至少小了510倍。那么他们究竟用了什么方法呢?他们引入了“消防模块”作为CNN架构的构建模块。Squeezenet的设计策略大致可分为3个部分。

1、用1x1过滤器替换3x3过滤器。

2、减少3x3滤波器的输入通道数量。

3、在神经网络的后期降低采样采样,以便使卷积层可以进行大的激活映射。由于输出层具有小的激活映射,因此对神经网络过早的降低采样(通过使步长>1)将会导致一些信息的丢失。由于延迟降低采样,网络中的大多数层将具有更大的激活映射,这有助于提高的任务准确性,也同时保持了其他的所有层相等。

“消防模块”就像下图所示:

但我们只担心如何将3x3滤波器和输入通道分解成更小的卷积,从而形成一个更紧凑的网络,这在不但性能相同,而且速度也快的多,更重要的是内存比较便宜。

知识蒸馏

想象一下,将Kaggle或Imagenet的大型模型集合缩小为更小的模型,并且这些模型在运行时同样出色。来自谷歌研究团队的Hinton教授和Jeff Dean最近恰正在解决这个问题。一个类似的类比可以在教室中找到,教师就像是一个非常繁琐的模型,需要经过严格训练以达到标准,而学生则是较小的神经网络,从老师那里获得知识。本文旨在将知识从大型神经网络中提取或转移到一个小得多的神经网络中,该网络直接从输出的繁琐的模型中学习,但是部署起来却很轻松。为什么会有这么好的效果呢?当你使用繁琐的模型进行相同的训练,你不必担心过度拟合之类的事情,因为笨重的模型已经处理过了。这种方法运作良好的另一个原因是因为这种神经网络训练的是用“软”概率来训练繁琐模型的,而不是进行“硬”方法来训练目标的。例如,就像下图那样:

在这张有着建筑物做背景的汽车图片

当使用繁琐的模型进行“硬”目标训练就像这样:

汽车 - 1;人类 - 0;建筑 - 0;树 - 0;

另一方面,蒸馏模型是在“软”概率中进行运算如下:

车 - 约0.96;人 - 约0.00001;建筑物 - 约0.03;树木 - 约0.000002;

与笨重的模型相比,蒸馏模型显然有更多的“信息”需要学习。但它可能仍然无法学习建筑物的空间属性,因为只有0.03可能性可以从中学习,并且没有过多的增大梯度。

本文提出的解决该问题的一种解决方案是将输入softmax的输入(输出概率的输入)除以此处称为“温度”的数字。假设输入softmax的输入为[2,-2,-14,-10],除以温度(假设为5),进入softmax的新项为[0.4,-0.4,-2.8,-2]]。这将以一种方式改变繁琐模型的“软”输出概率,使得蒸馏模型更容易得知存在建筑物。在softmax之后,软概率看起来就像这样:

车 - 约0.67;人 - 约0.04;建筑物 - 约0.24;树木 - 约0.05;(假设)

然而,这些概率将在预测时影响蒸馏模型。因此,重要的是在预测期间将softmax输入恢复到其初始状态,方法是将它们与“温度”相乘。

这里的温度过参数可以随用户的习惯而改变。原始论文建议在大多数情况下用5作为初始温度。降低温度会将softmax输入推向其原始值(我们不会了识别筑物),而增加温度值会为我们的梯度增加更多干扰,因为softmax将为几乎所有类别输出更高的概率。

参考文献:

Distilling the Knowledge in a Neural Network (https://arxiv.org/abs/1503.02531)

SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and

Notes on Low-rank Matrix Factorization (https://arxiv.org/abs/1507.00333)

Minimum Energy Quantized Neural Networks (https://arxiv.org/abs/1711.00215)

Binarized Neural Networks: Training Deep Neural Networks with Weights and Activations Constrained to +1 or -1 (https://arxiv.org/abs/1602.02830)

A Survey of Model Compression and Acceleration for Deep Neural Networks (https://arxiv.org/abs/1710.09282)

Pruning Convolutional Neural Networks for Resource Efficient Inference (https://arxiv.org/abs/1611.06440)

Quantized Neural Networks: Training Neural Networks with Low Precision Weights and Activations (https://arxiv.org/abs/1609.07061)

Universal Deep Neural Network Compression (https://arxiv.org/abs/1802.02271)

想要继续查看该篇文章更多代码、链接和参考文献?

戳链接:

http://www.gair.link/page/TextTranslation/1095

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181015A1NCBO00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券