注:全文來自于知乎YJango專欄
如果要提出一個新的神經網絡結構,首先就需要引入像循環神經網絡中“時間共享”這樣的先驗知識,降低學習所需要的訓練資料需求量。 而卷積神經網絡同樣也引入了這樣的先驗知識:“空間共享”。下面就讓我們以畫面識别作為切入點,看看該先驗知識是如何被引入到神經網絡中的。
目錄
- 視覺感覺
- 畫面識别是什麼
- 識别結果取決于什麼
- 圖像表達
- 畫面識别的輸入
- 畫面不變形
- 前饋神經網絡做畫面識别的不足
- 卷積神經網絡做畫面識别
- 局部連接配接
- 空間共享
- 輸出空間表達
- Depth維的處理
- Zero padding
- 形狀、概念抓取
- 多filters
- 非線性
- 輸出尺寸控制
- 矩陣乘法執行卷積
- Max pooling
- 全連接配接層
- 結構發展
- 畫面不變性的滿足
- 平移不變性
- 旋轉和視角不變性
- 尺寸不變性
- Inception的了解
- 1x1卷積核了解
- 跳層連接配接ResNet
視覺感覺
一、畫面識别是什麼任務?
學習知識的第一步就是明确任務,清楚該知識的輸入輸出。卷積神經網絡最初是服務于畫面識别的,是以我們先來看看畫面識别的實質是什麼。
先觀看幾組動物與人類視覺的差異對比圖。
1. 蒼蠅的視覺和人的視覺的差異
2. 蛇的視覺和人的視覺的差異
(更多對比圖請參考連結)
通過上面的兩組對比圖可以知道,即便是相同的圖檔經過不同的視覺系統,也會得到不同的感覺。
這裡引出一條知識:生物所看到的景象并非世界的原貌,而是長期進化出來的适合自己生存環境的一種感覺方式。 蛇的獵物一般是夜間行動,是以它就進化出了一種可以在夜間也能很好觀察的感覺系統,感熱。
任何視覺系統都是将圖像反光與腦中所看到的概念進行關聯。
是以畫面識别實際上并非識别這個東西客觀上是什麼,而是尋找人類的視覺關聯方式,并再次應用。 如果我們不是人類,而是蛇類,那麼畫面識别所尋找的?就和現在的不一樣。
畫面識别實際上是尋找(學習)人類的視覺關聯方式?,并再次應用。
二、圖檔被識别成什麼取決于哪些因素?
下面用兩張圖檔來體會識别結果取決于哪些因素。
1. 老婦與少女
請觀察上面這張圖檔,你看到的是老婦還是少女? 以不同的方式去觀察這張圖檔會得出不同的答案。 圖檔可以觀察成有大鼻子、大眼睛的老婦。也可以被觀察成少女,但這時老婦的嘴會被識别成少女脖子上的項鍊,而老婦的眼睛則被識别為少女的耳朵。
2. 海豚與男女
上面這張圖檔如果是成人觀察,多半看到的會是一對親熱的男女。倘若兒童看到這張圖檔,看到的則會是一群海豚(男女的輪廓是由海豚構造出的)。是以,識别結果受年齡,文化等因素的影響,換句話說:
圖檔被識别成什麼不僅僅取決于圖檔本身,還取決于圖檔是如何被觀察的。
圖像表達
我們知道了“畫面識别是從大量的
資料中尋找人類的視覺關聯方式?,并再次應用。 其
-是輸入,表示所看到的東西
-輸出,表示該東西是什麼。
在自然界中,
是物體的反光,那麼在計算機中,圖像又是如何被表達和存儲的呢?
[from]
圖像在計算機中是一堆按順序排列的數字,數值為0到255。0表示最暗,255表示最亮。 你可以把這堆數字用一個長長的向量來表示,也就是tensorflow的mnist教程中784維向量的表示方式。 然而這樣會失去平面結構的資訊,為保留該結構資訊,通常選擇矩陣的表示方式:28x28的矩陣。
上圖是隻有黑白顔色的灰階圖,而更普遍的圖檔表達方式是RGB顔色模型,即紅(Red)、綠(Green)、藍(Blue)三原色的色光以不同的比例相加,以産生多種多樣的色光。
這樣,RGB顔色模型中,單個矩陣就擴充成了有序排列的三個矩陣,也可以用三維張量去了解,其中的每一個矩陣又叫這個圖檔的一個channel。
在電腦中,一張圖檔是數字構成的“長方體”。可用 寬width, 高height, 深depth 來描述,如圖。
畫面識别的輸入 是shape為(width, height, depth)的三維張量。
接下來要考慮的就是該如何處理這樣的“數字長方體”。
畫面不變性
在決定如何處理“數字長方體”之前,需要清楚所建立的網絡擁有什麼樣的特點。 我們知道一個物體不管在畫面左側還是右側,都會被識别為同一物體,這一特點就是不變性(invariance),如下圖所示。
我們希望所建立的網絡可以盡可能的滿足這些不變性特點。
為了了解卷積神經網絡對這些不變性特點的貢獻,我們将用不具備這些不變性特點的前饋神經網絡來進行比較。
圖檔識别--前饋神經網絡
友善起見,我們用depth隻有1的灰階圖來舉例。 想要完成的任務是:在寬長為4x4的圖檔中識别是否有下圖所示的“橫折”。 圖中,黃色圓點表示值為0的像素,深色圓點表示值為1的像素。 我們知道不管這個橫折在圖檔中的什麼位置,都會被認為是相同的橫折。
若訓練前饋神經網絡來完成該任務,那麼表達圖像的三維張量将會被攤平成一個向量,作為網絡的輸入,即(width, height, depth)為(4, 4, 1)的圖檔會被展成次元為16的向量作為網絡的輸入層。再經過幾層不同節點個數的隐藏層,最終輸出兩個節點,分别表示“有橫折的機率”和“沒有橫折的機率”,如下圖所示。
下面我們用數字(16進制)對圖檔中的每一個像素點(pixel)進行編号。 當使用右側那種物體位于中間的訓練資料來訓練網絡時,網絡就隻會對編号為5,6,9,a的節點的權重進行調節。 若讓該網絡識别位于右下角的“橫折”時,則無法識别。
解決辦法是用大量物體位于不同位置的資料訓練,同時增加網絡的隐藏層個數進而擴大網絡學習這些變體的能力。
然而這樣做十分不效率,因為我們知道在左側的“橫折”也好,還是在右側的“橫折”也罷,大家都是“橫折”。 為什麼相同的東西在位置變了之後要重新學習?有沒有什麼方法可以将中間所學到的規律也運用在其他的位置? 換句話說,也就是讓不同位置用相同的權重。
圖檔識别--卷積神經網絡
卷積神經網絡就是讓權重在不同位置共享的神經網絡。
局部連接配接
在卷積神經網絡中,我們先選擇一個局部區域,用這個局部區域去掃描整張圖檔。 局部區域所圈起來的所有節點會被連接配接到下一層的一個節點上。
為了更好的和前饋神經網絡做比較,我将這些以矩陣排列的節點展成了向量。 下圖展示了被紅色方框所圈中編号為0,1,4,5的節點是如何通過
連接配接到下一層的節點0上的。
這個帶有連接配接強弱的紅色方框就叫做 filter 或 kernel 或 feature detector。 而filter的範圍叫做filter size,這裡所展示的是2x2的filter size。
(1)
第二層的節點0的數值就是局部區域的線性組合,即被圈中節點的數值乘以對應的權重後相加。 用
表示輸入值,
表示輸出值,用圖中标注數字表示角标,則下面列出了兩種計算編号為0的輸出值
的表達式。
注:在局部區域的線性組合後,也會和前饋神經網絡一樣,加上一個偏移量
。
(2)
空間共享
當filter掃到其他位置計算輸出節點
時,
,包括
是共用的。
下面這張動态圖展示了當filter掃過不同區域時,節點的連結方式。 動态圖的最後一幀則顯示了所有連接配接。 可以注意到,每個輸出節點并非像前饋神經網絡中那樣與全部的輸入節點連接配接,而是部分連接配接。 這也就是為什麼大家也叫前饋神經網絡(feedforward neural network)為fully-connected neural network。 圖中顯示的是一步一步的移動filter來掃描全圖,一次移動多少叫做stride。
空間共享也就是卷積神經網絡所引入的先驗知識。
輸出表達
如先前在圖像表達中提到的,圖檔不用向量去表示是為了保留圖檔平面結構的資訊。 同樣的,卷積後的輸出若用上圖的排列方式則丢失了平面結構資訊。 是以我們依然用矩陣的方式排列它們,就得到了下圖所展示的連接配接。
這也就是你們在網上所看到的下面這張圖。在看這張圖的時候請結合上圖的連接配接一起了解,即輸入(綠色)的每九個節點連接配接到輸出(粉紅色)的一個節點上的。
經過一個feature detector計算後得到的粉紅色區域也叫做一個“Convolved Feature” 或 “Activation Map” 或 “Feature Map”。
Depth維的處理
現在我們已經知道了depth次元隻有1的灰階圖是如何處理的。 但前文提過,圖檔的普遍表達方式是下圖這樣有3個channels的RGB顔色模型。 當depth為複數的時候,每個feature detector是如何卷積的?
現象:2x2所表達的filter size中,一個2表示width維上的局部連接配接數,另一個2表示height維上的局部連接配接數,并卻沒有depth維上的局部連接配接數,是因為depth維上并非局部,而是全部連接配接的。
在2D卷積中,filter在張量的width維, height維上是局部連接配接,在depth維上是貫串全部channels的。
類比:想象在切蛋糕的時候,不管這個蛋糕有多少層,通常大家都會一刀切到底,但是在長和寬這兩個維上是局部切割。
下面這張圖展示了,在depth為複數時,filter是如何連接配接輸入節點到輸出節點的。 圖中紅、綠、藍顔色的節點表示3個channels。 黃色節點表示一個feature detector卷積後得到的Feature Map。 其中被透明黑框圈中的12個節點會被連接配接到黃黑色的節點上。
- 在輸入depth為1時:被filter size為2x2所圈中的4個輸入節點連接配接到1個輸出節點上。
- 在輸入depth為3時:被filter size為2x2,但是貫串3個channels後,所圈中的12個輸入節點連接配接到1個輸出節點上。
- 在輸入depth為 時:2x2x 個輸入節點連接配接到1個輸出節點上。
(可從vectary在3D編輯下檢視)
注意:三個channels的權重并不共享。 即當深度變為3後,權重也跟着擴增到了三組,如式子(3)所示,不同channels用的是自己的權重。 式子中增加的角标r,g,b分别表示red channel, green channel, blue channel的權重。
(3)
計算例子:用
表示red channel的編号為0的輸入節點,
表示green channel編号為5個輸入節點。
表示blue channel。如式子(4)所表達,這時的一個輸出節點實際上是12個輸入節點的線性組合。
(4)
當filter掃到其他位置計算輸出節點
時,那12個權重在不同位置是共用的,如下面的動态圖所展示。 透明黑框圈中的12個節點會連接配接到被白色邊框選中的黃色節點上。
每個filter會在width維, height維上,以局部連接配接和空間共享,并貫串整個depth維的方式得到一個Feature Map。
Zero padding
細心的讀者應該早就注意到了,4x4的圖檔被2x2的filter卷積後變成了3x3的圖檔,每次卷積後都會小一圈的話,經過若幹層後豈不是變的越來越小? Zero padding就可以在這時幫助控制Feature Map的輸出尺寸,同時避免了邊緣資訊被一步步舍棄的問題。
例如:下面4x4的圖檔在邊緣Zero padding一圈後,再用3x3的filter卷積後,得到的Feature Map尺寸依然是4x4不變。
通常大家都想要在卷積時保持圖檔的原始尺寸。 選擇3x3的filter和1的zero padding,或5x5的filter和2的zero padding可以保持圖檔的原始尺寸。 這也是為什麼大家多選擇3x3和5x5的filter的原因。 另一個原因是3x3的filter考慮到了像素與其距離為1以内的所有其他像素的關系,而5x5則是考慮像素與其距離為2以内的所有其他像素的關系。
尺寸:Feature Map的尺寸等于(input_size + 2 * padding_size − filter_size)/stride+1。
注意:上面的式子是計算width或height一維的。padding_size也表示的是單邊補零的個數。例如(4+2-3)/1+1 = 4,保持原尺寸。
不用去背這個式子。其中(input_size + 2 * padding_size)是經過Zero padding擴充後真正要卷積的尺寸。 減去 filter_size後表示可以滑動的範圍。 再除以可以一次滑動(stride)多少後得到滑動了多少次,也就意味着得到了多少個輸出節點。 再加上第一個不需要滑動也存在的輸出節點後就是最後的尺寸。
形狀、概念抓取
知道了每個filter在做什麼之後,我們再來思考這樣的一個filter會抓取到什麼樣的資訊。
我們知道不同的形狀都可由細小的“零件”組合而成的。比如下圖中,用2x2的範圍所形成的16種形狀可以組合成格式各樣的“更大”形狀。
卷積的每個filter可以探測特定的形狀。又由于Feature Map保持了抓取後的空間結構。若将探測到細小圖形的Feature Map作為新的輸入再次卷積後,則可以由此探測到“更大”的形狀概念。 比如下圖的第一個“大”形狀可由2,3,4,5基礎形狀拼成。第二個可由2,4,5,6組成。第三個可由6,1組成。
除了基礎形狀之外,顔色、對比度等概念對畫面的識别結果也有影響。卷積層也會根據需要去探測特定的概念。
可以從下面這張圖中感受到不同數值的filters所卷積過後的Feature Map可以探測邊緣,棱角,模糊,突出等概念。
[from]
如我們先前所提,圖檔被識别成什麼不僅僅取決于圖檔本身,還取決于圖檔是如何被觀察的。
而filter内的權重矩陣W是網絡根據資料學習得到的,也就是說,我們讓神經網絡自己學習以什麼樣的方式去觀察圖檔。
拿老婦與少女的那幅圖檔舉例,當标簽是少女時,卷積網絡就會學習抓取可以成少女的形狀、概念。 當标簽是老婦時,卷積網絡就會學習抓取可以成老婦的形狀、概念。
下圖展現了在人臉識别中經過層層的卷積後,所能夠探測的形狀、概念也變得越來越抽象和複雜。
卷積神經網絡會盡可能尋找最能解釋訓練資料的抓取方式。
多filters
每個filter可以抓取探測特定的形狀的存在。 假如我們要探測下圖的長方框形狀時,可以用4個filters去探測4個基礎“零件”。
是以我們自然而然的會選擇用多個不同的filters對同一個圖檔進行多次抓取。 如下圖(動态圖過大,如果顯示不出,請看到該連結觀看),同一個圖檔,經過兩個(紅色、綠色)不同的filters掃描過後可得到不同特點的Feature Maps。 每增加一個filter,就意味着你想讓網絡多抓取一個特征。
[from]
這樣卷積層的輸出也不再是depth為1的一個平面,而是和輸入一樣是depth為複數的長方體。
如下圖所示,當我們增加一個filter(紫色表示)後,就又可以得到一個Feature Map。 将不同filters所卷積得到的Feature Maps按順序堆疊後,就得到了一個卷積層的最終輸出。
卷積層的輸入是長方體,輸出也是長方體。
這樣卷積後輸出的長方體可以作為新的輸入送入另一個卷積層中處理。
加入非線性
和前饋神經網絡一樣,經過線性組合和偏移後,會加入非線性增強模型的拟合能力。
将卷積所得的Feature Map經過ReLU變換(elementwise)後所得到的output就如下圖所展示。
[from]
輸出長方體
現在我們知道了一個卷積層的輸出也是一個長方體。 那麼這個輸出長方體的(width, height, depth)由哪些因素決定和控制。
這裡直接用CS231n的Summary:
計算例子:請體會CS231n的Convolution Demo部分的示範。
矩陣乘法執行卷積
如果按正常以掃描的方式一步步計算局部節點和filter的權重的點乘,則不能高效的利用GPU的并行能力。 是以更普遍的方法是用兩個大矩陣的乘法來一次性囊括所有計算。
因為卷積層的每個輸出節點都是由若幹個輸入節點的線性組合所計算。 因為輸出的節點個數是
,是以就有
個線性組合。
讀過我寫的線性代數教程的讀者請回憶,矩陣乘矩陣的意義可以了解為批量的線性組合按順序排列。 其中一個矩陣所表示的資訊是多組權重,另一個矩陣所表示的資訊是需要進行組合的向量。 大家習慣性的把組成成分放在矩陣乘法的右邊,而把權重放在矩陣乘法的左邊。 是以這個大型矩陣乘法可以用
表示,其中
和
都是矩陣。
卷積的每個輸出是由局部的輸入節點和對應的filter權重展成向量後所計算的,如式子(2)。 那麼
中的每一行則是每個filter的權重,有
個; 而
的每一列是所有需要進行組合的節點(上面的動态圖中被黑色透明框圈中的節點),也有
個。
的列的個數則表示每個filter要滑動多少次才可以把整個圖檔掃描完,有
次。 因為我們有多個filters,
的行的個數則是filter的個數
。
最後我們得到:
當然矩陣乘法後需要将
整理成形狀為
的三維張量以供後續處理(如再送入另一個卷積層)。
則也需要逐漸的局部滑動圖檔,最後堆疊構成用于計算矩陣乘法的形式。
Max pooling
在卷積後還會有一個pooling的操作,盡管有其他的比如average pooling等,這裡隻提max pooling。
max pooling的操作如下圖所示:整個圖檔被不重疊的分割成若幹個同樣大小的小塊(pooling size)。每個小塊内隻取最大的數字,再舍棄其他節點後,保持原有的平面結構得出output。
[from]
max pooling在不同的depth上是分開執行的,且不需要參數控制。 那麼問題就max pooling有什麼作用?部分資訊被舍棄後難道沒有影響嗎?
[from]
Max pooling的主要功能是downsamping,卻不會損壞識别結果。 這意味着卷積後的Feature Map中有對于識别物體不必要的備援資訊。 那麼我們就反過來思考,這些“備援”資訊是如何産生的。
直覺上,我們為了探測到某個特定形狀的存在,用一個filter對整個圖檔進行逐漸掃描。但隻有出現了該特定形狀的區域所卷積獲得的輸出才是真正有用的,用該filter卷積其他區域得出的數值就可能對該形狀是否存在的判定影響較小。 比如下圖中,我們還是考慮探測“橫折”這個形狀。 卷積後得到3x3的Feature Map中,真正有用的就是數字為3的那個節點,其餘數值對于這個任務而言都是無關的。 是以用3x3的Max pooling後,并沒有對“橫折”的探測産生影響。 試想在這裡例子中如果不使用Max pooling,而讓網絡自己去學習。 網絡也會去學習與Max pooling近似效果的權重。因為是近似效果,增加了更多的parameters的代價,卻還不如直接進行Max pooling。
Max pooling還有類似“選擇句”的功能。假如有兩個節點,其中第一個節點會在某些輸入情況下最大,那麼網絡就隻在這個節點上流通資訊;而另一些輸入又會讓第二個節點的值最大,那麼網絡就轉而走這個節點的分支。
但是Max pooling也有不好的地方。因為并非所有的抓取都像上圖的例子。有些周邊資訊對某個概念是否存在的判定也有影響。 并且Max pooling是對所有的Feature Maps進行等價的操作。就好比用相同網孔的漁網打魚,一定會有漏網之魚。
全連接配接層
當抓取到足以用來識别圖檔的特征後,接下來的就是如何進行分類。 全連接配接層(也叫前饋層)就可以用來将最後的輸出映射到線性可分的空間。 通常卷積網絡的最後會将末端得到的長方體平攤(flatten)成一個長長的向量,并送入全連接配接層配合輸出層進行分類。
卷積神經網絡大緻就是covolutional layer, pooling layer, ReLu layer, fully-connected layer的組合,例如下圖所示的結構。
[from]
這裡也展現了深層神經網絡或deep learning之是以稱deep的一個原因:模型将特征抓取層和分類層合在了一起。 負責特征抓取的卷積層主要是用來學習“如何觀察”。
下圖簡述了機器學習的發展,從最初的人工定義特征再放入分類器的方法,到讓機器自己學習特征,再到如今盡量減少人為幹涉的deep learning。
[from]
結構發展
以上介紹了卷積神經網絡的基本概念。 以下是幾個比較有名的卷積神經網絡結構,詳細的請看CS231n。
- LeNet:第一個成功的卷積神經網絡應用
- AlexNet:類似LeNet,但更深更大。使用了層疊的卷積層來抓取特征(通常是一個卷積層馬上一個max pooling層)
- ZF Net:增加了中間卷積層的尺寸,讓第一層的stride和filter size更小。
- GoogLeNet:減少parameters數量,最後一層用max pooling層代替了全連接配接層,更重要的是Inception-v4子產品的使用。
- VGGNet:隻使用3x3 卷積層和2x2 pooling層從頭到尾堆疊。
- ResNet:引入了跨層連接配接和batch normalization。
- DenseNet:将跨層連接配接從頭進行到尾。
總結一下:這些結構的發展趨勢有:
- 使用small filter size的卷積層和pooling
- 去掉parameters過多的全連接配接層
- Inception(稍後會對其中的細節進行說明)
- 跳層連接配接
不變性的滿足
接下來會談談我個人的,對于畫面不變性是如何被卷積神經網絡滿足的想法。 同時結合不變性,對上面提到的結構發展的重要變動進行直覺上的解讀。
需要明白的是為什麼加入不變性可以提高網絡表現。 并不是因為我們用了更炫酷的處理方式,而是加入了先驗知識,無需從零開始用資料學習,節省了訓練所需資料量。 思考表現提高的原因一定要從訓練所需要的資料量切入。 提出滿足新的不變性特點的神經網絡是計算機視覺的一個主要研究方向。
平移不變性
可以說卷積神經網絡最初引入局部連接配接和空間共享,就是為了滿足平移不變性。
因為空間共享,在不同位置的同一形狀就可以被等價識别,是以不需要對每個位置都進行學習。
旋轉和視角不變性
個人覺得卷積神經網絡克服這一不變性的主要手段還是靠大量的資料。 并沒有明确加入“旋轉和視角不變性”的先驗特性。
Deformable Convolutional Networks似乎是對此變性進行了進行增強。
尺寸不變性
與平移不變性不同,最初的卷積網絡并沒有明确照顧尺寸不變性這一特點。
我們知道filter的size是事先選擇的,而不同的尺寸所尋找的形狀(概念)範圍不同。
從直覺上思考,如果選擇小範圍,再一步步通過組合,仍然是可以得到大範圍的形狀。 如3x3尺寸的形狀都是可以由2x2形狀的圖形組合而成。是以形狀的尺寸不變性對卷積神經網絡而言并不算問題。 這恐怕ZF Net讓第一層的stride和filter size更小,VGGNet将所有filter size都設定成3x3仍可以得到優秀結果的一個原因。
但是,除了形狀之外,很多概念的抓取通常需要考慮一個像素與周邊更多像素之間的關系後得出。 也就是說5x5的filter也是有它的優點。 同時,小尺寸的堆疊需要很多個filters來共同完成,如果需要抓取的形狀恰巧在5x5的範圍,那麼5x5會比3x3來的更有效率。 是以一次性使用多個不同filter size來抓取多個範圍不同的概念是一種順理成章的想法,而這個也就是Inception。 可以說Inception是為了尺寸不變性而引入的一個先驗知識。
Inception
下圖是Inception的結構,盡管也有不同的版本,但是其動機都是一樣的:消除尺寸對于識别結果的影響,一次性使用多個不同filter size來抓取多個範圍不同的概念,并讓網絡自己選擇需要的特征。
你也一定注意到了藍色的1x1卷積,撇開它,先看左邊的這個結構。
輸入(可以是被卷積完的長方體輸出作為該層的輸入)進來後,通常我們可以選擇直接使用像素資訊(1x1卷積)傳遞到下一層,可以選擇3x3卷積,可以選擇5x5卷積,還可以選擇max pooling的方式downsample剛被卷積後的feature maps。 但在實際的網絡設計中,究竟該如何選擇需要大量的實驗和經驗的。 Inception就不用我們來選擇,而是将4個選項給神經網絡,讓網絡自己去選擇最合适的解決方案。
接下來我們再看右邊的這個結構,多了很多藍色的1x1卷積。 這些1x1卷積的作用是為了讓網絡根據需要能夠更靈活的控制資料的depth的。
1x1卷積核
如果卷積的輸出輸入都隻是一個平面,那麼1x1卷積核并沒有什麼意義,它是完全不考慮像素與周邊其他像素關系。 但卷積的輸出輸入是長方體,是以1x1卷積實際上是對每個像素點,在不同的channels上進行線性組合(資訊整合),且保留了圖檔的原有平面結構,調控depth,進而完成升維或降維的功能。
如下圖所示,如果選擇2個filters的1x1卷積層,那麼資料就從原本的depth 3 降到了2。若用4個filters,則起到了升維的作用。
這就是為什麼上面Inception的4個選擇中都混合一個1x1卷積,如右側所展示的那樣。 其中,綠色的1x1卷積本身就1x1卷積,是以不需要再用另一個1x1卷積。 而max pooling用來去掉卷積得到的Feature Map中的備援資訊,是以出現在1x1卷積之前,緊随剛被卷積後的feature maps。(由于沒做過實驗,不清楚調換順序會有什麼影響。)
跳層連接配接
前饋神經網絡也好,卷積神經網絡也好,都是一層一層逐漸變換的,不允許跳層組合。 但現實中是否有跳層組合的現象?
比如說我們在判斷一個人的時候,很多時候我們并不是觀察它的全部,或者給你的圖檔本身就是殘缺的。 這時我們會靠單個五官,外加這個人的着裝,再加他的身形來綜合判斷這個人,如下圖所示。 這樣,即便圖檔本身是殘缺的也可以很好的判斷它是什麼。 這和前饋神經網絡的先驗知識不同,它允許不同層級之間的因素進行資訊互動、綜合判斷。
殘差網絡就是擁有這種特點的神經網絡。大家喜歡用identity mappings去解釋為什麼殘差網絡更優秀。 這裡我隻是提供了一個以先驗知識的角度去了解的方式。 需要注意的是每一層并不會像我這裡所展示的那樣,會形成明确的五官層。 隻是有這樣的組合趨勢,實際無法保證神經網絡到底學到了什麼内容。
用下圖舉一個更易思考的例子。 圖形1,2,3,4,5,6是第一層卷積層抓取到的概念。 圖形7,8,9是第二層卷積層抓取到的概念。 圖形7,8,9是由1,2,3,4,5,6的基礎上組合而成的。
但當我們想要探測的圖形10并不是單純的靠圖形7,8,9組成,而是第一個卷積層的圖形6和第二個卷積層的8,9組成的話,不允許跨層連接配接的卷積網絡不得不用更多的filter來保持第一層已經抓取到的圖形資訊。并且每次傳遞到下一層都需要學習那個用于保留前一層圖形概念的filter的權重。 當層數變深後,會越來越難以保持,還需要max pooling将備援資訊去掉。
一個合理的做法就是直接将上一層所抓取的概念也跳層傳遞給下下一層,不用讓其每次都重新學習。 就好比在程式設計時建構了不同規模的functions。 每個function我們都是保留,而不是重新再寫一遍。提高了重用性。
同時,因為ResNet使用了跳層連接配接的方式。也不需要max pooling對保留低層資訊時所産生的備援資訊進行去除。
Inception中的第一個1x1的卷積通道也有類似的作用,但是1x1的卷積仍有權重需要學習。 并且Inception所使用的結合方式是concatenate的合并成一個更大的向量的方式,而ResNet的結合方式是sum。 兩個結合方式各有優點。 concatenate當需要用不同的次元去組合成新觀念的時候更有益。 而sum則更适用于并存的判斷。比如既有油頭發,又有胖身軀,同時穿着常年不洗的牛仔褲,三個不同層面的概念并存時,該人會被判定為程式員的情況。 又比如雙向LSTM中正向和逆向序列抓取的結合常用相加的方式結合。在語音識别中,這表示既可以正向抓取某種特征,又可以反向抓取另一種特征。當兩種特征同時存在時才會被識别成某個特定聲音。
在下圖的ResNet中,前一層的輸入會跳過部分卷積層,将底層資訊傳遞到高層。
在下圖的DenseNet中,底層資訊會被傳遞到所有的後續高層。
後續
随着時間推移,各個ResNet,GoogLeNet等架構也都在原有的基礎上進行了發展和改進。 但基本都是上文描述的概念的組合使用加上其他的tricks。
如下圖所展示的,加入跳層連接配接的Inception-ResNet。