首先,為什麼要調整模型?
像摺積神經網路( CNN )這樣的深度學習模型具有大量的引數;一般稱之為超引數,因為它們不是固定值,需要迭代最佳化。通常可以透過網格搜尋的方法來查詢這些超引數的最佳值,但需要大量硬體和時間開銷。那麼,一個真正的資料科學家是否滿足於只是猜測這些超引數呢?答案當然是否定的。
改進模型的最佳方法之一是,基於專業團隊的設計和體系結構上來進行改進,但這些專業的知識往往需要對某一領域具有深入的瞭解,且通常需要有強大的硬體支援。一般這些專業的團隊都喜歡把他們的訓練好的模型(pre-trained model)開源出來,無償提供給別人使用。基於這些pre-trained model來做研究和應用,可以省去大量的時間和資源。
深度學習技巧
這裡分享幾種方法,如何基於預訓練好的模型來降低深度學習模型訓練時間,提升模型的準確性:
1、選擇最適用於做pre-trained模型的網路結構:瞭解遷移學習(transfer learning)的優點,或者一些強大的CNN網路結構。主要考慮,有些領域之間看起來不明顯,但領域之間卻共享一些具有潛在特性(share potential latent features)。
2、使用較小的學習率:由於預先訓練的權重(weights)通常比隨機初始化的權重更好,因此調整需要更精細!如何選擇主要取決於training landscape和學習的進展情況,但需要仔細檢查每個epoch的training errors,分析如何能讓模型達到收斂。
3、使用Dropout:就像Ridge和LASSO正則化技術對於回歸模型一樣,對於所有模型都存在需要最佳化的引數alpha或Dropout。這是一個超引數,取決於需要解決的具體問題,只能透過不停實驗的方法得到。先對超引數做比較大的調整(gridsearch時選擇一個比較大的變化範圍),比如NP. logspace(),然後像上面的一樣減小學習速率。迴圈上述過程直到找到最優值。
4、限制權重大小:可以限制某些層的權重的最大範數(絕對值),可以提升模型泛化的能力。
5、不要改變第一層網路的權值:神經網路的第一個隱含層傾向於捕捉通用和可解釋(universal and interpretable)的特徵,如形狀、曲線或交叉(shapes、curves and interactions),這些特徵通常與跨域(domains)相關。應該經常把這些特徵放到一邊,把重點放在進一步最佳化meta latent level在水平上。這可能意味需要新增隱藏層!
6、修改輸出層:把模型引數替換成適用於要解決新領域的新的啟用函式和輸出大小。但是,不要把自己侷限於最明顯的解決方案中。比如,儘管MNIST只需要10個輸出類,但這些數字有共同的變化,允許有12 – 16個類可能會更好地解決這些問題,並提高模型效能!
Keras中的技巧
如何在Keras MNIST中修改Dropout和限制權重的大小:
Dropout最佳實踐
1、使用20–50 %的,比較小的Dropout,建議20 %的輸入(Inputs)。值取得太小,不起作用;值取得太大,不好收斂。
2、在輸入層和隱藏層上使用Dropout。這一方法已被證明可以提高深入學習的效果。
3、使用較大的(帶衰減率)學習速率(learning rate with decay),以及較大的動量(momentum)。
4、限制模型的權重!大的學習速率容易導致梯度爆炸。透過對網路權值施加約束(如最大範數正則化(max-norm regularization),其大小為5 )可以改善結果。
5、使用更大的網路。在較大的網路上使用Dropout,可能會獲得更好的效能,從而使模型有更多的機會學習獨立表示(Independent representations)。
給一個例子,如何在Keras中修改MNIST模型最後一層,輸出14個類別:
如何在網路的最初五層中固定網路的權值(Freeze weights):
此外,可以將該層的學習速率設定為零,或者使用引數的自適應學習演演算法,如Adadelta或Adam。這有點複雜,在Caffe等其他平臺上可以更好地實現。
預訓練模型庫
Keras
Kaggle List https://www.kaggle.com/gaborfodor/keras-pretrained-models
Keras Application:https://keras.io/applications/
OpenCV Example:https://www.learnopencv.com/keras-tutorial-fine-tuning-using-pre-trained-models/
TensorFlow
VGG16:https://github.com/ry/tensorflow-vgg16
Inception V3:https://github.com/tensorflow/models/blob/master/inception
ResNet:https://github.com/ry/tensorflow-resnet
Torch
LoadCaie:https://github.com/szagoruyko/loadcaffe
Caffe
Model Zoo:https://github.com/BVLC/caffe/wiki/Model-Zoo
TensorBoard的Graph的視覺化
瞭解模型的整體結構通常很重要。下麵給出一個例子,如何直接使用Python視覺化訓練的模型:
http://nbviewer.jupyter.org/github/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/deepdream/deepdream.ipynb
往期精彩內容推薦
DeepLearning_NLP
深度學習與NLP
商務合作請聯絡微訊號:lqfarmerlq