由Andrew Zisserman 教授主導的 VGG 的 ILSVRC 的大賽中的卷積神經網絡取得了很好的成績,這篇文章詳細說明了網絡相關事宜。
文章主要干了點什么事呢?它就是在在用卷積神經網絡下,在采用小的卷積核與小的移動步長的情況下,探索一下網絡的深度對目標識別率的影響。
網絡的大體結構
網絡的輸入為224*224的RGB圖片,后面跟卷積層,卷積核的大小基本都為3*3有最小的可以保留圖片空間分瓣率的卷積核,步長為1個像素,偶爾會有1*1的卷積核,這就相當於加入了一個非線性變換而已。再往后接pooling 層,它的大小為2*2,步長為2個像素,並且采用MAX-pooling的方法;再往后就是三層的全連層,第一層為4096個單元,第二層為4096個單元,第三層為1000個單元,即對應1000個類別,根據這1000個單元的輸出其實這樣就可以分類了;再往后為一個softmax層,目的其實就是用於計算網絡的代價函數時用於求誤差。就這樣了,這就是整個網絡的結構。根據網絡的深度不同,文中探索了五種網絡結構,如下所示:(黑色字體部分為網絡相對於前一層增加的部分)
在上圖中,如網絡中的 conv3-512,表示網絡的卷積核的大小為3*3, 共有512個feature map. 另外,maxpool的具體配置沒有寫出來。
另外,在上面的網絡配置中,每經過一個 maxpooling的時候,它的feature map就增加一倍哦, 不對過maxpooling的話,feature map 的個數不變的,這樣做的目的方便增加網絡的深度;
網絡采用最小的卷積核 3*3, 其實呢,當兩層的3*3的卷積層疊加時相當於一個5*5的卷積層(因為它們對應的接收域是相同的),當三層的3*3的卷積層疊加時相當於一個7*7的卷積層哦。所以呢,文中的做法就是減少了卷積層的寬度,而增加了卷積層的深度,這樣做有一個好處,可以減少參數的個數。例如:三層的3*3有卷積層的參數個數為3* 3*3* num_featuremap, 而一層的7*7 的卷積層的參數個數為:7*7*num_featuremap。 是不是減少了好多呢,哈哈哈。 既然參數減少了,這個過程也就相當於一個隱形的對網絡一種 regularization。
網絡的訓練一些相關細節:
網絡采用常用的mini-batch 的梯度下降法進行網絡的訓練, size為256;權值更新的原則也是常用的 momentum 的方法,動量值為0.9; 對網絡的權值 decay 采用L2正則化方法,其中懲罰因子為5*10-4; 對最后的全連接層的前兩層采用 dropput 的正則化機制, dropout的值為0.5;網絡的學習率的大體設置為:初始值為0.01,當進入plateau時(可以認為驗證值的識別率不再變化,當然也可以選其它的哦,如:lossValue),學習率 縮小10倍,變為0.001,然后再重復一次,變為0.0001就OK了。
權值的初始化是一個重要的問題:對於深層的網絡來說,網絡的權值初始值特別特別容易影響最后的識別率的,而相對於比較 shallow的網絡的初始值我們可以用隨機初始化的方法解決的哦。所以文中的做法就是隨機初始化(用mean為0,variance為0.01的高斯分布)相當shallow的網絡 A,然后訓練完成啦,當我們訓練其它相當於較深的網絡的時候,我們用網絡A的權值來初始化其它網絡的權值就OK了,在訓練過程中,我們的學習率初始值同樣保持為0.01,好讓它們充分學習嘛。
網絡的輸入的圖片的選擇問題:
我發現這個在文章中顯的很重要呢,,,好像網絡的沒有什么創新,然后在這個方面下工夫來提高識別率吧,, 不過這個太也什么了吧。。。沒點。。。。啥啥呢。。感覺。。。。。哎,,,這一部分吧,看得也有點模糊哦。額。。
網絡的訓練:對於訓練時的圖片我還能看懂,就是把圖片調整為邊長最小的(估計不是正方形的吧)為Q,Q為256,或384,或在(256,512)之間的值。然后呢,在上面隨機采樣224*224大小的區域,然后去訓練就可以啦,還是每次迭代時都是再重新彩樣的。在訓練時,為了加快速度,當我們訓練完Q為256的時候,當我們再訓練Q=384時,我們的網絡用Q為256權值初始化,然后把學習率調整為0.001再訓練。。 當我們訓練Q=(256,512)之間的值時, 我們的網絡用Q為384權值初始化,然后把學習率調整為0.001再訓練。。
測試網絡的過程:在測試網絡過程中吧,同樣是把圖片調成 multi-scale,即不同大小嘛。。然后吧,后面分兩種方法哈:第一種dense evaluation, 這個吧就是 fully-convolutional networks.可以參考我之前寫過的 對 OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks 一文的理解,第二種方法吧,就是在圖片上進行multi-crop,然后送給網絡進行測試,這樣計算量很大的其實。反正吧,文中說它們之間可以進行 complementary.為什么呢?1,采用dense的 evaluation時,窗口的采樣率為2*2*2*2*2=32個像素的(一共5個步長為2的max-pooling),而如果用multi-crop的話,我們可以人為控制步長了吧;2,采用dense evaluation與 multi-crop時的一點小差別為:可能由於zero-padding 導制邊緣數據不一樣,這樣很容易理解啦( dense evaluation 時補充的為相鄰的像素值,而 multi-crop補充的為0嘛)。
結果表明了什么呢?首先看 A 與 A-LRN, 說明了局部的正則化 不起毛作用啊,白白增加了計算量,所以,后面的網絡就不用它了。現看網絡B與網絡C-1,它倆的區別在於C-1增加了一層的卷積核為1 的卷積層,即相當於此引入了非線性,結果呢,識別的錯誤率有所下降,說明起點作用啦(這樣也可以,竟然,,,我怎么覺得在瞎攪gu 呢)。再看D-1與C-1,它們的區別在於把C-1中的卷積核為1*1換為了3*3的卷積核,結果又有提高,說明了,用原文中的話就是 it is important to capture spatial context by using conv. 文中一句話我覺得很重要的:文中在的實驗過程中表示出了當網絡的深度增加到了 19層的時候,網絡的錯誤識別率達到了飽和了,已經很難下降了哦。。。
而multi scale evaluation 對應於三個 scale 的圖片,然后求它們三個的average 就可以啦,結果如下圖所示:
反正這么做的結果就是:網絡的性能提高了。。提高了,提高了。。。其實像這樣的做法提高也在情理之中吧,,我覺得在情理之中, ,也沒有什么技術含量啊。。。。。
測試網絡的過程2: 對於測試的 multi-crop evaluation 與 dense evaluation的對比,反正沒看明白什么意思,怎么又把網絡的全連接層轉為 卷積層的呢,泥馬 這么做的話,權值怎么辦啊。留着后續去看相關論文去尋找答案吧。
網絡的實現:
網絡的訓練是基於caffe的,當然也對它進行修改了,主要就是來實現多GPU的加速。 文中采用的方法為把一個 min-batch 分為多份,然后讓每一個 GPU 去求對應的梯度值,然后呢,再把這個GPU的梯度值進行求平均,再權值更新。。 總之吧,最后用4塊
NVIDIA Titan 系列(一兩萬一塊)的 GPU,訓練網絡要花2-3周, 如果我用我筆記本跑的話,單 620M的顯卡, 估計可以跑一年,哈。。。。
圖片分類實驗:
這里要說一點我們經常見到的 top-1 error 與top-5 error是什么毛玩意呢。。。top-1 error 就是實在的錯誤率,概率最大一類的作為輸出;而top-5 error常作為 ILSVRC 官方的識別率的測試,它指 的是概率的前5個中 只要有對應的正確的類就算是識別對了,沒有就是錯了。。。以前傻乎乎的不明白,現在終於知道了。。。。。。另外吧,ILSVRC分類識別中,一般我們只知道訓練集與驗證集哦,然后呢, 如果想要測試,那好,就提交給 ILSVRC大賽的官方服務器就可以哦,,這樣做防止別人作弊。。記得15年的大賽中,某網上尋醫問葯有風險的互聯網巨頭,在2014年11月28日至2015年5月13日期間,參賽團隊使用了至少30個帳號向測試服務器進行了至少200次提交,這大大超過了比賽規定的每周提交兩次的上限,最后被禁止參與這樣的競賽了,哈哈哈!!!
所謂的 網絡融合(convnet fusion,翻譯過來應該是這個意思)
這種做法,是什么呢?很簡單很簡單,多個網絡模型的輸出結果求平均再用於識別。在ILSVRC的比賽中大家都在用,為什么呢?因為這樣做基本上稍微弄弄,都可以提高網絡的識別率。原理呢,可能就是所謂的不同網絡模型之間有點互補吧(complementarity). 這也說明了網絡的不穩定吧。。。還是沒有找到本質吧。
最后文中的附錄B給出了網絡的generalization
即把網絡的特征提取層 用到的 data set中去。
說實話,讀完了這篇文章以后,給我的什么感覺呢?無非還是 trial-and-error啊啊啊啊。。。。人工智能是不是沒有發展前景呢??全都是基於數學模型與算法,還有各種大數據統計,概率相關知識吧吧。,想讓電腦有自己的思想,,,我覺得還好遙遠遠遠啊啊啊。。。