收錄於話題 #模型壓縮 7個
如何同時滿足減少可學習參數的數量以及維持computation/memory access比值?你需要Shift操作。本文將詳細介紹shift操作的具體方法、如何剪掉冗餘的Shift操作、3種用於深度神經網絡加速的Shift操作、如何利用bit-wise的Shift操作避免乘法運算以及如何將Shift的思想應用到加法網絡中。 >>年度盤點:極市計算機視覺資源匯總,頂會論文、技術視頻、數據集等(限時開放下載)
在之前的文章中,我們詳細介紹了模型壓縮中的Slimming操作以及高效模型設計的自動機器學習流水線,本文將非常全面的介紹模型壓縮的另一種操作:Shift。
目錄詳細講解3種用於深度神經網絡加速的Shift操作。
再進一步的bit-wise的Shift操作, 走向無乘法的神經網絡 講解如何利用bit-wise的Shift操作避免乘法運算。
"移位"Shift操作與加法網絡結合,打造適用於邊緣設備的ShiftAddNet 1 我們為什麼需要Shift操作?
端側設備 (手機,各種可穿戴設備,自動駕駛,智慧機器人等)的功率較低,內存受限。而且,內存之間的通信和計算量也對CNN的功耗有很大的影響。除此之外,如果設備需要和雲通信的話(模型更新等),模型的大小也會極大地影響成本。所以,對於端側設備和物聯網設備的推理過程(Inference)來講,模型的優化,尺寸的縮減,速度的提升和功耗的節約是研究的重點。CNN主要依賴卷積
(Spatial Convolution) 來聚合圖像中的空間信息。在神經網絡中,卷積核是卷積操作最核心的部分,它也叫濾波器,接收這一層的輸入Input,計算出這一層的輸出Output。卷積網絡計算密集,且模型變大的原因是卷積核引入了高強度的計算量,且使模型參數量急劇上升。在這樣的背景下,研究者們設法減少卷積核的大小,進而減少模型的計算量和參數量。其中比較著名的是
Depthwise Seperable Convolution ,即
深度可分離卷積 。如下圖所示,圖中對比了深度可分離卷積和常規卷積操作的不同:假設
輸入張量 ,其中 代表特徵的height和width, 代表特徵的channel數。假設卷積核 ,其中 代表卷積核的kernel size, 分別代表輸入特徵和輸出特徵的channel數。假設輸出張量 ,其中 代表特徵的height和width(這裡假設輸入輸出的大小一致), 代表特徵的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這個值儘量大 ,以更有效率地利用我們的硬體資源。式中, 代表Depthwise 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 ConvolutionsShift操作可以看做是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卷積相當於將原輸入矩陣在某個方向進行平移 一個卷積核在每一個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基本沒有變化。下圖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的結構。下圖9所示為ShiftNet的3種結構:ShiftNet-A,ShiftNet-B,ShiftNet-C與其他方法的對比,ShiftNet-A,ShiftNet-B,ShiftNet-C對比的對象為具有相似的精度 (Accuracy)的模型。結果發現,在精度相當的條件下,ShiftNet的參數量大幅減少。下圖10所示為不同的網絡改造成ShiftNet之後的結果對比,結果表明,ShiftNet模型在精度和參數量/計算量之間提供了很好的trade-off。圖10:ShiftNet模型在精度和參數量/計算量之間提供了很好的trade-off3 稀疏的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操作,那些memory movement可以減少。這也就是本文的motivation。為了抑制冗餘移位操作,作者在優化過程中增加了懲罰。結果發現,一定數目的 Shift操作實際上足以提供空間信息通信。作者將這種類型的移位層稱為稀疏移位層(Sparse Shift Layer , SSR),如圖11(e)所示,它可以顯著減少Shift操作的佔用時間。具體是怎麼做的呢?我們先統一下Shift操作的表達:其中, 角標 表示 channel, 和 分別表示這個channel的橫向和縱向的移位數。 和 的參數數量分別相當於輸入特徵圖的通道數,與卷積層的參數相比幾乎可以忽略不計。上節提到的分組Shift操作可以表達為(圖12(a)):式中, 代表第 個channel, 代表分組數, 代表kernel size。為了使得移位數 和 可學習 , 也有研究者將位移從整數放寬到實數值,並將移位操作放寬到雙線性插值,以使其可微,前向傳播 的表達式如下所示(圖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)來進行空間下採樣。模型:ResNet-20/56,ShiftResNet(GroupedShift)-20/56(上一小節的模型),ShiftResNet(SSL)-20/56。圖15:The analysis of SSL on CIFAR10 and CIFAR100Grouped 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所示。結果發現,將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),完全避免浮點運算,從而能夠實現推理加速。圖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方法。 假設現在有權重 ,我們先把它進行量化得到 ,具體的量化方法是:把它近似為離它最近的2的N次冪。這樣,我們再定義LinearShift operator :式中, 為損失函數對輸出的偏導數; 是損失函數對權重的偏導數。這樣,有了前向傳播的方法(5.7-5.8)和反向傳播的方法(5.9-5.12),我們就可以正常完成網絡的訓練過程,如下圖30所示:DeepShift-PS方法直接把移位矩陣Shift matrix 和符號矩陣Shift matrix 作為可訓練的參數,按照上面的公式,前向傳播的過程和權重的定義是相同的:至此,有了前向傳播的方法(5.13)和反向傳播的方法(5.15,5.17),我們就可以正常完成網絡的訓練過程,如下圖31所示:圖31:DeepShift-PS方法網絡的訓練過程Train from Scratch:隨機初始化權值,並把卷積和全連接的乘法變為移位相加,並使用Deepshift-Q or DeepShift-PS進行訓練。Train from Pre-trained Baseline:先使用32位的浮點數權重進行預訓練,繼承權重並把權值量化為最接近的2的次冪 (4.5式),再把卷積和全連接的乘法變為移位相加,並使用Deepshift-Q or DeepShift-PS進行訓練。圖中的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。圖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如何進行參數的更新?看上去相比於常規卷積操作只是改變了度量函數,那反向傳播的方法能不能和常規卷積操作進行類比? 這一眼就能看出有問題,符號函數的輸出結果只有 這三種情況,也就是說你的梯度也只可能算出來這三個值。這樣的梯度更新方式沒法在梯度下降的最陡方向更新,且當參數的維度很高時,效果會更差,非常不利於卷積核的優化。因此,作者考慮使用以 -範數為距離度量的梯度計算公式:這一步可行的原因是什麼?我的個人觀點是:改進後的梯度計算公式是以 -範數為距離度量的前向傳播的配套的梯度計算方法,如果我們把前文所述的距離度量的方法 替換為 -範數,那毫無疑問這種梯度更新方法是可行且收斂的。但現在距離度量的方法 為 -範數,當 (收斂)時, ,也收斂。且 更能表達輸入特徵和濾波器之間的距離大小關係,也更加有利於梯度的優化。同樣的問題,符號函數的輸出結果只有 這三種情況,仿照上面的做法,我們考慮使用以 -範數為距離度量的梯度計算公式:但是,此時輸出特徵 對於輸入特徵 的偏導數 計算出的結果的量級可能大於1,當網絡很深時,反向傳播會導致梯度爆炸。所以,在對輸入特徵X求偏導數時,我們對其進行截斷:其中 為 函數,即將輸出截斷到-1到+1。如果不對X進行截斷,多層的反向傳播會使得改進梯度的量級和真實梯度的量級有著很大的累計誤差,導致梯度爆炸。以上我們複習了加法網絡的基本原理,上節我們介紹了DeepShift,它從硬體設計實踐、計算機處理器、甚至數位訊號處理中得出一個非常基本的概念:乘法可以通過加法和邏輯位移位來執行,其硬體實現非常簡單且更快,而不會損害結果質量或精度。此外,在目前可用的處理器上,位移位指令比乘法指令更快,可用於乘法和除法的。 用一系列的移位和加法 (或減法)來實現常數的乘法 (或除法)。上述的「捷徑」節省了算術運算,並且可以很容易地應用於加速任何涉及乘法(標量、矢量或矩陣)的機器學習算法的硬體實現。僅僅使用Shift操作或者加法網絡性能均不如原始的DNN,但將二者結合在一起可以提高網絡的性能和表達能力,同時保持硬體效率的優勢。Shift操作屬於粗粒度操作,而加法網絡屬於細粒度的操作,二者的結合甚至有可能產生新的模型,在任務精度方面與基於乘法的DNN相當,同時提供更高的硬體效率。因此,以上也就是作者的Motivation,即把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倍 。儘管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操作的特點是硬體效率高,表達能力弱。 加法可以對於 fixed-point 的數據可以比乘法節省高達196倍和31倍的能量成本,當分別在45nm CMOS和FPGA 中實現時,可以比浮點格式的數據節省47倍和4.1倍的能量成本。目前並沒有相關的工作研究加法網絡的表達能力 或者表達效率 , 作者通過在各種setting下的實驗表明,基於加法的網絡通常比基於Shift操作的網絡具有更好的表達能力。在ResNet18和ImageNet數據集上,在計算量相當甚至更少的情況下, Addernes的精度比DeepShift高1.37%。而且,在DNN中,學習到的特徵細粒度的多樣性是另一個對所達到的精度很重要的因素。從這個角度來講,Shift操作屬於粗粒度操作,而加法網絡屬於細粒度的操作。以上我們在硬體層面和算法層面這2個方面對比了Shift操作和加法網絡。下面是把二者結合起來:為了更好地驗證作者的上述假設(1),即,將兩個weak players (Shift操作和加法網絡) 集成為一個,與僅具有兩個weak players 之一的網絡相比,可以得到具有更高的任務準確性和硬體效率,我們採用基於SOTA的Shift操作和加法網絡來實現 shift and add layers:式中, 和 代表輸入和輸出, 和 是執行inner products(Shift操作)和 範數(加法網絡)的核函數。 代表加法網絡的權重, 代表Shift層的權重。 為符號位sign flip operators, 為移動的位數,即bit-wise shift。本質是先進行Shift操作,得到的結果再通過加法網絡,如上圖所示。在反向傳播過程中,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)式): (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。我們可以發現量化為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極市&英特爾 OpenVINO™中級認證,代碼均已內置,助力快速完成~
添加極市小助手微信(ID : cvmart2),備註:姓名-學校/公司-研究方向-城市(如:小極-北大-目標檢測-深圳),即可申請加入極市目標檢測/圖像分割/工業檢測/人臉/醫學影像/3D/SLAM/自動駕駛/超解析度/姿態估計/ReID/GAN/圖像增強/OCR/視頻理解等技術交流群:每月大咖直播分享、真實項目需求對接、求職內推、算法競賽、乾貨資訊匯總、與 10000+來自港科大、北大、清華、中科院、CMU、騰訊、百度等名校名企視覺開發者互動交流~覺得有用麻煩給個在看啦~