XNOR-Net论文理解

本人基本属于网络压缩领域的小白,而且由于任务需要,故研读了文章XNOR-Net: ImageNet Classification Using BinaryConvolutional Neural Networks。如有问题,望相互告知,相互学习。

本篇文章是在Binary-weight-network(BWN)和BinaryConnect(BC)两篇文章基础上做出改进。主要改进有两点:

1.在对权重进行{-1,+1}量化的同时,加入了尺度因子α;

2.除了对权重进行量化,还对特征值进行了量化,同样引入了尺度因子β,不过β因子重要性不及α。


首先通过文章第一幅图来大致说明量化为何能够压缩和加速网络:

Fig1

(1)压缩体现在:将多比特的浮点数用低比特的数表示,节省内存;

(2)加速体现在:

i.先看图片第一行,由于参数都是浮点数,所以进行卷积操作时先进行元素之间的乘法,再进行加减。乘法的运算量是远大于加减法的;

ii.接着看图片第二行,由于权重都已经量化成了{-1,+1},输入和量化权重进行卷积实际就变成输入参数之间的加减了,运算速度加快了,但因为输入还是浮点数, 所以运算速度还是不够快。这部分实际就是文章所说的Binary-Weight-Networks 

iii.如果我把输入也量化成{-1,+1}呢,那就是二进制矩阵之间的卷积了,可以直接采用二进制运算(XNOR,bitcount)来代替上一步的加减运算了。这就是文章所提的XNOR-Networks的目的。


我们直接来说文章的方法原理。这篇文章的基本思想是量化后的 参数  和量化之前的相似。

Ps:有些量化的基本思想是结果和原来一致的,有兴趣可以看看Extremely Low Bit Neural Network: Squeeze the Last Bit Out with ADMM

Binary-Weight-Networks 

 I 代表某层的输入,W 代表某层的权重,此处我们希望把权重量化成矩阵 B ∈ {-1,+1} 和一个尺度因子α的乘积,即

和之前所说,权重量化后的卷积操作中的加减乘法操作只剩矩阵之间的加减法操作和矩阵与α之间的乘法操作

Estimating binary weights:现在目的已经很明确:如何确定一个最佳的量化矩阵。其中W是确定的,α和B是变量,可得到下列关系式,采用了L2范数:

PS:这里的W是指一个卷积核,α也是该卷积核对应的尺度因子。比如某一层的权重为(output_channel,input_channel,w,h),output_channel为该层的卷积核个数,(input_channel,w,h)为输入的形状(此处省略batch_size这一维度),那么最终会得到output_channel个α,所以α实际也是一个矩阵

将公式展开后为

由于B  ∈ {-1,+1},所以BTB = n ,n = channel * w * h ,为权重矩阵的元素个数,同时,权重W在此也是已知参数,故令WTW = c。所以公式变为

c 这个变量在求导中可以忽略,采用中学最常用的交替求导法则——>B动α不动,α动B不动可以得到以下公式

B动α不动

B  ∈ {-1,+1},所以当Wi ≥ 0时Bi = 1 ,Wi < 0 时Bi = -1 会得到最优解。即 B* = sign(W)

同理,α动B不动可得下式

把B*代入

Training Binary-Weights-Networks:大概公式说明完毕了,下面大概说明一下训练过程,具体细节建议去看代码。

训练主要遵循以下公式:

即反向更新时是在原权重基础上更新的,但梯度是由量化后的权重求得的,具体原因论文解释如下:

For updating the parameters, weuse the high precision (real-value) weights. Because, in gradient descend the parameterchanges are tiny, binarization after updating the parameters ignores these changes andthe training objective can not be improved.

大概意思就是权重每次更新就那么一点儿,如果是在量化矩阵基础上更新,下次训练时又把权重量化,就比如说反向更新后量化的矩阵好不容易不再是二值的了,结果你这一波量化操作又把矩阵打回原形,白反向更新了。所以还是在原权重上更新吧(○’ω’○)

下面贴一下更新步骤

两个for循环把矩阵量化了,同时还偷偷保留了一份未量化的权重(原始权重),先用量化后的权重得到loss,反向传播时得到的实际时对量化权重的梯度,再通过上述所说的公式

把梯度换成原始权重应该更新的权重,然后使用SGD或这Adam优化算法去更新原始权重。下次epoch时又再把权重量化,不断重复以上步骤。


