盤點卷積神經(jīng)網(wǎng)絡(luò)中十大操作
CNN從2012年的AlexNet發(fā)展至今,科學(xué)家們發(fā)明出各種各樣的CNN模型,一個比一個深,一個比一個準(zhǔn)確,一個比一個輕量。我下面會對近幾年一些具有變革性的工作進(jìn)行簡單盤點,從這些充滿革新性的工作中探討日后的CNN變革方向。
注:水平所限,下面的見解或許有偏差,望大牛指正。另外只介紹其中具有代表性的模型,一些著名的模型由于原理相同將不作介紹,若有遺漏也歡迎指出。
一、卷積只能在同一組進(jìn)行嗎?-- Group convolution
Group convoluTIon 分組卷積,最早在AlexNet中出現(xiàn),由于當(dāng)時的硬件資源有限,訓(xùn)練AlexNet時卷積操作不能全部放在同一個GPU處理,因此作者把feature maps分給多個GPU分別進(jìn)行處理,最后把多個GPU的結(jié)果進(jìn)行融合。
分組卷積的思想影響比較深遠(yuǎn),當(dāng)前一些輕量級的SOTA(State Of The Art)網(wǎng)絡(luò),都用到了分組卷積的操作,以節(jié)省計算量。但題主有個疑問是,如果分組卷積是分在不同GPU上的話,每個GPU的計算量就降低到 1/groups,但如果依然在同一個GPU上計算,最終整體的計算量是否不變?找了pytorch上有關(guān)組卷積操作的介紹,望讀者解答我的疑問。
pytroch github
關(guān)于這個問題,知乎用戶朋友?@蔡冠羽?提出了他的見解:
我感覺group conv本身應(yīng)該就大大減少了參數(shù),比如當(dāng)input channel為256,output channel也為256,kernel size為3*3,不做group conv參數(shù)為256*3*3*256,若group為8,每個group的input channel和output channel均為32,參數(shù)為8*32*3*3*32,是原來的八分之一。這是我的理解。
我的理解是分組卷積最后每一組輸出的feature maps應(yīng)該是以concatenate的方式組合,而不是element-wise add,所以每組輸出的channel是 input channels / #groups,這樣參數(shù)量就大大減少了。
二、卷積核一定越大越好?-- 3×3卷積核
AlexNet中用到了一些非常大的卷積核,比如11×11、5×5卷積核,之前人們的觀念是,卷積核越大,recepTIve field(感受野)越大,看到的圖片信息越多,因此獲得的特征越好。雖說如此,但是大的卷積核會導(dǎo)致計算量的暴增,不利于模型深度的增加,計算性能也會降低。于是在VGG(最早使用)、IncepTIon網(wǎng)絡(luò)中,利用2個3×3卷積核的組合比1個5×5卷積核的效果更佳,同時參數(shù)量(3×3×2+1 VS 5×5×1+1)被降低,因此后來3×3卷積核被廣泛應(yīng)用在各種模型中。
三、每層卷積只能用一種尺寸的卷積核?-- IncepTIon結(jié)構(gòu)
傳統(tǒng)的層疊式網(wǎng)絡(luò),基本上都是一個個卷積層的堆疊,每層只用一個尺寸的卷積核,例如VGG結(jié)構(gòu)中使用了大量的3×3卷積層。事實上,同一層feature map可以分別使用多個不同尺寸的卷積核,以獲得不同尺度的特征,再把這些特征結(jié)合起來,得到的特征往往比使用單一卷積核的要好,谷歌的GoogleNet,或者說Inception系列的網(wǎng)絡(luò),就使用了多個卷積核的結(jié)構(gòu):
? ? ? ?一個輸入的feature map分別同時經(jīng)過1×1、3×3、5×5的卷積核的處理,得出的特征再組合起來,獲得更佳的特征。但這個結(jié)構(gòu)會存在一個嚴(yán)重的問題:參數(shù)量比單個卷積核要多很多,如此龐大的計算量會使得模型效率低下。這就引出了一個新的結(jié)構(gòu):
四、怎樣才能減少卷積層參數(shù)量?-- Bottleneck
發(fā)明GoogleNet的團隊發(fā)現(xiàn),如果僅僅引入多個尺寸的卷積核,會帶來大量的額外的參數(shù),受到Network In Network中1×1卷積核的啟發(fā),為了解決這個問題,他們往Inception結(jié)構(gòu)中加入了一些1×1的卷積核
根據(jù)上圖,我們來做個對比計算,假設(shè)輸入feature map的維度為256維,要求輸出維度也是256維。有以下兩種操作:
256維的輸入直接經(jīng)過一個3×3×256的卷積層,輸出一個256維的feature map,那么參數(shù)量為:256×3×3×256 = 589,824