caffe study(5) - AlexNet 之演算法篇

查志強發表於2015-08-06

【原文:http://blog.sina.com.cn/s/blog_eb3aea990102v5px.html

在機器學習中,我們通常要考慮的一個問題是如何的“以偏概全”,也就是以有限的樣本或者結構去儘可能的逼近全域性的分佈。這就要在樣本以及結構模型上下一些工夫。

在一般的訓練任務中,考慮的關鍵問題之一就是資料分佈是否合理:首先是資料集的覆蓋度,也就是資料集是否能夠覆蓋樣本空間;其次還要儘可能的保證具有和真實資料一樣的分佈(注意資料分佈是未知的,你只能根據一些先驗來近似),這樣的資料才是有效的。當然這些方式只是增大了得到正確解的概率,而並不能保證一定可以得到正確解。當你不知道你所取的訓練集合是否和真實分佈一致的時候,那麼就要多取幾次,每一個資料集都算算,對於分類器也是這樣,單個分類器往往不能精確描述一個分介面,那麼我們就組合一下,每個都算算。從方法論上講,對於事物觀察到的往往是區域性,因此會犯以偏概全的錯誤,如果能夠將所得到的“偏” ensambling 一下,那麼就生成了相對的“全”,從而可以更大的概率逼近總體分佈。這種思想在好多方面都體現出來,如交叉驗證,經典的RANSAC,Random Tree(forest),Adaboost 等方法。

下面將從資料和模型兩個方面來學習一下AlexNet中的一些技巧,主要參考的是Alex 2012 年的 NIPS論文ImageNet classification with deep convolutional neural networks.
 
1. 資料的處理:

到目前為止,還沒有人看到資料集的大小對deeplearning演算法理論上限造成的影響,也就是說資料集合還沒有達到臨界點,所以增加資料集只有好處,沒有壞處。

在Alex的論文中,採用了兩個方法對於影象進行了增強。

a. 增大訓練樣本:通過對於影象的變換實現了對於資料集合的enlarge。首先對於輸入的影象(size 256*256)隨機提取224*224的影象集合,並對他們做一個horizontal reflections。變換後影象和原影象相差了32個畫素,因此主體部分應該都包含在訓練集合中,相當於在位置這個維度上豐富了訓練資料。對horizontal reflections來說,相當於相機在主軸方向做了映象,豐富了反方向的影象。資料集合增大了2048倍,直接結果就是降低了overfitting同時降低了網路結構設計的複雜層度。

在測試階段,取每一個測試樣本四個角以及中間區域,一共5個patch然後再映象後得到10個樣本輸入到網路中,最後將10個softmax輸出平均後作為最後的輸出。

b.使用PCA對於訓練資料進行增強:對於每一個RGB影象進行一個PCA的變換,完成去噪功能,同時為了保證影象的多樣性,在eigenvalue上加了一個隨機的尺度因子,每一輪重新生成一個尺度因子,這樣保證了同一副影象中在顯著特徵上有一定範圍的變換,降低了overfitting的概率。

以上的策略是不是真的有必要,這個還是要打一個問號,因為對於a部分來說,樣本少,可以在結構設計上下下功夫,可能達到相同的效果。對於b來說,deeplearning還需要對於影象加入增強處理嗎?如果這樣的話,自然也可以用一些傳統人工特徵先來一遍,再deeplearning了。我想關鍵的原因是deeplearning還沒有真正的被證明的規則,所以你用什麼策略都有點道理,但是誰敢保證不是“以偏概全”呢?

2. 模型結構:

在模型的設計上,AlexNet做了一個Local Response Normalization的處理,同時在節點的選擇上採用了一個dropout策略。

a. Local Response Normalization.

公式如下,其中a是每一個神經元的啟用,n是在同一個位置上臨近的kernel map的數目,N是可kernel的總數目,k,alpha,beta都是預設的一些hyper-parameters,其中k=2,n=5,alpha = 1*e-4,beta = 0.75。

caffe <wbr>study(5) <wbr>- <wbr>AlexNet <wbr>之演算法篇

從這個公式中可以看出,原來的啟用a被加一個歸一化權重(分母部分)生成了新的啟用b,相當於在同一個位置(x,y),不同的map上的啟用進行了平滑,但是至於為什麼k,alpha,beta這樣來設定,沒有想太清楚。

這個平滑大概可以將識別率提高1-2個百分點。

b. Dropout策略

使用多個model來共同進行預測是一個降低test errors的基本方法,但是單獨的訓練多個model組合會導致整個的訓練成本增加,畢竟訓練一個單一的網路需要很長的時間,即便計算資源足夠,在不影響精度的情況下降低整個運算時間還是我們追求的目標。

由此Hinton提出了dropout策略,這個策略很簡單,對於每一個隱層的output,以50%的概率將他們設定為0,不再對於forward或者backward的過程起任何作用。對於每一個input來說,使用的不同的網路結構,但是權重是共享的。這樣求得的引數能夠適應不同的情況下的網路結構,也就是提高了系統的泛化能力。

在AlexNet中最後的兩個full-connected層中使用了這個策略。

3. 優化演算法的引數

論文中使用SGD演算法,基本引數設定在前面優化演算法的總結中已經提到了。這裡要說幾個個人體會。

 a. 原文中輸入的batch數目是256,應該Alex經過調節後的結果,我實際用到的機器效能比較低,記憶體8G,視訊記憶體4G,所以不得不就將batch數目往下調到64,以免產生out of memory的錯誤。這樣就需要調節其他的引數來保證資料的收斂。原因是batch比較小,導致本文開篇提到的樣本覆蓋面過低,產生了非常多的區域性極小點,在步長和方向的共同作用下,導致資料產生了震盪,導致了不收斂。

b.在這種情況下,把learning rate調節到了0.02,相當於加大了步長,這樣可以在一定程度上避免震盪,可以越過區域性極小點往比較大的極值點行走。

c. 對於每一層的bias從1設定為了0.1,在一定程度上限制了啟用的大小,這樣就限制了某一過大的誤差的影響,這樣可以避免迭代方向出現過大的變化。

d. 經過b c後,系統終於收斂了,但帶來的不良後果就是整個收斂速度變慢,因此還需要增加最大迭代次數,經過測試迭代次數成了從45w修改成了70w。

e. 在整個執行過程中,出現了幾次平穩點,20w以及40w左右的時候,因此迭代的learning rate應該隨著迭代的接近平穩點的時候有意的減小一些,目前是以每10w次減小為1/10,調引數用了5天,最後執行時間為15天。

f. 關於調參策略,上面只是按照一些簡單的理解設定的,如果沒有一個合理的解釋,調參就變成了一個很low的工作。還好發現了好幾篇關於調參的論文,主要是優化演算法理論方面的,學習完再回來測試一下。

相關文章