摘要:得益于GPU的快速计算,DNN在大量计算机视觉任务中取得了最先进的结果。但算法要落地就要求其能在低功耗的设备上也可以运行,即DNN的运行速度要更快,并且占用内存更少。这是我读的关于二值网络的第一篇文章,中心思路是在DNN的训练阶段用1bit的二值权重代替浮点数权重,可以将硬件的乘法操作简化为累加操作,可以大量节省存储空间,同时提高运行速度。
当前CNN网络主要的运算集中在实数权值乘以实数激活值或者实数权值乘以实数梯度。论文提出BinaryConnect将用于前向传播和后向传播计算的实数权值二值化为, 从而将这些乘法运算变为加减运算。这样即压缩了网络模型大小,又加快了速度。论文提到,SGD通过平均权重带来的梯度来得到一些小的带噪声的步长,尝试更新权重去搜索参数空间,因此这些梯度非常重要,要有足够的分辨率,sgd至少需要6—8bits的精度。如果对权重进行量化,就会导致无法对权重直接求导,所以我们可以把二值化权重看成是带噪声的权重。论文认为,带噪声的权重往往能够带来正则化,使得泛化能力更好,类似Dropout,DropCconnect这种就是对激活值或者权重加入了噪声,它们表明只要权重的期望值是高精度的,添加噪声往往是有益处的,所以对权重进行量化理论角度是可行的。
这篇论文的贡献如下:
这一节开始详细的介绍BinaryConnect,考虑选择哪两个值,如何离散化,如何训练以及如何进行推理。
DNN主要由卷积和矩阵乘法组成。因此,DNN的关键运算是乘加操作。BinaryConnect在传播期间将权重限制为+1或-1。因此,许多乘加操作被简单的加法(和减法)所取代。这是一个巨大的收益,因为定点加法器在内存和功耗方面比定点乘法累加器少得多。
二值化将float类型权重转换为两个值,一个非常简单直接的二值化操作基于符号函数:
其中是二值化权重,是实值权重。这是一个确定式的二值化操作,另外一种方案是随机二值化,即以一定的概率更新值:
其中
第二种方法比第一种方法更合理,但在实现时,每次生成随机数会非常耗时,所以一般使用第一种方法。
考虑使用SGD进行反向传播的更新。在这些步骤的每一步(前向传播,反向传播,参数更新) 中是否仍然行得通。BinaryConnect的一个关键是,我们只在前向和反向传播期间对权重进行二值化,而不是在参数更新期间进行二值化,如算法Algorithm1所示。在更新期间保持良好的精度的权重对SGD是必不可少的。原因如下:
另一方面,二值化相当于给权重和激活值添加了噪声,而这样的噪声具有正则化的作用,可以防止模型过拟合。
在这里插入图片描述
由于权重量化只取决于符号,浮点权重大于正负1对结果没影响,为了限制浮点权重不会增长太大以及提高正则性,使用clip函数将浮点权重限制在[-1,1]
。
这篇论文使用了BN层,不仅可以加速训练,还因为它减少了权重缩放的整体影响。使用ADAM算法优化。
在这里插入图片描述
如何前向推理,大致可以分为以下几种方法:
这篇论文使用了第3种方法,训练过程中用随机二值权重,测试时用浮点权重可以提升性能,证明了论文前面认为的带噪声的权重具有一定的正则性。在MNIST/CIFAR10/SVHN上的实验说明了这点:
注意,这里精度没掉(甚至提升)是因为用的浮点数模型测试,如果是直接用第一种方法即二值化weights来测试,精度会掉很多。
总结一下,这篇论文提出将浮点权重量化到1bit,提出了完整的量化权重训练/测试流程,并且从带噪声权重的角度来解释了量化权重。但这种方法还有一个缺点,即并没有对激活函数进行量化,所以后面BNN出现了,请看下节。
欢迎关注我的微信公众号GiantPandaCV,期待和你一起交流机器学习,深度学习,图像算法,优化技术,比赛及日常生活等。