1. 程式人生 > >深度學習中的池化詳解 | Pooling in Deep learning

深度學習中的池化詳解 | Pooling in Deep learning

本文由多篇部落格總結整理而成,參考部落格見文末,侵刪。

目錄

最大池化 :

平均池化

重疊池化

參考文獻

參考部落格

  • 首先,什麼是CNN

--------------------------------------------------------

卷積神經網路關鍵在於”卷積”二字, 在通訊中, 卷積是對輸入訊號經過持續的轉換, 持續輸出另一組訊號的過程.

convolution_of_box_signal_with_itself2
圖1 FROM wiki

解釋上圖:通過卷積生成新函式。輸入是固定的藍色方框和紅色框,紅色框滑動作為滑動視窗,輸出的黑線,代表的是滑動視窗與藍色框的重疊面積。 

------------------------------------------------------------

CNN對輸入的處理與上面類似,在輸入上利用塊單位(n*n)來提取特徵,使得高維圖片降維。

untitled
圖2

上圖中,通過卷積核\begin{bmatrix} 1& 0&1 \\ 0& 1& 0\\ 1&0 &1 \end{bmatrix}的卷積操作,最終得到降維後的圖片(特徵)。

--------------------------

或者從神經網路連線結構的角度來展示。

untitled
圖3

在上圖中,CNN的hidden layer (綠色字母A)跟input layers(藍色圓圈)不再是全連線,而是區域性區域成塊連線。一個hidden單元照顧一部分的input units。

我們也可以加入更多的hidden layer (紫色字母B),聚集出更大的塊,以學到與ground truth更為相似的結果。

untitled
圖4

但由於加入了更多的單元,會導致整個網路隱藏層引數增多(每個相鄰的輸入x,都在上層生成了一個大塊),訓練時易造成過擬合的狀況。所以為了減少引數的複雜度,不再嚴格要求相鄰塊至少聚合到一個上層塊,可以將下層塊分一些區域,在這些區域聚合--這是Pooling的直觀作用。

untitled
圖5

紅色的max,即為max pooling池化層,把小的塊分割成一個個池子,也就是大塊,具體如下所示。

untitled
圖6

可以看一下2D影象上有無pooling的效果:

untitled
圖7
untitled
圖8

顯然後者引數更少,更不容易發生過擬合。

  • 什麼是Pooling

上一部分我們已經提到了卷積也初步認識了pooling,那pooling在CNN網路結構裡具體是怎麼和CNN相互作用的呢?以下圖在NLP中應用的典型結構為例:

圖9 自然語言處理中的CNN典型網路結構 

第一部分的介紹可知:卷積層本質上是個特徵抽取層,可以設定超引數F來指定設立多少個k*k的特徵抽取器(Filter)。

讓我們再具體描述一遍,卷積層抽取特徵的過程(回想圖一):假設輸入X包含m個字元,而每個字元的Word Embedding的長度為d,那麼輸入就是m*d的二維向量。對於某個Filter來說,可以想象有一個k*d大小的移動視窗從輸入矩陣的第一個字開始不斷往後移動。對於某個時刻的視窗,通過神經網路的非線性變換,將這個視窗內的輸入值轉換為某個特徵值,隨著視窗不斷往後移動,這個Filter對應的特徵值不斷產生,形成這個Filter的特徵向量。。每個Filter都如此操作,形成了不同的特徵抽取器。Pooling 層則對Filter的特徵進行降維操作,形成最終的特徵。一般在Pooling層之後連線全聯接層神經網路,形成最後的分類過程。

綜上,大家已經對pooling有了抽象的瞭解了。

---------------------------------------------

  • pooling的定義:

pooling 是仿照人的視覺系統進行降維(降取樣),用更高層的抽象表達 來表示 影象特徵。

  • pooling為什麼可以降低維度呢?

