重排訓練樣本
信息論中有這樣的話——「學習發(fā)生的極小概率事件比學習發(fā)生的大概率事件更有信息」。類似地,隨機排列訓練樣本的順序(不同的迭代或批處理中)將導致更快的收斂。當訓練樣本的順序不同時,模型的結果會有輕微的提升。
作為正則化的 dropout
考慮到要學習數百萬的參數,正則化成為防止 DNN 過度擬合的必然要求。你也可以繼續(xù)使用 L1/L2 正則化,但是 dropout 是更好的檢查 DNN 過擬合的方法。dropout 在實現方法上比較瑣碎,它通常能更快地學習模型。默認值 0.5 是一個好的選擇,但是這也取決于具體的任務。如果模型較不復雜,則 0.2 的 dropout 也可能就足夠了。
在測試階段,應該相應地標準化權重,同時暫緩使用舍棄方法,如論文《Dropout: A Simple Way to Prevent Neural Networks from Overfitting》中所做的那樣。賦予模型舍棄正則化方法,經過一定的訓練時間錯誤肯定會下降。
訓練的迭代數
「用多個迭代(epoch)來訓練深度學習模型將產生更好的結果」——但是我們如何量化「多少」?原來,有一個簡單的策略 - 只要對訓練模型設置固定數量的訓練樣本或迭代,比如 20,000 個樣本或 1 個迭代。在每組訓練樣本訓練完成后,將測試誤差與訓練誤差進行比較,如果它們之間的差距正在減小,則繼續(xù)訓練。除此之外,在每個這樣的集合之后,保存這組數據訓練模型的參數(以便從多個模型中選擇)。
可視化
有一千種可能使得訓練的深度學習模型出錯。我們都有過這樣的經歷,當模型訓練了幾個小時或幾天后,在訓練完成后我們才意識到模型存在一些問題。為了避免這種問題——總是可視化訓練過程。最明顯的步驟是打印/保存損失(loss)函數值的日志、訓練誤差或測試誤差等。
除此之外,另一個好的做法是在訓練一定樣本后或在 epoch 之間使用可視化庫繪制權重的直方圖。這可能有助于跟蹤深度學習模型中的一些常見問題,例如梯度消失(Vanishing Gradient)、梯度爆炸(Exploding Gradient)等。
多核計算機,GPU 集群
隨著 GPU、提供向量化操作的庫(library)、具有更強計算能力的計算機的出現,這些可能是深度學習成功的最重要的因素。如果你足夠耐心,你可以嘗試在你的筆記本電腦上運行 DNN(這時你甚至不能打開 10 個 Chrome 瀏覽器標簽),并需要等待很長時間才能得到結果。要么你有非常好的硬件(很昂貴)與至少多個 CPU 核和幾百個 GPU 核。GPU 已經徹底改變了深度學習研究(難怪 Nvidia 的股票井噴式漲價),主要是因為 GPU 能夠更大規(guī)模地執(zhí)行矩陣操作。
因此,以前在正常的機器上花幾個星期的訓練,由于并行(parallelization)技術,將訓練的時間減少到幾天甚至幾個小時。
使用具有 GPU 計算和自動微分支持的庫
幸運的是,對于快速訓練,我們有一些很好的庫,如 Theano、Tensorflow、Keras 等。幾乎所有這些深度學習庫提供對 GPU 計算和自動微分(Automatic Differentiation)的支持。所以,你不必深入了解 GPU 的核心編程(除非你想,絕對有趣);你也不必編寫自己的微分代碼,這在真正復雜的模型中可能會有點費力(雖然你應該能夠做到這一點)。TensorFlow 能進一步支持在分布式架構上訓練模型。
以上并不是訓練 DNN 的詳盡列表。它只包括了最常見的做法,上面已經去掉了如數據標準化、批規(guī)范化/層規(guī)范化、梯度檢查(Gradient Check)等概念。