我們都知道卷積的重要性,但你知道深度學(xué)習(xí)領(lǐng)域的卷積究竟是什么,又有多少種類嗎?研究學(xué)者 Kunlun Bai 發(fā)布了一篇介紹深度學(xué)習(xí)的卷積文章,用淺顯易懂的方式介紹了深度學(xué)習(xí)領(lǐng)域的各種卷積及其優(yōu)勢。
如果你聽說過深度學(xué)習(xí)中不同種類的卷積(比如 2D / 3D / 1x1 /轉(zhuǎn)置/擴(kuò)張(Atrous)/空間可分/深度可分/平展/分組/混洗分組卷積),并且搞不清楚它們究竟是什么意思,那么這篇文章就是為你寫的,能幫你理解它們實際的工作方式。 ? 在這篇文章中,我會歸納總結(jié)深度學(xué)習(xí)中常用的幾種卷積,并會試圖用一種每個人都能理解的方式解釋它們。
除了本文之外,還有一些關(guān)于這一主題的好文章,請參看原文。 ? 希望本文能幫助你構(gòu)建起對卷積的直觀認(rèn)知,并成為你研究或?qū)W習(xí)的有用參考。 ? ???
本文目錄
? 1.卷積與互相關(guān) 2.深度學(xué)習(xí)中的卷積(單通道版本,多通道版本) 3.3D 卷積 4.1×1 卷積 5.卷積算術(shù) 6.轉(zhuǎn)置卷積(去卷積、棋盤效應(yīng)) 7.擴(kuò)張卷積 8.可分卷積(空間可分卷積,深度可分卷積) 9.平展卷積 10.分組卷積 11.混洗分組卷積 12.逐點分組卷積 ? ??
?卷積與互相關(guān)
? 在信號處理、圖像處理和其它工程/科學(xué)領(lǐng)域,卷積都是一種使用廣泛的技術(shù)。在深度學(xué)習(xí)領(lǐng)域,卷積神經(jīng)網(wǎng)絡(luò)(CNN)這種模型架構(gòu)就得名于這種技術(shù)。但是,深度學(xué)習(xí)領(lǐng)域的卷積本質(zhì)上是信號/圖像處理領(lǐng)域內(nèi)的互相關(guān)(cross-correlation)。這兩種操作之間存在細(xì)微的差別。 ? 無需太過深入細(xì)節(jié),我們就能看到這個差別。在信號/圖像處理領(lǐng)域,卷積的定義是: ?
其定義是兩個函數(shù)中一個函數(shù)經(jīng)過反轉(zhuǎn)和位移后再相乘得到的積的積分。下面的可視化展示了這一思想: ?
信號處理中的卷積。過濾器 g 經(jīng)過反轉(zhuǎn),然后再沿水平軸滑動。在每一個位置,我們都計算 f 和反轉(zhuǎn)后的 g 之間相交區(qū)域的面積。這個相交區(qū)域的面積就是特定位置出的卷積值。 ? 這里,函數(shù) g 是過濾器。它被反轉(zhuǎn)后再沿水平軸滑動。在每一個位置,我們都計算 f 和反轉(zhuǎn)后的 g 之間相交區(qū)域的面積。這個相交區(qū)域的面積就是特定位置出的卷積值。 ? 另一方面,互相關(guān)是兩個函數(shù)之間的滑動點積或滑動內(nèi)積?;ハ嚓P(guān)中的過濾器不經(jīng)過反轉(zhuǎn),而是直接滑過函數(shù) f。f 與 g 之間的交叉區(qū)域即是互相關(guān)。下圖展示了卷積與互相關(guān)之間的差異。 ?
信號處理中卷積與互相關(guān)之間的差異 ? 在深度學(xué)習(xí)中,卷積中的過濾器不經(jīng)過反轉(zhuǎn)。嚴(yán)格來說,這是互相關(guān)。我們本質(zhì)上是執(zhí)行逐元素乘法和加法。但在深度學(xué)習(xí)中,直接將其稱之為卷積更加方便。這沒什么問題,因為過濾器的權(quán)重是在訓(xùn)練階段學(xué)習(xí)到的。如果上面例子中的反轉(zhuǎn)函數(shù) g 是正確的函數(shù),那么經(jīng)過訓(xùn)練后,學(xué)習(xí)得到的過濾器看起來就會像是反轉(zhuǎn)后的函數(shù) g。因此,在訓(xùn)練之前,沒必要像在真正的卷積中那樣首先反轉(zhuǎn)過濾器。 ? ??
?3D 卷積
在上一節(jié)的解釋中,我們看到我們實際上是對一個 3D 體積執(zhí)行卷積。但通常而言,我們?nèi)栽谏疃葘W(xué)習(xí)中稱之為 2D 卷積。這是在 3D 體積數(shù)據(jù)上的 2D 卷積。過濾器深度與輸入層深度一樣。這個 3D 過濾器僅沿兩個方向移動(圖像的高和寬)。這種操作的輸出是一張 2D 圖像(僅有一個通道)。 ? 很自然,3D 卷積確實存在。這是 2D 卷積的泛化。下面就是 3D 卷積,其過濾器深度小于輸入層深度(核大小<通道大?。?。因此,3D 過濾器可以在所有三個方向(圖像的高度、寬度、通道)上移動。在每個位置,逐元素的乘法和加法都會提供一個數(shù)值。因為過濾器是滑過一個 3D 空間,所以輸出數(shù)值也按 3D 空間排布。也就是說輸出是一個 3D 數(shù)據(jù)。 ?
在 3D 卷積中,3D 過濾器可以在所有三個方向(圖像的高度、寬度、通道)上移動。在每個位置,逐元素的乘法和加法都會提供一個數(shù)值。因為過濾器是滑過一個 3D 空間,所以輸出數(shù)值也按 3D 空間排布。也就是說輸出是一個 3D 數(shù)據(jù)。 ? 與 2D 卷積(編碼了 2D 域中目標(biāo)的空間關(guān)系)類似,3D 卷積可以描述 3D 空間中目標(biāo)的空間關(guān)系。對某些應(yīng)用(比如生物醫(yī)學(xué)影像中的 3D 分割/重構(gòu))而言,這樣的 3D 關(guān)系很重要,比如在 CT 和 MRI 中,血管之類的目標(biāo)會在 3D 空間中蜿蜒曲折。 ? ???
轉(zhuǎn)置卷積(去卷積)
對于很多網(wǎng)絡(luò)架構(gòu)的很多應(yīng)用而言,我們往往需要進(jìn)行與普通卷積方向相反的轉(zhuǎn)換,即我們希望執(zhí)行上采樣。例子包括生成高分辨率圖像以及將低維特征圖映射到高維空間,比如在自動編碼器或形義分割中。(在后者的例子中,形義分割首先會提取編碼器中的特征圖,然后在解碼器中恢復(fù)原來的圖像大小,使其可以分類原始圖像中的每個像素。) ? 實現(xiàn)上采樣的傳統(tǒng)方法是應(yīng)用插值方案或人工創(chuàng)建規(guī)則。而神經(jīng)網(wǎng)絡(luò)等現(xiàn)代架構(gòu)則傾向于讓網(wǎng)絡(luò)自己自動學(xué)習(xí)合適的變換,無需人類干預(yù)。為了做到這一點,我們可以使用轉(zhuǎn)置卷積。 ?
轉(zhuǎn)置卷積在文獻(xiàn)中也被稱為去卷積或 fractionally strided convolution。但是,需要指出「去卷積(deconvolution)」這個名稱并不是很合適,因為轉(zhuǎn)置卷積并非信號/圖像處理領(lǐng)域定義的那種真正的去卷積。
從技術(shù)上講,信號處理中的去卷積是卷積運(yùn)算的逆運(yùn)算。但這里卻不是這種運(yùn)算。因此,某些作者強(qiáng)烈反對將轉(zhuǎn)置卷積稱為去卷積。人們稱之為去卷積主要是因為這樣說很簡單。后面我們會介紹為什么將這種運(yùn)算稱為轉(zhuǎn)置卷積更自然且更合適。 ? 我們一直都可以使用直接的卷積實現(xiàn)轉(zhuǎn)置卷積。對于下圖的例子,我們在一個 2×2 的輸入(周圍加了 2×2 的單位步長的零填充)上應(yīng)用一個 3×3 核的轉(zhuǎn)置卷積。上采樣輸出的大小是 4×4。 ?
將 2×2 的輸入上采樣成 4×4 的輸出 ?
有趣的是,通過應(yīng)用各種填充和步長,我們可以將同樣的 2×2 輸入圖像映射到不同的圖像尺寸。下面,轉(zhuǎn)置卷積被用在了同一張 2×2 輸入上(輸入之間插入了一個零,并且周圍加了 2×2 的單位步長的零填充),所得輸出的大小是 5×5。 ?
將 2×2 的輸入上采樣成 5×5 的輸出 ?
觀察上述例子中的轉(zhuǎn)置卷積能幫助我們構(gòu)建起一些直觀認(rèn)識。但為了泛化其應(yīng)用,了解其可以如何通過計算機(jī)的矩陣乘法實現(xiàn)是有益的。從這一點上我們也可以看到為何「轉(zhuǎn)置卷積」才是合適的名稱。 ?
在卷積中,我們定義 C 為卷積核,Large 為輸入圖像,Small 為輸出圖像。經(jīng)過卷積(矩陣乘法)后,我們將大圖像下采樣為小圖像。這種矩陣乘法的卷積的實現(xiàn)遵照:C x Large = Small。 ? 下面的例子展示了這種運(yùn)算的工作方式。它將輸入平展為 16×1 的矩陣,并將卷積核轉(zhuǎn)換為一個稀疏矩陣(4×16)。然后,在稀疏矩陣和平展的輸入之間使用矩陣乘法。之后,再將所得到的矩陣(4×1)轉(zhuǎn)換為 2×2 的輸出。 ?
卷積的矩陣乘法:將 Large 輸入圖像(4×4)轉(zhuǎn)換為 Small 輸出圖像(2×2) ?
現(xiàn)在,如果我們在等式的兩邊都乘上矩陣的轉(zhuǎn)置 CT,并借助「一個矩陣與其轉(zhuǎn)置矩陣的乘法得到一個單位矩陣」這一性質(zhì),那么我們就能得到公式 CT x Small = Large,如下圖所示。 ?
卷積的矩陣乘法:將 Small 輸入圖像(2×2)轉(zhuǎn)換為 Large 輸出圖像(4×4) ? 這里可以看到,我們執(zhí)行了從小圖像到大圖像的上采樣。這正是我們想要實現(xiàn)的目標(biāo)?,F(xiàn)在。你就知道「轉(zhuǎn)置卷積」這個名字的由來了。 ? 轉(zhuǎn)置矩陣的算術(shù)解釋可參閱:https://arxiv.org/abs/1603.07285 ? ??
?擴(kuò)張卷積(Atrous 卷積)
擴(kuò)張卷積由這兩篇引入:
https://arxiv.org/abs/1412.7062;
https://arxiv.org/abs/1511.07122
這是一個標(biāo)準(zhǔn)的離散卷積: ?
擴(kuò)張卷積如下: ?
當(dāng) l=1 時,擴(kuò)張卷積會變得和標(biāo)準(zhǔn)卷積一樣。 ?
擴(kuò)張卷積 ? 直觀而言,擴(kuò)張卷積就是通過在核元素之間插入空格來使核「膨脹」。新增的參數(shù) l(擴(kuò)張率)表示我們希望將核加寬的程度。具體實現(xiàn)可能各不相同,但通常是在核元素之間插入 l-1 個空格。下面展示了 l = 1, 2, 4 時的核大小。 ?
擴(kuò)張卷積的感受野。我們基本上無需添加額外的成本就能有較大的感受野。 ? 在這張圖像中,3×3 的紅點表示經(jīng)過卷積后,輸出圖像是 3×3 像素。盡管所有這三個擴(kuò)張卷積的輸出都是同一尺寸,但模型觀察到的感受野有很大的不同。l=1 時感受野為 3×3,l=2 時為 7×7。l=3 時,感受野的大小就增加到了 15×15。有趣的是,與這些操作相關(guān)的參數(shù)的數(shù)量是相等的。我們「觀察」更大的感受野不會有額外的成本。因此,擴(kuò)張卷積可用于廉價地增大輸出單元的感受野,而不會增大其核大小,這在多個擴(kuò)張卷積彼此堆疊時尤其有效。 ? 論文《Multi-scale context aggregation by dilated convolutions》的作者用多個擴(kuò)張卷積層構(gòu)建了一個網(wǎng)絡(luò),其中擴(kuò)張率 l 每層都按指數(shù)增大。由此,有效的感受野大小隨層而指數(shù)增長,而參數(shù)的數(shù)量僅線性增長。 ? 這篇論文中擴(kuò)張卷積的作用是系統(tǒng)性地聚合多個比例的形境信息,而不丟失分辨率。這篇論文表明其提出的模塊能夠提升那時候(2016 年)的當(dāng)前最佳形義分割系統(tǒng)的準(zhǔn)確度。請參閱那篇論文了解更多信息。 ? ???
可分卷積
某些神經(jīng)網(wǎng)絡(luò)架構(gòu)使用了可分卷積,比如 MobileNets??煞志矸e有空間可分卷積和深度可分卷積。 ?
1、空間可分卷積
空間可分卷積操作的是圖像的 2D 空間維度,即高和寬。從概念上看,空間可分卷積是將一個卷積分解為兩個單獨的運(yùn)算。對于下面的示例,3×3 的 Sobel 核被分成了一個 3×1 核和一個 1×3 核。 ?
Sobel 核可分為一個 3x1 和一個 1x3 核 ? 在卷積中,3×3 核直接與圖像卷積。在空間可分卷積中,3×1 核首先與圖像卷積,然后再應(yīng)用 1×3 核。這樣,執(zhí)行同樣的操作時僅需 6 個參數(shù),而不是 9 個。 ? 此外,使用空間可分卷積時所需的矩陣乘法也更少。給一個具體的例子,5×5 圖像與 3×3 核的卷積(步幅=1,填充=0)要求在 3 個位置水平地掃描核(還有 3 個垂直的位置)。總共就是 9 個位置,表示為下圖中的點。在每個位置,會應(yīng)用 9 次逐元素乘法??偣簿褪?9×9=81 次乘法。 ?
具有 1 個通道的標(biāo)準(zhǔn)卷積 ?
另一方面,對于空間可分卷積,我們首先在 5×5 的圖像上應(yīng)用一個 3×1 的過濾器。我們可以在水平 5 個位置和垂直 3 個位置掃描這樣的核。總共就是 5×3=15 個位置,表示為下圖中的點。在每個位置,會應(yīng)用 3 次逐元素乘法??偣簿褪?15×3=45 次乘法?,F(xiàn)在我們得到了一個 3×5 的矩陣。這個矩陣再與一個 1×3 核卷積,即在水平 3 個位置和垂直 3 個位置掃描這個矩陣。對于這 9 個位置中的每一個,應(yīng)用 3 次逐元素乘法。這一步需要 9×3=27 次乘法。因此,總體而言,空間可分卷積需要 45+27=72 次乘法,少于普通卷積。 ?
具有 1 個通道的空間可分卷積 ? 我們稍微推廣一下上面的例子。假設(shè)我們現(xiàn)在將卷積應(yīng)用于一張 N×N 的圖像上,卷積核為 m×m,步幅為 1,填充為 0。傳統(tǒng)卷積需要 (N-2) x (N-2) x m x m 次乘法,空間可分卷積需要 N x (N-2) x m + (N-2) x (N-2) x m = (2N-2) x (N-2) x m 次乘法。空間可分卷積與標(biāo)準(zhǔn)卷積的計算成本比為: ?
因為圖像尺寸 N 遠(yuǎn)大于過濾器大?。∟>>m),所以這個比就變成了 2/m。也就是說,在這種漸進(jìn)情況(N>>m)下,當(dāng)過濾器大小為 3×3 時,空間可分卷積的計算成本是標(biāo)準(zhǔn)卷積的 2/3。過濾器大小為 5×5 時這一數(shù)值是 2/5;過濾器大小為 7×7 時則為 2/7。 ? 盡管空間可分卷積能節(jié)省成本,但深度學(xué)習(xí)卻很少使用它。一大主要原因是并非所有的核都能分成兩個更小的核。如果我們用空間可分卷積替代所有的傳統(tǒng)卷積,那么我們就限制了自己在訓(xùn)練過程中搜索所有可能的核。這樣得到的訓(xùn)練結(jié)果可能是次優(yōu)的。
2、深度可分卷積
現(xiàn)在來看深度可分卷積,這在深度學(xué)習(xí)領(lǐng)域要常用得多(比如 MobileNet 和 Xception)。深度可分卷積包含兩個步驟:深度卷積核 1×1 卷積。 ? 在描述這些步驟之前,有必要回顧一下我們之前介紹的 2D 卷積核 1×1 卷積。首先快速回顧標(biāo)準(zhǔn)的 2D 卷積。舉一個具體例子,假設(shè)輸入層的大小是 7×7×3(高×寬×通道),而過濾器的大小是 3×3×3。經(jīng)過與一個過濾器的 2D 卷積之后,輸出層的大小是 5×5×1(僅有一個通道)。 ?
用于創(chuàng)建僅有 1 層的輸出的標(biāo)準(zhǔn) 2D 卷積,使用 1 個過濾器
? 一般來說,兩個神經(jīng)網(wǎng)絡(luò)層之間會應(yīng)用多個過濾器。假設(shè)我們這里有 128 個過濾器。在應(yīng)用了這 128 個 2D 卷積之后,我們有 128 個 5×5×1 的輸出映射圖(map)。然后我們將這些映射圖堆疊成大小為 5×5×128 的單層。通過這種操作,我們可將輸入層(7×7×3)轉(zhuǎn)換成輸出層(5×5×128)??臻g維度(即高度和寬度)會變小,而深度會增大。 ? ?
用于創(chuàng)建有 128 層的輸出的標(biāo)準(zhǔn) 2D 卷積,要使用 128 個過濾器? ?
現(xiàn)在使用深度可分卷積,看看我們?nèi)绾螌崿F(xiàn)同樣的變換。 ? 首先,我們將深度卷積應(yīng)用于輸入層。但我們不使用 2D 卷積中大小為 3×3×3 的單個過濾器,而是分開使用 3 個核。每個過濾器的大小為 3×3×1。每個核與輸入層的一個通道卷積(僅一個通道,而非所有通道?。?。每個這樣的卷積都能提供大小為 5×5×1 的映射圖。然后我們將這些映射圖堆疊在一起,創(chuàng)建一個 5×5×3 的圖像。經(jīng)過這個操作之后,我們得到大小為 5×5×3 的輸出?,F(xiàn)在我們可以降低空間維度了,但深度還是和之前一樣。 ?
深度可分卷積——第一步:我們不使用 2D 卷積中大小為 3×3×3 的單個過濾器,而是分開使用 3 個核。每個過濾器的大小為 3×3×1。每個核與輸入層的一個通道卷積(僅一個通道,而非所有通道?。?。每個這樣的卷積都能提供大小為 5×5×1 的映射圖。然后我們將這些映射圖堆疊在一起,創(chuàng)建一個 5×5×3 的圖像。經(jīng)過這個操作之后,我們得到大小為 5×5×3 的輸出。
? 在深度可分卷積的第二步,為了擴(kuò)展深度,我們應(yīng)用一個核大小為 1×1×3 的 1×1 卷積。將 5×5×3 的輸入圖像與每個 1×1×3 的核卷積,可得到大小為 5×5×1 的映射圖。 ?
因此,在應(yīng)用了 128 個 1×1 卷積之后,我們得到大小為 5×5×128 的層。 ?
深度可分卷積——第二步:應(yīng)用多個 1×1 卷積來修改深度。 ? 通過這兩個步驟,深度可分卷積也會將輸入層(7×7×3)變換到輸出層(5×5×128)。 ? 下圖展示了深度可分卷積的整個過程。 ?
深度可分卷積的整個過程 ? 所以,深度可分卷積有何優(yōu)勢呢?效率!相比于 2D 卷積,深度可分卷積所需的操作要少得多。 ? 回憶一下我們的 2D 卷積例子的計算成本。有 128 個 3×3×3 個核移動了 5×5 次,也就是 128 x 3 x 3 x 3 x 5 x 5 = 86400 次乘法。 ? 可分卷積又如何呢?在第一個深度卷積步驟,有 3 個 3×3×1 核移動 5×5 次,也就是 3x3x3x1x5x5 = 675 次乘法。在 1×1 卷積的第二步,有 128 個 1×1×3 核移動 5×5 次,即 128 x 1 x 1 x 3 x 5 x 5 = 9600 次乘法。因此,深度可分卷積共有 675 + 9600 = 10275 次乘法。這樣的成本大概僅有 2D 卷積的 12%! ? 所以,對于任意尺寸的圖像,如果我們應(yīng)用深度可分卷積,我們可以節(jié)省多少時間?讓我們泛化以上例子?,F(xiàn)在,對于大小為 H×W×D 的輸入圖像,如果使用 Nc 個大小為 h×h×D 的核執(zhí)行 2D 卷積(步幅為 1,填充為 0,其中 h 是偶數(shù))。為了將輸入層(H×W×D)變換到輸出層((H-h+1)x (W-h+1) x Nc),所需的總乘法次數(shù)為: ? Nc x h x h x D x (H-h+1) x (W-h+1) ? 另一方面,對于同樣的變換,深度可分卷積所需的乘法次數(shù)為: ? D x h x h x 1 x (H-h+1) x (W-h+1) + Nc x 1 x 1 x D x (H-h+1) x (W-h+1) = (h x h + Nc) x D x (H-h+1) x (W-h+1) ? 則深度可分卷積與 2D 卷積所需的乘法次數(shù)比為: ? ? 現(xiàn)代大多數(shù)架構(gòu)的輸出層通常都有很多通道,可達(dá)數(shù)百甚至上千。對于這樣的層(Nc >> h),則上式可約簡為 1 / h2?;诖?,如果使用 3×3 過濾器,則 2D 卷積所需的乘法次數(shù)是深度可分卷積的 9 倍。如果使用 5×5 過濾器,則 2D 卷積所需的乘法次數(shù)是深度可分卷積的 25 倍。 ?
使用深度可分卷積有什么壞處嗎?當(dāng)然是有的。深度可分卷積會降低卷積中參數(shù)的數(shù)量。因此,對于較小的模型而言,如果用深度可分卷積替代 2D 卷積,模型的能力可能會顯著下降。因此,得到的模型可能是次優(yōu)的。但是,如果使用得當(dāng),深度可分卷積能在不降低你的模型性能的前提下幫助你實現(xiàn)效率提升。 ?
???分組卷積 ?
AlexNet 論文(https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf)在 2012 年引入了分組卷積。實現(xiàn)分組卷積的主要原因是讓網(wǎng)絡(luò)訓(xùn)練可在 2 個內(nèi)存有限(每個 GPU 有 1.5 GB 內(nèi)存)的 GPU 上進(jìn)行。下面的 AlexNet 表明在大多數(shù)層中都有兩個分開的卷積路徑。這是在兩個 GPU 上執(zhí)行模型并行化(當(dāng)然如果可以使用更多 GPU,還能執(zhí)行多 GPU 并行化)。 ?
圖片來自 AlexNet 論文 ?
這里我們介紹一下分組卷積的工作方式。首先,典型的 2D 卷積的步驟如下圖所示。在這個例子中,通過應(yīng)用 128 個大小為 3×3×3 的過濾器將輸入層(7×7×3)變換到輸出層(5×5×128)。推廣而言,即通過應(yīng)用 Dout 個大小為 h x w x Din 的核將輸入層(Hin x Win x Din)變換到輸出層(Hout x Wout x Dout)。 ?
標(biāo)準(zhǔn)的 2D 卷積 ? 在分組卷積中,過濾器會被分為不同的組。每一組都負(fù)責(zé)特定深度的典型 2D 卷積。下面的例子能讓你更清楚地理解。 ?
具有兩個過濾器分組的分組卷積
? 上圖展示了具有兩個過濾器分組的分組卷積。在每個過濾器分組中,每個過濾器的深度僅有名義上的 2D 卷積的一半。它們的深度是 Din/2。每個過濾器分組包含 Dout/2 個過濾器。第一個過濾器分組(紅色)與輸入層的前一半([:, :, 0:Din/2])卷積,而第二個過濾器分組(橙色)與輸入層的后一半([:, :, Din/2:Din])卷積。因此,每個過濾器分組都會創(chuàng)建 Dout/2 個通道。整體而言,兩個分組會創(chuàng)建 2×Dout/2 = Dout 個通道。然后我們將這些通道堆疊在一起,得到有 Dout 個通道的輸出層。 ?
1、分組卷積與深度卷積 ?
你可能會注意到分組卷積與深度可分卷積中使用的深度卷積之間存在一些聯(lián)系和差異。如果過濾器分組的數(shù)量與輸入層通道的數(shù)量相同,則每個過濾器的深度都為 Din/Din=1。這樣的過濾器深度就與深度卷積中的一樣了。 ? 另一方面,現(xiàn)在每個過濾器分組都包含 Dout/Din 個過濾器。整體而言,輸出層的深度為 Dout。這不同于深度卷積的情況——深度卷積并不會改變層的深度。在深度可分卷積中,層的深度之后通過 1×1 卷積進(jìn)行擴(kuò)展。
? 分組卷積有幾個優(yōu)點。 ? 第一個優(yōu)點是高效訓(xùn)練。因為卷積被分成了多個路徑,每個路徑都可由不同的 GPU 分開處理,所以模型可以并行方式在多個 GPU 上進(jìn)行訓(xùn)練。相比于在單個 GPU 上完成所有任務(wù),這樣的在多個 GPU 上的模型并行化能讓網(wǎng)絡(luò)在每個步驟處理更多圖像。人們一般認(rèn)為模型并行化比數(shù)據(jù)并行化更好。后者是將數(shù)據(jù)集分成多個批次,然后分開訓(xùn)練每一批。但是,當(dāng)批量大小變得過小時,我們本質(zhì)上是執(zhí)行隨機(jī)梯度下降,而非批梯度下降。這會造成更慢,有時候更差的收斂結(jié)果。 ? 在訓(xùn)練非常深的神經(jīng)網(wǎng)絡(luò)時,分組卷積會非常重要,正如在 ResNeXt 中那樣。 ?
圖片來自 ResNeXt 論文,https://arxiv.org/abs/1611.05431
? 第二個優(yōu)點是模型會更高效,即模型參數(shù)會隨過濾器分組數(shù)的增大而減少。在之前的例子中,完整的標(biāo)準(zhǔn) 2D 卷積有 h x w x Din x Dout 個參數(shù)。具有 2 個過濾器分組的分組卷積有 (h x w x Din/2 x Dout/2) x 2 個參數(shù)。參數(shù)數(shù)量減少了一半。 ? 第三個優(yōu)點有些讓人驚訝。分組卷積也許能提供比標(biāo)準(zhǔn)完整 2D 卷積更好的模型。另一篇出色的博客已經(jīng)解釋了這一點:https://blog.yani.io/filter-group-tutorial。這里簡要總結(jié)一下。 ? 原因和稀疏過濾器的關(guān)系有關(guān)。下圖是相鄰層過濾器的相關(guān)性。其中的關(guān)系是稀疏的。 ?
在 CIFAR10 上訓(xùn)練的一個 Network-in-Network 模型中相鄰層的過濾器的相關(guān)性矩陣。高度相關(guān)的過濾器對更明亮,而相關(guān)性更低的過濾器則更暗。圖片來自:https://blog.yani.io/filter-group-tutorial ? 分組矩陣的相關(guān)性映射圖又如何? ?
在 CIFAR10 上訓(xùn)練的一個 Network-in-Network 模型中相鄰層的過濾器的相關(guān)性,動圖分別展示了有 1、2、4、8、16 個過濾器分組的情況。圖片來自 https://blog.yani.io/filter-group-tutorial ? 上圖是當(dāng)用 1、2、4、8、16 個過濾器分組訓(xùn)練模型時,相鄰層的過濾器之間的相關(guān)性。那篇文章提出了一個推理:「過濾器分組的效果是在通道維度上學(xué)習(xí)塊對角結(jié)構(gòu)的稀疏性……在網(wǎng)絡(luò)中,具有高相關(guān)性的過濾器是使用過濾器分組以一種更為結(jié)構(gòu)化的方式學(xué)習(xí)到。從效果上看,不必學(xué)習(xí)的過濾器關(guān)系就不再參數(shù)化。這樣顯著地減少網(wǎng)絡(luò)中的參數(shù)數(shù)量能使其不容易過擬合,因此,一種類似正則化的效果讓優(yōu)化器可以學(xué)習(xí)得到更準(zhǔn)確更高效的深度網(wǎng)絡(luò)。」 ?
AlexNet conv1 過濾器分解:正如作者指出的那樣,過濾器分組似乎會將學(xué)習(xí)到的過濾器結(jié)構(gòu)性地組織成兩個不同的分組。本圖來自 AlexNet 論文。 ?
此外,每個過濾器分組都會學(xué)習(xí)數(shù)據(jù)的一個獨特表征。正如 AlexNet 的作者指出的那樣,過濾器分組似乎會將學(xué)習(xí)到的過濾器結(jié)構(gòu)性地組織成兩個不同的分組——黑白過濾器和彩色過濾器。 ? 你認(rèn)為深度學(xué)習(xí)領(lǐng)域的卷積還有那些值得注意的地方?
? 編輯:黃飛
評論
查看更多