點擊上圖,立即開啟AI急速修煉
作者:Charlotte 高級算法工程師 ,博客專家;
擅長用通俗易懂的方式講解深度學習和機器學習算法,熟悉Tensorflow,PaddlePaddle等深度學習框架,負責過多個機器學習落地項目,如垃圾評論自動過濾,用戶分級精準營銷,分布式深度學習平臺搭建等,都取了的不錯的效果。
博客專欄:https://www.cnblogs.com/charlotte77/
前文傳送門:
【好書推薦&學習階段】三個月教你從零入門深度學習
【深度學習系列】PaddlePaddle之手寫數字識別
【深度學習系列】卷積神經網絡CNN原理詳解(一)——基本原理
【深度學習系列】PaddlePaddle之數據預處理
【深度學習系列】卷積神經網絡詳解(二)——自己手寫一個卷積神經網絡
【深度學習系列】用PaddlePaddle和Tensorflow進行圖像分類
【深度學習系列】用PaddlePaddle和Tensorflow實現經典CNN網絡AlexNet
【深度學習系列】用PaddlePaddle和Tensorflow實現經典CNN網絡Vgg
【深度學習系列】用PaddlePaddle和Tensorflow實現經典CNN網絡GoogLeNet
上一篇文章我們引出了GoogLeNet InceptionV1的網絡結構,這篇文章中我們會詳細講到Inception V2/V3/V4的發展歷程以及它們的網絡結構和亮點。
GoogLeNet Inception V2
GoogLeNet Inception V2在《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》出現,最大亮點是提出了Batch Normalization方法,它起到以下作用:
使用較大的學習率而不用特別關心諸如梯度爆炸或消失等優化問題;
降低了模型效果對初始權重的依賴;
可以加速收斂,一定程度上可以不使用Dropout這種降低收斂速度的方法,但卻起到了正則化作用提高了模型泛化性;
即使不使用ReLU也能緩解激活函數飽和問題;
能夠學習到從當前層到下一層的分布縮放( scaling (方差),shift (期望))係數。
在機器學習中,我們通常會做一種假設:訓練樣本獨立同分布(iid)且訓練樣本與測試樣本分布一致,如果真實數據符合這個假設則模型效果可能會不錯,反之亦然,這個在學術上叫Covariate Shift,所以從樣本(外部)的角度說,對於神經網絡也是一樣的道理。從結構(內部)的角度說,由於神經網絡由多層組成,樣本在層與層之間邊提特徵邊往前傳播,如果每層的輸入分布不一致,那麼勢必造成要麼模型效果不好,要麼學習速度較慢,學術上這個叫InternalCovariate Shift。
假設:
通過神經網絡若干層後每層的輸入;
理論上:
但是:
BN整個算法過程如下:
左邊是未做白化的原始可行域,右邊是做了白化的可行域;
這裡的參數
卷積網絡中採用權重共享策略,每個feature map只有一對
GoogLeNet Inception V3
GoogLeNet Inception V3在《Rethinking the Inception Architecture for Computer Vision》中提出(注意,在這篇論文中作者把該網絡結構叫做v2版,我們以最終的v4版論文的劃分為標準),該論文的亮點在於:
提出通用的網絡結構設計準則
引入卷積分解提高效率
引入高效的feature map降維
前面也說過,深度學習網絡的探索更多是個實驗科學,在實驗中人們總結出一些結構設計準則,但說實話我覺得不一定都有實操性:
神經網絡包含一個自動提取特徵的過程,例如多層卷積,直觀並符合常識的理解:如果在網絡初期特徵提取的太粗,細節已經丟了,後續即使結構再精細也沒法做有效表示了;舉個極端的例子:在宇宙中辨別一個星球,正常來說是通過由近及遠,從房屋、樹木到海洋、大陸板塊再到整個星球之後進入整個宇宙,如果我們一開始就直接拉遠到宇宙,你會發現所有星球都是球體,沒法區分哪個是地球哪個是水星。所以feature map的大小應該是隨著層數的加深逐步變小,但為了保證特徵能得到有效表示和組合其通道數量會逐漸增加。
下圖違反了這個原則,剛開就始直接從35×35×320被抽樣降維到了17×17×320,特徵細節被大量丟失,即使後面有Inception去做各種特徵提取和組合也沒用。
通過合理平衡網絡的寬度和深度優化網絡計算消耗(這句話尤其不具有實操性)。
抽樣降維,傳統抽樣方法為pooling+卷積操作,為了防止出現特徵表示的瓶頸,往往需要更多的卷積核,例如輸入為n個d×d的feature map,共有k個卷積核,pooling時stride=2,為不出現特徵表示瓶頸,往往k的取值為2n,通過引入inception module結構,即降低計算複雜度,又不會出現特徵表示瓶頸,實現上有如下兩種方式:
平滑樣本標註對於多分類的樣本標註一般是one-hot的,例如[0,0,0,1],使用類似交叉熵的損失函數會使得模型學習中對ground truth標籤分配過於置信的概率,並且由於ground truth標籤的logit值與其他標籤差距過大導致,出現過擬合,導致降低泛化性。一種解決方法是加正則項,即對樣本標籤給個概率分布做調節,使得樣本標註變成「soft」的,例如[0.1,0.2,0.1,0.6],這種方式在實驗中降低了top-1和top-5的錯誤率0.2%。
GoogLeNet Inception V4/和ResNet V1/V2這三種結構在《Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning》一文中提出,論文的亮點是:提出了效果更好的GoogLeNet Inception v4網絡結構;與殘差網絡融合,提出效果不遜於v4但訓練速度更快的結構。
代碼實踐
Tensorflow的代碼在slim模塊下有完整的實現,paddlepaddle的可以參考上篇文章中寫的inception v1的代碼來寫。
總結
這篇文章比較偏理論,主要講了GoogLeNet的inception模塊的發展,包括在v2中提出的batch normalization,v3中提出的卷積分級與更通用的網絡結構準則,v4中的與殘差網絡結合等,在實際應用過程中可以可以對同一份數據用不同的網絡結構跑一跑,看看結果如何,實際體驗一下不同網絡結構的loss下降速率,對準確率的提升等。
想從零開始學人工智慧?
下圖掃碼了解本文作者胡老師的系列課程吧!
限時優惠6.18折!