0. 背景
隨着何凱明等人提出的ResNet v1,google這邊坐不住了,他們基於inception v3的基礎上,引入了殘差結構,提出了inception-resnet-v1和inception-resnet-v2,並修改inception模塊提出了inception v4結構。基於inception v4的網絡實驗發現在不引入殘差結構的基礎上也能達到和inception-resnet-v2結構相似的結果,從而認為何凱明等人認為的:
“要想得到深度卷積網絡必須使用殘差結構”
這一觀點是不完全正確的。
不過值得注意的是,google這邊對於inception v2是屬於哪篇論文有些不同觀點:
- 在《Rethinking the Inception Architecture for Computer Vision》中認為:基於inception v1進行結構的改進是inception v2;在inception v2上加上BN是inception v3;
- 在《Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning》中將《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》認為是inception v2(即inception v1 上進行小改動再加上BN);《Rethinking the Inception Architecture for Computer Vision》認為是inception v3
google認為他們之前在改變架構選擇上相對保守:網絡結構的改變只局限於獨立的網絡組件范圍內,從而保持剩下模型穩定。而如果不改變之前的這種原則,那么生成的模型將會比需要的還復雜(即過頭了)。在這里,他們決定拋棄之前那個設計原則,對不同尺度的網格都采用統一的inception模塊
在下面的網絡結構圖中:所有后面不帶V的卷積,用的都是same-padded,也就是輸出的網格大小等於輸入網格的大小(如vgg的卷積一樣);帶V的使用的是valid-padded,表示輸出的網格尺寸是會逐步減小的(如lenet5的卷積一樣)。
在下面的結構圖中,每一個inception模塊中都有一個\(1*1\)的沒有激活層的卷積層,用來擴展通道數,從而補償因為inception模塊導致的維度約間。其中Inception-ResNet-V1的結果與Inception v3相當;Inception-ResNet-V1與Inception v4結果差不多,不過實際過程中Inception v4會明顯慢於Inception-ResNet-v2,這也許是因為層數太多了。且在Inception-ResNet結構中,只在傳統層的上面使用BN層,而不在合並層上使用BN,雖然處處使用BN是有好處,不過更希望能夠將一個完整的組件放入單獨的GPU中。因為具有大量激活單元的層會占用過多的顯存,所以希望這些地方丟棄BN,從而總體增加Inception模塊的數量。使得不需要去解決計算資源和模塊什么的權衡問題。
1. inception v4
圖1.1 inception v4 網絡結構圖
圖1.2 圖1.1的stem和Inception-A部分結構圖
圖1.3 圖1.1的Reduction-A和Inception-B部分結構圖
圖1.4 圖1.1的Reduction-B和Inception-C部分結構圖
2. Inception-resnet-v1 & Inception-resnet-v2
圖2.1 Inception-resnet-v1 & Inception-resnet-v2的結構圖
2.1 Inception-resnet-v1的組成模塊
圖2.1.1 圖2.1的stem和Inception-ResNet-A部分結構圖
圖2.1.2 圖2.1的Reduction-A和Inception-ResNet-B部分結構圖
圖2.1.3 圖2.1的Reduction-B和Inception-ResNet-C部分結構圖
2.2 Inception-resnet-v2的組成模塊
圖2.2.1 圖2.1的stem和Inception-ResNet-A部分結構圖
圖2.2.2 圖2.1的Reduction-A和Inception-ResNet-B部分結構圖
圖2.2.3 圖2.1的Reduction-B和Inception-ResNet-C部分結構圖
3. 模型訓練
在上述的Inception V4,Inception-Resnet-V1,Inception-ResNet-v2這三個模型中都用到了Reduction-A,他們各自的具體參數如下:
圖3.1 不同模型下Reduction-A的模型超參數
作者們在訓練的過程中發現,如果通道數超過1000,那么Inception-resnet等網絡都會開始變得不穩定,並且過早的就“死掉了”,即在迭代幾萬次之后,平均池化的前面一層就會生成很多的0值。作者們通過調低學習率,增加BN都沒有任何改善。
不過他們發現如果在將殘差匯入之前,對殘差進行縮小,可以讓模型穩定訓練,值通常選擇[0,1.0.3],如圖3.2
圖3.2 對inception-resnet模塊進行最后輸出值的等比例縮小
同樣的在ResNet-v1中,何凱明等人也在cifar-10中發現了模型的不穩定現象:即在特別深的網絡基礎上去訓cifar-10,需要先以0.01的學習率去訓練,然后在以0.1的學習率訓練。
不過這里的作者們認為如果通道數特別多的話,即使以特別低的學習率(0.00001)訓練也無法讓模型收斂,如果之后再用大學習率,那么就會輕松的破壞掉之前的成果。然而簡單的縮小殘差的輸出值有助於學習的穩定,即使進行了簡單的縮小,那么對最終結果也造成不了多大的損失,反而有助於穩定訓練。
- 在inception-resnet-v1與inception v3的對比中,inception-resnet-v1雖然訓練速度更快,不過最后結果有那么一丟丟的差於inception v3;
- 而在inception-resnet-v2與inception v4的對比中,inception-resnet-v2的訓練速度更塊,而且結果比inception v4也更好一點。所以最后勝出的就是inception-resnet-v2。
圖3.3 不同模型的結果對比