深度学习(十三)——花式池化, Batch Normalization
https://antkillerfarm.github.io/
花式池化
池化和卷積一樣,都是信號采樣的一種方式。
普通池化
池化的一般步驟是:選擇區域P,令Y=f(P)。這里的f為池化函數。
上圖是Max Pooling的示意圖。除了max之外,常用的池化函數還有mean、min等。
ICLR2013上,Zeiler提出了另一種pooling手段stochastic pooling。只需對Pooling區域中的元素按照其概率值大小隨機選擇,即元素值大的被選中的概率也大。而不像max-pooling那樣,永遠只取那個最大值元素。
根據相關理論,特征提取的誤差主要來自兩個方面:
(1)鄰域大小受限造成的估計值方差增大;
(2)卷積層參數誤差造成估計均值的偏移。
一般來說,mean-pooling能減小第一種誤差,更多的保留圖像的背景信息,max-pooling能減小第二種誤差,更多的保留紋理信息。
Stochastic-pooling則介于兩者之間,通過對像素點按照數值大小賦予概率,再按照概率進行亞采樣,在平均意義上,與mean-pooling近似,在局部意義上,則服從max-pooling的準則。
池化的反向傳播
池化的反向傳播比較簡單。以上圖的Max Pooling為例,由于取的是最大值7,因此,誤差只要傳遞給7所在的神經元即可。
這里再次強調一下,池化只是對信號的下采樣。對于圖像來說,這種下采樣保留了圖像的某些特征,因而是有意義的。但對于另外的任務則未必如此。
比如,AlphaGo采用CNN識別棋局,但對棋局來說,下采樣顯然是沒有什么物理意義的,因此,AlphaGo的CNN是沒有Pooling的。
全局平均池化
Global Average Pooling是另一類池化操作,一般用于替換FullConnection層。
上圖是FC和GAP在CNN中的使用方法圖。從中可以看出Conv轉換成FC,實際上進行了如下操作:
1.對每個通道的feature map進行flatten操作得到一維的tensor。
2.將不同通道的tensor連接成一個大的一維tensor。
上圖展示了FC與Conv、Softmax等層聯動時的運算操作。
上圖是GAP與Conv、Softmax等層聯動時的運算操作。可以看出,GAP的實際操作如下:
1.計算每個通道的feature map的均值。
2.將不同通道的均值連接成一個一維tensor。
UnPooling
UnPooling是一種常見的上采樣操作。其過程如下圖所示:
1.在Pooling(一般是Max Pooling)時,保存最大值的位置(Max Location)。
2.中間經歷若干網絡層的運算。
3.上采樣階段,利用第1步保存的Max Location,重建下一層的feature map。
從上面的描述可以看出,UnPooling不完全是Pooling的逆運算:
1.Pooling之后的feature map,要經過若干運算,才會進行UnPooling操作。
2.對于非Max Location的地方以零填充。然而這樣并不能完全還原信息。
參考:
http://blog.csdn.net/u012938704/article/details/52831532
caffe反卷積
K-max Pooling
參考
http://www.cnblogs.com/tornadomeet/p/3432093.html
Stochastic Pooling簡單理解
http://mp.weixin.qq.com/s/XzOri12hwyOCdI1TgGQV3w
新型池化層sort_pool2d實現更快更好的收斂:表現優于最大池化層
http://blog.csdn.net/liuchonge/article/details/67638232
CNN與句子分類之動態池化方法DCNN–模型介紹篇
Batch Normalization
在《深度學習(二)》中,我們已經簡單的介紹了Batch Normalization的基本概念。這里主要講述一下它的實現細節。
我們知道在神經網絡訓練開始前,都要對輸入數據做一個歸一化處理,那么具體為什么需要歸一化呢?歸一化后有什么好處呢?
原因在于神經網絡學習過程本質就是為了學習數據分布,一旦訓練數據與測試數據的分布不同,那么網絡的泛化能力也大大降低;另外一方面,一旦每批訓練數據的分布各不相同(batch梯度下降),那么網絡就要在每次迭代都去學習適應不同的分布,這樣將會大大降低網絡的訓練速度,這也正是為什么我們需要對數據都要做一個歸一化預處理的原因。
對輸入數據歸一化,早就是一種基本操作了。然而這樣只對神經網絡的輸入層有效。更好的辦法是對每一層都進行歸一化。
然而簡單的歸一化,會破壞神經網絡的特征。(歸一化是線性操作,但神經網絡本身是非線性的,不具備線性不變性。)因此,如何歸一化,實際上是個很有技巧的事情。
首先,我們回顧一下歸一化的一般做法:
x^(k)=x(k)?E[x(k)]Var[x(k)]???????√
其中,x=(x(0),x(1),…x(d))表示d維的輸入向量。
接著,定義歸一化變換函數:
y(k)=γ(k)x^(k)+β(k)
這里的γ(k),β(k)是待學習的參數。
BN的主要思想是用同一batch的樣本分布來近似整體的樣本分布。顯然,batch size越大,這種近似也就越準確。
用B={x1,…,m}表示batch,則BN的計算過程如下:
Step 1.計算mini-batch mean。
μB←1m∑i=1mxi
Step 2.計算mini-batch variance。
σ2B←1m∑i=1m(xi?μB)2
Step 3.normalize。
x^i←xi?μBσ2B+??????√
這里的?是為了數值的穩定性而添加的常數。
Step 4.scale and shift。
yi=γx^i+β≡BNγ,β(xi)
在實際使用中,BN計算和卷積計算一樣,都被當作神經網絡的其中一層。即:
z=g(Wu+b)→z=g(BN(Wu+b))=g(BN(Wu))
從另一個角度來看,BN的均值、方差操作,相當于去除一階和二階信息,而只保留網絡的高階信息,即非線性部分。因此,上式最后一步中b被忽略,也就不難理解了。
BN的誤差反向算法相對復雜,這里不再贅述。
在inference階段,BN網絡忽略Step 1和Step 2,只計算后兩步。其中,β,γ由之前的訓練得到。μ,σ原則上要求使用全體樣本的均值和方差,但樣本量過大的情況下,也可使用訓練時的若干個mini batch的均值和方差的FIR濾波值。
Instance Normalization
Instance Normalization主要用于CV領域。
論文:
《Instance Normalization: The Missing Ingredient for Fast Stylization》
首先我們列出對圖片Batch Normalization的公式:
ytijk=xtijk?μiσ2i+??????√,μi=1HWT∑t=1T∑l=1W∑m=1Hxtilm,σ2i=1HWT∑t=1T∑l=1W∑m=1H(xtilm?mμi)2
其中,T為圖片數量,i為通道,j、k為圖片的寬、高。
Instance Normalization的公式:
ytijk=xtijk?μtiσ2ti+??????√,μti=1HW∑l=1W∑m=1Hxtilm,σ2ti=1HW∑l=1W∑m=1H(xtilm?mμti)2
從中可以看出Instance Normalization實際上就是對一張圖片的一個通道內的值進行歸一化,因此又叫做對比度歸一化(contrast normalization)。
參考:
http://www.jianshu.com/p/d77b6273b990
論文中文版
總結
以上是生活随笔為你收集整理的深度学习(十三)——花式池化, Batch Normalization的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器学习(二十三)——Beam Sear
- 下一篇: 深度学习(十四)——Softmax详解,