摘要
論文地址:https://arxiv.org/pdf/1807.11164.pdf
作者:Face++
概述:論文指出現(xiàn)在的網(wǎng)絡通常使用間接量來度量計算復雜度(例如FLOPs)全跨,然而實際的運行時間受到很多其他因素的影響例如內(nèi)存訪問開銷(memory access cost)和平臺的特性熔任,如下圖所示凌那,同樣的FLOPs卻有著截然不同的運行速度
直接度量(speed)和間接度量(FLOPs)之間的差距在于主要存在于
(1)許多其他的因素也會影響運行的速度拭抬,這是FLOPs不能考慮到的,比如內(nèi)存訪問開銷(MAC)沦疾,分組卷積就會有著非常高的MAC称近;另一個常見因素是網(wǎng)絡的并行程度第队,在相同F(xiàn)LOPs的條件下,并行度高的網(wǎng)絡要比低的網(wǎng)絡速度更快
(2)平臺的不同刨秆,相同的FLOPs在不同的平臺上可能有著不同的運行時間凳谦,我們不能簡單地認為卷積的運行時間就是
卷積的九倍
于是文章提出了在設計高效網(wǎng)絡時的兩個準則
(1)采用直接的度量方式(例如speed),而不是間接地
(2)要在目標平臺上進行估計
網(wǎng)絡設計準則
采用的硬件設施:
?GPU ———— NVIDIA GeForce GTX 1080Ti + cuDNN 7.0
?ARM ———— 高通驍龍810
實驗可得坛善,F(xiàn)LOPs并不是一個能足夠精確估計實際時間的度量
G1 相同通道數(shù)能夠減小內(nèi)存訪問開銷
首先對depthwise separable convolutions中的卷積進行分析晾蜘,一次卷積的FLOPs為
,由此計算
眠屎,然后利用均值不等式可得
然后將帶入可得到結(jié)論剔交,當輸入輸出通道數(shù)相等時,MAC最小
當輸入輸出通道數(shù)相同時改衩,MAC最小岖常,運行速度更快,因此網(wǎng)絡設計時葫督,應盡可能地使輸入輸出通道數(shù)之比盡可能等于1
G2 過多的組卷積增加MAC
分組卷積大大減少了計算復雜度(FLOPS)竭鞍,也能夠增加網(wǎng)絡容量,但隨之帶來的是MAC的增加橄镜,分組卷積的MAC
其中是組卷積的個數(shù)偎快,F(xiàn)LOPs為
,容易得出洽胶,給定輸入
和計算量
晒夹,
隨著
的增加而增加
組卷積的使用建議:具體的分組數(shù)要根據(jù)實際的目標平臺和任務來選擇,單純的因為組卷積能夠增加通道數(shù)從而較為容易的增加準確度而使用大量的組卷積是不明智的選擇
G3 網(wǎng)絡的分支會影響并行程度
盡管多分支結(jié)構(gòu)的網(wǎng)絡能夠提高準確度姊氓,但是對并行計算能力不強的GPU來說丐怯,會大大減小運行效率。為了量化網(wǎng)絡分支如何影響網(wǎng)絡運行效率翔横,作者對一系列具有不同程度的網(wǎng)絡塊(blocks)進行了評估读跷,如下圖所示
網(wǎng)絡的分支數(shù)增加會減慢網(wǎng)絡運行速度
G4 Element-wise操作并不能忽略
如圖2所示,element-wise操作占據(jù)了相當大一部分時間禾唁,尤其是在GPU上效览,這些操作包括:ReLU、AddTensor荡短、AddBias等等丐枉。它們都有著較小的FLOPs但卻有較大的MAC,應該將depthwise convolution也視為一種element-wise操作因為它也有著較高的
移除ReLU和shortcut肢预,網(wǎng)絡速度提高了20%
結(jié)論
通過上述的分析矛洞,我們得出了一個高效的網(wǎng)絡結(jié)構(gòu)應該盡可能的根據(jù)如下原則去設計
(1)使用 balanced 卷積(即輸入輸出通道數(shù)相同)
(2)小心使用組卷積來防止大的內(nèi)存開銷
(3)減少網(wǎng)絡的分支
(4)減少 element-wise 操作
ShuffleNet V2:全新高效的網(wǎng)絡結(jié)構(gòu)
Review of ShuffleNet v1
為了增加通道數(shù)但又不顯著增加FLOPs洼哎,主要有以下兩種方法:(1)pointwise group convolution烫映;(2)bottleneck-like structures 沼本。然而以上兩種方法都會增加MAC(G1 G2),尤其是在輕量級的網(wǎng)絡中锭沟。此外抽兆,使用太多的組卷積違背了 G3 原則。shortcut中的逐個元素的 “+”操作也不可忽視(G4)
實現(xiàn)高容量且高效率模型的關(guān)鍵在于如何既不使用 dense convolution(通過增加輸出卷積核數(shù)目來增加通道數(shù)) 也不使用過多 組卷積 來保證通道數(shù)目多且等寬
ShuffleNet V2
基于上述啟發(fā)族淮,提出了一種名為 channel split 的操作辫红。如圖3(c)所示(上圖),輸入特征通道被分為兩個分支
和
祝辣,符合 G3 贴妻,一個分支保留自身映射,另一個分支包含三個有著相同輸入輸出的通道來滿足 G1 蝙斜,兩個
卷積不再是組卷積名惩,部分符合 G2 原則,之所以說部分符合是因為分離操作已經(jīng)產(chǎn)生了兩個組孕荠。經(jīng)過卷積層后娩鹉,兩個分支開始進行融合,通道數(shù)保持不變(G1)稚伍,然后經(jīng)過 Channel Shuffle 層弯予,一個單元結(jié)束。
在shuffling之后个曙,下個單元開始锈嫩,注意在ShuffleNet v1中 Add 操作不復存在,ReLU和depthwise convolution只存在于一個分支困檩。而且祠挫,三個連續(xù)的逐個元素操作 “Concat” “Channel Shuffle” 以及 “Channel Split”合并為一個 element-wise操作,根據(jù)G4悼沿,這些改變有利于提高網(wǎng)絡效率等舔。
完整的網(wǎng)絡結(jié)構(gòu)是由上述blocks堆疊而成,簡單起見糟趾,設置慌植,整體的網(wǎng)絡結(jié)構(gòu)與ShuffleNet相似,有一個不同之處在于
后加入了一個額外的
卷積層用于融合特征义郑。