date: 2020/02/16

孤身 - 徐秉龙 :“我总是一个人 从午夜到清晨” 


最近号称达到MobileNet水平的二值网络MeliusNet面世,趁这个机会顺便梳理一下二值量化的发展历程吧。

早期二值化大多从已有的成熟网络如AlexNet、VGG、ResNet等直接转换而来,而且必须重新训练,提速明显但准确率下降通常也很明显。后来研究者渐渐觉得是信息不流通的缘故,于是就模仿DenseNet等网络增加信息流,并且为二值量化专门设计特殊的网络结构。


参考:


二值网络推理框架:


BNN

算是开山之作,同时二值化了权重和激活,但精度挺低,只在MNIST跟CIFAR10上做了些实验。

论文:《Binarized Neural Networks(NIPS2016)

参考:《二值神经网络(Binary Neural Network,BNN) | CSDN, 张雨石

实现:https://github.com/itayhubara/BinaryNet.pytorch


二值化形式

BNN提出了两种二值化形式,一种是决策形式,一种是随机形式。


移位实现的BN层

为参数找到最接近的近似值,把乘法运算简化为位移运算

image.png


训练细节


优点


XNOR-Net

与BNN相似,加入了额外的缩放因子,问题讨论也比BNN更加详尽。

论文:《XNOR-Net: ImageNet Classification Using Binary Convolutional Neural Networks (ECCV2016)

参考:《XNOR-Net算法详解 | CSDN, AI之路

实现:https://github.com/jiecaoyu/XNOR-Net-PyTorch


image.png

(据说~58x的加速比有问题)


image.png

(XNOR-Net卷积过程图示,源自BiRealNet论文)


二值化权重

将权重二值化为+1和-1,同时和常规的线性量化一样保留一个缩放因子,即

其中,是浮点数权重,是一个浮点数,是二值权重。

卷积操作可以近似为

其中,是输入特征图,代表只包含加减法的卷积运算。

,整层权重共享一个

证明如下:

为了最小化二值化之后的误差,可以定义损失函数并得到优化目标

展开损失函数

又因为只包含+1和-1,已知的情况下只是一个常量,那么可以简化为

,显然


二值化权重和激活

image.png

二值化的方式不变,依旧是,权重的缩放因子也依旧为

同理也可推导出,其中分别是输入的第i个tile及其量化的缩放因子(如上图(2));


输入的二值化过程中计算有很多中间结果没有得到有效复用,于是作者又提出了更为高效的方式(如上图(3))

  1. 先沿通道方向求取平均,将输入特征图拍平成
  2. 然后用进行卷积,是一个跟实际卷积核尺寸相当的核,其元素均为(如做3x3卷积,那)——其实就是一个stride=1的平均池化。最终出来的上的元素就是输出特征图上每一位置对应的


实际卷积的时候就如上图(4)所示,image.png

image.png代表同或和计位,image.png代表对应位相乘。


由于在卷积和激活阶段进行二值化,传统CNN上的BN层和池化层会出现一些问题,所以需要稍微调整一下顺序:

image.png

注意图中只有 BinActiv->BinConv 中间的数据是二值的,其他数据都是浮点数



暂不展开介绍

WRPN 和 Shen et al. 通过提升卷积层通道数的方式来提升 BNN 的精度,即让 BNN 变得更宽。但是这样的方法很大程度上增加了运算复杂度,欠缺模型效果和计算复杂度上的平衡,实用性比较差。


ABC-Net 和 GroupNet 是另一种提升 BNN 准确率的代表性方法。它们认为单个权重与激活值信息量不够,如果多学习几组,并取线性加权来逼近全精度输出,那么效果应该是足够的。这类方法计算复杂度太高,准确率是上去了,但速度优势也没了。



Bi-RealNet

XNOR-Net的改进版。

论文:《Bi-Real Net: Enhancing the Performance of 1-bit CNNs with Improved Representational Capability and Advanced Training Algorithm (ECCV2018)

参考:《Bi-Real Net——XNOR-net的增强与演进(Binary Neural Network) | CSDN, Law-Yao

实现(这pytorch代码有点丑啊)https://github.com/liuzechun/Bi-Real-net

