白话详细解读(一)-----GoogLeNet(Inception V1-Inception V3)
一、背景
GoogLeNet、VGGNet分別是2014年ImageNet挑戰(zhàn)賽的第一名和第二名,相對于VGGNet的網(wǎng)絡結構,GoogLeNet則進行了大膽的嘗試,提出了Inception結構,這種結構的最大的特點就是提高了計算資源的利用率。雖然GoogLeNet只有22層,但是整個網(wǎng)絡的尺寸卻比AlexNet和VGGNet小很多。GoogLeNet在擴大深度和寬度的同時,保持計算預算不變,這是非常難得的。
二、初識Inception結構
2.1 Inception naive version(原始版本Inception)
Inception結構經(jīng)歷了4個版本,其中,由于Inception V4是與殘差神經(jīng)網(wǎng)絡進行結合,在此先不講述。下面對Inception的各個版本進行詳細介紹。
一般來說,提升網(wǎng)絡性能最直接的辦法就是增加網(wǎng)絡深度和寬度,深度指網(wǎng)絡層次數(shù)量、寬度指神經(jīng)元數(shù)量。但這種方式存在以下問題:
(1)參數(shù)太多,如果訓練數(shù)據(jù)集有限,很容易產(chǎn)生過擬合;
(2)網(wǎng)絡越大、參數(shù)越多,計算復雜度越大,難以應用;
(3)網(wǎng)絡越深,容易出現(xiàn)梯度彌散問題(梯度越往后穿越容易消失),難以優(yōu)化模型。
解決這種問題的方式當然是在增加網(wǎng)絡的寬度和深度的同時減少參數(shù)(減少參數(shù)是為了高性能的計算)。因此,Google團隊提出了Inception結構,以保持高性能計算的同時增加網(wǎng)絡的寬度和深度。
那么。Inception結構具體是什么樣的呢?
圖(a)中,將1*1、3*3、5*5卷積和3*3池化堆疊在一起,卷積池化后的feature map尺寸相同,對這結構設計的原因,我的理解是:眾所周知,卷積核越大,說明感受野越大,提取的信息語義層次特征更高;卷積核越小,感受野越小,提取到的特征更為直觀。將不同卷積核提取到的feature map疊加在一起,不僅有直觀的特征,而且也有語義層次高的特征,這樣特征信息會更加豐富。但設計Inception的初衷是為了保持高性能計算,這樣5*5的卷積核的計算量顯得未免也太大了,這與Inception設計的初衷相悖。于是Google團隊對Inception的原始版本進行了改進,即Inception V1。
2.2 使用1*1卷積的優(yōu)勢
使用1*1卷積的優(yōu)勢:
- 減少參數(shù)量,減少計算量
- 假設輸入feature map的維度是256維,要求輸出維度也是256維,有以下兩種操作:
- (1)256維的輸入直接經(jīng)過一個3*3*256的卷積層,輸出一個256維的feature map,那么參數(shù)量為:(3*3*256)*256 = 589824
- (2)256維的輸入先經(jīng)過一個1*1*256*64的卷積層,再經(jīng)過一個3*3*64的卷積層, 最后經(jīng)過一個1*1*256的卷積層,輸出256維,參數(shù)量為:(1*1*256*64)+(3*3*64*64)+(1*1*64*256) = 69532 可以看到,參數(shù)量減少了大約8.5倍
- 假設輸入feature map的維度是256維,要求輸出維度也是256維,有以下兩種操作:
- 實現(xiàn)跨通道的信息交互和信息整合
- 使用1*1卷積核,其實就是對不同的channel間的信息做線性組合的一個變換過程。比如輸入為3*3*3的feature map,后面添加一個1*1*3*64個的卷積核,就變成了3*3*64的feature map,原來的3個channels就可以理解為跨通道線性組合變成了64channels,這就是通道間的信息交互。
- 增加非線性
- 1*1卷積核,在獲得相同感受野(reception feild)、保持feature map尺度不變的情況下,使用1*1卷積核的網(wǎng)絡更深,而每一層網(wǎng)絡后都會用Relu函數(shù)增加非線性,這樣就增加了一層非線性特性。
2.3 Inception V1
在3*3卷積和5*5卷積之前,使用1*1卷積主要是為了減少參數(shù)量,從而減少計算。至于為什么減少了,上一小節(jié)已經(jīng)描述了,在此不再贅述了。
2.4 GoogLeNet結構
- 1.網(wǎng)絡的最后采用全局平均池化代替全連接層,該想法來自NIN。但是,實際在最后還是加了一個全連接層,主要是為了方便對輸出進行靈活調整。網(wǎng)絡中雖然用全局平均池化替代了全連接層,但是網(wǎng)絡模型還是用到了dropout,來減少過擬合現(xiàn)象。
- 2.為了避免梯度消失,網(wǎng)絡額外增加了2個輔助的softmax用于向前傳導梯度(輔助分類器)。輔助分類器是將中間某一層的輸出用作分類,并按一個較小的權重(0.3)加到最終分類結果中,這樣相當于做了模型融合,同時給網(wǎng)絡增加了反向傳播的梯度信號,也提供了額外的正則化,對于整個網(wǎng)絡的訓練很有裨益。而在推理過程時,這兩個額外的softmax會被去掉。(摘自https://my.oschina.net/u/876354/blog/1637819)
2.5 GoogLeNet細節(jié)圖
三、Batch Normalization
推薦閱讀博文(深入了解BN):https://blog.csdn.net/dongjinkun/article/details/109001484
3.1 BN的相關概念
什么是Batch Normalization?在了解什么是Batch Normalization之前,需要先了解3個概念,第一個是IID獨立同分布假設,第二個是covariate shift,第三個是internal covariate shift。
- IID獨立同分布假設:假設訓練數(shù)據(jù)和測試數(shù)據(jù)是滿足獨立同分布的,這是通過訓練數(shù)據(jù)學得的模型能夠在測試集上獲得好的效果的一個基本保障。
- internal covariate shift:神經(jīng)網(wǎng)絡是一個包含很多隱層的網(wǎng)絡結構,在訓練過程中,因為各層參數(shù)不停在變化,所以每個隱層都會面臨covariate shift的問題,也就是在訓練過程中,隱層的輸入分布老是變來變去,這就是所謂的“Internal Covariate Shift”,Internal指的是深層網(wǎng)絡的隱層,是發(fā)生在網(wǎng)絡內部的事情,而不是像covariate shift問題只發(fā)生在輸入層。
- covariate shift:covariate shift只針對輸入層,含義輸入的輸入分布總是變來變去,這不符合IID獨立同分布假設,網(wǎng)絡模型很難學習到穩(wěn)定的特征,結果是網(wǎng)絡模型的泛化能力很差。
3.2 BN的本質思想
BN的基本思想其實相當直觀:因為深層神經(jīng)網(wǎng)絡在做非線性變換前的激活輸入值(就是那個x=WU+B,U是輸入)隨著網(wǎng)絡深度加深或者在訓練過程中,其輸入分布逐漸發(fā)生偏移或者變動,之所以模型訓練收斂慢,一般是輸入整體分布逐漸往非線性函數(shù)的取值區(qū)間的上下限兩端靠近(對于Sigmoid函數(shù)來說,意味著激活輸入值WU+B是大的負值或正值),所以這導致反向傳播時低層神經(jīng)網(wǎng)絡的梯度消失,這是訓練深層神經(jīng)網(wǎng)絡收斂越來越慢的本質原因。
BN是要干什么呢?
BN就是通過一定的規(guī)范化手段,把每層神經(jīng)網(wǎng)絡任意神經(jīng)元這個輸入值的分布強行拉回到均值為0方差為1的標準正態(tài)分布,將,激活輸入分布固定下來,這樣使得激活輸入值落在非線性函數(shù)對輸入比較敏感的區(qū)域(對于Sigmoid函數(shù)來說,輸入會更大概率的落在[-2,2]區(qū)間上,該區(qū)間上梯度較為明顯),意思是這樣讓梯度變大,避免梯度消失問題產(chǎn)生,而且梯度變大意味著學習收斂速度快,能大大加快訓練速度。
3.3 訓練階段如何做BN變換
對于d維數(shù)據(jù),對每一維的數(shù)據(jù)都做BN變換,使其變?yōu)榫禐?、方差為0的標準正態(tài)分布,下面以第k維舉例:
BN變換算法流程(算法1):
未添加BN層:
添加BN層之后:
經(jīng)過BN變換后,神經(jīng)元的激活X形成了均值為0,方差為1的正態(tài)分布,目的就是把X變換至梯度明顯的區(qū)域,但是這樣會導致網(wǎng)絡表達能力下降,為了防止這一點,每個神經(jīng)元增加兩個調節(jié)參數(shù)(scale和shift),這兩個參數(shù)是通過訓練來學習到的,用來對變換后的激活反變換,使得網(wǎng)絡表達能力增強,即對變換后的激活進行如下的scale和shift操作,這其實是BN變換的反操作:
3.4 BN的推理過程
BN在訓練的時候可以根據(jù)Mini-Batch里的若干訓練實例進行激活數(shù)值調整,但是在推理(inference)的過程中,輸入就只有一個實例,那么這時候怎么對輸入做BN呢?可以用從所有訓練實例中獲得的統(tǒng)計量來代替Mini-Batch里面m個訓練實例獲得的均值和方差統(tǒng)計量。如何求訓練集的均值和方差呢?這里不進行解釋了,只提供方法,均值是利用了滑動平均法求得,方差是使用的無偏估計。
對上述算法的一點解釋:
- 1-7行:其實就是算法1,也就是對K維數(shù)據(jù)分別進行BN變換,使得每一維的數(shù)據(jù)分布都為均值為1、方差為0的標準正態(tài)分布。
- 8-12行:是模型的推理過程。
- 第11行公式是具體怎么來的?
- 其實就是一個簡單的恒等變換,推導過程如下:
- 其實就是一個簡單的恒等變換,推導過程如下:
3.5 添加BN層后的Inception結構
3.6 BN的優(yōu)勢
- 1.加快模型的收斂速度
- 2.使用BN,可以設置大的學習率,并且對于權重的初始化要求也不那么嚴格
- 3.BN還可以充當正則化器,減緩dropout的使用
四、Inception V2
Inception V2最主要的工作就是對大的卷積(3*3、5*5)進行分解,例如,一個5*5卷積核獲得的感受野和兩個3*3卷積核疊加獲得的感受野相同,但是3*3卷積核的參數(shù)量要比5*5卷積核的參數(shù)量要少約2.78倍,所以,1個5*5的卷積核可以由2個3*3代替。
4.1 卷積分解(Factorizing Convolutions)
分解5*5卷積后,Inception結構變成如下:
這時,google團隊又思考了,能不能進一步的分解卷積,例如,將卷積核分解成2*2卷積,然而,事實證明,使用非對稱卷積可以做得比2*2卷積更好。例如:在保持獲得相同感受野的前提下,使用1個3*1卷積+1個1*3卷積可以代替3*3卷積。
4.2 非對稱卷積( Asymmetric Convolutions)
使用非對稱卷積后:
然而,Google團隊發(fā)現(xiàn),這種非對稱卷積在神經(jīng)網(wǎng)絡早期的效果并不理想,換句話說,這種非對稱卷積方式在比較大的feature map(size:n*n,12≤n≤20)上使用時,效果會比較好。在這個層次上,使用1個1*7卷積+1個7*1卷積會得到一個比較好的結果。
4.3 降低feature map的尺寸
原文提到,降低feature map尺寸的方式有2種:
- 1.先對feature map進行池化,然后再做Inception卷積。這種方式雖然會減少計算量,但是會造成特征信息缺失,也就是會遇到特征瓶頸,因為池化只是提取了最明顯的特征(這里以最大池化為例,因為現(xiàn)在最大池化用的較多,平均池化基本不用了)。
- 2.先對feature map進行Inception卷積,然后再進行池化。這種方式是正常的縮放,但這種方式計算量很大。為了同時保持特征表示且降低計算量,將網(wǎng)絡結構改為下圖,使用兩個并行化的模塊來降低計算量(卷積、池化并行執(zhí)行,再進行合并)
五、Inception V3
5.1 GoogLeNet發(fā)展歷程
總結一下GoogLeNet的發(fā)展歷程:
- 1.Inception的原始版本
- 2.Inception V1版本
- 3.Inception-BN版本
- 4.Inception V2版本(其中,依次包括卷積分解、非對稱卷積)
- 5.Inception V3版本,見下文。
5.2 Inception V3
論文中提到:
紅筆標記處提到:表格3中最后一行的模型稱之為Inception V3,也就是Inception V2+Batch Normalization = Inception V3。
至此,除Inception V4版本,其余版本已經(jīng)介紹完,其中,有很多細節(jié)由于篇幅問題沒有詳細說明,詳細了解還需要仔細閱讀文章。
七、參考文獻
- https://my.oschina.net/u/876354/blog/1637819
- https://www.cnblogs.com/guoyaohua/p/8724433.html
- Going deeper with convolutions
- Rethinking the Inception Architecture for Computer Vision
- Batch Normalization: Accelerating Deep Network Training by
Reducing Internal Covariate Shift
總結
以上是生活随笔為你收集整理的白话详细解读(一)-----GoogLeNet(Inception V1-Inception V3)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用户激励体系搭建指南
- 下一篇: 2022十大科技趋势