因為影象具有一種“靜態性”的屬性,這也就意味著在一個影象區域有用的特徵極有可能在另一個區域同樣適用。因此,為了描述大的影象,一個很自然的想法就是對不同位置的特徵進行聚合統計。例如,人們可以計算影象一個區域上的某個特定特徵的平均值 (或最大值)來代表這個區域的特徵。[1]

  • pooling有哪些操作方式

最常見的池化操作是max pooling和 mean pooling。顧名思義,效果如下圖所示,2*2的方塊內取最大值/均值。

  • 最大池化 :

前向傳播:選影象區域的最大值作為該區域池化後的值。

反向傳播:梯度通過最大值的位置傳播,其它位置梯度為0

  • 平均池化

前向傳播:計算影象區域的平均值作為該區域池化後的值。

反向傳播:梯度取均值後分給每個位置。

  • max pooling和 mean pooling效果比較

通常來講,max-pooling的效果更好,雖然max-pooling和average-pooling都對資料做了降取樣,但是max-pooling感覺更像是做了特徵選擇,選出了分類辨識度更好的特徵,提供了非線性,根據相關理論,特徵提取的誤差主要來自兩個方面:(1)鄰域大小受限造成的估計值方差增大;(2)卷積層引數誤差造成估計均值的偏移。一般來說,average-pooling能減小第一種誤差,更多的保留影象的背景資訊,max-pooling能減小第二種誤差,更多的保留紋理資訊。average-pooling更強調對整體特徵資訊進行一層下采樣,在減少引數維度的貢獻上更大一點,更多的體現在資訊的完整傳遞這個維度上,一個有代表性的模型,DenseNet中的模組之間的連線大多采用average-pooling,在減少維度的同時,更有利資訊傳遞到下一個模組進行特徵提取。

但是average-pooling在全域性平均池化操作中應用也比較廣,在ResNet和Inception結構中最後一層都使用了平均池化。有的時候在模型接近分類器的末端使用全域性平均池化還可以代替Flatten操作,使輸入資料變成一位向量。

  • pooling 選擇與實際應用

通常我們使用Max Pooling,因為使用它能學到影象的邊緣和紋理結構。而Average Pooling則不能。Max Pooling通常用以減小估計值方差,在方差不太重要的地方可以隨意選擇Max Pooling和Average Pooling。Average Pooling用以減小估計均值的偏移。在某些情況下Average Pooling可能取得比Max Pooling稍好一些的效果。

average pooling會弱化強啟用值,而max pooling保留最強的啟用值卻容易過擬合。

雖然從理論上說Stochastic Pooling也許能取得較好的結果,但是需要在實踐中多次嘗試,隨意使用可能效果變差。因此並不是一個常規的選擇。

按池化是否作用於影象中不重合的區域(這與卷積操作不同)分為一般池化(Gerneral Pooling)與重疊池化(OverlappingPooling)。

常見設定是filter大小F=2,步長S=2或F=3,S=2(overlapping pooling,重疊);pooling層通常不需要填充

  • 池化在CNN中的作用

本小節內容 源自知乎 謝志寧的回答

1.不變性(invariance)。包括平移、旋轉、尺度、(translation、rotation、scale)

2.減少維度(少引數就是少計算量)並可以保留主要特徵(降維,效果類似PCA(從結果上來理解是的吧))。

其中最常用的目的是--防止過擬合。提高模型的泛化能力。

---------------------------------------------

  • translation invariance:

這裡舉一個直觀的例子(數字識別),假設有一個16x16的圖片,裡面有個數字1,我們需要識別出來,這個數字1可能寫的偏左一點(圖1),這個數字1可能偏右一點(圖2),圖1到圖2相當於向右平移了一個單位,但是圖1和圖2經過max pooling之後它們都變成了相同的8x8特徵矩陣,主要的特徵我們捕獲到了,同時又將問題的規模從16x16降到了8x8,而且具有平移不變性的特點。圖中的a(或b)表示,在原始圖片中的這些a(或b)位置,最終都會對映到相同的位置。

  •  rotation invariance:

下圖表示漢字“一”的識別,第一張相對於x軸有傾斜角,第二張是平行於x軸,兩張圖片相當於做了旋轉,經過多次max pooling後具有相同的特徵

  • scale invariance:

下圖表示數字“0”的識別,第一張的“0”比較大,第二張的“0”進行了較小,相當於作了縮放,同樣地,經過多次max pooling後具有相同的特徵

  • 其他非一般池化方法

重疊池化

重疊池化正如其名字所說的,相鄰池化視窗之間會有重疊區域,此時sizeX>stride。它引入了空間金字塔的思想,將池化層的輸出擴充為多級較小的特徵,採用稀疏編碼進行多級特徵的融合,降低了池化層輸出的特徵維度。傳統的池化策略輸出的是單一大小的特徵對映,而多級的輸出已經顯示了對目標形變的魯棒性,所以結合多級金字塔的池化策略也是可以提高深度網路效能的。

設空間卷積操作後得到的特徵對映大小為a*a,某級金字塔大小為n*n,則對應的池化操作的池化比率為\left \lceil a/n \right \rceil,步長為 \left \lfloor a/n \right \rfloor這裡 \left \lceil \cdot \right \rceil和 \left \lfloor \cdot \right \rfloor 分別對應向上取整和向下取整的操作。我們發現當  \left \lceil a/n \right \rceil<  \left \lfloor a/n \right \rfloor的時候,池化區域和區域之間會出現重疊,而傳統的池化方法之間則不會。

具體的說,池化操作可以看作池化單元網格以s畫素為步長在移動,對以池化單元網格為中心的z*z區域性區域進行特徵概括。如果s=z,那麼該池化操作就是傳統的池化策略;如果s<z,則該池化操作就是重疊的池化方法,論文[2]中,作者使用了重疊池化,錯誤率有所降低。。

  • 空間金字塔池化: SPP-NET

 空間金字塔池化,由何愷明2014年提出。paper:《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》。paper 

空間金字塔池化的contribution在於,構建的網路可以把任何尺度的影象的卷積特徵轉化成相同維度,這不僅可以讓CNN處理任意尺度的影象,還能避免cropping和warping操作導致一些資訊的丟失,精度也有所提高。

回顧前文的CNN影象處理過程,卷積核池化操作對影象的大小都是沒有要求的,所以只剩下了全連線層。因為全連線層的輸入需要固定輸入維度,所以空間金字塔池化,要解決的就是從卷積層到全連線層之間的一個過渡。

也就是說在以後的文獻中,一般空間金子塔池化層,都是放在卷積層到全連線層之間的一個網路層。

-------------------------------------------

空間金字塔池化,先讓影象進行卷積操作,然後轉化成維度相同的特徵輸入到全連線層,它的靈感來自於空間金字塔(熟悉SIFT特徵的應該瞭解),在不同尺度上進行特徵提取。而空間金字塔最大池化的過程,是將原本唯一尺度的池化操作變成了多個尺度下的池化,用這樣不同大小池化視窗作用於卷積特徵,我們可以得到多層池化後的特徵map。然後再在不同尺度的特徵map上,分別計算每個塊的最大值,並把這21個256維特徵連結起來輸入全連線層,通過這種方式把不同大小的影象轉化成相同維度的特徵。

具體的流程圖如下

對於不同的影象要得到相同大小的pooling結果,就需要根據影象的大小動態的計算池化視窗的大小和步長。假設conv5輸出的大小為a*a,需要得到n*n大小的池化結果,可以讓視窗大小sizeX為,步長為 。下圖以conv5輸出的大小為13*13為例。

SPP其實就是一種多個scale的pooling,可以獲取影象中的多尺度資訊;在CNN中加入SPP後,可以讓CNN處理任意大小的輸入,這讓模型變得更加的flexible。

END

參考文獻

參考部落格