AdderNet

  AdderNet是由華爲、北大和悉尼大學共同提出的一個網絡層結構。主要思想是用加法代替卷積層特徵計算的乘法,從而實現減少深度網絡的計算。

1、卷積計算

  在深度卷積神經網絡中,設FRd×d×cin×coutF\in R^{d\times d\times c_{in}\times c_{out}}是一個卷積核,輸入的特徵圖是XRH×W×cinX\in R^{H\times W\times c_{in}},則它們的卷積計算如下:
Y(m,n,t)=i=0dj=0dk=0cinX(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=i=0d21X(i)F(i)(2)Y'=\sum_{i=0}^{d^2-1}{X(i) \cdot F(i)} \tag{2}
  卷積描述和向量的內積是一樣的,也就是說卷積描述的是兩個向量的相似程度,而描述向量相似程度的還有其他的形式,比如說L2L_2距離和L1L_1距離。
  在這篇文章中,採用L1L_1 距離代替卷積,這樣就把乘法用加法替換了。

2、特徵的加法計算

  用L1L_1距離替換卷積計算,公式(1)(1)就可寫成如下形式:
Y(m,n,t)=i=0dj=0dk=0cinX(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}
  用公式(3)(3)計算的特徵都是負數,因此在特徵計算後,採用BN層來歸一化,之後再用激活函數提高特徵非線性。

3、優化

  反向傳播計算加法層對參數的偏導是一個符號函數:
Y(m,n,t)F(i,j,k,t)=sgn(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}
  由公式(4)(4)可知,加法層計算的梯度只是三個數1,0,1-1, 0,1中的一個。但是其梯度並不是梯度下降最快的方向,而且隨着維度的增加,其指向性更差。因此公式(4)(4)並不適合用於優化含有大量參數的神經網絡。作者用公式(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}
  作者還發現輸入特徵XX的梯度對參數的更新也很有用。爲了避免XX的梯度絕對值大於1而造成的梯度爆炸,對其進行了限制:
Y(m,n,t)X(m+i,n+j,k)=HT(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}
其中
HT(x)={xif1<x<11x>11x<1HT(x)=\begin{cases} x & if -1<x<1\\ 1 & x > 1\\ -1 & x < -1 \end{cases}
  梯度計算也好了,似乎一切都好了,但是還是有個問題:加法層的方差會很大。

4、自適應可學習尺度

  假設權重和輸入特徵是獨立同分布的正態分佈,用卷積計算的輸出方差是:
Var[YCNN]=i=0dj=0dk=0cinVar[X×F]=d2cinVar[X]Var[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[YAdder]=i=0dj=0dk=0cinVar[XF]=(12π)d2cin(Var[X]+Var[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}
  在BN層的損失函數llxx的偏導是和方差有關的:
lxi=j=1mγm2σB{lyilyj[1+(xixj)(xjμ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}
  其中σB\sigma_B是輸入特徵的方差。
  CNN權重的方差都很小的,一般的數量級在10310^{-3}或者10410^{-4}。因此用一個很小的數乘以Var[X]Var[X]比兩者相加要小很多,因此公式(9)(9)中的梯度就會小很多,這就會使得參數更新變得很慢,甚至會停在鞍點上。

  雖然可以採用大的學習率來提升學習過程效果,但是從上圖可以看出不同層其權重梯度變化很大,這表明每一層的參數需要不同。因此作者給每一層設計了不同學習率:
ΔFl=γ×αl×Δ(Fl)(10)\Delta F_l=\gamma\times \alpha_l\times \Delta(F_l)\tag{10}
  這裏的γ\gamma是全局學習率,Δ(Fl)\Delta(F_l)是卷積核的梯度,αl\alpha_l是對應的局部學習率。輸入是經過BN的,也就是說在AdderNet中,filters的值也是經過了歸一化,因此將局部學習率定義爲如下形式:
αl=ηkΔ(Fl)2(11)\alpha_l=\frac{\eta \sqrt{k}}{||\Delta(F_l)||_2}\tag{11}
  這裏的η\eta是一個控制加法filter學習率的超參數,kkFlF_l中參數的個數。

5、訓練流程及實驗結果

訓練流程如下:

在這裏插入圖片描述

實驗結果

5.1、特徵的分佈

在這裏插入圖片描述

5.2、在CIFAR-10和CIFAR-100測試結果

在這裏插入圖片描述

5.2、在ImageNet測試結果

在這裏插入圖片描述
  從測試結果看,效果不錯,但是沒有給出前向結構的運行時間,感覺可能是時間也還是個瓶頸。雖然單個加法運算所需要的時間比乘法的要少,但是從公式(3)(3)可以看出在計算特徵時需要判斷計算值的符號,並且這個判斷是在大量的循環內的,這需要消耗大量的時間,很可能比卷積消耗的時間還要多。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章