點擊上方「AI有道」,選擇「置頂」公眾號
重磅乾貨,第一時間送達
原文出處:
https://jeffmacaluso.github.io/post/DeepLearningRulesOfThumb/
《深度學習》,又名「花書」。該書由三位大佬 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 撰寫,是深度學習領域奠基性的經典教材,被譽為深度學習「聖經」。
之前紅色石頭介紹過一份來自 Microsoft 計算機軟體工程師 Jeff Macaluso 總結的關於「花書」的 Deep Learning Rules of Thumb。在線閱讀地址為:
https://jeffmacaluso.github.io/post/DeepLearningRulesOfThumb/
然而,這份 Deep Learning Rules of Thumb 是英文版,閱讀起來不是很方便。最近,紅色石頭在網上發現了這份由 Cugtyt 整理的「花書」經驗法則的中文版,經過翻譯作者的允許,特此將這份經驗法則在公眾號分享出來,方便大家嘗鮮!
下面是「花書」經驗法則的翻譯版正文。
儘可能使用遷移學習。否則,對於已經是廣泛研究的問題,先從複製網絡結構開始。
一定要使用 early stopping(早停),兩種方法:
使用 dropout 或許是個好主意。
ReLU 是理想的激活函數。它也有缺陷,因此使用 leaky ReLU 或 noisy ReLU 或許有性能提升,但是會有更多的參數要調。
要得到差不多可以接收的性能,至少需要每個類 5000 個數據(>=10M可以達到人類的水平或更好)
使用 GPU 能做到的最大的 batch size。
帶動量和學習率衰減的隨機梯度下降是個不錯的開始。
學習率是最重要的超參數。如果時間有限,主要花時間來調它。
對於計算機視覺:
對於自然語言處理:
隨機搜索通常比網格搜索更快的收斂到好的超參數設置。
調試策略:
可視化模型:查看模型檢測的圖像樣本,這對確定性能指標是否合理有幫助。
可視化最差的錯誤情況:這可以發現預處理和打標籤中存在的問題。
當訓練誤差太高時先擬合一個小的數據集:這能檢查出是欠擬合問題還是軟體缺陷。
監視激活和梯度的直方圖:完成大概一個 epoch。這能告訴我們神經元是否飽和及其飽和頻率。梯度(值?)應該是參數的 1% 左右。
第一部分 應用數學和機器學習基礎
1. 介紹
每個類別至少需要大概 5000 個樣本才能得到可接受的性能。大概每類需要 10M 個樣本才能達到人類水平或更好。
4. 數值計算
在深度學習中,我們通常會陷入局部最優而不是全局最優,這是由於複雜性和非凸優化的問題。
5. 機器學習基礎
如果模型具有最優的容量,但是在訓練和測試誤差之間仍有較大差距,去收集更多的數據來。
通常使用 20% 的訓練集作為驗證集。
如果數據少於 100000 個樣本,使用k折交叉驗證而不是訓練/測試集劃分的方法。
使用均方誤差時,增加容量會降低偏差但是會增加方差。
貝葉斯方法在訓練數據有限的時候泛化性能更好,但是訓練樣本較多時它的計算開銷很大。
最常使用的損失函數是負對數似然。因此最小化損失函數也就是最大似然估計。
第二部分 深度網絡:現代實踐
6. 深度前饋網絡ReLU 對於前饋神經網絡而言是一個完美的激活函數。
在基於梯度的優化問題上,由於梯度消失的原因,交叉熵相比 MSE 和 MAE 更好。
ReLU 的優點:減少了梯度消失的概率,稀疏性,減少了計算量。
大的梯度幫助學習更快,但是任意大會導致不穩定。
網絡結構應該通過實驗和監視驗證集誤差來確定。
更深的模型減少了用於表示函數的神經元數量,也降低了泛化誤差。
7. 深度學習的正則項最好在每層中使用不同的正則係數,但是使用相同的權重衰減。
使用早停 early stopping。這是一個很好調的超參數,而且也減少了計算量。
模型平均(bagging, boosting 等)基本上總會提高預測性能,雖然提高了計算量。
dropout 在寬層網絡工作更好,因為它減少了從輸入到輸出的路徑。
通常輸入層 dropout 中的保留概率是 0.8,隱層的概率是 0.5。
使用 dropout 的模型通常要更大,迭代更長。
如果數據集足夠大,dropout 沒有太大幫助。另外,在很小(<5000)的訓練樣本上dropout的作用很有限。
批量標準化同樣也引入了噪聲,這提供了正則的作用,但也可能讓 dropout 沒有太大必要。
模型平均一般都工作得很好,因為不同的模型不太可能犯相同的錯誤。
dropout 通過創建子網絡形成了一個高效的 bagging 方法。
8. 訓練深度模型的優化mini-batch 的大小(batch size):大的 batch size 會提供更大的梯度,但是通常內存是個限制條件。
讓你的 batch size 在內存允許範圍內儘可能大。
在 GPU 中,從 32 到 256 以 2 的指數級別增長,對於較大的模型可以從 16 開始。
小的 batch size 因為噪聲的原因可能有正則的作用,但是會導致整體運行時間增加。這些情況下需要更小的學習率來提升穩定性。
深度學習模型有多個局部最優,但這沒太大關係,因為它們都有相同的代價。最主要的問題是局部最優的損失比全局最優的損失大得多。
梯度裁剪(clipping)用於解決梯度爆炸的情況。這在 RNN 中是個常見的問題。
繪製出目標函數隨時間的變化曲線來選擇學習率。
最優學習率通常高於前 100 次迭代後產生最佳性能的學習率。監視前幾次迭代,選擇一個比表現最好的學習率更高的學習率,同時注意避免不穩定的情況。
使用高斯和均勻分布來初始看起來沒有太大影響。
沒有一個優化算法明顯由於其他,這主要取決於用戶對超參數調整的熟悉情況。
隨機梯度下降(SGD),帶動量的SGD,RMSProp,帶動量的RMSProp,AdaDelta,Adam都是流行的選擇。注意:RMSProp在訓練初期或許會有很高的偏差。
通常動量的值有0.5,0.9,0.99。這個超參數可以隨時間變化,從一個小值開始增加到大的值。
Adam通常是較為魯棒的選擇。但是學習率通常要根據默認值改動。
對轉化後的值(transformed value)而不是輸入做批量歸一化。在引入可學習的參數 β 下去掉偏置項。對於 CNN 在每個空間位置應用範圍歸一化(range normalization)。
太淺或太深的網絡更難訓練,但是他們有更好的泛化誤差。
相對於一個強大的優化算法,選擇容易優化的模型更重要。
9. 卷積網絡10. 序列模型:循環和遞歸網絡雙向 RNN 在手寫識別,語音識別和生物信息方面非常成功。
相比較 CNN 而言,RNN 用於圖像通常更困難,但是可以讓相同特徵圖中的特徵進行遠程橫向交互。
無論何時 RNN 要表示長期依賴,長期交互的梯度要指數級別小於短期交互。
在回波狀態網絡中設置權重的技術可用於在完全可訓練的 RNN 中初始化權重。初始光譜半徑為 1.2,稀疏初始化性能良好。
實踐中最有效的序列模型是門控 RNN,包括 LSTM 和 GRU。
設計一個容易優化的模型通常比設計一個強大的算法容易些。
正則參數鼓勵「信息流」,並預防梯度消失,但是同樣需要梯度裁剪來預防梯度爆炸。但是大量的數據例如語言建模對於 LSTM 而言就不是那麼高效了。
11. 實踐方法在不確定的時候讓模型拒絕決策也是很有幫助的,但是這之間也存在折中。收斂是機器學習算法可以響應的樣本部分,和準確率之間也存在折中。
對於基線模型而言,ReLU 及其變種是理想的激活函數。
帶動量和學習率衰減的 SGD 是基線優化算法中一個不錯的選擇。衰減方法包括:
線性衰減直到一個固定小的學習率。
指數衰減。
每次驗證誤差不變時減少 2 到 10 分之一。
另一個不錯的基線優化算法是 Adam。
如果優化出現了問題,立馬使用批量歸一化。
如果訓練集不足 10M,一開始就採用中等強度的正則項。
如果當前的問題已經被研究爛了,直接拷貝模型就是個不錯主意,或許可以拷貝訓練過的模型。
如果已知無監督學習對於你的應用很重要(例如 NLP 中的詞嵌入),那麼在基線中就把它包含進來。
決定什麼時候收集更多的數據:
如果無法獲得更多的數據,最後的辦法是嘗試提升學習算法。
使用對數比例的學習曲線來決定還需要多少數據。
如果訓練性能很差,增加模型的大小,調整學習算法。如果還是很差,那是數據質量問題,重新開始收集更乾淨的數據或更多的特徵。
如果訓練性能不錯但是測試性能很差,在可行的情況下收集更多的數據。或者,嘗試降低模型的大小或增加正則強度。如果這些沒有幫助,那你的確需要更多的數據。
學習率是最重要的超參數,因為它以一種複雜的方式控制著模型的有效容量。如果時間有限,就調它。調其他的超參數需要監視訓練和測試誤差來判斷模型是欠擬合還是過擬合。
只要訓練誤差很低,你總是可以通過收集更多數據來減低泛化誤差。
網格搜索:通常在少於四個超參數時使用。
隨即搜索:使用起來很簡單,相比於網格搜索更快收斂到好的超參數。
通常不建議基於超參數來調整模型,因為它很少超過人類並且經常失敗。
調試策略:
可視化模型的行為。例如,查看圖像樣本,和模型檢測情況。這可以看到量化的性能指標是否合理。
可視化最差的錯誤情況:這可以發現預處理和打標籤中存在的問題。
當訓練誤差太高時先擬合一個小的數據集:這能檢查出是欠擬合問題還是軟體缺陷。
監視激活和梯度的直方圖:完成大概一個 epoch。這能告訴我們神經元是否飽和及其飽和頻率。梯度值應該是參數的1%左右。稀疏的數據(如 NLP)有很多參數很少更新,一定要記得這一點。
12. 應用在分布式系統中,使用異步 SGD。每一步的平均提升是很小的,但是步驟速率加快也導致了整體的加快。
級聯(cascade)分類器是目標檢測中一個高效的方法。一個分類器有高召回率,另一個有高精確率,好的,結果有了。
集成方法中一個減少推理時間的方法是訓練一個控制器來挑選哪個網絡應該來做推理。
標準化像素尺度是計算機視覺中唯一一個強制的預處理步驟。
對比度歸一化通常是一個安全的計算機視覺預處理步驟。
尺度參數或者可以設置為 1,或者讓每個像素在整體樣本上有接近1的標準梯度。
近似剪切的圖像數據集可以安全的設置 λ=0, ϵ=1e−8。
小的隨機剪切的圖像數據集需要更高的正則強度,例如 λ=10, ϵ=0。
全局對比度歸一化(GCN)是其中一個方法,但是它在低對比度的情況下會降低邊緣的檢測。
局部對比度歸一化通常可以用分離卷積計算特徵圖的局部均值/方差來實現,然後在不同的特徵圖上做元素級別減/除。相比於全局對比度歸一化更能凸顯邊緣。
在 NLP 的實踐中,分層 softmax 相比於基於採樣的方法測試結果更差。
第三部分 深度學習研究
13. 線性因子模型14. 自動編碼器15. 表示學習在深度學習中,一個好的表示可以讓後續的學習任務更加容易。例如監督前饋網絡:每一層都為最後的分類層學習一個更好的表示。
貪心的層間無監督訓練對於分類測試誤差有幫助,但是其他任務上不行。
對於圖像分類沒啥作用,但是對於 NLP 很有幫助(例如詞嵌入),這是因為初始表示非常差。
在標籤樣本很少,或無標籤樣本很大的時候,正則器非常有用。
在要學習的函數極其複雜的時候它最有用。
根據監督階段的驗證集誤差來選擇預訓練階段的超參數。
無監督預訓練基本已經被拋棄了,除了 NLP 領域(例如詞嵌入)。
在有些特徵對於不同的任務設置有幫助的時候,遷移學習,多任務學習和域適應都可以通過表示學習來完成。
當一個很複雜的結構可以用更少的參數緊湊表示時,分布式表示相比於非分布式表示更具有統計優勢。一些傳統的非分布式算法能泛化是由於其平滑的假設,但是會受限於維度詛咒。
16. 深度學習的結構化概率模型結構化概率模型提供了一個框架,用於對隨機間隔的直接交互進行建模,這使得模型可以使用更少的參數。正因為此,他們可以在更少的數據下可靠地估計,並且減少了存儲模型,執行推理和採樣的計算量。
很多深度學習的生成模型或沒有隱含變量,或這用一層隱含變量。他們在模型中使用深度計算圖來定義條件分布。這和大部分深度學習應用中有比可觀察變量更多的隱含變量形成強烈對比。他們是從非線性交互中學得的。
深度學習中的隱含變量是不受限的,但是很難通過可視化來解釋。
循環信念傳播(loopy belief propagation)基本上在深度學習中從未使用,因為大部分深度學習模型是使用吉布斯採樣或變分推斷算法設計的。
17. Monte Carlo方法Monte Carlo Markov Chains(MCMC)計算量很大,這是由於在平衡分布「燃燒」需要的時間,以及為了保證樣本間不相關而讓每n個樣本有序。
當在深度學習中從MCMC採樣時,通常需要運行一定數量的並行馬爾科夫鏈,數量與一個minibatch的樣本數一樣,讓後從中採樣。通常使用的數字是100。
馬爾科夫鏈會到達平衡狀態,但我們不知道要多久,除非它已經到達了。我們可以測試它是否混合了啟發式方法,比如手動檢查樣本或測量連續樣本之間的相關性。
雖然 Metropolis-Hastings 算法在其他學科中經常與馬爾可夫鏈一起使用,但 Gibbs 抽樣是深度學習的 de-facto 方法。
19. 近似推斷20. 深度生成模型玻爾茲曼機的變種早已超過了最初的流行度。玻爾茲曼機對於觀察變量就像一個線性預測器,但是對於未觀察到的變量更加強大。
從一系列受限玻爾茲曼機中初始化一個深度玻爾茲曼機時,稍微修改下參數是很有必要的。
今天很少使用深度信念網絡(DBN),因為其他算法已經超過它了,但是在歷史上有重要地位。由於 DBN 是生成模型,一個訓練過的 DBN 可以用於初始化一個 MLP 的權重來做分類。
【略去玻爾茲曼機的部分內容】
雖然變分自動編碼器(VAE)很簡單,但是它們通常能得到不錯的結果,也是最後的生成模型之一。來自 VAE 的圖像通常模糊,原因未知。
不收斂是 GAN 欠擬合(一個網絡抵達局部最優,另一個抵達局部最大)的一個問題,但是這個問題的長度還不清楚。
雖然 GAN 有穩定性的問題,但是通常在精心選擇的模型和超參數情況下效果很不錯。
GAN 的一個變種 LAPGAN,從低解析度開始不斷加入細節,它的結果經常能騙過人類。
為了保證 GAN 的生成器不會在任意點變成0概率,需要在最後一層給所有圖像加入高斯噪聲。
在 GAN 的判別器中一定要使用 dropout,不這樣做結果很差。
生成矩匹配網絡的視覺樣本令人失望,但可以通過將它們與自動編碼器結合來改進。
在生成圖像時,使用轉置卷積操作通常會產生更真實的圖像,相比於沒有參數共享的全連接層使用更少的參數。
即使在卷積生成網絡中上採樣的假設不真實,但是生成的樣本總體來說還是不錯的。
雖然有很多使用生成模型的方法來生成樣本,MCMC 採樣,ancestral sampling 或把二者結合是比較流行的做法。
當比較生成模型時,預處理的改變(即使很小,很微妙)是完全不能接收的,因為它會改變分布從而根本上改變了任務。
如果通過觀察樣本圖片來衡量生成模型,最好在不知道樣本源的情況下去做實驗。另外,由於一個差的模型也可能產生好的樣本,必須確保模型不是僅僅複製了訓練圖片。使用歐氏距離來進行檢查。
如果計算上可行的化,最好的衡量生成模型樣本的方法是評估模型分配給測試數據的對數似然。這個方法也有缺陷,例如一個固定的簡單圖片(如空白背景)有很高的似然。
生成模型有很多用處,因此根據用途來挑選評估指標。
以上就是關於「花書」經驗法則的中文翻譯版!之前紅色石頭頁收集過「花書」的相關資源,連結如下:
19 頁花書精髓筆記!你可能正需要這份知識清單
深度學習聖經「花書」核心筆記、代碼發布
【推薦閱讀】
乾貨 | 公眾號歷史文章精選(附資源)
我的深度學習入門路線
我的機器學習入門路線圖
👆歡迎加入