[论文学习笔记-1] XNOR-net

XNOR-net

简介

文章中提出了两种二值化网络,分别是Binary-Weight-NetworksXNOR-Networks

Binary-Weight-Networks对模型中的权重W进行二值化操作,即要么是1要么是-1。其中更新参数时依然采用原参数W进行更新。
XNOR-Networks通过对权重W和输入I都进行二值化操作,同时降低空间和实践复杂度。

二值化操作过程

传统的Conv层:I*W
其中I是输入,W是权重,*是卷积操作

Binary-weight-Network的二值化操作:(I*B)α
其中B为二值化的权重矩阵,α是一个实数。
二值化网络的过程就是找到合适的B和α。使得W≈αB,这里a默认为正数。
我们希望尺度参数α和二值矩阵B替代原来的权重,就希望W和αB的差距尽可能小,这里使用来描述两者的差距,设: J ( B , α ) = ∣ ∣ W - B , α ∣ ∣ 2 J(B,α) = ||W-B,α||^2 J(B,α)=∣∣W-B,α∣∣2这里W和B看作向量,用的是向量的2范数的平方,则这里的α和B的取值则为J最小时对应的α和B的值,记为:
α ∗ , B ∗ = a r g m i n J ( B , α ) α^*,B^*=argminJ(B,α) α∗,B∗=argminJ(B,α)由于矩阵二范数符合分配律,得:
J ( B , α ) = α 2 B T B − 2 α W T B + W T W J(B,α) = α^2B^TB - 2αW^TB + W^TW J(B,α)=α2BTB−2αWTB+WTW由于B是-1和1组成的向量,则BTB为常数n,n为B的长度,又因为W是已知矩阵,则WTW也是常量,设为c,则可以重写方程为:
J ( B , α ) = α 2 n − 2 α W T B + c J(B,α)=α^2n-2αW^TB+c J(B,α)=α2n−2αWTB+c
由J的定义知J一定非负,由于α默认为正数,则要使WTB最小,则WTB最大, B ∗ = a r g m a x ( W T B ) B^*=argmax(W^TB) B∗=argmax(WTB),故:
B ∗ = s i g n ( W ) B^*=sign(W) B∗=sign(W)确定了B的值后,J为一元二次方程,易得J最小时的α值:
α ∗ = W T B ∗ n α^*=\frac{W^TB^*} n α∗=nWTB∗​替换B后得:
[论文学习笔记-1] XNOR-net
由此便确定了α和B的值。

因此,此处的二值权重滤波器只需要通过取原权重W的sign函数即可,而最优尺度因子α通过将权重各元素取绝对值再取平均值即可得到

训练N层的二值权重CNN的算法Algorithm1:
[论文学习笔记-1] XNOR-net
首先将每层的滤波器通过计算B和α二值化,然后用B和α进行前向传播,然后进行反向传播,参数更新时使用带动量的SGD或ADAM优化。

XNOR-Networks

XNOR-Networks将参数W和输入值I都进行二值化,这样卷积可通过XNOR和比特位运算高效实现:

令 X T W ≈ β H T α B X^TW≈βH^TαB XTW≈βHTαB,其中H,B均为二值矩阵,α,β为实数,近似公式为:

[论文学习笔记-1] XNOR-net
其中 ⊙ \odot ⊙表示点乘,令Yi=XiWi,Ci=HiBi,γ=βα,则等式可变为

[论文学习笔记-1] XNOR-net
相似于Binary-Weights-Networks中参数最优解的求解过程,可以得到,
[论文学习笔记-1] XNOR-net
[论文学习笔记-1] XNOR-net

这样XTW就被近似为γ*C*。

对于卷积滤波器W经过处理的每一个I中的子Tensor(与W的shape相同),都要计算一个尺度因子(figure2有两个例子,尺度因子计算公式为对应子Tensor的l1范数的平均数),因为与卷积滤波器点乘的子Tensor有很多重叠部分,会产生很多重复计算过程。故而先计算一个矩阵A:

[论文学习笔记-1] XNOR-net
代表每个channel的元素值绝对值的平均数,然后用一个2D滤波器k(wh矩阵)对A进行卷积,得到矩阵K,其中k的每个元素均为1/(wh),则K所存储的就是所有的尺度因子β(易证明),当获得了α(与Binary-Weight-Networks计算方式相同)和β后就可以计算卷积操作的近似:
[论文学习笔记-1] XNOR-net

以上 ⊛ \circledast ⊛代表以XNOR或bitcount为基础操作的卷积操作。

训练 XNOR-Networks
常规CNN网络中的block:卷积 → \to → BN-norm → \to → 激活 → \to → 池化
[论文学习笔记-1] XNOR-net

XNOR-Networks中的改进:
为了减少二值化的损失,在二值化卷积层之前就对输入进行归一化,这让数据保持0均值,因此,阈值为0可以减少量化误差(不是很懂)

XNOR-Networks中的block:

[论文学习笔记-1] XNOR-net

在BinActiv中计算sign(I)和K,然后在BinConv中计算[论文学习笔记-1] XNOR-net然后再进行池化,同时可以在BinConv层后加入激活层,这样可以让XNOR-Networks与SOTA网络兼容使用。

XNOR-Networks的训练算法与Binary-Weight-Networks相同。

k-比特量化:
二值网络的递推,将sign函数替换为
[论文学习笔记-1] XNOR-net

上一篇:[Leetcode] 543. Diameter of Binary Tree_Easy Tag: DFS


下一篇:Mysql 主从同步之Got fatal error 1236 from master when reading data from binary log: 'Could not find