一、前述
調優對於模型訓練速度,準確率方面至關重要,所以本文對神經網路中的調優做一個總結。
二、神經網路超引數調優
1、適當調整隱藏層數
對於許多問題,你可以開始只用一個隱藏層,就可以獲得不錯的結果,比如對於複雜的問題我們可以在隱藏層上使用足夠多的神經元就行了, 很長一段時間人們滿足了就沒有去探索深度神經網路,
但是深度神經網路有更高的引數效率,神經元個數可以指數倍減少,並且訓練起來也更快!(因為每個隱藏層上面神經元個數減少了可以完成相同的功能,則連線的引數就少了)
就好像直接畫一個森林會很慢,但是如果畫了樹枝,複製貼上樹枝成大樹,再複製貼上大樹成森林卻很快。真實的世界通常是這種層級的結構,DNN就是利用這種優勢。
前面的隱藏層構建低階的結構,組成各種各樣形狀和方向的線,中間的隱藏層組合低階的結構,譬如方塊、圓形,後面的隱藏層和輸出層組成更高階的結構,比如面部。
僅這種層級的結構幫助DNN收斂更快,同時增加了複用能力到新的資料集,例如,如果你已經訓練了一個神經網路去識別面部,你現在想訓練一個新的網路去識別髮型,你可以複用前面的幾層,就是不去隨機初始化Weights和biases,你可以把第一個網路裡面前面幾層的權重值賦給新的網路作為初始化,然後開始訓練(整體來看會提高速度)。
這樣網路不必從原始訓練低層網路結構,它只需要訓練高層結構,例如,髮型
對於很多問題,一個到兩個隱藏層就是夠用的了,MNIST可以達到97%當使用一個隱藏層上百個神經元,達到98%使用兩
個隱藏層,對於更復雜的問題,你可以逐漸增加隱藏層,直到對於訓練集過擬合。(會經常過擬合,因為會不斷地調整引數)
非常複雜的任務譬如影像分類和語音識別,需要幾十層甚至上百層,但不全是全連線,並且它們需要大量的資料,不過,你很少需要從頭訓練,非常方便的是複用一些提前訓練好的類似業務的經典的網路。那樣訓練會快很多並且需要不太多的資料
當資料量不大的時候選擇機器學習(淺層模型)準確率好,資料量大的時候選擇深度學習。
2、每個隱藏層的神經元個數
輸入層和輸出層的神經元個數很容易確定,根據需求,比如MNIST輸入層28*28=784,輸出層10
通常的做法是每個隱藏層的神經元越來越少,比如第一個隱藏層300個神經元,第二個隱藏層100個神經元,可是,現在更多的是每個隱藏層神經元數量一樣,比如都是150個,這樣超引數需要調節的就少了,正如前面尋找隱藏層數量一樣,可以逐漸增加數量直到過擬合,找到完美的數量更多還是黑科技。
簡單的方式是選擇比你實際需要更多的層數和神經元個數(很容易過擬合),然後使用early stopping去防止過擬合,還有L1、L2正則化技術,還有dropout
三、防止過擬合技術
1、Early stopping(需要驗證集)
去防止在訓練集上面過擬合,
1.1 一個很好的手段是early stopping,
當在驗證集上面開始下降的時候中斷訓練,一種方式使用TensorFlow去實現,是間隔的比如每50 steps,在驗證集上去評估模型,然後儲存一下快照如果輸出效能優於前面的快照,記住最後一次儲存快照時候迭代的steps的數量,當到達step的limit次數的時候,restore最後一次勝出的快照。
儘管early stopping實際工作做不錯,你還是可以得到更好的效能當結合其他正則化技術一起的話
上圖中則需要當迭代次數執行完後,resotore損失函式最小的w引數。
1.2、程式碼示範: