AdderNet是由华为、北大和悉尼大学共同提出的一个网络层结构。主要思想是用加法代替卷积层特征计算的乘法,从而实现减少深度网络的计算。
在深度卷积神经网络中,设 F ∈ R d × d × c i n × c o u t F\in R^{d\times d\times c_{in}\times c_{out}} F∈Rd×d×cin×cout是一个卷积核,输入的特征图是 X ∈ R H × W × c i n X\in R^{H\times W\times c_{in}} X∈RH×W×cin,则它们的卷积计算如下:
Y ( m , n , t ) = ∑ i = 0 d ∑ j = 0 d ∑ k = 0 c i n X ( m + i , n + j , k ) ∗ F ( i , j , k , t ) (1) Y(m,n,t)=\sum_{i=0}^d\sum_{j=0}^d\sum_{k=0}^{c_{in}}{X(m+i, n+j, k)*F(i,j,k,t)} \tag{1} Y(m,n,t)=i=0∑dj=0∑dk=0∑cinX(m+i,n+j,k)∗F(i,j,k,t)(1)
把卷积核拉平成一个向量,对应的特征图区域也拉平成一个向量,单层特征图卷积可写成如下形式:
Y ′ = ∑ i = 0 d 2 − 1 X ( i ) ⋅ F ( i ) (2) Y'=\sum_{i=0}^{d^2-1}{X(i) \cdot F(i)} \tag{2} Y′=i=0∑d2−1X(i)⋅F(i)(2)
卷积描述和向量的内积是一样的,也就是说卷积描述的是两个向量的相似程度,而描述向量相似程度的还有其他的形式,比如说 L 2 L_2 L2距离和 L 1 L_1 L1距离。
在这篇文章中,采用 L 1 L_1 L1 距离代替卷积,这样就把乘法用加法替换了。
用 L 1 L_1 L1距离替换卷积计算,公式 ( 1 ) (1) (1)就可写成如下形式:
Y ( m , n , t ) = − ∑ i = 0 d ∑ j = 0 d ∑ k = 0 c i n ∣ X ( m + i , n + j , k ) − F ( i , j , k , t ) ∣ (3) Y(m,n,t)=-\sum_{i=0}^{d}\sum_{j=0}^{d}\sum_{k=0}^{c_{in}}{|X(m+i,n+j,k)-F(i,j,k,t)|}\tag{3} Y(m,n,t)=−i=0∑dj=0∑dk=0∑cin∣X(m+i,n+j,k)−F(i,j,k,t)∣(3)
用公式 ( 3 ) (3) (3)计算的特征都是负数,因此在特征计算后,采用BN层来归一化,之后再用激活函数提高特征非线性。
反向传播计算加法层对参数的偏导是一个符号函数:
∂ Y ( m , n , t ) ∂ F ( i , j , k , t ) = s g n ( X ( m + i , n + j , k ) − F ( i , j , k , t ) ) (4) \frac{\partial{Y(m,n,t)}}{\partial{F(i,j,k,t)}}=sgn(X(m+i,n+j,k)-F(i,j,k,t))\tag{4} ∂F(i,j,k,t)∂Y(m,n,t)=sgn(X(m+i,n+j,k)−F(i,j,k,t))(4)
由公式 ( 4 ) (4) (4)可知,加法层计算的梯度只是三个数 − 1 , 0 , 1 -1, 0,1 −1,0,1中的一个。但是其梯度并不是梯度下降最快的方向,而且随着维度的增加,其指向性更差。因此公式 ( 4 ) (4) (4)并不适合用于优化含有大量参数的神经网络。作者用公式 ( 5 ) (5) (5)来更新AdderNet的梯度:
∂ Y ( m , n , t ) ∂ F ( i , j , k , t ) = X ( m + i , n + j , k ) − F ( i , j , k , t ) (5) \frac{\partial{Y(m,n,t)}}{\partial{F(i,j,k,t)}}=X(m+i,n+j,k)-F(i,j,k,t)\tag{5} ∂F(i,j,k,t)∂Y(m,n,t)=X(m+i,n+j,k)−F(i,j,k,t)(5)
作者还发现输入特征 X X X的梯度对参数的更新也很有用。为了避免 X X X的梯度绝对值大于1而造成的梯度爆炸,对其进行了限制:
∂ Y ( m , n , t ) ∂ X ( m + i , n + j , k ) = H T ( F ( i , j , k , t ) − X ( m + i , n + j , k ) ) (6) \frac{\partial{Y(m,n,t)}}{\partial{X(m+i,n+j,k)}}=HT(F(i,j,k,t)-X(m+i,n+j,k))\tag{6} ∂X(m+i,n+j,k)∂Y(m,n,t)=HT(F(i,j,k,t)−X(m+i,n+j,k))(6)
其中
H T ( x ) = { x i f − 1 < x < 1 1 x > 1 − 1 x < − 1 HT(x)=\begin{cases} x & if -1
梯度计算也好了,似乎一切都好了,但是还是有个问题:加法层的方差会很大。
假设权重和输入特征是独立同分布的正态分布,用卷积计算的输出方差是:
V a r [ Y C N N ] = ∑ i = 0 d ∑ j = 0 d ∑ k = 0 c i n V a r [ X × F ] = d 2 c i n V a r [ X ] V a r [ F ] (7) Var[Y_{CNN}]=\sum_{i=0}^d\sum_{j=0}^d\sum_{k=0}^{c_{in}}Var[X\times F]=d^2c_{in}Var[X]Var[F]\tag{7} Var[YCNN]=i=0∑dj=0∑dk=0∑cinVar[X×F]=d2cinVar[X]Var[F](7)
而对于加法层的输出方差是:
V a r [ Y A d d e r ] = ∑ i = 0 d ∑ j = 0 d ∑ k = 0 c i n V a r [ ∣ X − F ∣ ] = ( 1 − 2 π ) d 2 c i n ( V a r [ X ] + V a r [ F ] ) (8) Var[Y_{Adder}]=\sum_{i=0}^d\sum^d_{j=0}\sum_{k=0}^{c_{in}}{Var[|X-F|]}=(1-\frac{2}{\pi})d^2c_{in}(Var[X]+Var[F])\tag{8} Var[YAdder]=i=0∑dj=0∑dk=0∑cinVar[∣X−F∣]=(1−π2)d2cin(Var[X]+Var[F])(8)
在BN层的损失函数 l l l对 x x x的偏导是和方差有关的:
∂ l ∂ x i = ∑ j = 1 m γ m 2 σ B { ∂ l ∂ y i − ∂ l ∂ y j [ 1 + ( x i − x j ) ( x j − μ B ) σ B ] } (9) \frac{\partial{l}}{\partial{x_i}}=\sum_{j=1}^{m}{\frac{\gamma}{m^2\sigma_B}\{\frac{\partial{l}}{\partial{y_i}}-\frac{\partial{l}}{\partial{y_j}}[1+\frac{(x_i-x_j)(x_j-\mu_B)}{\sigma_B}]\}}\tag{9} ∂xi∂l=j=1∑mm2σBγ{∂yi∂l−∂yj∂l[1+σB(xi−xj)(xj−μB)]}(9)
其中 σ B \sigma_B σB是输入特征的方差。
CNN权重的方差都很小的,一般的数量级在 1 0 − 3 10^{-3} 10−3或者 1 0 − 4 10^{-4} 10−4。因此用一个很小的数乘以 V a r [ X ] Var[X] Var[X]比两者相加要小很多,因此公式 ( 9 ) (9) (9)中的梯度就会小很多,这就会使得参数更新变得很慢,甚至会停在鞍点上。
虽然可以采用大的学习率来提升学习过程效果,但是从上图可以看出不同层其权重梯度变化很大,这表明每一层的参数需要不同。因此作者给每一层设计了不同学习率:
Δ F l = γ × α l × Δ ( F l ) (10) \Delta F_l=\gamma\times \alpha_l\times \Delta(F_l)\tag{10} ΔFl=γ×αl×Δ(Fl)(10)
这里的 γ \gamma γ是全局学习率, Δ ( F l ) \Delta(F_l) Δ(Fl)是卷积核的梯度, α l \alpha_l αl是对应的局部学习率。输入是经过BN的,也就是说在AdderNet中,filters的值也是经过了归一化,因此将局部学习率定义为如下形式:
α l = η k ∣ ∣ Δ ( F l ) ∣ ∣ 2 (11) \alpha_l=\frac{\eta \sqrt{k}}{||\Delta(F_l)||_2}\tag{11} αl=∣∣Δ(Fl)∣∣2ηk(11)
这里的 η \eta η是一个控制加法filter学习率的超参数, k k k是 F l F_l Fl中参数的个数。
从测试结果看,效果不错,但是没有给出前向结构的运行时间,感觉可能是时间也还是个瓶颈。虽然单个加法运算所需要的时间比乘法的要少,但是从公式 ( 3 ) (3) (3)可以看出在计算特征时需要判断计算值的符号,并且这个判断是在大量的循环内的,这需要消耗大量的时间,很可能比卷积消耗的时间还要多。