查看原文
其他

关于深度神经网络压缩(下) | “小声嘟囔”专栏

赵威 集智俱乐部 2019-09-14




赵威,华米科技算法工程师,中科院遥感与数字地球所博士。研究兴趣:深度学习,视觉目标识别,人体生物信号识别。


前 期 回 顾

关于深度神经网络压缩(上) | “小声嘟囔”专栏 

上半部分主要介绍了SqueezeNet[1]和 Deep Compression[2]两篇文章,前者主要思路是通过使用更小的卷积核(1*1)来设计网络架构,让参数数量变少;后者主要思路是通过网络剪枝、参数压缩让网络模型文件变小。


导    语

今天要分享的两篇文章则是探讨网络压缩的另一个重要方向:网络二值化,也就是用1bit的数去代替传统网络中的单精度浮点系数。二值化的系数大小是单精度浮点数值的1/32,也就是可以将网络压缩到原来的3%。其实我觉得二值化的神经网络与人脑应该更加相似,我们大脑中的每个神经元只能传导兴奋、抑制两种状态,而无法传导很精确的数值,所以虽然现在二值网络暂时比单精度网络性能略低,但我们完全有理由相信单精度网络能做到的,二值网络应该都能做到。

二值网络最早的突破是Matthieu于2015年11月发表的BinaryConnect[3],它实现了网络权重系数的二值化,但只能达到2倍的加速度。不过三个月后,Matthieu发表了BinaryNet [4],实现了权重系数和中间结果的二值化,由于中间结果的二值化,BinaryNet能够达到7倍的加速。之后,Mohammad改进BinaryNet的得到XNOR-Net[4],实现了输入数据、权重系数全部二值化,相比Alexnet,它能达到58倍的加速。


BinaryNet



1. 二值化

浮点型系数的二值化有两种思路,一种是根据系数的符号转换为+1/-1,如下:


 

第二种方法是按照根据浮点数算出一个概率p,按照这个概率将它变成+1/-1。

 

从数学上讲,概率转换更好,但是要去不断产生随机数,是很难实现的,所以文章还是用第一种方法进行二值化。


2. 训练时梯度计算与更新


BinaryNet其实并没有完全二值化,而是在训练时保持了一份浮点型的权重,在前向传播时,要先把浮点型权重二值化,然后再做卷积。

另一个问题是,Sign(x)函数的梯度都是零,那就无法用梯度下降法来训练网络了,所以文章用一个Hard tanh函数(图 1)来近似Sign(x)函数,这样反向传播时,就可以计算梯度了。

值得注意的是,既然前向传播时我们使用的是二值化权值,那么这里计算得到的梯度也是相对于的,但在做权值更新时,我们是对浮点型权值进行更新,这主要还是因为二值化权值很难做小幅的更新调整。

 

图 1 Sign函数与Htanh函数

3. 卷积计算的优化


在CNN网络中最主要的计算就是卷积 ,其本质来说是两个向量按位相乘后相加,而在二值网络中,权值矩阵和激活值都二值化后,卷积操作可以用简单的位操作来实现。

假设一个二值激活向量和一个二值权重向量做卷积,结果累加到,我们可以通过以下位操作实现:

 

其中popcount的是计算一串二进制中有多少个1,xnor就是对两个二进制串按位取异或,这样比逐个做乘法,再累加减少了大量计算。

BinaryNet的优势主要在于其预测时的速度快(在GPU上快了7倍),占用内存小(与32bit DNN相比,它的内存占用减少了32倍),内存访问是比计算耗能更大的操作,所以内存减小对能耗的降低非常显著。


XNOR-Net


Xnor-net其实和BinaryNet整体思路也是差不多的,只是在二值化上做得更加彻底,它将输入、权重、中间结果、反向传播梯度等全部二值化了,从而达到了更高的加速比,当然完全二值化后,性能降低了。


1. 二值化


与BinaryNet直接用符号将权值二值化为+1/-1,Xnor-net的做法略有不同,假设权重矩阵为,文章提出用一个标量和二值矩阵的乘积来近似,即通过简单推导(见论文),可以发现,也就是说二值矩阵可以由符号函数Sign得到,而标量系数可以由实值权重绝对值的平均值来近似。这是对权重矩阵的二值化,对输入数据二值化也是一样,假设输入数据,也可以将其近似为一个标量和二值矩阵的乘积,即,其中, 与BinaryNet相比,在二值化时加入了一个标量系数,表达能力是能够得到一些增加的。

