BNN网络量化与8bit量化之间关系

Binarized Neural Networks(BNN)与8bit量化

BNN网络利用二值化的方法,将权重与激活函数都进行了改变,为了可以达到更高的速度和更小的存储空间。但是这种量化方法与8bit的方法相比是颠覆性的,因为8bit量化可以认为是把信息变得粗糙了不精确了,但是这种二值化的方法可以说是把信息进行了极端的抽象化处理。这种大量的信息丧失必然带来了效果的大幅度下降,但是时间和空间上也得到了很好的简化。下面我们通过研究BNN这篇论文比较一下它与8bit方法上有哪些相通的地方,又有那些不同。论文链接在此https://arxiv.org/abs/1602.02830

权重与激活值的量化

权重的量化很简单,直接进行了二值化处理,毕竟只有一个bit,正的对应正的,负的对应负的。不过作者实际上是提出了两种方法,一种方法是直接利用符号函数Sign(x)进行量化,另一种则是统计法,从概率的角度,即生成期望如下的两点分布
在这里插入图片描述
由于产生随机数并不是一件很容易的事情,是需要占用一定的时间的。因此原文决定采用直接符号函数进行量化的方法。
此时对比一下8bit量化时的方法,注意到有两个不同
1.直接利用符号函数进行量化是不需要计算clip的
2.8bit量化后还是要采用激活函数RELU的,但是在BNN中,量化的过程本身就带有了激活函数的非线性性质,甚至比激活函数抑制丢掉信息更为明显。
因为我认为,这里与其说是1bit量化,不如说是改变了激活函数,改变了非线性的方式。一个BNN网络不可能通过原先的一个训练好的浮点网络量化而来,只能重新训练得到,可以说BNN网络中的信息与原先浮点网络毫无关系,是另起炉灶。而8bit量化则是对浮点网络的一种粗糙化简洁化处理,根还在那里。

梯度传播

由于利用了sign函数作为激活函数,符号函数的导数在非零处始终为零,这是无法进行梯度的反向传播的。作者采取了straight-through estimator的方法,也就是说,当计算反向的时候,求梯度时利用函数Htan代替原先的sign函数,并且利用浮点运算,将权重值限定在-1到1之间。但是前向传播的时候又要用sign函数对这个权重进行量化。也就是说,W的变化不是一蹴而就的,是一个连续缓慢变化的过程,但是当利用其计算时体现的却只有-1和1两个数。
可以说BNN中的梯度传播是十分巧妙地,与8bit量化训练结束后量化不同,这种反向传播的方法是动态变化的,也就是利用量化后模型计算前向传播,反向传播修正的模型确是量化前的浮点模型。这是一个值得借鉴的思路!

BN

为了降低计算量,BNN采用了SBN(shift-based batch normalization)的技术,作者表示利用这个方法对于准确率是没有能看得出来的影响。算法是将计算得到的与均值之差近似到了2的次方上,因此就可以利用移位代替乘除法,大大提高了速度。
可以注意到其中的apx variance这一步,是将平方的计算改成了把C(x)移位,也就是C(x)乘以与之最相近的2的此房得到方差,之后的除法乘法也都是利用这个方法。本人对于文章中所说的对准确率影响不大是比较怀疑的。还有一个令我不解的是这个算法中好像没有考虑BN时的β参数。
在这里插入图片描述
与8bit的BN处理方法进行比较,可以发现。BNN中的BN是把计算过程进行简化以降低复杂度提高运算速度,而8bit量化时利用了BN融合将卷积操作与BN操作融为一体,实质上只是计算的结合律,而并没有对运算的方法与参数进行近似。

优化器

由于ADAM优化器采用了较多的乘法,作者建议采用Shift based AdaMax的优化方法,也就是把ADAM中尽可能的使用移位运算以加速,利用合适的方法确定超参数α与β,使计算时所用的整体是2的次方,就可以加速运算。其本质还是ADAM优化器。
在这里插入图片描述
在我看来,这确实可以加速,但是这样超参数的设定未免太过于局限。我认为,轻量级网络首先要保证的是前向传播的速度与准确率,至于训练的速度快慢其实是次要的。因为我认为这个并不是有很大的价值。

第一层

这个处理是比较巧妙的。因为图像的输入都是8bit,将这8bit拆成8个二进制组合,然后对于每一位与权重进行同或运算,再进行这一位相应的位移。这可以大大的降低运算量并且保证精度不发生损失。将权重的二值化特点与图像输入数据8bit的特点结合起来了,非常的精妙!

乘加操作替换为同或

卷积操作的实质是先乘后加,而由于此时权重与输入矩阵均为-1与1两个值组成(除了第一层),因此可以使用同或运算代替乘法计算,因为这两个计算结果是对应上的!然后只需要记录1的个数就可以知道结果是-1还是1了。这种运算方式非常适合于硬件,可以大大减少计算速度,这也是二值化网络最为重要的优势。这个方法在8bit量化是无法使用的。

卷积核重复

这个巧妙地方法也只适用于二值化网络。因为在二值化网络中,一个卷积核的可能情况是很少的。比如3x3的卷积核,只有$一共512个组合方式,重复是很容易出现的。出现重复的卷积核或者+1和-1完全颠倒的卷积核,是可以把之前计算结果拿过来直接用的进而减少运算。不过这个具体的实现我还是很好奇的,感觉匹配并不是一个很简单的事情。

遇到的问题

1.popcount与xnor一起使用,但是popcount计算之后是不是还得看比例是多少才能确定之后是1还是-1呢。比如得到了5个-1和4个1,popcount的值是4吗?那这样的话,还需要与整体求和的个数9进行比较才能得到最终结果应为-1。
2.原文中1.2梯度累计那里的噪声与自带正则化没看明白。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值