【深度学习】万字综述:用于深度神经网络加速的Shift操作
??作者丨科技猛獸
編輯丨極市平臺
導讀
?如何同時滿足減少可學習參數的數量以及維持computation/memory access比值?你需要Shift操作。本文將詳細介紹shift操作的具體方法、如何剪掉冗余的Shift操作、3種用于深度神經網絡加速的Shift操作、如何利用bit-wise的Shift操作避免乘法運算以及如何將Shift的思想應用到加法網絡中。
在之前的文章中,我們詳細介紹了模型壓縮中的Slimming操作以及高效模型設計的自動機器學習流水線,本文將非常全面的介紹模型壓縮的另一種操作:Shift。
目錄
我們為什么需要Shift操作?
論述shift操作的誕生背景。
如何進行Shift操作?
論述shift操作的具體方法。
稀疏的Shift操作
論述如何剪掉冗余的Shift操作。
給深度神經網絡加速的Shift操作
詳細講解3種用于深度神經網絡加速的Shift操作。
再進一步的bit-wise的Shift操作, 走向無乘法的神經網絡
講解如何利用bit-wise的Shift操作避免乘法運算。
"移位"Shift操作與加法網絡結合,打造適用于邊緣設備的ShiftAddNet
講解如何將Shift的思想應用到加法網絡中。
參考文獻
1 我們為什么需要Shift操作?
端側設備(手機,各種可穿戴設備,自動駕駛,智能機器人等)的功率較低,內存受限。而且,內存之間的通信和計算量也對CNN的功耗有很大的影響。除此之外,如果設備需要和云通信的話(模型更新等),模型的大小也會極大地影響成本。所以,對于端側設備和物聯網設備的推理過程(Inference)來講,模型的優化,尺寸的縮減,速度的提升和功耗的節約是研究的重點。
CNN主要依賴卷積 (Spatial Convolution) 來聚合圖像中的空間信息。在神經網絡中,卷積核是卷積操作最核心的部分,它也叫濾波器,接收這一層的輸入Input,計算出這一層的輸出Output。卷積網絡計算密集,且模型變大的原因是卷積核引入了高強度的計算量,且使模型參數量急劇上升。在這樣的背景下,研究者們設法減少卷積核的大小,進而減少模型的計算量和參數量。其中比較著名的是Depthwise Seperable Convolution,即深度可分離卷積。如下圖所示,圖中對比了深度可分離卷積和常規卷積操作的不同:
計算下常規卷積和深度可分離卷積的計算量和參數量:
假設輸入張量?,其中?代表特征的height和width,?代表特征的channel數。
假設卷積核?,其中?代表卷積核的kernel size,?分別代表輸入特征和輸出特征的channel數。
假設輸出張量?,其中?代表特征的height和width(這里假設輸入輸出的大小一致),?代表特征的channel數。
1 普通卷積的表達式可以寫作:
其中?為輸入的第?個channel的第?個元素。
常規卷積的計算量:?
常規卷積核的參數量:?
輸入特征和輸出特征的參數量之和:?
所以,常規卷積的computation/memory access:
這里需要著重強調的是computation/memory access,這個值反映了模型計算量與內存大小的比值,比值越大,代表我們把更多的資源傾向于計算,而不是內存訪問上;比值越小,則代表我們把更多的資源傾向于內存的訪問 (memory access),而這個過程相比計算要耗費更多的能量和更多的時間,使模型延遲 (Latency)上升嚴重。 這個缺點意味著I/O密集型設備 (I/O-bound device)將無法實現最大的計算效率。
注:關于I/O密集型設備 (I/O-bound device)和計算密集型設備 (CPU-bound device):意思是計算機在處理某個任務的時候,主要時間花在什么地方,就是被什么所“束縛”。比如主要時間消耗在CPU計算上,也就是說處理該任務大部分時間都在等待CPU的計算而不是等待讀寫(硬盤/內存)數據,那么就是CPU-bound,稱之為CPU密集型。反過來如果主要時間消耗在等待讀寫數據而CPU利用率很低,那么該任務就是I/O-bound,I/O密集型。
CPU bound的程序一般而言CPU占用率相當高。這可能是因為任務本身不太需要訪問I/O設備,也可能是因為程序是多線程實現因此屏蔽掉了等待I/O的時間。
I/O bound 指的是系統的CPU效能相對硬盤/內存的效能要好很多,此時,系統運作,大部分的狀況是 CPU 在等 I/O (硬盤/內存) 的讀/寫,此時 CPU Loading 不高。
根據以上的注釋,我們希望computation/memory access這個值盡量大,以更有效率地利用我們的硬件資源。
2 深度可分離卷積的表達式可以寫作:
Depthwise Convolution:
式中,?代表Depthwise Convolution的卷積核。
Pointwise Convolution:
式中,?代表Pointwise Convolution的卷積核。
Depthwise Convolution的計算量:?
Depthwise Convolution卷積核的參數量:
輸入特征和輸出特征的參數量之和:?
所以,Depthwise Convolution的computation vs. memory access:
Depthwise Convolution的計算量/內存占用的比值相比于常規卷積小很多,這意味著Depthwise Convolution將更多的時間花費在內存訪問上,這比浮點運算慢好幾個數量級,并且更消耗能量。這個缺點意味著I/O密集型設備將無法實現最大的計算效率,使之不容易在硬件設備上實現。
問:為什么更輕量化的深度可分離卷積反而不利于實現最大的計算效率?
答:因為其內部的Depthwise Convolution的computation/memory access這個比值太低了,換句話說,同樣的參數,沒有帶來同比的計算量。
所以,我們希望有一種操作,能夠:
減少可學習參數 (learnable parameters)的數量。
維持computation/memory access這個比值不變小。
Shift操作因此誕生。它的最大特點是:requires zero FLOPs and zero parameters。這個特點能夠同時滿足上面的2個要求。這樣,Shift操作維持了computation/memory access這個比值,從而能夠很容易地在硬件設備上實現。
同時,Shift操作與其他的模型壓縮方法是正交 (orthogonal)的,即Shift操作可以與其他的壓縮方法聯合使用。
A和B是正交 (orthogonal)的意思是:使用A方法,不妨礙B方法的使用,換句話說,A和B可以同時使用。
2 如何進行Shift操作?
原文鏈接:CVPR2018:Shift: A Zero FLOP, Zero Parameter Alternative to Spatial Convolutions
Shift操作可以看做是Depthwise Convolution的一種特殊情況,表達式為:
式中,shift operation的卷積核?的定義為:
這里,你會發現Shift操作與Depthwise Convolution的不同之處在于Shift操作的卷積核的每一個channel中的卷積核?中的?個值,只有一個是1,其他都是0。這里的?是個索引,告訴我們位于?處的這個值為1,其他?個值為0。
這一步做完以后,和Depthwise Convolution一樣,我們在后面接上pointwise convolution來進一步融合channel之間的信息。下圖1是Shift操作與常規卷積和深度可分離卷積的對比,圖2是做完Shift操作以后,進一步在后面融合pointwise convolution。
圖1:Shift操作與常規卷積和深度可分離卷積的對比
圖2:Shift操作在空間上調整數據,1×1卷積在通道間混合信息。
我們發現,如下圖3所示,shift卷積過程相當于將原輸入的矩陣在某個方向進行平移,如圖3所示。這也是為什么該操作稱之為shift的原因。雖然簡單的平移操作似乎沒有提取到空間信息,但是考慮到我們之前說到的,通道域是空間域信息的層次化擴散。因此通過設置不同方向的shift卷積核,可以將輸入張量不同通道進行平移,隨后配合1x1卷積實現跨通道的信息融合,即可實現空間域和通道域的信息提取。
圖3:shift卷積相當于將原輸入矩陣在某個方向進行平移
如何構建Shift的卷積核?
一個卷積核在每一個channel上面有?種可能的shift directions,再假設有?個channel,所以共有?種可能的shift選擇。顯然,在這樣的空間里暴力搜索出最適合的shift選擇是不現實的。所以作者使用了近似的手段,即:把這?個channel分成?組,我們將每個組稱之為平移組(shift group)。那么每組的?個channel使用相同的shift選擇,采用相同的平移方向。當然,有可能存在除不盡的情況,這個時候將會有一些通道不能被劃分到任意一個組內,這些剩下的通道都稱之為“居中”組對輸入按通道數進行分組, 每一組通道只往一個方向平移。
舉個例子哈,比如現在卷積核是?的,然后一共有64個channel,按照上面的做法我們把這些channel分成9組,每組7個channel,剩下的一個channel不做shift操作。
那么下面的問題是:如何把每個channel正確地劃分到對應的組里面?
圖4:如何把每個channel正確地劃分到對應的組里面?
雖然通過這種手段大大縮小了搜索空間,但是仍然需要讓模型學出如何將第個通道映射到第個平移組的最佳排列規則,這仍然是一個很大的搜索空間。為了解決這個問題,以下需要提出一種方法,其能夠使得shift卷積層的輸出和輸入是關于通道排序無關的。
具體來講,比如現在輸入的通道如圖4左側圖所示,相同顏色的通道應該歸為一組 (此時是最優情況),但是現在我其實是事先告訴你哪些通道應該歸為一組,即顏色應該相同。其實你事先是不知道的,即:我們不知道具體哪些通道的顏色是相同的,也就是說,我們不知道具體哪些通道應該歸為一組。這時,為了解決這個問題,我們想先通過一個排序 (permutation),使得4個應該分到group 1的channel排到最上面,把4個應該分到group 2的channel排到5-8位置。這樣,我們就可以直接把最上面的4個通道歸為group 1,再下面的4個通道歸為group 2,再下面的4個通道歸為group 3,以此類推。shift進行完后,再通過一個排序恢復原來的channel的順序。但是這樣做排序 (permutation)是未知的,我們的目的就是關于通道排序無關的。
假設表示是在以為通道排序的shift卷積操作,則上式(2.1)可以表示為,如果我們在進行該卷積之前,先后進行兩次通道排序,分別是和,那么我們有:
其中表示算子組合。
上式的意思是:輸入特征?先經過一個排序?,再經過Shift操作?,再經過一個排序?。
那么,如上文所述,排序?都是未知的。怎么解決這個問題?
問:可不可以不用知道排序?是什么?
答:可以的。只需要在頭和尾加上?卷積即可。為什么?
令和分別表示1x1卷積操作,我們有式子(2.4):
這一點不難理解,即便對1x1卷積的輸入進行通道排序重組,在學習過程中,通過算法去調整卷積的參數的順序,就可以通過構造的方式,實現和之間的雙射(bijective)。如式子(2.5)所示,就結論而言,不需要考慮通道的排序,比如只需要依次按著順序賦值某個平移組,使得其不重復即可。通過用卷積“三明治”夾著shift卷積的操作,從理論上可以等價于其他任何形式的通道排序后的結果。
這樣我們就有效地避開了排序?的求解。那么接下來,根據shift算子構建出來的卷積模塊如下圖所示:
圖5:基于shift卷積算子構建的ResNet網絡基本模塊。
如上圖5所示為一個基于Shift操作的模塊,先忽略虛線部分,首先輸入經過一個pointwise convolution,融合channel維度的信息。然后,是帶有Shift操作的卷積核重新分配spatial維度的信息,最后再經過一個pointwise convolution,融合channel維度的信息。這樣就形成了1x1 conv -> shift kernel -> 1x1 conv的結構。所有的pointwise convolution前面都會加上BN和ReLU激活函數。與此同時,為了形成殘差結構,模塊還添加了Identity塊,如果輸入輸出的shape是一樣的,就直接使用殘差即可;如果輸入輸出的shape是不一樣的,就結合downsampling。
藍色虛線塊的Shift塊是實驗補充的一個設計,存在虛線部分的shift塊的設計稱之為結構,只存在實線部分的設計則稱之為結構,它可以在下采樣之前就結合spatial information。
同時,也使用了expansion rate來控制中間層的channel數,因為?卷積計算密集,使得中間層的channel數不能過大。但是使用了Shift操作之后,因為卷積核得到了調整,就可以使中間層的channel數更大。
實驗結果:
ShiftResNet的構建是通過把ResNet里面所有的basic module (2個3×3卷積) 替換為圖5的?結構。下圖6為若我們把ResNet56網絡使用Shift操作,并通過調節expansion rate使參數量降低約3倍時的結果,我們發現模型的Accuracy基本沒有變化。
圖6:Shift操作使得參數量降低約3倍
下圖7展示了3個模型 (ResNet20,ResNet56,ResNet110)的不同參數量 (expansion rate=1,3,6,9)時在2個數據集 (CIFAR-10,CIFAR-100)上的實驗結果。Shift算子的確在計算量和參數量上有著比較大的優勢。比如說當我們控制參數量或計算量下降8倍左右時,即每組的第一行,那么常規ResNet的性能會大幅地下降,而ShiftResNet的性能下降幅度較小。
圖7:不同模型使用Shift操作,在不同參數量級上的結果
如下圖8所示為ShiftNet-A的結構,因為參數量并不會隨著Shift kernel size的增長而變大,所以在一開始的module里面使用了比較大的卷積5×5。通過調節expansion rate來改變每個CSC module的參數量。下圖所示的結構為ShiftNet-A。若把每個CSC模塊的channel數變為原來的0.5倍,即得到ShiftNet-B的結構。若在group 1,2,3,4中分別使用{1,4,4,3}個CSC module,channel數分別為{32,64,128,256},expansion rate,kernel size為3,則得到ShiftNet-C的結構。
圖8:ShiftNet-A的結構
下圖9所示為ShiftNet的3種結構:ShiftNet-A,ShiftNet-B,ShiftNet-C與其他方法的對比,ShiftNet-A,ShiftNet-B,ShiftNet-C對比的對象為具有相似的精度 (Accuracy)的模型。結果發現,在精度相當的條件下,ShiftNet的參數量大幅減少。
圖9:ShiftNet的3種結構與其他方法的對比
下圖10所示為不同的網絡改造成ShiftNet之后的結果對比,結果表明,ShiftNet模型在精度和參數量/計算量之間提供了很好的trade-off。
圖10:ShiftNet模型在精度和參數量/計算量之間提供了很好的trade-off
3 稀疏的Shift操作
原文鏈接:CVPR 2019:All you need is a few shifts: Designing efficient convolutional neural networks for image classification
我們把CPU稱為compute-bound computation platforms,對于這類設備來說,算力是它們的瓶頸。而GPU稱為memory-bound computation platforms,對于這類設備來說,內存數據的移動等是它們的瓶頸。然后分別測試以下Shift操作和Depth-wise convolution在這兩類設備上的運行時間(Runtime)的占比:結果如下圖11所示。
圖(a)和(b)展示了在ShiftNet(上一小節講的模型)中,Shift操作分別在在這兩類設備上的運行時間(Runtime)的占比,我們發現,Shift操作在CPU上占3.6%的運行時間,但在GPU上占28.1%,這表明由于memory movement,Shift操作在memory-bound computation platforms上仍然占據相當大的運行時間。
圖(c), (d)展示了在ShiftNet中,我們僅用深度可分卷積Depthwise separable convolution代替Shift操作來測試其推理時間,得到此時的Depthwise convolution在GPU上的運行時間(Runtime)的占比。其中,圖(c)為使用5×5卷積核的占比,Depthwise separable convolution占了運行時間的79.2%;圖(d)為使用3×3卷積核的占比,Depthwise separable convolution占了運行時間的62.1%。
通過以上的對比即可體現出Shift操作的優越性,即:
對于memory-bound的設備來說,某種操作占用越小份額的運行時間,代表memory movement所需要的時間越短,即這種操作更有利于在memory-bound的設備中實現。
圖11:Shift操作和Depth-wise convolution在這兩類設備上的運行時間(Runtime)的占比
盡管Shift操作在實際運行時間上優于Depthwise separable convolution,但它的實現仍然存在瓶頸,即上文所述memory movement。這里自然就來了一個問題:
每個Shift操作真的有必要嗎?
如果消除無意義的Shift操作,那些memory movement可以減少。這也就是本文的motivation。
為了抑制冗余移位操作,作者在優化過程中增加了懲罰。結果發現,一定數目的Shift操作實際上足以提供空間信息通信。作者將這種類型的移位層稱為稀疏移位層(Sparse Shift Layer , SSR),如圖11(e)所示,它可以顯著減少Shift操作的占用時間。
具體是怎么做的呢?我們先統一下Shift操作的表達:
圖12:不同類型的Shift操作的比較
標準的Shift操作可以表達為:
其中, 角標?表示 channel,?和?分別表示這個channel的橫向和縱向的移位數。?和?的參數數量分別相當于輸入特征圖的通道數,與卷積層的參數相比幾乎可以忽略不計。
上節提到的分組Shift操作可以表達為(圖12(a)):
式中,?代表第?個channel,?代表分組數,?代表kernel size。
這樣做的局限性是移位數?和?是不可學習的。
主動Shift操作:
為了使得移位數?和?可學習, 也有研究者將位移從整數放寬到實數值,并將移位操作放寬到雙線性插值,以使其可微,前向傳播的表達式如下所示(圖12(b)):
即對于輸出的每一個channel上的每個點?都會有一個neighbor set?,它包含的是?周圍的4個點,之后利用這4個點的值做雙線性插值。
但是,這種做法不能帶來與Shift操作相同的inference speed的加速,因為插值仍然需要乘法,而標準的移位操作在推理過程中只需要存儲器移動。
所以,本文方法是從減小Shift操作的數目開始, 冗余的Shift操作會帶來冗余的memory movement,進一步影響神經網絡的推理時間。從這一點出發,作者希望以更少的移位操作構建高效的網絡。
為了避免無意義的記憶移動,我們在損失函數中加入位移懲罰來消除無用的Shift操作。具體是 使用?正則化, 以懲罰冗余的Shift操作,表達式如下:
但是,因為現在的?和?依然是實數值,所以現在依然需要解決主動Shift操作共性的問題,即利用這4個點的值做雙線性插值,插值仍然需要乘法,而標準的移位操作在推理過程中只需要memory movement,所以插值會影響神經網絡的推理時間。
所以,作者避開了雙線性插值,而是直接把實數值的?和?作近似,如下式所示:
前向傳播的表達式如下:
反向傳播:
當前向傳播使用Active Shift(式3.3)時,即移位數?和?是可學習的參數時,損失對移位參數的偏導數為:
式中?和?是feature map的spatial size。損失對輸入特征的偏導數為:
為了充分地利用每個特征,作者在每次只使用feature map的一個子集用于計算,其他的feature map直接傳播到下一層,以確保信息流動,可以表示為下式:
式中,?和?分別代表輸入和輸出的特征,?表示channel的分離,?表示channel的concatenation。上式的意思是:先把這些輸入的feature map的通道進行分離,再將一部分進行運算,另一部分直接傳播;最后將得到的結果結合在一起。如下圖13所示,以上操作叫做Fully-Exploited computational Block (FE-Block)。隨著層數的增加,我們將更多的feature map混合到計算中。這樣,每一個輸入的特征最終都會被優化,得到多尺度的特征用于預測。
圖13:Fully-Exploited computational Block (FE-Block)
其中,黑色的箭頭代表基本的運算單元,如下圖14所示,其中(a)和(b)分別為不帶殘差和帶殘差的運算單元,(c)為下采樣的運算單元。expansion rate默認為6,即:1×1卷積先將channel數擴展為6倍。作者主要采用圖14(b)作為基本計算單元。對于每個計算塊(FE-Block)的最后一個計算單元,我們使用圖14(a)來改變下一個計算塊的信道號,或者使用圖14(c)來進行空間下采樣。
圖14:FE-Block基本運算單元
實驗:
數據集:CIFAR-10/100
模型:ResNet-20/56,ShiftResNet(GroupedShift)-20/56(上一小節的模型),ShiftResNet(SSL)-20/56。
圖15:The analysis of SSL on CIFAR10 and CIFAR100
其實是從3個維度上進行了比較,如圖15所示:
Grouped Shift vs. Sparse Shift:
通過Shift操作,網絡可以根據不同的任務和不同的數據集自適應地調整移位操作的位移和方向。通過偏移懲罰,它可以消除大部分偏移操作,同時保持網絡的精度與原始網絡相當。即使偏移操作的稀疏度超過90%,該網絡仍能保持相當好的性能,這表明只有少量的偏移操作在傳遞圖像分類的空間信息方面起著至關重要的作用。當稀疏度達到100%時,即不再使用Shift操作而只有1×1 convolution時,性能會有明顯下降,這也證明了Shift操作的重要性。
Deep Networks vs. Shallow Networks:
當網絡由20層變為56層時,Shift操作的冗余度增加了,說明增加深度會給移位層帶來更多冗余。
的設置:
當?從0增大到5e-4時, 發現大部分Shift操作被逐步消除,而網絡的精度略有下降。這里的(?)實際上相當于量化感知的主動移位Active Shift。當我們顯著地增加?,使得稀疏度達到100%時,這意味著這些基本模塊都由1×1 convolution組成,并且網絡中只有3個pooling layer提供空間信息通信。在這種情況下,精度下降了很多,這從另一個方面反映了這樣的幾個偏移對空間信息交流真的很重要。
為了進一步分析部分Shift操作的冗余性,作者繼續使用ShiftResNet-20在CIFAR-10/100上進行實驗,?,結果如圖16所示。作者詳細展示了每一層的Shift操作的稀疏性。
圖16:CIFAR10和CIFAR100上的ShiftResNet-20 (λ = 0.0005)中各層的shift稀疏度。
解釋一下表格數據的含義:Unshifts/Channels(比如93/96)這個指標是指在某個block的某層中的96個channel里面,沒有進行移位操作的channel占了93個,說明這93個channel是冗余的,并不重要,那么它的稀疏度就是93/96 = 96.9%。
我們也發現,確實在所有的層中都存在著大量的冗余Shift操作,可以直接剪掉。我們將block2_2進行可視化,結果如圖17所示:
圖17:在CIFAR100上從ShiftResNet-20的block2_2的偏移層中偏移值的可視化。
可以看到在所有的channel中不移位的channel是最多的,所以點也是最大的。但即使許多的channel選擇不移位,剩下的移位的channel仍可以學習有意義的轉換模式,并提供多個感受野。實際上,與pointwise convolution配合的移位層優于傳統卷積層。
接下來作者直接粗暴地剪掉稀疏度大的layer,結果如下圖18所示:
圖18:在移除最不重要的偏移層后,ShiftNet-20在CIFAR10和CIFAR100上的性能。
圖18為在移除最不重要的偏移層后,ShiftNet-20在CIFAR10和CIFAR100上的性能。可以看出,一共9個layer,我們一次砍掉4個,6個,甚至是只保留稀疏度最低的block 2_2,依然有89.4%/66.0%的精度。但是全部砍掉以后,精度就大幅下降。說明少量重要的Shift操作必須保留,大量冗余的Shift操作可以剪掉。
最后作者把SE 模塊 (Squeeze-and-Excitation)操作融合進圖14的FE-Block基本運算單元中,產生了2種新的FE-Block基本運算單元,如圖19所示。
圖19:SE模塊的兩種不同放置方式。
結果發現,將SE模塊放置在 inverted bottleneck部分更為合理。表中的結果從經驗上驗證了這個想法。此外,我們注意到,在裝備SE模塊后,Shift操作的稀疏度增加了很多,這可以從另一個角度反映SE模塊帶來的 channel attention 的作用。
4 給深度神經網絡加速的Shift操作
原文鏈接:WACV 2019:AddressNet: Shift-based Primitives for Efficient Convolutional Neural Networks
本文作者提出了3種基于Shift的操作:channel shift, address shift, shortcut shift來減少GPU上的推理時間,這些操作避免了內存復制(memory copy),所以很快。比如,channel shift的速度要比channel shuffle的速度快12.7倍,但能得到相同的精度。
本文所基于的出發點是:
一個神經網絡,擁有較小的參數量 (params.)或計算量 (FLOPs)并不總是導致直接的神經網絡推理時間 (inference time)的減少,因為這些最先進的緊湊架構 (compact architecture)引入的許多核心操作不能有效地在基于GPU的機器上實現。
我們舉個例子,如下圖20所示:
在MobileNet網絡中,深度可分離卷積(depthwise separable convolutions)只占了總計算量的3%和總參數量的1%,但是占了總的推理時間的20%。
在ShuffleNet網絡中,Channel shuffle 與 shortcut connections操作不占任何參數量和計算量,但是,推理時間卻占了總的推理時間的30%。
在上文所講到的ShiftNet網絡中,特征圖的 shift操作依舊是parameter-free 和 FLOP-free,但是,推理時間卻占了總的推理時間的25%。
雖然MobileNet和ShuffleNet的FLOPs大致相同,但后者需要多兩倍的推理時間。
圖20:不同操作和模型中計算量、參數數量和推理時間的比較
所以根據上面的現象作者得到結論:無論是減少參數量或者是計算量都不能確保減少推理時間。
這也就是本文Motivation的來源,即:有哪些操作能夠既減少參數和計算量,使模型達到壓縮的效果,又減少推理時間,使模型達到加速的效果呢?
答:作者為GPU-based machine設計了3種Shift primitive的操作,如下圖21所示:
圖21:用于高效神經網絡架構設計的三種高效Shift primitive
(a)表示Channel Shift:用來替代Channel Shuffle的操作。
圖22:具有2層卷積的Channel Shuffle和Channel Shift操作
Channel Shuffle非常耗時,因為它需要將特征映射移動到另一個存儲空間。請注意,與浮點運算相比,移動數據在延遲和能耗方面要昂貴得多。相比之下,移動指針或加載數據的物理地址是free的。因此,作者提出Channel Shift Primitive來利用指針移位和最小化實際數據移動來減少時間和能量。Channel Shift 層,通道沿預定義的方向循環移位,該過程最多花費兩個單位的時間來復制數據,因此memory movement比Channel Shuffle少8倍。
(b)表示Address Shift:有效收集空間信息而不消耗實際的推理時間。
Address Shift是把卷積核沿著4種不同的方向移位,以右移為例:黑色箭頭指向feature map的初始地址,右移操作是指把這個地址移動一位,使它指向前面的A, 然后從地址開始在內存空間中連續取張量,相當于將整個張量右移一格。類似地,我們可以定義其他三種不同的移位操作(left,up和down)。
圖23:實現4個方向的地址移位,其中A代表相鄰要素圖的值,黑色箭頭表示指向feature map 的 pointer
以上過程可以抽象為下述公式:
式中,?是指根據指針?讀取對應的地址位置的值,?代表移位的方向。具體而言,?。
圖24:Depth-wise Convolution中的右移操作
Address Shift中的右移操作(圖23)與上文講到的Shift操作中的右移操作(圖24)十分相似,區別是:Shift操作中的右移操作相當于是padding的值都取為0,而Address Shift中的右移操作的boundary值非0。但是作者通過實驗發現, 這種細微差別對網絡的準確性沒有任何明顯的影響。
可能的移位方向的數量相對于kernel size成二次增長(3×3 的kernel:9個可能的方向;5x5的kernel:25個可能的方向)。但是,左上移位方向也可以分解為左移位+上移位的形式。隨著信道數量的增加,配備地址移位操作的CNNs可以融合來自各個方向的所有信息。因此,我們可以只使用四個基本的移動方向來表示其他方向,以簡化網絡架構。
(c)表示Shortcut Shift:通過預先分配連續的存儲空間來提供快速的channel concatenation以實現殘差,但是不消耗推理時間。
作者通過預先分配一個固定大小的空間,將當前層的輸出放在上一層的輸出之后。換句話說,可以使兩層的輸出位于預先分配的連續存儲空間中,這樣就不會在channel concatenation上花費復制或計算時間。
這些操作只需要在內存空間中移動指針來實現, 以最小化實際內存移動(memory copy),完全避免浮點運算,從而能夠實現推理加速。
Address-based模塊:
圖25:Address-based模塊 and Address-enhanced模塊
如圖25(a)所示為Address-based模塊,首先通過pointwise group convolution layer,然后通過Channel Shift層融合channel之間的信息。再然后是address shift層融合spatial information,并將channel分為3組,對每一組的數據使用4種基本移位操作里的一種。最后再通過pointwise group convolution layer來匹配channel數以及融合信息。如果特征的大小是不變的,就再使用 additive residual connection,否則就使用average pooling + concatenation。
如圖25(b)所示為Address-enhanced模塊,它進一步把Address Shift和Channel Shift融入第2個pointwise group convolution layer,并把channel分為4組,每一組分別使用一種方向的Address Shift操作,分別是Left,Up,Right,Down。
實驗:
Channel shift vs. Channel shuffle:
以上二者都可以融合網絡不同的通道之間的信息,二者的性能的對比如圖26所示。
圖26:Channel shift vs. Channel shuffle
上圖為2者在相同的參數量(Params.)和計算量(FLOPs)下的性能對比,Total Time指的是模型的平均運行時間,Operation Time指的是這個操作的平均運行時間。兩種模型達到了相同的精度,但是Channel shuffle在兩個指標上的提速分別達到了1.4倍和12.7倍,顯示出這種操作的優越性。
Address Shift vs. Feature map Shift:
基于上面的分析,4種基本的移位操作(Left,Up,Right,Down)可以替代原本的?個操作。所以,作者將第2節中的ShiftResNet中的feature map Shift操作替換為Address Shift操作,得到的網絡結構稱為AddressResNet,以及只使用4種基本的移位操作替代9個操作(?),比較的結果如下圖27所示。
圖27:Address Shift vs. Feature map Shift
第1個結果是:無論是使用4種基本的移位操作還是使用全部的9種操作,模型的性能相似。這表明基于四個基本方向的移動操作足以較好地融合空間上的信息。
第2個結果是:當將feature map Shift操作替換為Address Shift操作以后,模型實現了一定程度的加速。
下圖28是AddressNet與ShiftResNet在參數量,計算量和推理時間這3個維度的對比。
圖28:AddressNet與ShiftResNet在3個維度的對比
與ShiftResNet的最佳精度相比,AddressNet-44可以用少3倍的計算量和少6倍的參數量獲得更好的性能。此外,圖28(a)和圖28(b)中的曲線表明,在不同的參數量和計算量下,AddressNet始終比移位寄存器網絡獲得更好的精度。在圖28(c)中,AddressNet可以顯著減少推理時間。
5 再進一步的"移位"Shift操作, 走向無乘法的神經網絡
原文鏈接:Arxiv:Deepshift: Towards multiplication-less neural networks
在上面的工作里面我們是在二維空間上進行Shift的操作,目的是CNN卷積核減少參數量,進而減少整個網絡的參數量和計算量。我們讓卷積核的每個channel點乘一個one-hot矩陣(只有一個位置為1,其余位置為0),假設有M個channel,shift kernel的可能情況為?種,為了降低搜索空間,對M個channel分組,每個組內采用一個one-shot矩陣。相同的組使用相同的Shift操作,得到了滿意的結果。
下面要講的這篇工作將Shift操作拓展到了bit-wise,即按位進行。簡而言之就是:維持Shift操作的思想,只是把它按位進行。
這個工作的思想其實是來自數字電路中乘法器的實現原理:比如說有一個整數10,我們把它用8位二進制表示為:00001010。對它做乘法時,比如乘以4,其實可以不直接相乘,而是把它按位左移2位:即:00001010→00101000。這樣一來,移位實現的乘除法比直接乘除的效率高很多。
用移位實現乘除法運算:
a=a×16;
b=b÷16;
可以改為:
a=a<<4;
b=b>>4;
說明:
除2 = 右移1位 乘2 = 左移1位
除4 = 右移2位 乘4 = 左移2位
除8 = 右移3位 乘8 = 左移3位 通常如果需要乘以或除以2的n次方,都可以用移位的方法代替。大部分的C編譯器,用移位的方法得到代碼比調用乘除法子程序生成的代碼效率高。實際上,只要是乘以或除以一個整數,均可以用移位的方法得到結果,如:
分析?可以拆成?,因此為:?
再如:
分析?可以拆成?,因此為:
。
問:上面我們其實是做了一件什么事情?
答:我們總結了這樣一個結論,即:原數任意乘以一個數其實可以通過原數的移位操作和加法操作來實現,而不需要直接相乘。且用移位的方法比調用乘除法子程序的計算量低很多。
上面這句話就是這個工作的核心思想,現在我們把它推廣到神經網絡里面,看看能為我們優化網絡,減少運算帶來哪些有益的啟發。
上面介紹的移位操作使用公式可以表達為:
我們定義一個移位矩陣Shift matrix?,代表每個元素的?值,為整數(integer)。式中?是整數(integer)或定點數(fixed-point)格式。
這里簡單講解下什么是定點數(fixed-point):
定點數(fixed-point number)就是小數點位置固定的數,也就是說,小數點后面的位數是固定的,比如要記錄一筆賬目,這些賬目的數字都不會超過100,就可以使用2位小數位定點數來記錄,比如99.99,2.30,75.28;如果要更精確,可以使用3位小數位的定點數來記錄,比如7.668,38.235。
存儲方式:
第1種方式是對每一個十進制數進行BCD編碼(BCD碼(Binary-Coded Decimal?),用4位二進制數來表示1位十進制數中的0~9這10個數碼,是一種二進制的數字編碼形式,用二進制編碼的十進制代碼),然后加上一個額外的符號位,0表示正數,1表示負數。由于需要使用整數個字節數來存儲定點數,所以依據不同情形,符號位可能使用4bit編碼,也可能使用8bit編碼。如果用4bit編碼符號位,加上數值位的bit數剛好是整數字節,那么就用4bit編碼編碼符號位,否則就用8bit編碼符號位。比如,對-9.99編碼,由于使用BCD編碼9.99需要1.5字節,那么使用4bit編碼符號位剛好就可以湊成2字節,編碼結果如下:0001 1001 1001 1001;如果對-99.99編碼,由于使用BCD編碼99.99剛好是2字節,那么對符號位就使用8bit編碼,編碼結果如下:0000 0001 1001 1001 1001 1001(藍色部分表示符號位編碼,紅色部分表示數值位編碼)。
第2種方式是有一個定點小數的規范。假設機器字長8 bits,我們規定從左至右,第一位為符號位,接著后5位表示定點小數的整數部分,后兩位表示定點小數的小數部分。那么26.5的實際存儲形式為01101010。這種情況是可以進行移位的操作的。
注意對定點數的編碼,不需要對小數點位置進行編碼,因為小數點位置是固定的(對同一定點數表示方式來說)。
優缺點:
定點數的優點就是可以精確表示想要表示的數值,不會像浮點數一樣計算機內部無法精確的表示一些數值,比如要表示[0,100)之間的任何兩位小數,定點數都能精確表示;
定點數的缺點就是不適用于表示特別大或者特別小的數值,比如要表示[0.00000000026,490000000000)之間的任何11位小數,那么就需要使用的字節高達12個(算上符號位)。
在神經網絡中,要成的權重也可能為負值,所以再定義取負操作?(sign flip):
我們定義一個符號矩陣Shift matrix?,代表每個元素的符號變化,即是否進行取負操作?。
這樣,不論是神經網絡的卷積層:?亦或是全連接層:?,我們都可以把乘法運算的過程用下式來表示:
那么,我們通過上述簡單的變換就把神經網絡的乘法操作轉換為了移位操作和加法操作。把訓練神經網絡的權重的問題轉化為了訓練移位矩陣Shift matrix和符號矩陣Shift matrix的問題。如下圖29所示:
圖29:神經網絡的乘法操作轉換為了移位操作和加法操作
問:如何訓練移位矩陣Shift matrix和符號矩陣Shift matrix呢?
答:DeepShift-Q 和DeepShift-PS方法。
DeepShift-Q方法:
假設現在有權重?,我們先把它進行量化得到?,具體的量化方法是:把它近似為離它最近的2的N次冪。
這里舉個例子,比如?,則經過上面的計算有:?。
這樣,我們再定義LinearShift operator:
和ConvShift operator:
LinearShift的反向傳播過程可以計算為:
式中,?為損失函數對輸出的偏導數;?是損失函數對權重的偏導數。
因為?是?的近似值,所以我們取:
所以,?可化簡為:
ConvShift的反向傳播過程可以計算為:
這樣,有了前向傳播的方法(5.7-5.8)和反向傳播的方法(5.9-5.12),我們就可以正常完成網絡的訓練過程,如下圖30所示:
圖30:DeepShift-Q方法網絡的訓練過程
DeepShift-PS方法:
DeepShift-PS方法直接把移位矩陣Shift matrix?和符號矩陣Shift matrix?作為可訓練的參數,按照上面的公式,前向傳播的過程和權重的定義是相同的:
矩陣?中的每個元素:
相應的,反向傳播的過程:
為了方便計算依然使用:?和?。
又因為:?是權值?的符號,所以:
因此,經過5.16式的簡化,5.15變為了:
至此,有了前向傳播的方法(5.13)和反向傳播的方法(5.15,5.17),我們就可以正常完成網絡的訓練過程,如下圖31所示:
圖31:DeepShift-PS方法網絡的訓練過程
實驗:
作者使用了2種DeepShift 的訓練策略:
Train from Scratch:隨機初始化權值,并把卷積和全連接的乘法變為移位相加,并使用Deepshift-Q or DeepShift-PS進行訓練。
Train from Pre-trained Baseline:先使用32位的浮點數權重進行預訓練,繼承權重并把權值量化為最接近的2的次冪 (4.5式),再把卷積和全連接的乘法變為移位相加,并使用Deepshift-Q or DeepShift-PS進行訓練。
在MNIST數據集的結果如下圖32所示:
圖中的Simple FC:一個簡單的全連接模型,由3個線性層組成,特征輸出大小分別為512、512和10。在層間插入了概率為0.2的Dropout層。所有中間層隨后都有一個ReLU激活。
圖中的Simple CNN: 由兩個卷積層和兩個線性層組成的模型。兩個卷積層的輸出通道大小分別為20和50,kernel size大小均為5×5,步長為1。在每個卷積層之后插入窗口大小為2x2的max-pool層,然后進行ReLU激活。線性層的輸出特征尺寸分別為500和10。
圖32:在MNIST數據集的結果
在CIFAR-10數據集的結果如下圖33所示:
圖33:在CIFAR-10數據集的結果
在ImageNet數據集的結果如下圖34所示:
圖34:在ImageNet數據集的結果(只列舉了部分)
6 "移位"Shift操作與加法網絡結合,打造適用于邊緣設備的ShiftAddNet
原文鏈接:NeurIPS 2020:ShiftAddNet: A Hardware-Inspired Deep Network
加法網絡原文鏈接:CVPR 2020:AdderNet: Do We Really Need Multiplications in Deep Learning?
加法網絡的基本原理:
關于加法網絡的詳細介紹和原理推導,請參考這篇博客:
解讀模型壓縮1:輕量化模型設計新思路:加法神經網絡的故事
https://zhuanlan.zhihu.com/p/262260391
在此,我們首先對加法網絡做一個簡單的回顧:
加法網絡的作者研究卷積神經網絡中用加法代替乘法的可行性。一般的卷積計算的過程是:
假設我們的卷積核?,其中?為卷積核的大小,和分別為輸入和輸出通道數,輸入特征為?,其中?和?為特征的長和寬,輸出特征可以被計算為:
上述過程就是最普通的卷積層前向傳播的過程,其中是預先定義好的距離度量函數(pre-defined similarity measure)。
CNN中的卷積運算是計算特征和卷積核之間的互相關性。而這個互相關性可以理解為一種距離的度量。因此,卷積運算也可以看成是距離度量的一種方式。所以,在我們計算卷積的時候,可以理解為我們在度量特征?與卷積核?之間的距離。但是,距離度量的方式有很多種。大部分的度量函數都包含乘法,因此帶來了大量的計算代價。比如說:
當使用互相關作為距離度量時,我們有,此時上面的公式就成為了卷積運算,當?時,公式可以被看做全連接層的計算。
所以,我們理所應當想到:有沒有那么一種距離度量的方式,可以避開乘法運算?
談到距離的度量,你一開始想到的應該是幾個范數:?-范數,?-范數,?-范數,?-范數等等。而恰好?-范數(以向量的-范數為例):
不涉及乘法運算且也是一種距離度量函數,所以輸出的特征可以被重新計算為:
只是把距離度量函數變為了不含乘法運算的?-范數。借助它,我們可以有效地計算卷積核和特征之間的相似性。因此,我們可以只使用加法來提取神經網絡中的特征,并構建加法神經網絡。
但是傳統的卷積神經網絡的輸出有正有負,可是按照上2式計算,輸出全是負值。怎么辦?
借助batch normalization,把輸出歸一化到一定的范圍,并正常在后面使用激活函數。盡管batch normalization涉及乘法運算,但是乘法運算量相比于常規卷積微乎其微。為什么微乎其微?這里作者給出了量化的對比:
比如卷積核的尺寸是:?,輸入特征為?,輸出特征為?。那么:
卷積層的計算復雜度是:?
BN層的計算復雜度是:?
假設?,則二者計算復雜度差距4068倍,故BN層的乘法運算量微乎其微。
讀到這里一個很自然的問題是:AdderNet如何進行參數的更新?
前向傳播計算?:
看上去相比于常規卷積操作只是改變了度量函數,那反向傳播的方法能不能和常規卷積操作進行類比?
常規卷積操作:
AdderNet:
要完成反向傳播的過程,就需要幾個值:
輸出特征?對于卷積核參數?的偏導數。
輸出特征?對于輸入特征?的偏導數。
首先計算輸出特征 對于卷積核參數 的偏導數:
對于常規的卷積操作:
式中?。
2. 對于AdderNet:
式中?代表符號函數。
這一眼就能看出有問題,符號函數的輸出結果只有?這三種情況,也就是說你的梯度也只可能算出來這三個值。這樣的梯度更新方式沒法在梯度下降的最陡方向更新,且當參數的維度很高時,效果會更差,非常不利于卷積核的優化。
因此,作者考慮使用以?-范數為距離度量的梯度計算公式:
這一步可行的原因是什么?我的個人觀點是:改進后的梯度計算公式是以?-范數為距離度量的前向傳播的配套的梯度計算方法,如果我們把前文所述的距離度量的方法?替換為-范數,那毫無疑問這種梯度更新方法是可行且收斂的。但現在距離度量的方法?為-范數,當?(收斂)時,?,也收斂。且?更能表達輸入特征和濾波器之間的距離大小關系,也更加有利于梯度的優化。
接下來計算輸出特征 對于輸入特征 的偏導數:
對于常規的卷積操作:
2. 對于AdderNet:
同樣的問題,符號函數的輸出結果只有?這三種情況,仿照上面的做法,我們考慮使用以?-范數為距離度量的梯度計算公式:
但是,此時輸出特征?對于輸入特征?的偏導數計算出的結果的量級可能大于1,當網絡很深時,反向傳播會導致梯度爆炸。
所以,在對輸入特征X求偏導數時,我們對其進行截斷:
其中?為?函數,即將輸出截斷到-1到+1。如果不對X進行截斷,多層的反向傳播會使得改進梯度的量級和真實梯度的量級有著很大的累計誤差,導致梯度爆炸。
Shift與加法網絡結合:
以上我們復習了加法網絡的基本原理,上節我們介紹了DeepShift,它從硬件設計實踐、計算機處理器、甚至數字信號處理中得出一個非常基本的概念:乘法可以通過加法和邏輯位移位來執行,其硬件實現非常簡單且更快,而不會損害結果質量或精度。此外,在目前可用的處理器上,位移位指令比乘法指令更快,可用于乘法和除法的。 用一系列的移位和加法 (或減法)來實現常數的乘法 (或除法)。上述的“捷徑”節省了算術運算,并且可以很容易地應用于加速任何涉及乘法(標量、矢量或矩陣)的機器學習算法的硬件實現。
作者首先進行了2個假設:
僅僅使用Shift操作或者加法網絡性能均不如原始的DNN,但將二者結合在一起可以提高網絡的性能和表達能力,同時保持硬件效率的優勢。
Shift操作屬于粗粒度操作,而加法網絡屬于細粒度的操作,二者的結合甚至有可能產生新的模型,在任務精度方面與基于乘法的DNN相當,同時提供更高的硬件效率。
因此,以上也就是作者的Motivation,即把Shift操作和加法網絡的思想相結合。
1) Shift操作的硬件層面分析:
首先我們比較一下在ASIC和FPGA上面,不同的數據格式 (Format)的不同操作 (Operation):乘法,加法和Shift操作的能耗 (pJ):
圖35:在ASIC和FPGA上面:乘法,加法和Shift操作的能耗 (pJ)
我們發現,各種數據格式與它們相應的乘法相比,加法操作和Shift操作可以非常有效,大幅降低能耗。當分別在45nm CMOS和FPGA中實現時,Shift操作可以比它們的乘法電路節省高達196倍和24倍的能量成本。此外,對于16 bit的設計,據估計乘法器的平均功率和電路面積至少分別是Shift操作的9.7倍和1.45倍。
2) Shift操作的算法層面分析:
盡管Shift操作的硬件效率很高,但就表達效率(expressive efficiency)而言,Shift操作構建的網絡與基于乘法的網絡相比是不利的。關于表達效率(expressive efficiency),作者是這樣定義的:
從形式上來說,如果B實現的任何功能都可以被A復制,但是存在A實現的功能,除非B的規模顯著變大,否則B無法實現。那么架構A的表達效率要高于架構B。
例如,人們普遍認為,與淺層網絡(shallow network)相比,Deep network具有更高的表達效率,因為淺層網絡必須指數增長才能逼近多項式大小的DNN所表示的函數。
為了便于討論,作者定義表達能力(expressive capacity)為:
表達能力是指在相同或相似的硬件成本下網絡達到的精度,即如果網絡A以相同或甚至更少的浮點運算(或能量成本)為代價達到更高的精度,則認為網絡A比網絡B具有更好的表達能力。
作者觀察到Shift操作在表達能力上不如加法網絡和乘法。
總之,Shift操作的特點是硬件效率高,表達能力弱。
3) 加法網絡的硬件層面分析:
加法可以對于 fixed-point 的數據可以比乘法節省高達196倍和31倍的能量成本,當分別在45nm CMOS和FPGA中實現時,可以比浮點格式的數據節省47倍和4.1倍的能量成本。
4) 加法網絡的算法層面分析:
目前并沒有相關的工作研究加法網絡的表達能力或者表達效率, 作者通過在各種setting下的實驗表明,基于加法的網絡通常比基于Shift操作的網絡具有更好的表達能力。在ResNet18和ImageNet數據集上,在計算量相當甚至更少的情況下, Addernes的精度比DeepShift高1.37%。而且,在DNN中,學習到的特征細粒度的多樣性是另一個對所達到的精度很重要的因素。從這個角度來講,Shift操作屬于粗粒度操作,而加法網絡屬于細粒度的操作。
以上我們在硬件層面和算法層面這2個方面對比了Shift操作和加法網絡。下面是把二者結合起來:
為了更好地驗證作者的上述假設(1),即,將兩個weak players (Shift操作和加法網絡)集成為一個,與僅具有兩個weak players 之一的網絡相比,可以得到具有更高的任務準確性和硬件效率,我們采用基于SOTA的Shift操作和加法網絡來實現 shift and add layers:
圖36:ShiftAddNet的總體結構。
5) ShiftAddNet的前向傳播過程:
式中,?和?代表輸入和輸出,?和?是執行inner products(Shift操作)和?范數(加法網絡)的核函數。?代表加法網絡的權重,?代表Shift層的權重。?為符號位sign flip operators,?為移動的位數,即bit-wise shift。
本質是先進行Shift操作,得到的結果再通過加法網絡,如上圖所示。
6) ShiftAddNet的反向傳播過程:
在反向傳播過程中,ShiftAddNet采用了SOTA的Shift操作和加法網絡的反向傳播設計。 簡單來說,Shift操作的反向傳播參考本文 (5.17) 式,加法網絡部分的反向傳播參考本文 (6.12) 式。為了查閱的方便,這里再敘述一遍:
(6.1) 加法網絡部分的前向傳播(依據(6.5)式):
式中,?和?是輸入和輸出的channel數,?和?是the size of the weight filters。
是激活函數輸出,?為輸入,?為權重。
(6.2) 加法網絡的反向傳播為(依據(6.12)式):
在反向傳播時我們需要求輸出對輸入,輸出對權值的偏導數,分別如下(6.16)和(6.17)式所示:
這里我們需要將梯度截斷到-1到+1,如式(6.17)所示。如果不對X進行截斷,多層的反向傳播會使得改進梯度的量級和真實梯度的量級有著很大的累計誤差,導致梯度爆炸。
ShiftAddNet的加法層的stride始終為1,Shift層的stride可以取與對應的原始卷積網絡一致。
以上3式(6.15-6.17)為ShiftAddNet加法網絡部分的更新方法,嚴格按照了?中的前向傳播和反向傳播方法。
(6.3) Shift部分的前向傳播(依據(5.7)式):
式中,?代表卷積核的步長stride。
(6.4) Shift部分的反向傳播(依據(5.17)式):
是激活函數輸出,?為輸入,?為權重。式中?的計算要依據(6.17)式。
在反向傳播時依舊要求輸出對輸入,輸出對權值的偏導數,只是此時加法網絡的輸入是Shift操作的輸出,即:?。所以輸出對權值的偏導數如上(6.19)式所示;輸出對輸入的偏導數?,如上(6.17)式所示。
實驗:
模型和數據集: 作者分別在2種模型和6種數據集上進行了實驗,數據集為:CIFAR-10/100,MHEALTH, FlatCam Face, USCHAD, Head-pose detection。模型為:ResNet-20和VGG-19 small。
評價指標: 為了評估硬件效率,作者使用了為SOTA FPGA (ZYNQ-7 ZC706)來評估DNN的能量消耗。
Baseline有3個: AdderNet[1],DeepShift[5],ConvNet(The lottery ticket hypothesis: Finding sparse, trainable neural networks論文所提出的網絡)。
ShiftAddNet的前向傳播過程(weights and activations)使用FIX32(32位定點數)格式的數據,反向傳播過程(error and gradient)使用FIX8(8位定點數)格式的數據。
以上實驗的結果如下圖37所示:ShiftAddNet無論是在能耗方面還是在精度方面都超過了單純的Shift操作或者加法網絡。全精度的ShiftAddNet甚至是超過了基于乘法的ConvNet。
圖37:不同模型的精度和能耗的結果
我們可以發現量化為FP-8的ShiftAddNet的精度相比于FP-32的AdderNet的變化為-1.79%-0.18%,但是節約了65.1%-75.0%的能耗;量化為FP-8的ShiftAddNet的精度相比于DeepShift的變化為2.41%-16.1%,而且節約了34.1%-70.9%的能耗。作者同樣對比了在相同的量化精度下(FIX32/16/8)ShiftAddNet的精度和能耗都優于DeepShift和AdderNet。
如下圖38所示為ShiftAddNet與DeepShift和AdderNet的訓練曲線,根據結果可以得出結論:ShiftAddNet以更少的時期和能量成本實現了相當或更高的精度,這表明它具有更好的泛化能力。
圖38:ShiftAddNet與DeepShift和AdderNet的訓練曲線
作者也嘗試了把Shift layer的參數固定住,只去更新加法網絡的參數,得到的結果如下圖39所示:
圖39:通過在CIFAR-10/100和兩個IoT數據集上使用ResNet-20和VGG 19模型,在AdderNet(僅加法操作)、DeepShift(僅移位操作)和基于乘法的ConvNet上測試固定住Shift layer的參數的ShiftAddNet的準確性與能耗成本的關系。
總體而言,與AdderNet(具有浮點或定點精度)和DeepShift相比,ShiftAddNet可以實現高達90.0%和82.8%的節能,同時實現更高的精度(-3.74%-31.2%和3.5%-23.6%)。更有趣的是,把Shift權重固定的ShiftAddNet具有更少的能源消耗,同時對量化的更好的魯棒性(FIX-8格式的數據取得了10.8%的精度提升)。
作者也對ShiftAddNet中的Shift層進行剪枝,對比不同的剪枝率下的ShiftAddNet的性能,如下圖40所示。當剪枝率達到100%時,ShiftAddNet退化為AdderNet。我們可以發現,即使在Shift層被大幅刪減的情況下,ShiftAddNet仍能保持其快速收斂的優勢。
圖40:ResNet-20 網絡, CIFAR-10數據集,不同剪枝率下ShiftAddNet的收斂曲線。
最后一個對照試驗作者對比了對加法網絡層進行剪枝后的性能維持情況,如下圖41右側所示,使用ResNet-20作為主干。當加法網絡層的剪枝率由30%→50%→70%→90%時,原AdderNet的性能出現大幅下降,即使稍微修剪AdderNet也會導致精度下降。
圖41左側為第11個add layer中的權重分布。為了更好地可視化,直方圖中僅顯示非零權重。
圖41:左:在ResNet20主干,數據集CIFAR-10上訓練的的第11個Adder Layer中的權重分布直方圖。右:比較不同剪枝比例下的ShiftAddNet和AdderNet的精度。
我們可以看到,原始的加法網絡,即AdderNet,在高剪枝率下不能為權重提供寬的動態范圍(權重分布的范圍變窄了,但是ShiftAddNet權重的分布范圍還是依舊很寬),而ShiftAddNet可以保持一致的寬動態范圍的權重。這解釋了ShiftAddNet對稀疏化的魯棒性的提高。圖41(c)中的測試精度比較表明,當剪掉add layer層中50%的參數時,ShiftAddNet仍然可以達到80.42%的測試精度,而原始AdderNet的精度下降到51.47%。
參考文獻:
[1] CVPR 2020:AdderNet: Do We Really Need Multiplications in Deep Learning?
[2] CVPR 2018:Shift: A Zero FLOP, Zero Parameter Alternative to Spatial Convolutions
[3] CVPR 2019:All you need is a few shifts: Designing efficient convolutional neural networks for image classification
[4] WACV 2019:AddressNet: Shift-based Primitives for Efficient Convolutional Neural Networks
[5] Arxiv:Deepshift: Towards multiplication-less neural networks
[6] NeurIPS 2020:ShiftAddNet: A Hardware-Inspired Deep Network
◎作者檔案
作者:科技猛獸
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯 獲取本站知識星球優惠券,復制鏈接直接打開: https://t.zsxq.com/qFiUFMV 本站qq群704220115。加入微信群請掃碼: 與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的【深度学习】万字综述:用于深度神经网络加速的Shift操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ie浏览器剪贴板操作警告弹窗关闭方法
- 下一篇: 【NLP】全面详解 | 深度学习中的注意