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