图 2 是作者给出的上述二值化思路示意图,其中输入X的二值化有一些技巧,图中(2)是直接按照一个个卷积核的大小去对输入的每个数据块去计算标量系数,这样其实有很多的冗余计算,图中(3)是作者实际使用的快速做法,也就是先将输入的每个像素点所有通道(channel)值求平均,将三维输入转成二维矩阵A,然后在二维矩阵A上做局域平均来计算每个卷积区域的系数。最终效果是将卷积操作近似成计算成本低得多的二值操作与标量的乘法操作,如下式所示:

 

图 2 卷积层输入、权重二值化的思路图示

2. 其他优化

一般的CNN网络中,一个完整的卷积层是按照1)卷积,2)Batch Normalize,3)激活,4)池化这样的顺序进行的,然而对二值化后,每层的激活值都是二值的,对二值数组做MaxPool后,大部分值都会变成+1,这样数据信息就丢失了,所以XNOR-net做了个调整,将池化放在卷积之后,而把Batch Normalize用在输入数据上。不过个人感觉这样一个小的trick,似乎不太有什么好的理论支撑,通用性也有待验证。

 

图 3 XNOR-net与典型CNN网络中卷积层的顺序区别 

与BinaryNet一样,因为训练时,要采用随机梯度下降法,而符号函数会使得梯度消失,所以在训练时要使用一个实值的权重来做训练。 

通过二值化,原先的卷积操作中的乘法,都可以转换成二值位运算的异或操作和操作,这与BinaryNet思路也是一样的,只不过现在所有地方都二值化了,都可以这样优化计算了。

XNOR-net将Alexnet二值化后再Imagenet上做了分类实验,预测速度提升了58倍,但分类精度下降了超过10个点。

总结


总的来说,SqueezeNet、DeepCompression两篇文章讨论的思路更加清晰直接,效果非常好,也容易去重复实验;而BinaryNet和XnorNet这两篇文章讨论的网络二值化,其实还是有很大未知的方向,由于目前还缺乏比较好的二值网络底层框架,二值化后分类性能的降低,在不同网络架构上的可扩展性都还有很大问题,所以网络二值化在学术界还没有受到非常大的重视,不过从工业界的角度来考虑,网络二值化所能带来的价值是非常重大的,目前很多公司都已经在投入资源研发深度学习芯片,相信不久的将来二值化神经网络会和深度学习芯片一道成熟起来。


参考文献

[1]. Iandola F N, Moskewicz M W, Ashraf K, et al. SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and< 1MB model size[J]. arXiv preprint arXiv:1602.07360, 2016.

[2]. Han S, Mao H, Dally W J. Deep compression: Compressing deep neural network with pruning, trained quantization and huffman coding[J]. CoRR, abs/1510.00149, 2015, 2.

[3]. Courbariaux M, Bengio Y, David J P. Binaryconnect: Training deep neural networks with binary weights during propagations[C]//Advances in Neural Information Processing Systems. 2015: 3123-3131.

[4]. Courbariaux M, Bengio Y. Binarynet: Training deep neural networks with weights and activations constrained to+ 1 or-1[J]. arXiv preprint arXiv:1602.02830, 2016.

[5]. Rastegari M, Ordonez V, Redmon J, et al. XNOR-Net: ImageNet Classification Using Binary Convolutional Neural Networks[J]. arXiv preprint arXiv:1603.05279, 2016.

 


-  END -




集智俱乐部


英文名: Swarm Agents Club ,简称“ SA Club ”,成立于 2008 年 , 是一个从事学术研究、享受科学乐趣的探索者的团体 。它倡导以平等开放的态度、科学实证的精神,进行跨学科的研究与交流,力图搭建一个中国的 “ 没有围墙的研究所 ”。

集智俱乐部的口号:

让苹果砸得更猛烈些吧!!!

集智俱乐部的使命(即目标):

营造自由交流学术思想的小生境,

 孕育开创性的科学发现。

集智每周精品推荐

集智Superfit AI圣诞晚会,让你的圣诞快乐再飞一会儿!

深度学习与自然语言处理

深度学习在自然语言处理中的应用 


让苹果砸得更猛烈些吧!


长按识别二维码,关注集智Club,

让我们离科学探索更近一步。

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存