深度學習實踐經驗彙總

寫在前面:

本文原載於how-to-start-a-deep-learning-project,而且在機器之心上有翻譯(如何從零開始構建深度學習項目?這裏有一份詳細的教程)。網絡

忽略中英文的標題,由於這並不是是一個入門的詳細教程,而是在深度學習應用中各個步驟階段上經驗彙總,寫的很不錯,在這裏推薦一下。函數

文章具體的應用的是採用生成對抗網絡,給日本漫畫上色。雖然領域小衆,但內容上仍是有不少通用意義的。下面開始應用經驗的給出:學習


實踐經驗:

  • 深度學習模型查找 bug 的過程很是艱難。所以要從簡單的地方着手,按部就班,例如模型的優化(如正則化)始終能夠在代碼調試完成後進行。
  • 咱們還須要常常可視化預測結果和模型度量標準,而且咱們首先須要令模型先跑起來,這樣就有一個能夠後退的基線。咱們最好不要陷在一個很大的模型,並嘗試將全部的模塊都弄好。
  • 項目研究階段:先對現有產品進行研究,以探索它們的弱點。
  • 站在巨人的肩膀上。閱讀研究論文可能會很痛苦,但很是有意義。
  • 數據的質量要重視起來:類別均衡,數據充足,數據和標記中有高質量信息,數據和標記錯誤很是小,與你的問題相關。
  • 與學術數據集相比,小型項目收集的樣本不多,在適當狀況下能夠應用遷移學習。
  • 避免隨機改進:首先分析本身模型的弱點,而不是隨意地改進。
  • 創建深度學習並非簡單的把網絡層堆在一塊兒。增長好的限制(constraints)能使得學習更爲有效,或者更智能。例如,應用注意機制,能讓網絡知道注意哪裏,在變分自編碼器中,咱們訓練隱藏因子使其服從正態分佈。
  • 許多預訓練模型可用於解決深度學習難題。(這一點深有體會,在NLP上如此,在看到的圖像處理、機器翻譯領域亦是如此。)
  • L1 正則化和 L2 正則化都很常見,但 L2 正則化在深度學習中更受歡迎。L1 正則化能夠產生更加稀疏的參數,然而,L2 正則化仍然更受歡迎,由於解可能更穩定。
  • 梯度降低:始終密切監視梯度是否消失或爆炸,梯度降低問題有許多可能的緣由,這些緣由難以證明。不要跳至學習速率調整或使模型設計改變太快。
  • 縮放輸入特徵。咱們一般將特徵縮放爲以零爲均值在特定範圍內,如 [-1, 1]。特徵的不適當縮放是梯度爆炸或下降的一個最多見的緣由。有時咱們從訓練數據中計算均值和方差,以使數據更接近正態分佈。若是縮放驗證或測試數據,要再次利用訓練數據的均值和方差。(其實還能夠經過分佈,來check訓練樣本和真實樣本分佈diff)
  • 批量歸一化也有助於解決梯度降低問題,所以它逐漸取代了 Dropout。結合 Dropout 和 L2 正則化的好處是領域特定的。一般,咱們能夠在調優過程當中測試 dropout,並收集經驗數據來證實其益處。
  • 激活函數:在 DL 中,ReLU 是最經常使用的非線性激活函數。若是學習速率過高,則許多節點的激活值可能會處於零值。若是改變學習速率沒有幫助,咱們能夠嘗試 leaky ReLU 或 PReLU。在 leaky ReLU 中,當 x < 0 時,它不輸出 0,而是具備小的預約義向下斜率(如 0.01 或由超參數設置)。參數 ReLU(PReLU)往前推進一步。每一個節點將具備可訓練斜率。
  • 確保樣本在每一個數據集和每批訓練樣本中被充分打亂。
  • 用小量的訓練數據使模型過擬合是 debug 深度學習的最好方式。若是在數千次迭代內,損失值不降低,進一步 debgug 代碼。準確率超越瞎猜的概念,你就得到了第一個里程碑。而後對模型作後續的修改:增長網絡層和自定義;開始用完整訓練數據作訓練;經過監控訓練和驗證數據集之間的準確率差異,來增長正則化控制過擬合。
  • 前期的問題主要來自於 bug,而不是模型設計和精調問題。(贊)
  • 把權重所有初始化到 0 是最多見的錯誤,深度網絡也學不到任何東西。權重要按照高斯分佈作初始化。
  • 檢查和測試損失函數的準確性。模型的損失值必定要比隨機猜想的值低。例如,在 10 類別分類問題中,隨機猜想的的交叉熵損失是-ln(1/10)。
  • 避免使用多個數據損失函數。每一個損失函數的權重可能有不一樣的數量級,也須要一些精力去調整。若是咱們只有一個損失函數,就能夠只在乎學習率了。
  • 數據加強:收集有標籤的數據是一件昂貴的工做。對於圖片來講,咱們可使用數據加強方法如旋轉、隨機剪裁、移位等方式來對已有數據進行修改,生成更多的數據。顏色失真則包括色調、飽和度和曝光偏移。(在NLP領域中應用到少些。
  • Mini-batch 尺寸:一般的批尺寸是 八、1六、32 或 64。若是批尺寸過小,則梯度降低不會很順暢,模型學習的速度慢,損失可能會振盪。若是批尺寸太大,則完成一次訓練迭代(一輪更新)的時間太長,獲得的返回結果較小。在咱們的項目中,咱們下降批尺寸,由於每次訓練迭代時間太長。咱們密切監控整個學習速度和損失。若是損失振盪劇烈,則咱們會知道批尺寸下降的幅度太大了。批尺寸影響正則化因子等超參數。一旦咱們肯定好批尺寸,咱們一般就鎖定了值。
  • 學習率和正則化因子高度相關,有時須要一塊兒調。不要太早進行精細調整,有可能浪費時間。設計改變的話這些努力就白費了。
  • Dropout 率一般在 20% 到 50% 之間。咱們先從 20% 開始。若是模型出現過擬合,則提升值。
  • 網格搜索的計算量很大。對於較小的項目,它們會被零星使用。咱們開始用較少的迭代來調整粗粒度參數。在後期的細調階段,咱們會使用更長的迭代,並將數值調至 3(或更低)。
  • kaggle是一個很棒的學習,討論的地方。畢竟紙上得來終覺淺,須知此事要躬行。
相關文章
相關標籤/搜索