AdderNet是由華爲、北大和悉尼大學共同提出的一個網絡層結構。主要思想是用加法代替卷積層特徵計算的乘法,從而實現減少深度網絡的計算。
1、卷積計算
在深度卷積神經網絡中,設F∈Rd×d×cin×cout是一個卷積核,輸入的特徵圖是X∈RH×W×cin,則它們的卷積計算如下:
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∑d2−1X(i)⋅F(i)(2)
卷積描述和向量的內積是一樣的,也就是說卷積描述的是兩個向量的相似程度,而描述向量相似程度的還有其他的形式,比如說L2距離和L1距離。
在這篇文章中,採用L1 距離代替卷積,這樣就把乘法用加法替換了。
2、特徵的加法計算
用L1距離替換卷積計算,公式(1)就可寫成如下形式:
Y(m,n,t)=−i=0∑dj=0∑dk=0∑cin∣X(m+i,n+j,k)−F(i,j,k,t)∣(3)
用公式(3)計算的特徵都是負數,因此在特徵計算後,採用BN層來歸一化,之後再用激活函數提高特徵非線性。
3、優化
反向傳播計算加法層對參數的偏導是一個符號函數:
∂F(i,j,k,t)∂Y(m,n,t)=sgn(X(m+i,n+j,k)−F(i,j,k,t))(4)
由公式(4)可知,加法層計算的梯度只是三個數−1,0,1中的一個。但是其梯度並不是梯度下降最快的方向,而且隨着維度的增加,其指向性更差。因此公式(4)並不適合用於優化含有大量參數的神經網絡。作者用公式(5)來更新AdderNet的梯度:
∂F(i,j,k,t)∂Y(m,n,t)=X(m+i,n+j,k)−F(i,j,k,t)(5)
作者還發現輸入特徵X的梯度對參數的更新也很有用。爲了避免X的梯度絕對值大於1而造成的梯度爆炸,對其進行了限制:
∂X(m+i,n+j,k)∂Y(m,n,t)=HT(F(i,j,k,t)−X(m+i,n+j,k))(6)
其中
HT(x)=⎩⎪⎨⎪⎧x1−1if−1<x<1x>1x<−1
梯度計算也好了,似乎一切都好了,但是還是有個問題:加法層的方差會很大。
4、自適應可學習尺度
假設權重和輸入特徵是獨立同分布的正態分佈,用卷積計算的輸出方差是:
Var[YCNN]=i=0∑dj=0∑dk=0∑cinVar[X×F]=d2cinVar[X]Var[F](7)
而對於加法層的輸出方差是:
Var[YAdder]=i=0∑dj=0∑dk=0∑cinVar[∣X−F∣]=(1−π2)d2cin(Var[X]+Var[F])(8)
在BN層的損失函數l對x的偏導是和方差有關的:
∂xi∂l=j=1∑mm2σBγ{∂yi∂l−∂yj∂l[1+σB(xi−xj)(xj−μB)]}(9)
其中σB是輸入特徵的方差。
CNN權重的方差都很小的,一般的數量級在10−3或者10−4。因此用一個很小的數乘以Var[X]比兩者相加要小很多,因此公式(9)中的梯度就會小很多,這就會使得參數更新變得很慢,甚至會停在鞍點上。
雖然可以採用大的學習率來提升學習過程效果,但是從上圖可以看出不同層其權重梯度變化很大,這表明每一層的參數需要不同。因此作者給每一層設計了不同學習率:
ΔFl=γ×αl×Δ(Fl)(10)
這裏的γ是全局學習率,Δ(Fl)是卷積核的梯度,αl是對應的局部學習率。輸入是經過BN的,也就是說在AdderNet中,filters的值也是經過了歸一化,因此將局部學習率定義爲如下形式:
αl=∣∣Δ(Fl)∣∣2ηk(11)
這裏的η是一個控制加法filter學習率的超參數,k是Fl中參數的個數。
5、訓練流程及實驗結果
訓練流程如下:
實驗結果
5.1、特徵的分佈
5.2、在CIFAR-10和CIFAR-100測試結果
5.2、在ImageNet測試結果
從測試結果看,效果不錯,但是沒有給出前向結構的運行時間,感覺可能是時間也還是個瓶頸。雖然單個加法運算所需要的時間比乘法的要少,但是從公式(3)可以看出在計算特徵時需要判斷計算值的符號,並且這個判斷是在大量的循環內的,這需要消耗大量的時間,很可能比卷積消耗的時間還要多。