权重量化完成后,我们再试试把输入也量化一波

XNOR-Networks 

看论文你会发现这一步不再使用I * W这个公式,而是换成了Binary Dot Product操作

PS: X⊙W = XTW

我们知道输入和权重的卷积 I * W 实际上就是卷积核在输入矩阵中不断移动,这里的X实际就是指左图的橙色部分,W就是右边粉色矩阵

PS:上图出处https://www.cnblogs.com/alexcai/p/5506806.html

为什么突然换作X而不是I了呢?个人理解是,按照之前所说的参数相似原则,那么就是要两个矩阵对应元素都尽量相近,这样才能使两个矩阵相似。实际上

Binary-Weight-Networks那部分公式中的L2范数的作用就是这样。因此这里才把I * W 的卷积操作换成L2范数能够作用的操作: X⊙W.但这一步也会引入重复计算的

问题,我们会在下面细说。


我们先按程序求解最优解,和Binary-Weight-Networks 部分的求解公式差不多,观察公式,我们可以作以下操作

令Yi = XiWi     ,  Ci = HiBi  ,γ = βα,则

由于X和W是独立的,所以容易求解得

下面我们开始讨论以下重复计算的问题,先贴一幅论文里的图

第二行就是说明重复计算的问题,因为卷积核的stride一般为1,这样实际上两次位移对应位置的X有很大一部分是重叠的,而我们又需要求每个X的平均值,这实际上进行了许多重复求平均操作。此处再说明一下,求平均是指对三个维度——channel,w,h一起求平均(见公式中的 1/n )

原算法是先算出每个位置(X)的β和H,但实际上H矩阵就是对原矩阵进行sign操作而已,根本没必要对每个位置(X)求对应的H,直接对输入 I 实际上是一个更为简洁的做法 。既然如此,何不直接先算出每个位置对应的β,形成一个β矩阵,然后β矩阵和sign( I )就代表输入的量化了。

论文是这样求β矩阵矩阵的,由于    β = (1 / n)* || X ||(X的L1范数) ,所以先把输入绝对值化,在channel这一维求平均,得到A矩阵

然后再对A矩阵用k滤波器进行均值滤波,

A矩阵和均值滤波器k 卷积 A矩阵均值滤波后得到K矩阵,K矩阵的每个元素实际就是每个位置(X)对应的β,具体实现看上图第三行。因此可以得到最终公式,该公式可以参考上图第四行


在知道具体的量化法则后,论文还提到,为了尽量防止信息丢失,需要对网络结果进行调整

PS:特征值量化实际就是使用新的Activ函数,即把原来的激活函数(relu,sigmoid)换成sign函数。

Applying pooling on binary input results in significant loss of information. For example,max-pooling on binary input returns a tensor that most of its elements are equal to+1. Therefore, we put the pooling layer after the convolution. To further decrease theinformation loss due to binarization, we normalize the input before binarization.

当你把输入量化成{-1,+1}时,再进行pooling操作会丢失许多信息。比如采用maxpooling,那么pooling后的结果大多为 +1 ,因此作者把pooling层放到卷积层后。为了进一步防止信息 因为量化 丢失,作者又把BN层放到BinActiv层前


实验结果:

一、压缩和加速效果:由于仅仅使用-1,+1以及尺度因子,因此压缩和加速效果还是有保障的

二、在ImageNet数据库上和其他算法的对比,full-precision代表原始准确率

三、在对resnet-18进行量化后的结果对比

四、补充

上面部分花了很大篇幅去求β矩阵,但是作者实验发现,其实没有β因子,对结果影响不大,所以,代码压根没算β矩阵 ,我还能说什么  ʅ(´◔౪◔)ʃ  


个人感想:

1.尺度因子的提出应该是一个比较中肯的方法,即牺牲一丢丢的内存和速度可能会带来不错的精度,个人也比较看好这个方法;

2.这篇文章的优势可以说是{-1,+1}的二值化方法了,目前我只想到只有这种量化方法可以粗暴地把加减乘法变成只剩加减法,最多像三值网络那样加一个“0”变成 {-1,0,+1};

3.也许是加了特征值量化这个操作,在精度实验对比方面Xnor-Net并没有什么优势;

4.总的来说我还是挺喜欢这篇文章的,简单粗暴的方法,却透露出一种暴力美学

 ヘ( ̄ω ̄ヘ)♪

你可能感兴趣的:(XNOR-Net论文理解)