VGGNet
論文地址:https://arxiv.org/abs/1409.1556
VGGNet是牛津大學計算機視覺組(VisualGeometry Group)和GoogleDeepMind公司的研究員一起研發的的深度卷積神經網路。VGGNet探索了卷積神經網路的深度與其效能之間的關係,通過反覆堆疊3*3的小型卷積核和2*2的最大池化層,VGGNet成功地構築了16~19層深的卷積神經網路。VGGNet相比之前state-of-the-art的網路結構,錯誤率大幅下降,並取得了ILSVRC 2014比賽分類專案的第2名和定位專案的第1名。同時VGGNet的擴充性很強,遷移到其他圖片資料上的泛化性非常好。VGGNet的結構非常簡潔,整個網路都使用了同樣大小的卷積核尺寸(3*3)和最大池化尺寸(2*2)。到目前為止,VGGNet依然經常被用來提取影像特徵。VGGNet訓練後的模型引數在其官方網站上開源了,可用來在特定的影像分類任務上進行再訓練(相當於提供了非常好的初始化權重),因此被用在了很多地方。
VGGNet論文中全部使用了3*3的卷積核和2*2的池化核,通過不斷加深網路結構來提升效能。圖1所示為VGGNet各級別的網路結構圖,圖2所示為每一級別的引數量,從11層的網路一直到19層的網路都有詳盡的效能測試。雖然從A到E每一級網路逐漸變深,但是網路的引數量並沒有增長很多,這是因為引數量主要都消耗在最後3個全連線層。前面的卷積部分雖然很深,但是消耗的引數量不大,不過訓練比較耗時的部分依然是卷積,因其計算量比較大。這其中的D、E也就是我們常說的VGGNet-16和VGGNet-19。C很有意思,相比B多了幾個1*1的卷積層,1*1卷積的意義主要在於線性變換,而輸入通道數和輸出通道數不變,沒有發生降維。
訓練時,輸入是大小為224*224的RGB影像,預處理只有在訓練集中的每個畫素上減去RGB的均值。
圖1 VGGNet各級別網路結構圖
圖2 VGGNet各級別網路引數量
VGGNet擁有5段卷積,每一段內有2~3個卷積層,同時每段尾部會連線一個最大池化層用來縮小圖片尺寸。每段內的卷積核數量一樣,越靠後的段的卷積核數量越多:64-128-256-512-512。其中經常出現多個完全一樣的3*3的卷積層堆疊在一起的情況,這其實是非常有用的設計。如圖3所示,兩個3*3的卷積層串聯相當於1個5*5的卷積層,即一個畫素會跟周圍5*5的畫素產生關聯,可以說感受野大小為5*5。而3個3*3的卷積層串聯的效果則相當於1個7*7的卷積層。除此之外,3個串聯的3*3的卷積層,擁有比1個7*7的卷積層更少的引數量,只有後者的(3*3*3)/(7*7)=55%。最重要的是,3個3*3的卷積層擁有比1個7*7的卷積層更多的非線性變換(前者可以使用三次ReLU啟用函式,而後者只有一次),使得CNN對特徵的學習能力更強。
圖3 兩個串聯3´3的卷積層功能類似於一個5´5的卷積層
VGGNet在訓練時有一個小技巧,先訓練級別A的簡單網路,再複用A網路的權重來初始化後面的幾個複雜模型,這樣訓練收斂的速度更快。在預測時,VGG採用Multi-Scale的方法,將影像scale到一個尺寸Q,並將圖片輸入卷積網路計算。然後在最後一個卷積層使用滑窗的方式進行分類預測,將不同視窗的分類結果平均,再將不同尺寸Q的結果平均得到最後結果,這樣可提高圖片資料的利用率並提升預測準確率。在訓練中,VGGNet還使用了Multi-Scale的方法做資料增強,將原始影像縮放到不同尺寸S,然後再隨機裁切224´224的圖片,這樣能增加很多資料量,對於防止模型過擬合有很不錯的效果。實踐中,作者令S在[256,512]這個區間內取值,使用Multi-Scale獲得多個版本的資料,並將多個版本的資料合在一起進行訓練。圖4所示為VGGNet使用Multi-Scale訓練時得到的結果,可以看到D和E都可以達到7.5%的錯誤率。最終提交到ILSVRC 2014的版本是僅使用Single-Scale的6個不同等級的網路與Multi-Scale的D網路的融合,達到了7.3%的錯誤率。不過比賽結束後作者發現只融合Multi-Scale的D和E可以達到更好的效果,錯誤率達到7.0%,再使用其他優化策略最終錯誤率可達到6.8%左右,非常接近同年的冠軍Google Inceptin Net。同時,作者在對比各級網路時總結出了以下幾個觀點:(1)LRN層作用不大(VGGNet不使用區域性響應標準化(LRN),這種標準化並不能在ILSVRC資料集上提升效能,卻導致更多的記憶體消耗和計算時間。);(2)越深的網路效果越好;(3)1*1的卷積也是很有效的,但是沒有3*3的卷積好,大一些的卷積核可以學習更大的空間特徵。
圖4 各級別VGGNet在使用Multi-Scale訓練時的top-5錯誤率
在訓練的過程中,比AlexNet收斂的要快一些,原因為:(1)使用小卷積核和更深的網路進行的正則化;(2)在特定的層使用了預訓練得到的資料進行引數的初始化。
對於較淺的網路,如網路A,可以直接使用隨機數進行隨機初始化,而對於比較深的網路,則使用前面已經訓練好的較淺的網路中的引數值對其前幾層的卷積層和最後的全連線層進行初始化。