從頭開始做深度學習項目,應該注意哪些問題?

李亞洲54052926

在學習了有關深度學習的理論課程之後,很多人都會有興趣嘗試構建一個屬於自己的項目。但對初學者來說,學習前輩的經驗,能夠讓自己避免很多坑。這裡機器之心整理了國外工程師Jonathan Hui上手漫畫上色項目時寫的經驗。


  • 第一部分:啟動一個深度學習項目

  • 第二部分:創建一個深度學習數據集

  • 第三部分:設計深度模型

  • 第四部分:深度學習網絡中的調試

第一部分:啟動一個深度學習項目

很多人工智能項目其實並沒有那麼嚴肅,做起來還很有趣。在尋找項目時,不要侷限於增量性改進,去做一款適銷對路的產品,或者創建一種學習速度更快、質量更高的新模型。

訓練深度學習模型需要數百萬次的迭代,因此查找 bug 的過程非常艱難,而且容易崩壞。因此我們要從簡單的地方著手,循序漸進,例如模型的優化(如正則化)始終可以在代碼調試完成後進行。此外,我們還需要經常可視化預測結果和模型度量標準,並且我們首先需要令模型跑起來,這樣就有一個可以後退的基線。我們最好不要陷在一個很大的模型,並嘗試將所有的模塊都弄好。

宏偉的項目計劃可能帶慘烈的失敗。多數個人項目的第一個版本會持續兩到四個月,這個時間非常短暫,因為研究、調試和實驗都需要花費大量的時間。一般我們安排這些複雜的實驗,使其通宵運行,到第二天清晨時,我們希望得到足夠的信息來採取下一步行動。在早期階段,這些實驗不應超過 12 小時,這是一條良好的經驗法則。

在成本考慮上,必須使用 GPU 來訓練實際模型。它比 CPU 快 20 到 100 倍。價格最低的亞馬遜 GPU p2.xlarge 站點實例要價 7.5 美元/天,而 8 核 GPU 的價格則高達 75 美元/天。

第二部分:創建一個深度學習數據集

深度學習項目的成功取決於數據集的質量。在本文的第 2 部分中,我們將探討創建優質訓練數據集的核心問題。

公開及學術數據集

對於研究項目,可以搜索已建立的公開數據集。這些數據集可以提供更整齊的樣本和基線模型性能。如果你有多個可用的公開數據集,請選擇與你的問題最相關且質量最好的樣本。

自定義數據集

對於實際問題,我們需要來自問題領域的樣本。首先嚐試查找公共數據集。關於創建高質量自定義數據集的研究還有所欠缺。如果沒有可用的資料,請搜尋你可以抓取數據的位置。該位置通常有很多參考,但數據質量通常較低,還需要投入大量精力進行整理。在抓取樣本之前,要專門抽出時間評估所有選項並選擇最相關的選項。

高質量數據集應該包括以下特徵:

  • 類別均衡

  • 數據充足

  • 數據和標記中有高質量信息

  • 數據和標記錯誤非常小

  • 與你的問題相關

注意,不要一次爬取所有數據。我們經常藉助標籤和分類來抓取網站樣本,從而獲取與我們的問題相關的數據。最好的爬取方法是在你的模型中訓練、測試少量樣本,並根據得到的經驗教訓改善抓取方法。

清理你抓取的數據非常重要

,否則,即使最好的模型設計也達不到與人類水平相當的表現。

模型訓練和視覺評估都提供了進一步的信息來細化我們的標籤選擇。隨著迭代的繼續,我們將學到更多,並逐漸進行樣本積累。我們還需要使用分類器進一步過濾與問題無關的樣本,如清除所有人物過小的圖像等。與學術數據集相比,小型項目收集的樣本很少,在適當情況下可以應用遷移學習。

總結來說,也就是:

  • 儘可能使用公共數據集;

  • 尋找可以獲取高質量、多樣化樣本的最佳網站;

  • 分析錯誤並過濾掉與實際問題無關的樣本;

  • 迭代地創建你的樣本;

  • 平衡每個類別的樣本數;

  • 訓練之前先整理樣本;

  • 收集足夠的樣本。如果樣本不夠,應用遷移學習。

