作者‖ Cocoon
编辑‖ 3D视觉开发者社区
本文是由香港科技大学发布于ECCV 2020的论文,是Bi-Real Net作者对二值化研究领域的最新成果,拥有着69.4%的精度,作者通过简单的优化激活函数的操作改进便取得了惊人的效果,本文将详细解读ReActNet的具体方法。
论文链接: https://arxiv.org/pdf/2003.03488.pdf
代码地址: https://github.com/liuzechun/ReActNet
通常认为的二值神经网络,指模型权重以及激活值均为二进制数值的模型,被认为是最有前途的神经网络压缩方法之一。但显然,二值的表达与浮点数的表达存在着差距,而本篇所介绍的 R e A c t N e t ReActNet ReActNet,其目的就是希望在不引入额外计算开销的前提下,能够缩小这之间的差距。
论文首先构建了一个 B a s e l i n e Baseline Baseline网络,具体的构建方式为使用不引入参数的 s h o r t c u t shortcut shortcut修改某一浮点数网络,并将其二值化。该 B a s e l i n e Baseline Baseline网络在精度和效率上有较好的 t r a d e trade trade- o f f off off,比大多数已有的二值网络效果都要好。
通过大量的实验,文章发现,二值网络的性能对激活函数的分布非常敏感。基于该发现,文章提出将传统的 S i g n Sign Sign以及 P R e L U PReLU PReLU函数进行“推广”,并将“推广”后的函数分别命名为 R S i g n RSign RSign以及 R P R e L U RPReLU RPReLU,这样做的目的是希望在不引入额外计算开销的前提下,显式地学习分布的“ r e s h a p e reshape reshape”和“ s h i f t shift shift”。
最后,文章提出了所谓的“ D i s t r i b u t i o n a l L o s s Distributional Loss DistributionalLoss”来进一步地对二值网络进行强化,目的是使其与浮点数网络学到近似的输出分布。
合并了上述想法后所攒出来的网络即命名为 R e A c t N e t ReActNet ReActNet,其性能远超出当时已有的二值网络。
对于权重已经一比特化的卷积层来说,其乘法运算可以被按位运算 X N O R XNOR XNOR以及 p o p c o u n popcoun popcount操作替换,具体为:
X b ∗ W b = popcount ( XNOR ( X b , W b ) ) \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))
其中 W b \mathcal{W_b} Wb以及 X b \mathcal{X_b} Xb分别表示二值权重矩阵以及二值激活。具体地,权重和激活通过以下的方式进行二值化:
x b = Sign ( x r ) = { + 1 , if x r > 0 − 1 , if x r ≤ 0 , w b = ∥ W r ∥ l 1 n Sign ( w r ) = { + ∥ W r ∥ l 1 ∥ , if w r > 0 − ∥ W r n ∥ l 1 n , if w r ≤ 0 x_{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∥l1Sign(wr)={+∥∥Wr∥l1, if wr>0−n∥Wrn∥l1, if wr≤0
其中,下标 b b b和下标 r r r分别指代二值和浮点数。 ∥ W r ∥ l 1 n \frac{\left\| \mathcal{W}_{r}\right\|_{l 1}}{n} n∥Wr∥l1表示权重绝对值的平均值,其作用为作为尺度因子减少浮点数与二值之间的差距,在 X N O R − N e t XNOR-Net XNOR−Net(Rastegari 等,2016)中,也应用了类似的尺度因子。然而,随着后续所谓的 R e A c t ReAct ReAct操作的引入,这个尺度因子将变得不再重要。
许多二值化工作选择的浮点数网络是 R e s N e t ResNet ResNet,然而,该论文认为对更为紧实的轻量级网络进行二值化更具有实际意义,因此选择了 M o b i l e N e t V 1 MobileNet V1 MobileNetV1网络结构作为浮点数网络。受 B i − R e a l Bi-Real Bi−Real网络(Liu等,2018)的启发,论文也加入一些 s h o r t c u t shortcut shortcut,而且将在 M o b i l e N e t V 1 MobileNetV1 MobileNetV1中的 3 ∗ 3 3*3 3∗3的逐深度卷积以及 1 ∗ 1 1 *1 1∗1的逐点卷积块替换成了$3 *3 $和 1 ∗ 1 1 * 1 1∗1的普通卷积,且并行地加入了 s h o r t c u t shortcut shortcut, 示意图如下所示:
此外,还提出了一个新的结构来处理下采样的操作,文章希望能够在不增加额外开销的情况下进行处理。然而,文章需要输入与输出的通道数是一致的,这样才能够在不引入额外的浮点数矩阵乘法的前提下进行二值化,且只使用一个简单的 i d e n t i t y identity identity s h o r t c u t shortcut shortcut进行激活的传播。
正如上图中的左图所示,复制了输入通道,将两个具有相同输入的 b l o c k block block进行 c o n c a t concat concat进而解决掉输入输出通道数不一致的问题,且在 s h o r t c u t shortcut shortcut过程中使用平均池化的操作来进行空间上的下采样。在 B a s e l i n e Baseline Baseline中,除了第一层和最后输出的全连接层以外,都是一比特的,这样的架构设计是硬件友好的。
图像分类的神经网络本质是学习一个从输入图像到输出分布的映射关系。因此,文章认为一个性能良好的二值神经网络就应该学到和浮点数网络相似的输出分布。但是,二值网络的离散性限制了其像浮点数网络那样学习复杂分布的能力。为了解决这个问题, X N O R − N e t XNOR-Net XNOR−Net提出计算尺度缩放因子,并将其与激活相乘的方案,其后续的工作进一步地提出了如何通过反向传播进行这些因子的更新。
与 X N O R − N e t XNOR-Net XNOR−Net不同,文章着重研究了激活分布,并且发现,激活分布的微小变化会极大地影响一比特 C N N CNN CNN的语义特征表达。但是反过来讲,一比特的 C N N CNN CNN学习分布的能力本来就有限,为了解决这样的问题,文章引入了广义的激活函数( g e n e r a l i z e d generalized generalized a c t i v a t i o n activation activation f u n c t i o n s functions functions),所谓的广义激活有着可学习的系数,进而提高一比特 C N N CNN CNN学习分布的能力。
在浮点数网络中,似乎不那么关注分布,这是因为激活都是连续的浮点数,对它们来说, r e s h a p e reshape reshape或者 s h i f t shift shift分布并不费力气。然而,对于一比特的 C N N CNN CNN来说,激活只能够选择 1 1 1或 − 1 -1 −1两个值,如果输入的特征分布有一点偏移,很可能会导致特征图受到巨大的影响,如下图所示:
一比特的 C N N CNN CNN显然不像浮点数的 C N N CNN CNN那样对特征信息具备鲁棒性,输入特征的一点变化会导致特征引入过多不必要的背景信息或过少的特征信息,进而使得 B N N BNN BNN的识别负担加大。
基于以上的观察,我们提出了一个 R e A c t ReAct ReAct操作,目的是显式地 r e s h a p e reshape reshape或 s h i f t shift shift激活的分布。 R e A c t ReAct ReAct操作将传统的 S i g n Sign Sign以及 P R e L U PReLU PReLU广义化,分别命名为 R e A c t − S i g n ReAct-Sign ReAct−Sign以及 R e A c t − P R e L U ReAct-PReLU ReAct−PReLU,以下将简称为 R S i g n RSign RSign和 R P R e L U RPReLU RPReLU。
实际上, R S i g n RSign RSign相对于 S i g n Sign Sign来说,有着逐通道的可学习阈值,具体为:
x i b = h ( x i r ) = { + 1 , if x i r > α i − 1 , if x i r ≤ α i x_{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
其中下标 i i i表示不同的通道。
类似地, R P R e L U RPReLU RPReLU的定义为:
f ( x i ) = { x i − γ i + ζ i , if x i > γ i β i ( x i − γ i ) + ζ i , if x i ≤ γ i f\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都是可学习的参数,用来控制原先的 P R e L U PReLU PReLU的形状变化,下标 i i i也是指不同的通道数。
R S i g n RSign RSign与 S i g n Sign Sign,$ RPReLU 与 与 与PReLU$的示意图分别为:
通过 R S i g n RSign RSign以及 R P R e L U RPReLU RPReLU的引入,可以大幅减轻一比特 C N N CNN CNN学习激活分布的压力,进而使得一比特 C N N CNN CNN更为专注的学习更有意义的特征。
后续的实验结果也表明,这样的设计将大幅的提高 B a s e l i n e Baseline Baseline的精度。
R S i g n RSign RSign以及 R P R e L U RPReLU RPReLU中的参数可以和网络中的其他参数一同进行端到端的优化。
在 R S i g n RSign RSign中的 α i \alpha_i αi可以通过链式法则进行求解,具体为:
∂ L ∂ α i = ∑ x i r ∂ L ∂ h ( x i r ) ∂ h ( x i r ) ∂ α 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 ( x i r ) \frac{\partial \mathcal{L}}{\partial h\left(x_{i}^{r}\right)} ∂h(xir)∂L表示更深网络的梯度。
类似地,在 R P R e L U RPReLU RPReLU中,梯度可以通过以下的公式进行计算:
∂ f ( x i ) ∂ β i = I { x i ≤ γ i } ⋅ ( x − γ i ) ∂ f ( x i ) ∂ γ i = − I { x i ≤ γ i } ⋅ β i − I { x i > γ i } ∂ f ( x i ) ∂ ζ 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\}}=1 I{⋅}=1的条件是其括号中的不等式成立,反之则为0。
因为文章认为如果二值网络能够和浮点数网络学到类似的分布,那么其性能就能够得到提升,所以文章特意设计了一个分布的损失函数,命名为 D i s t r i b u t i o n a l Distributional Distributional L o s s Loss Loss,其数学表达为:
L Distribution = − 1 n ∑ c ∑ i = 1 n p c R θ ( X i ) log ( p c B θ ( X i ) p c R θ ( X i ) ) \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 =−n1c∑i=1∑npcRθ(Xi)log(pcRθ(Xi)pcBθ(Xi))
其物理含义为浮点数网络输出的分布与二值网络输出的分布之间的 K L KL KL散度。下标 c c c表示类别, n n n表示 b a t c h batch batch s i z e size size。
数据集为 I L S V R C 12 ILSVRC12 ILSVRC12 I m a g e N e t ImageNet ImageNet分类数据集,相比起 M N I S T MNIST MNIST等数据集来说,更具挑战性。数据增强方法同原版 M o b i l e N e t MobileNet MobileNet一致。
训练方法参照 B i − r e a l Bi-real Bi−real中推荐的标准二值化方法,并采用了Brais等(2020)的两步走训练策略。具体地,在第一步,随机地使用二值的激活和浮点数的权重进行训练,在第二步,将第一步得到的参数作为初始值,然后再用权重和激活都是二值的网络进行 f i n e t u n e finetune finetune。在这两步中,都是用的 A d a m Adam Adam优化器,学习率调整策略为线性下降的方式,初始的学习率为 5 e − 4 5e-4 5e−4。训练的 b a t c h s i z e batchsize batchsize为 256 256 256,共训练 600 k 600k 600k次迭代。权重衰减在第一步中为 1 e − 5 1e-5 1e−5,在第二步中为 0 0 0。
在两步中,都使用了文章所介绍的** D i s t r i b u t i o n a l Distributional Distributional L o s s Loss Loss**,而不是原先的网络输出与标签之间的交叉熵损失。
与Brais等(2020)的 O P s OPs OPs计算方式一致,文章分别计算二进制操作 B O P BOP BOP与浮点运算 F L O P s FLOPs FLOPs,然后整体的 O P s OPs OPs计算方法为:
O P s = B O P s / 64 + F L O P s \mathrm{OPs}=\mathrm{BOPs} / 64+\mathrm{FLOPs} OPs=BOPs/64+FLOPs
将 R e A c t N e t ReActNet ReActNet与 S O T A SOTA SOTA的量化与二值化方法进行比较,具体的比较结果如下表所示:
在消融实验中,主要探究以下几个技巧在网络中所起的作用:
(1) B l o c k Block Block复制以及 C o n c a t Concat Concat;
(2) D i s t r i b u t i o n a l Distributional Distributional L o s s Loss Loss;
(3) R e A c t ReAct ReAct操作。
浮点数的 s h o r t c u t shortcut shortcut对于 B N N BNN BNN来说,是至关重要的,然而,降采样的通道数是输出通道数的两倍,这违反了输入输出通道数一致的限制,因此,为了能够加入 i d e n t i t y identity identity s h o r t c u t shortcut shortcut, 文章对其做了 B l o c k Block Block复制和 C o n c a t Concat Concat的操作。示意图见下图 ( a ) (a) (a):
这样的设计相对于没有 s h o r t c u t shortcut shortcut的设计(上图 ( b ) (b) (b))而言,提高了 2.9 2.9% 2.9个点。相关的提升也可以见 T a b l e 2 Table 2 Table2中的第二行和第四行。
D i s t r i b u t i o n a l Distributional Distributional L o s s Loss Loss
由 T a b l e 2 Table2 Table2中的结果可见,该损失大概提升了 1.4 1.4 % 1.4个点。
R e A c t ReAct ReAct操作
由 T a b l e 2 Table2 Table2中的结果可见, R S i g n RSign RSign和 R P R e L U RPReLU RPReLU分别使得 B a s e l i n e Baseline Baseline网络提升了 4.9 4.9% 4.9以及 3.6 3.6 3.6个点。将这两个策略都加上的时候, R e A c t N e t ReActNet ReActNet- A A A相比起 B a s e l i n e Baseline Baseline提升了 6.9 6.9 6.9个点,与浮点数网络的精度差距缩减到理论 3 3 3个点以内。更有趣的是,从验证集精度的变化曲线看来,使用原版本的 P R e L U PReLU PReLU以及 S i g n Sign Sign使得曲线震荡的非常严重,文章认为这个现象是因为 P R e L U PReLU PReLU的斜率变化使得符号改变,进而使得后面所有的层都受其影响而导致的。此外,文章也认为这间接的验证了其假设,即一比特 C N N CNN CNN对分布异常敏感。而文章所提出的 R e A c t ReAct ReAct操作则在鲁棒性和精确性上有着很好的表现。
为了更好的理解,文章将学习到的参数以及中间层激活的分布进行了可视化。
如下图所示,文章使用颜色条来表示每一层的学习参数,相比起传统的使用 P R e L U PReLU PReLU的二值网络来说,使用 R P R e L U RPReLU RPReLU所学习到的参数有正有负,更接近于浮点数网络中的分布,而传统的几乎只学到了正值。而且如下图中的 ( c ) (c) (c)所示, s h i f t shift shift系数的绝对值也较大,说明对于一比特的 C N N CNN CNN而言,显式地进行 s h i f t shift shift也是有必要的。
在下图中,展示了 B a s e l i n e Baseline Baseline与 R e A c t N e t ReActNet ReActNet内部的激活分布的直方图:
显然,有了 R e A c t ReAct ReAct操作后,整体的分布显得更为丰富,此外,从左到右的第二个子图的对比也能够发现,经由 R e A c t ReAct ReAct操作后, S i g n Sign Sign的输出的正负更加均匀了,说明在表达二进制的特征时,更好地利用了黑白像素。
文章分析了激活分布对二值化网络性能的影响,并针对该问题,提出了带有学习参数的 S i g n Sign Sign和 P R e L U PReLU PReLU,分别命名为 R S i g n RSign RSign与 R P R e L U RPReLU RPReLU,目的是更好地接近浮点数网络的激活分布。在实验中,文章以 M o b i l e N e t V 1 MobileNet V1 MobileNetV1作为待二值化的浮点数网络,在其基础上加入了 S h o r t c u t Shortcut Shortcut等修改,并进行二值化,进而作为 B a s e l i n e Baseline Baseline网络。在该 B a s e l i n e Baseline Baseline网络上加入 R S i g n RSign RSign及 R P R e L U RPReLU RPReLU等操作后,结果有较大程度的提升,进而说明了 R e A c t ReAct ReAct操作的有效性。此外,在希望二值网络尽可能输出与浮点数网络一样的分布的背景下,文章设计了名为 D i s t r i b u t i o n Distribution Distribution L o s s Loss Loss 的损失函数,实际上为二值网络输出分布与浮点数网络输出分布之间的 K L KL KL散度,消融实验的结果表明,该损失函数也为精度的提升贡献了自己的作用。
版权声明:本文为奥比中光3D视觉开发者社区特约作者授权原创发布,未经授权不得转载,本文仅做学术分享,版权归原作者所有,若涉及侵权内容请联系删文。
3D视觉开发者社区是由奥比中光给所有开发者打造的分享与交流平台,旨在将3D视觉技术开放给开发者。平台为开发者提供3D视觉领域免费课程、奥比中光独家资源与专业技术支持。点击加入3D视觉开发者社区,和开发者们一起讨论分享吧~
或可微信关注官方公众号3D视觉开发者社区,获取更多干货知识哦。