華為輕量級神經網路架構GhostNet再升級,GPU上大顯身手的G-GhostNet(IJCV22)


MLNLP 

機器學習演算法與自然語言處理 

)社群是國內外知名自然語言處理社群,受眾覆蓋國內外NLP碩博生、高校老師以及企業研究人員。


社群的願景 是促進國內外自然語言處理,機器學習學術界、產業界和廣大愛好者之間的交流,特別是初學者同學們的進步。

轉載自 | 極市平臺
作者 | Ziyang Li
1
『寫在前面的話』
本文針對網路部署時面臨的記憶體和資源有限的問題,提出兩種不同的Ghost模組,旨在利用成本低廉的線性運算來生成Ghost特徵圖。C-Ghost模組被應用於CPU等裝置,並透過簡單的模組堆疊實現C-GhostNet。適用於GPU等裝置的G-Ghost模組利用階段性特徵冗餘構建。最終實驗結果表明兩種模組分別實現了對應裝置上精度和延遲的最佳權衡。
論文地址:https://arxiv.org/abs/2201.03297
程式碼地址:https://github.com/huawei-noah/CV-Backbones
2
『導讀』
在GhostNet(CVPR 2020)出現之前,筆者對冗餘特徵一直保持刻板的偏見。但不管是過分的抑制冗餘,還是過分的增加冗餘,都會對架構效能造成不好的影響(存在即合理)。在GhostNet中,作者的等人透過細緻的實驗觀察,提出“以有效方式接受冗餘特徵圖”的思想,將以往的特徵生成過程用更廉價的線性運算來替代,從而在保證效能的同時實現輕量化。
如下圖所示,對中間特徵圖進行視覺化之後,可以明顯看出一些特徵表達近似(圖中用相同顏色標出的方框),因此作者等人提出,近似的特徵圖可以透過一些廉價的操作來獲得。
圖1:ResNet50中第一個殘差組產生的一些特徵圖的視覺化。
據此,作者等人提出GhostNet,並在本文中稱作C-GhostNet,因此筆者將解讀的重點放在G-Ghost,對C-Ghost僅做回顧。
C-GhostNet中為實現輕量化,使用了一些低運算密度的操作。低運算密度使得GPU的平行計算能力無法被充分利用,從而導致C-GhostNet在GPU等裝置上糟糕的延遲,因此需要設計一種適用於GPU裝置的Ghost模組。
作者等人發現,現有大多數CNN架構中,一個階段通常包括幾個卷積層/塊,同時在每個階段中的不同層/塊,特徵圖的尺寸大小相同,因此一種猜想是:特徵的相似性和冗餘性不僅存在於一個層內,也存在於該階段的多個層之間。下圖的視覺化結果驗證了這種想法(如右邊第三行第二列和第七行第三列的特徵圖存在一定相似性)。
圖2:左邊為ResNet34第二階段的所有卷積塊,右邊為該階段的第一塊和最後一塊的特徵圖。
作者等人利用觀察到的階段性特徵冗餘,設計G-Ghost模組並應用於GPU等裝置,實現了一個在GPU上具有SOTA效能的輕量級CNN。
3
『C-GhostNet回顧』
圖3:卷積層和C-Ghost模組的示意圖。
如圖3,給定輸入,一個普通的卷積過程可以表示為:
其中,,表示由尺寸為的特徵圖生成尺寸為的特徵圖。由視覺化結果可知,輸出特徵圖中包含一些冗餘存在,因此可以使用更廉價的操作來實現冗餘生成。
作者等人將輸出的特徵圖看做內在特徵與Ghost特徵的組合,其中Ghost特徵可以透過作用於內在特徵的廉價操作獲得,具體過程如下:
對於需要的輸出尺寸,首先利用一次普通卷積生成m個本徵特徵圖,即,其中,。接著對中的每一個特徵圖進行廉價操作以生成s個Ghost特徵(n=m×s),可用公式表示:
代表中的第i個特徵圖,是生成第j個鬼魂特徵圖的第j個(最後一個除外)廉價操作,不進行廉價操作,而使用恆等對映來保留內在特徵。
一份簡單的C-Ghost模組程式碼示例如下所示:
classGhostModule(nn.Module):
def__init__(self, in_channel, out_channel, kernel_size=1, ratio=2, dw_size=3, stride=1, relu=True):

        super(GhostModule, self).__init__()
        self.out_channel = out_channel

        init_channels = math.ceil(out_channel / ratio)

        new_channels = init_channels*(ratio

-1

)