第三部分:深度學習設計

第三部分介紹了一些高層次的深度學習策略,接下來我們將詳細介紹最常見的設計選擇,這可能需要一些基本的 DL 背景。

簡單靈活

設計初始要簡單、小巧。在學習階段,人們腦海中會充斥大量很酷的觀念。我們傾向於一次性把所有細節都編碼進來。但這是不現實的,最開始就想要超越頂尖的結果並不實際。從較少網絡層和自定義開始設計,後面再做一些必要的超參數精調方案。這些都需要查證損失函數一直在降低,不要一開始就在較大的模型上浪費時間。

在簡短的 Debug 之後,我們的模型經過 5000 次迭代產生了簡單的結果。但至少該模型所上的顏色開始限制在固定區域內,且膚色也有些顯露出來。

優先性以及增量設計

首先為了創造簡單的設計,我們需要選出優先項。把複雜問題分解成小問題,一步一步解決。做深度學習的正確策略是快速的執行學到的東西。相比於做個要不斷改變的長期計劃,還不如以優先性驅動的計劃。使用更短、更小的設計迭代,從而保證項目可管理性。

避免隨機改進

首先分析自己模型的弱點,而不是隨意地改進,例如用雙向 LSTM 或者 PReLU。我們需要根據可視化模型誤差(表現極差的場景)以及性能參數來確定模型問題。隨意做改進反而適得其反,會成比例的增加訓練成本,而回報極小。

限制

我們把限制應用到網絡設計,從而保證訓練更高效。建立深度學習並不是簡單的把網絡層堆在一起。增加好的限制(constraints)能使得學習更為有效,或者更智能。例如,應用注意機制,能讓網絡知道注意哪裡,在變分自編碼器中,我們訓練隱藏因子使其服從正態分佈。

以下是對深度學習項目的主要步驟的簡單總結:

第四部分:調試深度學習網絡

深度學習的問題解決步驟

在前期開發中,我們會同時遇到多個問題。就像前面提到的,深度學習訓練由數百萬次迭代組成。找到 bug 非常難,且容易崩潰。從簡單開始,漸漸做一些改變。正則化這樣的模型優化可以在代碼 degug 後做。以功能優先的方式檢查模型:

  • 把正則化因子設置為 0;

  • 不要其他正則化(包括 dropouts);

  • 使用默認設置的 Adam 優化器;

  • 使用 ReLU;

  • 不要數據增強;

  • 更少的深度網絡層;

  • 擴大輸入數據,但不要非必要預處理;

  • 不要在長時間訓練迭代或者大 batch size 上浪費時間。

用小量的訓練數據使模型過擬合是 debug 深度學習的最好方式。如果在數千次迭代內,損失值不下降,進一步 debgug 代碼。準確率超越瞎猜的概念,你就獲得了第一個里程碑。然後對模型做後續的修改:增加網絡層和自定義;開始用完整訓練數據做訓練;通過監控訓練和驗證數據集之間的準確率差別,來增加正則化控制過擬合。

如果卡住了,去掉所有東西,從更小的問題開始上手。

檢查列表

數據:

  • 可視化並檢查輸入數據(在數據預處理之後,饋送到模型之前);

  • 檢查輸入標籤的準確率(在數據擾動之後);

  • 不要一遍又一遍的饋送同一 batch 的數據;

  • 適當的縮放輸入數據(一般可縮放到區間 (-1, 1) 之間,且具有零均值);

  • 檢查輸出的範圍(如,在區間 (-1, 1) 之間);

  • 總是使用訓練集的平均值/方差來重新調節驗證/測試集;

  • 模型所有的輸入數據有同樣的維度;

  • 獲取數據集的整體質量(是否有太多異常值或者壞樣本)。

模型:

  • 模型參數準確的初始化,權重不要全部設定為 0;

  • 對激活或者梯度消失/爆炸的網絡層做 debug(從最右邊到最左邊);

  • 對權重大部分是 0 或者權重太大的網絡層做 debug;

  • 檢查並測試損失函數;

  • 對預訓練模型,輸入數據範圍要匹配模型中使用的範圍;

  • 推理和測試中的 Dropout 應該總是關掉。


分享到:


相關文章: