作者‖ Cocoon
编辑‖ 3D视觉开发者社区

导语:

本文是由香港科技大学发布于ECCV 2020的论文,是Bi-Real Net作者对二值化研究领域的最新成果,拥有着69.4%的精度,作者通过简单的优化激活函数的操作改进便取得了惊人的效果,本文将详细解读ReActNet的具体方法。

论文链接: https://arxiv.org/pdf/2003.03488.pdf

代码地址: https://github.com/liuzechun/ReActNet

概述

通常认为的二值神经网络,指模型权重以及激活值均为二进制数值的模型,被认为是最有前途的神经网络压缩方法之一。但显然,二值的表达与浮点数的表达存在着差距,而本篇所介绍的ReActNetReActNetReActNet,其目的就是希望在不引入额外计算开销的前提下,能够缩小这之间的差距。

论文首先构建了一个BaselineBaselineBaseline网络,具体的构建方式为使用不引入参数的shortcutshortcutshortcut修改某一浮点数网络,并将其二值化。该BaselineBaselineBaseline网络在精度和效率上有较好的tradetradetrade-offoffoff,比大多数已有的二值网络效果都要好。

通过大量的实验,文章发现,二值网络的性能对激活函数的分布非常敏感。基于该发现,文章提出将传统的SignSignSign以及PReLUPReLUPReLU函数进行“推广”,并将“推广”后的函数分别命名为RSignRSignRSign以及RPReLURPReLURPReLU,这样做的目的是希望在不引入额外计算开销的前提下,显式地学习分布的“reshapereshapereshape”和“shiftshiftshift”。

最后,文章提出了所谓的“DistributionalLossDistributional LossDistributionalLoss”来进一步地对二值网络进行强化,目的是使其与浮点数网络学到近似的输出分布。

合并了上述想法后所攒出来的网络即命名为ReActNetReActNetReActNet,其性能远超出当时已有的二值网络。

方法

一比特卷积

对于权重已经一比特化的卷积层来说,其乘法运算可以被按位运算XNORXNORXNOR以及popcounpopcounpopcount操作替换,具体为:
Xb∗Wb=popcount⁡(XNOR⁡(Xb,Wb))\mathcal{X}_{b} * \mathcal{W}_{b}=\operatorname{popcount}\left(\operatorname{XNOR}\left(\mathcal{X}_{b}, \mathcal{W}_{b}\right)\right) Xb​∗Wb​=popcount(XNOR(Xb​,Wb​))

