深度學習 14. 深度學習調參,CNN參數調參,各個參數理解和說明以及調整的要領。underfitting和overfitting的理解,過擬合的解釋。

本文爲原創文章轉載必須註明本文出處以及附上 本文地址超鏈接  以及 博主博客地址http://blog.csdn.NET/qq_20259459  和 作者郵箱[email protected] )。

(如果喜歡本文,歡迎大家關注我的博客或者動手點個贊,有需要可以郵件聯繫我)


因爲最近一直比較忙所以就有一段時間沒有更新了。
終於今天開始着手寫這篇關於參數的文章了,可以說我自己其實也在一直進行着各種調參而且有了一段時間了。作爲自己的見解和相應的相關知識理論將會在這篇文章裏爲大家寫出來,以做參考和學習資料。


我們在學習使用深度學習的過程中最最重要的就是調參,而調參的能力是需要長期積累才能形成的,因爲每一種數據庫和每一種網絡結構都需要不同的參數以達到最佳效果。而尋找這個最佳的參數的過程就叫做調參。


正文:


一. 參數是指那些?

參數其實是個比較泛化的稱呼,因爲它不僅僅包括一些數字的調整,它也包括了相關的網絡結構的調整和一些函數的調整。下面列舉一下各種參數:

1. 數據處理(或預處理)相關參數:
enrich data(豐富數據庫),
feature normalization and scaling(數據泛化處理),
batch normalization(BN處理),
2. 訓練過程與訓練相關的參數:
momentum term(訓練動量),
BGD, SGD, mini batch gradient descent(這裏的理解可以看我之前的一篇博 客:http://blog.csdn.net/qq_20259459/article/details/53943413 )。
number of epoch,
learning rate(學習率),
objective function(衰減函數),
weight initialization(權值初始化),
regularization(正則化相關方法),
3. 網絡相關參數:
number of layers,
number of nodes,
number of filters,
classifier(分類器的選擇),



二. 調參的目的以及會出現的問題

首先我們調參有兩個直接的目的:1. 當網絡出現訓練錯誤的時候,我們自然需要調整參數。 2. 可以訓練但是需要提高整個網絡的訓練準確度。
關於訓練可能會出現的問題彙總:

1. 可能沒法進行有效地訓練,整個網絡是錯誤的,完全不收斂(以下圖片全部來源於我的實驗,請勿盜用):



2. 部分收斂



3. 全部收斂但是結果不好:




三. 問題分析理解

在深度學習領域我上面的三個例子可以說是比較全面的概括了問題的種類:完全不收斂,部分收斂,全部收斂但是誤差大。
下面我們先進行問題分析,然後我再介紹如何具體調參:

1. 完全不收斂:

這種問題的出現可以判定兩種原因:1,錯誤的input data,網絡無法學習。 2,錯誤的網絡,網絡無法學習. 

2. 部分收斂:

這種問題的出現是有多種多樣的原因的,但是我們可以總結爲:1,underfitting。 2, overfitting
underfittingoverfitting在深度學習中是兩個最最常見的現象,他們的本質是網絡分類器的複雜度導致的。
一個過簡單的分類器面對一個複雜的數據就會出現underfitting,舉個例子:比如一個2類分類器他是無法實現XOR的問題的。
一個過複雜的分類器面對一個簡單的數據就會出現overfitting

說的更容易理解一點:
1.underfitting就是網絡的分類太簡單了沒辦法去分類,因爲沒辦法分類就是沒辦法學到正確的知識。
2.overfitting就是網絡的分類太複雜了以至於它可以學習數據中的每一個信息甚至是錯誤的信息他都可以學習。

如果我們放在實際運用中我們可以這樣理解:
1.我們有兩個數據A和B,是兩個人的臉的不同環境下10張照片。A我們拿來進行訓練,B則是用來測試,我們希望網絡可以從A學習人臉的特徵從而認識什麼是人臉,然後再去判斷B是不是人臉。
2.如果我們使用會導致underfitting的分類器時,這個網絡在學習A的時候將根本學不到任何東西,我們本來希望它可以知道A是人臉,但是它卻認爲這是個汽車(把A分去不正確的label,錯誤的分類)。
3.而當我們使用會導致overfitting的分類器時,這個網絡在學習A的時候不僅可以知道A是人臉,還認爲只有A纔是人臉,所以當它去判別B的時候它會認爲B不是人臉(過度的學習了過於精確的信息導致無法判別其它數據)。

下面我們再用圖來解釋說明一下這兩個問題:


以及用表格表示一下他們的訓練結果:



3. 全部收斂:

這是個好的開始,接下來我們要做的就是微調一些參數。


四. 針對問題來調參

我在許多其他人的文章看過別人的調參方法的分享和心得,其中有許多人提出使用暴力調參和微調配合使用。這裏我不是很同意這種觀點,因爲所謂的暴力調參就是無規律性的盲目的調整,同時調整多個參數,以尋找一個相對能收斂的結果,再進行微調。這種做法是一種拼運氣的做法,運氣好的話這個網絡的深度和重要的參數是可以被你找到,運氣不好的好你可能要花更多的時間去尋找什麼是好的結果。而且最終即使有好的結果你自己本身也是不能確認是不是最好的結果。
所以再次我建議我們在調參的時候切忌心浮氣躁,爲了好的實驗結果,我們必須一步一步的結果分析,解決問題。

下面我們談談如和調參:
現有的可調參數我已經在(一)中寫出了,而這些參數其實有一些是現在大家默認選擇的,比如激活函數我們現在基本上都是採用Relu,而momentum一般我們會選擇0.9-0.95之間,weight decay我們一般會選擇0.005, filter的個數爲奇數,而dropout現在也是標配的存在。這些都是近年來論文中通用的數值,也是公認出好結果的搭配。所以這些參數我們就沒有必要太多的調整。下面是我們需要注意和調整的參數。

1. 完全不收斂:

請檢測自己的數據是否存在可以學習的信息,這個數據集中的數值是否泛化(防止過大或過小的數值破壞學習)。
如果是錯誤的數據則你需要去再次獲得正確的數據,如果是數據的數值異常我們可以使用zscore函數來解決這個問題(參見我的博客: http://blog.csdn.net/qq_20259459/article/details/59515182 )。
如果是網絡的錯誤,則希望調整網絡,包括:網絡深度,非線性程度,分類器的種類等等。

2. 部分收斂:

underfitting: 
增加網絡的複雜度(深度),
降低learning rate,
優化數據集,
增加網絡的非線性度(ReLu),
採用batch normalization,
overfitting: 
豐富數據,
增加網絡的稀疏度,
降低網絡的複雜度(深度),
L1 regularization,
L2 regulariztion,
添加Dropout,
Early stopping,
適當降低Learning rate,
適當減少epoch的次數,

3. 全部收斂:

調整方法就是保持其他參數不變,只調整一個參數。這裏需要調整的參數會有:
learning rate,
minibatch size,
epoch,
filter size,
number of filter,(這裏參見我前面兩篇博客的相關filter的說明)


五. 大的思路和現在的發展

其實我們知道現在有許多的成功的網絡,比如VGGNet和GoogleNet,這兩個就是很劃時代的成功。我們也由此可以發現網絡設計或者說網絡調參的主方向其實只有兩種:1. 更深層的網絡, 2. 更加的複雜的結構。
我們可以參見下面圖片以比較幾個成功網絡的獨特之處:

1. AlexNet(深度學習劃時代的成功設計):



2. VGGNet(用小的filter得到更好的非線性和降低網絡的權值以及實現了更深的構造):



3. GoogleNet(新的結構的提出受啓發於NiN,網絡中的網絡同時實現了更深和更非線性):



4. Latest(接受請參見:https://arxiv.org/abs/1608.06993 ):



5. 比較分析:



這裏我們可以看出,不管你怎麼調整網絡,調整參數,你的目的只有一個就是讓網絡變得更加深層,更加非線性。


至此已經全部介紹完了有關結果分析和參數調整的相關知識和心得,最後我還是希望告訴每一個正在奮力調參的朋友們,調參是個辛苦和乏味的過程,一次次的失敗只是爲了更加好的結果。不要氣餒不要放棄,堅持每一次都分析,調參的過程必須是有規律的,切忌不可亂調,這種既得利益的取巧行爲是非常不好的習慣。

我們只看到了VGGNet和GoogleNet這種作品的成就,卻沒有看到背後的付出。同樣我們必須保持着創新精神和紮實的理論基礎。這些纔是成功的不二法則。


後面我會不定期更新一些其他實用的知識和心得,謝謝大家長期以來的支持。


本文爲原創文章轉載必須註明本文出處以及附上 本文地址超鏈接  以及 博主博客地址http://blog.csdn.NET/qq_20259459  和 作者郵箱[email protected] )。

(如果喜歡本文,歡迎大家關注我的博客或者動手點個贊,有需要可以郵件聯繫我)

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