主要贡献:

  1. 借鉴ResNet的shortcut,为每个卷积层引入shortcut加强信息的流动,提高特征表达能力
  2. 改造STE,用更平滑的曲线近似sign函数来估计梯度
  3. 改造参数更新规则,使得梯度与参数大小相关,加速训练过程
  4. 优化预训练步骤,在预训练期间用clip(-1,1)替代ReLU


卷积层shortcut

image.png

image.png

(左:不带shortcut,右:带shortcut)


假设输入特征图尺寸为


二值化近似函数

为了估计梯度,BNN和XNOR-Net采用的二值化近似函数比较简单,导数也只有0和1,信息较为贫乏;BiRealNet采用二次函数来更好的近似二值化sign函数,进一步减小偏差。

image.png

(Sign vs. Clip vs. ApproxSign)



幅度感知的参数更新

训练时,关于二值权重的梯度通常比较小,存在参数更新缓慢的问题。为了解决这个问题,BiRealNet引入了幅度感知的参数更新规则加速训练过程。


原始的二值化函数是简单的

新的二值化函数引入了幅度信息

其中,分别是第t次迭代下第l层卷积的实数权重和二值权重


原文似乎没有细说是啥,开源代码里则是用了该层卷积的实数参数的各滤波器均值(参考#L50-L54

在实际预测时,依旧应用sign函数进行二值化,而这个因子可以融合到后续BN层的参数中去


预训练时用clip替代ReLU激活

考虑到权重是二值化为+1和-1,而不是0和1,用ReLU来激活就显得不那么合理,作者用clip(-1,1)替代了ReLU来做激活函数,用clip激活来预训练也得到明显的提升。


BinaryDenseNet

借鉴ResNetE、DenseNet进一步改进Bi-RealNet。

论文:《BinaryDenseNet: Developing an Architecture for Binary Neural Networks (ICCV2019)


image.png

(ResNet vs. ResNetE)


image.png

(DenseNet vs. BinaryDenseNet)


  1. 短连接通过拼接的形式融合特征(ResNet则是相加)
  2. bottleneck会限制信息的流通,作者建议不要用bottleneck,直接用一层比较窄的3x3卷积
  3. 作者发现下采样路径二值化也会带来比较大的负面影响,所以建议
    (DenseNet里将如上图d、e下采样部分称为过渡层transition layer
    1. 过渡层不二值化,通道收缩依旧一半
    2. 过渡层二值化,但减缓通道收缩的速度,第一个过渡层不收缩,第二、三个过渡层分别收缩1.4倍
  1. 除了下采样的卷积,第一层卷积和最后一层全连接也不进行二值化
  2. 将DenseNet的 ReLU->1x1Conv->2x2AvgPool 过渡层改造为计算量更小的 2x2MaxPool->ReLU->1x1Conv 


MeliusNet

进一步改进BinaryDenseNet。

论文:《MeliusNet: Can Binary Neural Networks Achieve MobileNet-level Accuracy? (2020.01)

参考:《第一次胜过MobileNet的二值神经网络,-1与+1的三年艰苦跋涉 | 机器之心


基础模块和网络设计

image.png

(MeliusNet的基本block)


基础模块由DenseBlock和ImprovementBlock组成,


image.png

(完整模型,naive版本)


其他改进和细节

  1. 第一层卷积不二值化。用三个3x3卷积替代initial layers的7x7卷积,第一个卷积下采样,第二和第三个卷积分别用 g=4 和 g=8 的分组卷积,由此将计算量从118MFLOPS下降为69MFLOPS

image.png

  1. 过渡层的1x1卷积不二值化。但都改用分组卷积,取 g=2 或 g=4 同时配合shuffnet的通道混洗使用
  2. 最后一层全连接层也不二值化
  3. BiRealNet的二值化近似函数似乎没有提升,所以作者依旧采用了原来的hard tanh来近似
  4. XNOR-Net和BiRealNet在二值化时都有一个缩放因子,但这个因子是可以被BN层取代的,所以没啥必要,所以作者也没有用这个缩放因子,而是跟最初的BNN一样直接进行二值化处理


实验结果

image.png

image.png

(MeliusNet的准确率达到了MobileNetv1的水平)

BiRealNet、BinaryDenseNet、MeliusNet都只提供理论的加速效果(比较operations数量)而没有实测数据。