#  生成內在特徵圖

        self.primary_conv = nn.Sequential(

            nn.Conv2d(in_channel, init_channels, kernel_size, stride, kernel_size//

2

, ), 

            nn.BatchNorm2d(init_channels),

            nn.ReLU(inplace=

True

if

 relu 

else

 nn.Sequential(),

        )

#  利用內在特徵圖生成Ghost特徵

        self.cheap_operation = nn.Sequential(

            nn.Conv2d(init_channels, new_channels, dw_size, 

1

, dw_size//

2

, groups=init_channels),

            nn.BatchNorm2d(new_channels),

            nn.ReLU(inplace=

True

if

 relu 

else

 nn.Sequential(),

        )

defforward(self, x):

            x1 = self.primary_conv(x)

            x2 = self.cheap_operation(x1)

            out = torch.cat([x1,x2], dim=

1

)

return

 out[:,:self.out_channel,:,:]

4
『G-GhostNet
上述示例程式碼中使用低運算密度的depth-wise卷積作為生成Ghost特徵的廉價操作,對於GPU等裝置來說,無法充分利用其平行計算能力。另一方面,如果能去除部分特徵圖並減少啟用,便可以機率地減少 GPU 上的延遲
Radosavovic等人引入啟用度(所有卷積層的輸出張量的大小)來衡量網路的複雜性,對於GPU的延遲來說,啟用度比 FLOPs更為相關。
如何實現這一目標?就得利用導讀部分提及的“特徵的相似性和冗餘性不僅存在於一個層內,也存在於該階段的多個層之間”。由於現有流行CNN架構中,同一階段的不同層,其輸出特徵圖的尺寸大小不會發生變化,因此一種跨層的廉價替代便可以透過這一特點來實現。其具體實現過程如下:
在CNN的某個階段中,深層特徵被分為Ghost特徵(可透過淺層廉價操作獲得)和複雜特徵(不可透過淺層廉價操作獲得),以圖2為例:
圖2:左邊為ResNet34第二階段的所有卷積塊,右邊為該階段的第一塊和最後一塊的特徵圖。
將第二階段從淺到深的八個層分別記作,···,,假定的輸出為,此時設定一個劃分比例,那麼輸出的Ghost特徵即為,複雜特徵為。
其中複雜特徵依次透過8個卷積層獲得,具有更豐富的抽象語義資訊,Ghost特徵直接由的輸出透過廉價操作獲得,最終的輸出透過通道拼接得以聚合。如下圖所示():
圖4:λ = 0.5 的 G-Ghost 階段示意圖。
但是,直接的特徵拼接帶來的影響是顯而易見的。複雜特徵經過逐層提取,包含更豐富的語義資訊;而Ghost特徵由淺層進行廉價操作所得,可能缺乏一部分深層資訊。因此一種資訊補償的手段是有必要的,作者等人使用如下操作來提升廉價操作的表徵能力:
圖5:λ = 0.5 的含有mix操作的 G-Ghost 階段示意圖。
如圖5,複雜特徵經過連續的n個卷積塊生成,Ghost特徵則由第一個卷積塊經過廉價操作所得。其中mix模組用於提升廉價操作表徵能力,即先將複雜特徵分支中第2至第n層的中間特徵進行拼接,再使用變換函式,變換至與廉價操作的輸出同域,最後再進行特徵融合(如簡單的逐元素相加)。
圖6:mix操作的示意圖。
下面以圖6為例進行詳細說明。如圖,有至共n個同一階段的卷積塊輸出,其中代表最後一層,即複雜特徵;代表第一層,即廉價操作所應用的層。現將至的特徵進行拼接,得到特徵,並利用函式將Z變換至與廉價操作分支的輸出一致的域,函式用公式表示如下:
代表對Z進行全域性平均池化得到,和表示權重和偏差,即將Z池化後,透過一個全連線層進行域變換。
圖6中兩個分支的輸出進行簡單的逐元素相加,並應用非線性得到Ghost特徵。
官方公佈的g_ghost_regnet檔案中,廉價操作的程式碼段為:

self.cheap = nn.Sequential(

            nn.Conv2d(cheap_planes, cheap_planes,

                      kernel_size=

1

, stride=

1

, bias=

False

),

            nn.BatchNorm2d(cheap_planes),

#             nn.ReLU(inplace=True),

        )

除了大小為1的卷積核,廉價操作還可以用3×3、5×5的卷積核,或者直接的恆等對映來計算。
5
『效能對比』
表1:ImageNet各方法比較。
表2:ImageNet各方法比較(GhostX-RegNet)。
6
『總結與思考』
本文利用視覺化觀察到的現象和大量的實驗結果,提出了Ghost特徵的思想,利用“特徵的相似性和冗餘性不僅存在於一個層內,也存在於該階段的多個層之間”這一猜測,設計出相比C-Ghost更適用於GPU等裝置的G-Ghost,並在實際延遲與效能之間取得了良好的權衡。
同時在G-Ghost中,合理的中間特徵聚合模組有效緩解了Ghost特徵資訊損失的問題。但是Ghost特徵與複雜特徵的劃分比例卻需要手動調整,不同的對精度、延遲都有不同的影響,在作者等人的實際測試中,保持著精度與延遲的良好權衡。
另外關於使用C-Ghost、G-Ghost模組構建GhostNet整體網路,論文及程式碼中均有說明,感興趣的讀者可以自行閱覽~
技術交流群邀請函
△長按新增小助手
掃描二維碼新增小助手微信
請備註:姓名-學校/公司-研究方向
(如:小張-哈工大-對話系統)
即可申請加入自然語言處理/Pytorch等技術交流群

關於我們

MLNLP社群  機器學習演算法與自然語言處理 ) 是由國內外自然語言處理學者聯合構建的民間學術社群,目前已經發展為國內外知名自然語言處理社群,旗下包括  萬人頂會交流群、AI臻選匯、AI英才匯  以及  AI學術匯  等知名品牌,旨在促進機器學習,自然語言處理學術界、產業界和廣大愛好者之間的進步。
社群可以為相關從業者的深造、就業及研究等方面提供開放交流平臺。歡迎大家關注和加入我們。

相關文章