1、caffe study-AlexNet-算法

參考論文:Alex 2012 年的 NIPS論文ImageNet classification with deep convolutional neural networks.

AlexNet:數據、模型分析


數據:訓練過程1、數據覆蓋度廣,數據集覆蓋樣本空間

                           2、數據與真實數據同分布

在一般的訓練任務中,考慮的關鍵問題之一就是數據分佈是否合理:首先是數據集的覆蓋度,也就是數據集是否能夠覆蓋樣本空間;其次還要儘可能的保證具有和真實數據一樣的分佈(注意數據分佈是未知的,你只能根據一些先驗來近似),這樣的數據纔是有效的。當然這些方式只是增大了得到正確解的概率,而並不能保證一定可以得到正確解。當你不知道你所取的訓練集合是否和真實分佈一致的時候,那麼就要多取幾次,每一個數據集都算算,對於分類器也是這樣,單個分類器往往不能精確描述一個分界面,那麼我們就組合一下,每個都算算。從方法論上講,對於事物觀察到的往往是局部,因此會犯以偏概全的錯誤,如果能夠將所得到的“偏” 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的工作。還好發現了好幾篇關於調參的論文,主要是優化算法理論方面的,學習完再回來測試一下。


參考博客http://blog.sina.com.cn/s/blog_eb3aea990102v5px.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章