其中Wb\mathcal{W_b}Wb​以及Xb\mathcal{X_b}Xb​分别表示二值权重矩阵以及二值激活。具体地,权重和激活通过以下的方式进行二值化:
xb=Sign⁡(xr)={+1,if xr>0−1,if xr≤0,wb=∥Wr∥l1nSign⁡(wr)={+∥Wr∥l1∥,if wr>0−∥Wrn∥l1n,if wr≤0x_{b}=\operatorname{Sign}\left(x_{r}\right)=\left\{\begin{array}{l} +1, \text { if } x_{r}>0 \\ -1, \text { if } x_{r} \leq 0 \end{array}, \quad w_{b}=\frac{\left\|\mathcal{W}_{r}\right\|_{l 1}}{n} \operatorname{Sign}\left(w_{r}\right)=\left\{\begin{array}{l} +\frac{\left\|\mathcal{W}_{r}\right\|_{l 1}}{\|}, \text { if } w_{r}>0 \\ -\frac{\left\|\mathcal{W}_{r}^{n}\right\|_{l 1}}{n}, \text { if } w_{r} \leq 0 \end{array}\right.\right. xb​=Sign(xr​)={+1, if xr​>0−1, if xr​≤0​,wb​=n∥Wr​∥l1​​Sign(wr​)={+∥∥Wr​∥l1​​, if wr​>0−n∥Wrn​∥l1​​, if wr​≤0​
其中,下标bbb和下标rrr分别指代二值和浮点数。∥Wr∥l1n\frac{\left\| \mathcal{W}_{r}\right\|_{l 1}}{n}n∥Wr​∥l1​​表示权重绝对值的平均值,其作用为作为尺度因子减少浮点数与二值之间的差距,在XNOR−NetXNOR-NetXNOR−Net(Rastegari 等,2016)中,也应用了类似的尺度因子。然而,随着后续所谓的ReActReActReAct操作的引入,这个尺度因子将变得不再重要。

Baseline网络

许多二值化工作选择的浮点数网络是ResNetResNetResNet,然而,该论文认为对更为紧实的轻量级网络进行二值化更具有实际意义,因此选择了MobileNetV1MobileNet V1MobileNetV1网络结构作为浮点数网络。受Bi−RealBi-RealBi−Real网络(Liu等,2018)的启发,论文也加入一些shortcutshortcutshortcut,而且将在MobileNetV1MobileNetV1MobileNetV1中的3∗33*33∗3的逐深度卷积以及1∗11 *11∗1的逐点卷积块替换成了$3 *3 $和1∗11 * 11∗1的普通卷积,且并行地加入了shortcutshortcutshortcut, 示意图如下所示:


此外,还提出了一个新的结构来处理下采样的操作,文章希望能够在不增加额外开销的情况下进行处理。然而,文章需要输入与输出的通道数是一致的,这样才能够在不引入额外的浮点数矩阵乘法的前提下进行二值化,且只使用一个简单的identityidentityidentity shortcutshortcutshortcut进行激活的传播。

正如上图中的左图所示,复制了输入通道,将两个具有相同输入的blockblockblock进行concatconcatconcat进而解决掉输入输出通道数不一致的问题,且在shortcutshortcutshortcut过程中使用平均池化的操作来进行空间上的下采样。在BaselineBaselineBaseline中,除了第一层和最后输出的全连接层以外,都是一比特的,这样的架构设计是硬件友好的。

ReActNet

图像分类的神经网络本质是学习一个从输入图像到输出分布的映射关系。因此,文章认为一个性能良好的二值神经网络就应该学到和浮点数网络相似的输出分布。但是,二值网络的离散性限制了其像浮点数网络那样学习复杂分布的能力。为了解决这个问题,XNOR−NetXNOR-NetXNOR−Net提出计算尺度缩放因子,并将其与激活相乘的方案,其后续的工作进一步地提出了如何通过反向传播进行这些因子的更新。

与XNOR−NetXNOR-NetXNOR−Net不同,文章着重研究了激活分布,并且发现,激活分布的微小变化会极大地影响一比特CNNCNNCNN的语义特征表达。但是反过来讲,一比特的CNNCNNCNN学习分布的能力本来就有限,为了解决这样的问题,文章引入了广义的激活函数(generalizedgeneralizedgeneralized activationactivationactivation functionsfunctionsfunctions),所谓的广义激活有着可学习的系数,进而提高一比特CNNCNNCNN学习分布的能力。

分布对于一比特CNNCNNCNN的重要性

在浮点数网络中,似乎不那么关注分布,这是因为激活都是连续的浮点数,对它们来说,reshapereshapereshape或者shiftshiftshift分布并不费力气。然而,对于一比特的CNNCNNCNN来说,激活只能够选择111或−1-1−1两个值,如果输入的特征分布有一点偏移,很可能会导致特征图受到巨大的影响,如下图所示:

一比特的CNNCNNCNN显然不像浮点数的CNNCNNCNN那样对特征信息具备鲁棒性,输入特征的一点变化会导致特征引入过多不必要的背景信息或过少的特征信息,进而使得BNNBNNBNN的识别负担加大。

广义激活函数

基于以上的观察,我们提出了一个ReActReActReAct操作,目的是显式地reshapereshapereshape或shiftshiftshift激活的分布。ReActReActReAct操作将传统的SignSignSign以及PReLUPReLUPReLU广义化,分别命名为ReAct−SignReAct-SignReAct−Sign以及ReAct−PReLUReAct-PReLUReAct−PReLU,以下将简称为RSignRSignRSign和RPReLURPReLURPReLU。

实际上,RSignRSignRSign相对于SignSignSign来说,有着逐通道的可学习阈值,具体为:
xib=h(xir)={+1,if xir>αi−1,if xir≤αix_{i}^{b}=h\left(x_{i}^{r}\right)= \begin{cases}+1, & \text { if } x_{i}^{r}>\alpha_{i} \\ -1, & \text { if } x_{i}^{r} \leq \alpha_{i}\end{cases} xib​=h(xir​)={+1,−1,​ if xir​>αi​ if xir​≤αi​​
其中下标iii表示不同的通道。

类似地,RPReLURPReLURPReLU的定义为:
f(xi)={xi−γi+ζi,if xi>γiβi(xi−γi)+ζi,if xi≤γif\left(x_{i}\right)= \begin{cases}x_{i}-\gamma_{i}+\zeta_{i}, & \text { if } x_{i}>\gamma_{i} \\ \beta_{i}\left(x_{i}-\gamma_{i}\right)+\zeta_{i}, & \text { if } x_{i} \leq \gamma_{i}\end{cases} f(xi​)={xi​−γi​+ζi​,βi​(xi​−γi​)+ζi​,​ if xi​>γi​ if xi​≤γi​​

其中,γi\gamma_iγi​以及ζi\zeta_iζi​都是可学习的参数,用来控制原先的PReLUPReLUPReLU的形状变化,下标iii也是指不同的通道数。

RSignRSignRSign与SignSignSign,$ RPReLU与与与PReLU$的示意图分别为:

通过RSignRSignRSign以及RPReLURPReLURPReLU的引入,可以大幅减轻一比特CNNCNNCNN学习激活分布的压力,进而使得一比特CNNCNNCNN更为专注的学习更有意义的特征。

后续的实验结果也表明,这样的设计将大幅的提高BaselineBaselineBaseline的精度。

优化

RSignRSignRSign以及RPReLURPReLURPReLU中的参数可以和网络中的其他参数一同进行端到端的优化。

在RSignRSignRSign中的αi\alpha_iαi​可以通过链式法则进行求解,具体为:
∂L∂αi=∑xir∂L∂h(xir)∂h(xir)∂αi\frac{\partial \mathcal{L}}{\partial \alpha_{i}}=\sum_{x_{i}^{r}} \frac{\partial \mathcal{L}}{\partial h\left(x_{i}^{r}\right)} \frac{\partial h\left(x_{i}^{r}\right)}{\partial \alpha_{i}} ∂αi​∂L​=xir​∑​∂h(xir​)∂L​∂αi​∂h(xir​)​
其中L\mathcal{L}L表示损失函数,∂L∂h(xir)\frac{\partial \mathcal{L}}{\partial h\left(x_{i}^{r}\right)}∂h(xir​)∂L​表示更深网络的梯度。

类似地,在RPReLURPReLURPReLU中,梯度可以通过以下的公式进行计算:
∂f(xi)∂βi=I{xi≤γi}⋅(x−γi)∂f(xi)∂γi=−I{xi≤γi}⋅βi−I{xi>γi}∂f(xi)∂ζi=1\begin{aligned} &\frac{\partial f\left(x_{i}\right)}{\partial \beta_{i}}=\mathbf{I}_{\left\{x_{i} \leq \gamma_{i}\right\}} \cdot\left(x-\gamma_{i}\right) \\ &\frac{\partial f\left(x_{i}\right)}{\partial \gamma_{i}}=-\mathbf{I}_{\left\{x_{i} \leq \gamma_{i}\right\}} \cdot \beta_{i}-\mathbf{I}_{\left\{x_{i}>\gamma_{i}\right\}} \\ &\frac{\partial f\left(x_{i}\right)}{\partial \zeta_{i}}=1 \end{aligned} ​∂βi​∂f(xi​)​=I{xi​≤γi​}​⋅(x−γi​)∂γi​∂f(xi​)​=−I{xi​≤γi​}​⋅βi​−I{xi​>γi​}​∂ζi​∂f(xi​)​=1​
其中,I\mathbf{I}I表示指示函数,I{⋅}=1\mathbf{I}_{\{\cdot\}}=1I{⋅}​=1的条件是其括号中的不等式成立,反之则为0。

损失函数: Distributional Loss

因为文章认为如果二值网络能够和浮点数网络学到类似的分布,那么其性能就能够得到提升,所以文章特意设计了一个分布的损失函数,命名为DistributionalDistributionalDistributional LossLossLoss,其数学表达为:
LDistribution =−1n∑c∑i=1npcRθ(Xi)log⁡(pcBθ(Xi)pcRθ(Xi))\mathcal{L}_{\text {Distribution }}=-\frac{1}{n} \sum_{c} \sum_{i=1}^{n} p_{c}^{\mathcal{R}_{\theta}}\left(X_{i}\right) \log \left(\frac{p_{c}^{\mathcal{B}_{\theta}}\left(X_{i}\right)}{p_{c}^{\mathcal{R}_{\theta}}\left(X_{i}\right)}\right) LDistribution ​=−n1​c∑​i=1∑n​pcRθ​​(Xi​)log(pcRθ​​(Xi​)pcBθ​​(Xi​)​)
其物理含义为浮点数网络输出的分布与二值网络输出的分布之间的KLKLKL散度。下标ccc表示类别,nnn表示batchbatchbatch sizesizesize。

实验与结论

实验设计

  • 数据集

数据集为ILSVRC12ILSVRC12ILSVRC12 ImageNetImageNetImageNet分类数据集,相比起MNISTMNISTMNIST等数据集来说,更具挑战性。数据增强方法同原版MobileNetMobileNetMobileNet一致。

  • 训练策略:

训练方法参照Bi−realBi-realBi−real中推荐的标准二值化方法,并采用了Brais等(2020)的两步走训练策略。具体地,在第一步,随机地使用二值的激活和浮点数的权重进行训练,在第二步,将第一步得到的参数作为初始值,然后再用权重和激活都是二值的网络进行finetunefinetunefinetune。在这两步中,都是用的AdamAdamAdam优化器,学习率调整策略为线性下降的方式,初始的学习率为5e−45e-45e−4。训练的batchsizebatchsizebatchsize为256256256,共训练600k600k600k次迭代。权重衰减在第一步中为1e−51e-51e−5,在第二步中为000。

  • DistributionalDistributionalDistributional LossLossLoss

在两步中,都使用了文章所介绍的**DistributionalDistributionalDistributional LossLossLoss**,而不是原先的网络输出与标签之间的交叉熵损失。

  • OPsOPsOPs计算

与Brais等(2020)的OPsOPsOPs计算方式一致,文章分别计算二进制操作BOPBOPBOP与浮点运算FLOPsFLOPsFLOPs,然后整体的OPsOPsOPs计算方法为:
OPs=BOPs/64+FLOPs\mathrm{OPs}=\mathrm{BOPs} / 64+\mathrm{FLOPs} OPs=BOPs/64+FLOPs

和SOTA的比较

将ReActNetReActNetReActNet与SOTASOTASOTA的量化与二值化方法进行比较,具体的比较结果如下表所示:

消融实验

在消融实验中,主要探究以下几个技巧在网络中所起的作用:

(1) BlockBlockBlock复制以及ConcatConcatConcat;

(2) DistributionalDistributionalDistributional LossLossLoss;

(3) ReActReActReAct操作。

下表为消融实验的结果表:

  • BlockBlockBlock复制以及ConcatConcatConcat

浮点数的shortcutshortcutshortcut对于BNNBNNBNN来说,是至关重要的,然而,降采样的通道数是输出通道数的两倍,这违反了输入输出通道数一致的限制,因此,为了能够加入identityidentityidentity shortcutshortcutshortcut, 文章对其做了BlockBlockBlock复制和ConcatConcatConcat的操作。示意图见下图(a)(a)(a):

这样的设计相对于没有shortcutshortcutshortcut的设计(上图(b)(b)(b))而言,提高了2.92.9%2.9个点。相关的提升也可以见Table2Table 2Table2中的第二行和第四行。

  • DistributionalDistributionalDistributional LossLossLoss

    由Table2Table2Table2中的结果可见,该损失大概提升了1.41.4 %1.4个点。

  • ReActReActReAct操作

    由Table2Table2Table2中的结果可见,RSignRSignRSign和RPReLURPReLURPReLU分别使得BaselineBaselineBaseline网络提升了4.94.9%4.9以及3.63.63.6个点。将这两个策略都加上的时候,ReActNetReActNetReActNet-AAA相比起BaselineBaselineBaseline提升了6.96.96.9个点,与浮点数网络的精度差距缩减到理论333个点以内。更有趣的是,从验证集精度的变化曲线看来,使用原版本的PReLUPReLUPReLU以及SignSignSign使得曲线震荡的非常严重,文章认为这个现象是因为PReLUPReLUPReLU的斜率变化使得符号改变,进而使得后面所有的层都受其影响而导致的。此外,文章也认为这间接的验证了其假设,即一比特CNNCNNCNN对分布异常敏感。而文章所提出的ReActReActReAct操作则在鲁棒性和精确性上有着很好的表现。

可视化

为了更好的理解,文章将学习到的参数以及中间层激活的分布进行了可视化。

ReActReActReAct操作中学习参数的可视化

如下图所示,文章使用颜色条来表示每一层的学习参数,相比起传统的使用PReLUPReLUPReLU的二值网络来说,使用RPReLURPReLURPReLU所学习到的参数有正有负,更接近于浮点数网络中的分布,而传统的几乎只学到了正值。而且如下图中的(c)(c)(c)所示,shiftshiftshift系数的绝对值也较大,说明对于一比特的CNNCNNCNN而言,显式地进行shiftshiftshift也是有必要的。

中间层激活分布的可视化

在下图中,展示了BaselineBaselineBaseline与ReActNetReActNetReActNet内部的激活分布的直方图:

显然,有了ReActReActReAct操作后,整体的分布显得更为丰富,此外,从左到右的第二个子图的对比也能够发现,经由ReActReActReAct操作后,SignSignSign的输出的正负更加均匀了,说明在表达二进制的特征时,更好地利用了黑白像素。

结论

文章分析了激活分布对二值化网络性能的影响,并针对该问题,提出了带有学习参数的SignSignSign和PReLUPReLUPReLU,分别命名为RSignRSignRSign与RPReLURPReLURPReLU,目的是更好地接近浮点数网络的激活分布。在实验中,文章以MobileNetV1MobileNet V1MobileNetV1作为待二值化的浮点数网络,在其基础上加入了ShortcutShortcutShortcut等修改,并进行二值化,进而作为BaselineBaselineBaseline网络。在该BaselineBaselineBaseline网络上加入RSignRSignRSign及RPReLURPReLURPReLU等操作后,结果有较大程度的提升,进而说明了ReActReActReAct操作的有效性。此外,在希望二值网络尽可能输出与浮点数网络一样的分布的背景下,文章设计了名为DistributionDistributionDistribution LossLossLoss 的损失函数,实际上为二值网络输出分布与浮点数网络输出分布之间的KLKLKL散度,消融实验的结果表明,该损失函数也为精度的提升贡献了自己的作用。

参考文献

  1. Rastegari M, Ordonez V, Redmon J, et al. Xnor-net: Imagenet classification using binary convolutional neural networks[C]//European conference on computer vision. Springer, Cham, 2016: 525-542.
  2. Liu Z, Wu B, Luo W, et al. Bi-real net: Enhancing the performance of 1-bit cnns with improved representational capability and advanced training algorithm[C]//Proceedings of the European conference on computer vision (ECCV). 2018: 722-737.
  3. Howard, A.G., Zhu, M., Chen, B., Kalenichenko, D., Wang, W., Weyand, T., Andreetto, M., Adam, H.: Mobilenets: Efficient convolutional neural networks for mobile vision applications. arXiv preprint arXiv:1704.04861 (2017)
  4. Brais Martinez, Jing Yang, A.B.G.T.: Training binary neural networks with real-tobinary convolutions. International Conference on Learning Representations (2020)

版权声明:本文为奥比中光3D视觉开发者社区特约作者授权原创发布,未经授权不得转载,本文仅做学术分享,版权归原作者所有,若涉及侵权内容请联系删文。

3D视觉开发者社区是由奥比中光给所有开发者打造的分享与交流平台,旨在将3D视觉技术开放给开发者。平台为开发者提供3D视觉领域免费课程、奥比中光独家资源与专业技术支持。点击加入3D视觉开发者社区,和开发者们一起讨论分享吧~

或可微信关注官方公众号3D视觉开发者社区,获取更多干货知识哦。

【2020年BNN网络的SOTA—— ReActNet 】以简单的操作得到更高精度的二值神经网络相关推荐

  1. 信息保留的二值神经网络IR-Net,落地性能和实用性俱佳 | CVPR 2020

    出品 | AI科技大本营(ID:rgznai100) 导语:在CVPR 2020上,商汤研究院链接与编译组和北京航空航天大学刘祥龙老师团队提出了一种旨在优化前后向传播中信息流的实用.高效的网络二值化新 ...

  2. 二值神经网络(Binary Neural Network,BNN)

    在我刚刚过去的研究生毕设中,我在ImageNet数据集上验证了图像特征二值化后仍然具有很强的表达能力,可以在检索中达到较好的效果.而Bengio大神的这篇文章,则不止于将特征二值化,而是要将权重和每层 ...

  3. 北航、商汤提出的网络二值化新算法 IR-Net,到底好使不?

    [CSDN编者按]在CVPR 2020上,商汤研究院链接与编译组和北京航空航天大学刘祥龙老师团队提出了一种旨在优化前后向传播中信息流的实用.高效的网络二值化新算法IR-Net.不同于以往二值神经网络大 ...

  4. 【Paper Reading】二值化网络——BNN

    Binarized Neural Networks: Training Neural Networks withWeights and Activations Constrained to +1 or ...

  5. 二值化网络如何训练?这篇ICML 2021论文给你答案

    视学算法专栏 机器之心编辑部 这篇来自 CMU 和 HKUST 科研团队的 ICML 论文,仅通过调整训练算法,在 ImageNet 数据集上取得了比之前的 SOTA BNN 网络 ReActNet ...

  6. 论文推荐|【KSII TIIS 2021】DP-LinkNet:一种用于古籍文档图像二值化的卷积网络(有源码)...

    今日分享来自[KSII TIIS 2021]的论文『DP-LinkNet: A convolutional network for historical document image binariza ...

  7. 深度学习【6】二值网络(Binarized Neural Networks)学习与理解

    http://blog.csdn.net/linmingan/article/details/51008830 Binarized Neural Networks: Training Neural N ...

  8. 二值网络--Bi-Real Net: Enhancing the Performance of 1-bit CNNs

    Bi-Real Net: Enhancing the Performance of 1-bit CNNs With Improved Representational Capability and A ...

  9. 二值网络--XNOR-Net: ImageNet Classification Using Binary Convolutional Neural Networks

    XNOR-Net: ImageNet Classification Using Binary Convolutional Neural Networks ECCV2016 http://allenai ...

最新文章

  1. 《后浪》刷屏力图破壁二次元,B站还有哪些短板?
  2. c/c++整理--c++面向对象(4)
  3. 编制一个c语言成绩记录簿_C语言基础知识点模拟试题
  4. 捆网包裹行业调研报告 - 市场现状分析与发展前景预测
  5. 企业如何挖掘知识“金矿”?这本白皮书讲得够透彻
  6. java求最大子数组 (分治算法)
  7. HIVE 分区 分桶
  8. SpringMVC + security模块 框架整合详解
  9. IPv6Tools:IPv6安全审计框架
  10. springboot毕业实习信息管理系统的设计与实现
  11. 第七届中国云计算大会在京盛大开幕
  12. 记服务器数据库被攻击后修复经验
  13. Macintosh30周年回顾视频 ---转自36kr
  14. (转)用遗传算法优化BP神经网络的Matlab编程实例
  15. Linux内核之32/64位除法
  16. 不软的科幻——源代码浅析
  17. python可以编写成手机吗_python可以编写手机应用吗
  18. Word宋体小四变成宋体四号后行距变大了很多、无法缩小的解决办法
  19. 中文拼音gun和shu以及英文字符|的区别
  20. MotoSimEG-VRC软件:机器人工作路径轨迹跟踪功能使用方法

热门文章

  1. 《文献检索》随感-2003年10月24日
  2. 硅谷产品实战-总结:14、如何用数据做出产品决定?
  3. 6000字详解数据仓库建设
  4. 滴滴千万级ElasticSearch平台发展之路!
  5. 腾讯面试官问我Java中boolean类型占用多少个字节?我说一个,面试官让我回家等通知...
  6. 高德亿级流量接入层服务的演化之路
  7. 学习一下国际巨头互联网公司的一些运营与管理思路!
  8. 来!咱们聊聊如何把缓存玩出一种境界!
  9. 有关容器的六大误区和八大正确场景
  10. 源码资本深耕“三横九纵”科技助力网聚优秀企业