訓練一個模型不難,難的是當結果不理想時,知道下一步該做什麼。可以嘗試的方法很多:收集更多資料、換一個更大的網路、加強正則化、調整學習率、改變損失函數……如果每次都憑直覺挑一個試試看,往往花了幾週,卻說不清楚是哪個改變真正帶來了進步。
這一章整理的是「做機器學習專案的方法論」。核心想法只有一個:把問題拆成彼此獨立的幾個環節,一次只處理一個。每個環節都有自己的診斷指標,也有專門對應的調整手段。
1.1正交化Orthogonalization
正交化(orthogonalization)借用的是線性代數的概念:兩個互相正交的方向,調整其中一個不會影響另一個。套用到模型調校上,就是希望每一個「旋鈕」只控制一件事。
可以把它想像成顯微鏡的粗調節輪與細調節輪:先轉粗調節輪,讓影像落在視野範圍內;再轉細調節輪對焦。如果一個旋鈕同時改變位置與焦距,就很難調到清楚的畫面。
一個監督式學習專案,通常要依序通過四道關卡,每一關失敗時對應不同的處理方式:
| 關卡 | 失敗時代表 | 對應的旋鈕 |
|---|---|---|
| 在訓練集表現好 | 偏誤過高(模型學不起來) | 更大的網路、更好的最佳化演算法、訓練更久 |
| 在開發集表現好 | 變異過高(過擬合) | 正則化、更多訓練資料 |
| 在測試集表現好 | 對開發集過度調校 | 更大的開發集 |
| 在真實世界表現好 | 開發/測試集或評估指標選錯 | 重新設計開發/測試集,或更換成本函數與評估指標 |
Training set
訓練集表現好
可避免偏誤未通過時更大的網路、更好的最佳化方法、訓練更久
Dev set
開發集表現好
變異未通過時正則化、更大的訓練集
Test set
測試集表現好
對開發集過度調校未通過時更大的開發集
Real world
真實世界表現好
目標設定未通過時重新設計開發/測試集,或更換成本函數與評估指標
建議的工作順序
- 先決定評估指標。選一個能代表專案目標的指標,例如準確率(accuracy)、召回率(recall)或 F1 分數,作為之後所有比較的共同基準。
- 快速建立一個初始模型。不必一開始就追求最好的架構,先用簡單的模型得到一個基準結果。這個結果能幫助我們縮小參數調校的範圍、選擇值得優化的方向,也能及早發現程式錯誤這類人為問題。
- 進行偏誤與變異分析、錯誤分析。根據診斷結果,挑選對應的旋鈕,然後回到第 2 步反覆迭代。
1.2評估指標Evaluation Metrics
單一數字的評估指標
迭代的速度取決於「能不能快速判斷哪一個模型比較好」。如果同時看精確率(precision)與召回率兩個數字,模型 A 精確率高、模型 B 召回率高時,就很難做決定。因此建議使用單一數字的評估指標(single-number evaluation metric),例如結合兩者的 F1 分數。各種指標的定義請見第 5 章。
最佳化指標與滿足指標
實務上,「好模型」往往有多個條件。常見的做法是:
- 選一個最佳化指標(optimizing metric):希望它越高(或越低)越好,例如準確率。
- 其餘條件設為滿足指標(satisficing metric):只要達到門檻即可,例如「每張影像的推論時間低於 100 毫秒」、「某一類重要類別的誤判率低於 1%」。
這樣一來,比較模型時只需要在符合所有門檻的候選者中,挑出最佳化指標最好的那一個。
1.3訓練、開發與測試集Train / Dev / Test Sets
資料通常切成三份:
- 訓練集(training set):用來訓練模型參數。
- 開發集(dev set):又稱驗證集,用來比較不同模型與超參數,決定下一步的方向。
- 測試集(test set):在開發告一段落後,用來估計模型在真實世界的表現,不應該參與任何調校決策。
切分比例
在資料量只有數千筆的年代,常見的比例是 60/20/20。但在資料量達到百萬筆的情境下,開發集與測試集只需要「足夠大,能可靠地分辨模型好壞」即可,即使只佔全部資料的 1%,也有上萬筆。因此 98/1/1 這樣的比例在大數據情境並不罕見。
分布要一致
開發集就像是團隊瞄準的靶心。如果開發集與測試集的分布不同,團隊可能花了好幾個月把模型調到很準,結果發現測試時靶心早就換了位置。相對地,訓練集與開發/測試集的分布略有不同是可以接受的,例如用大量網路圖片訓練,但開發與測試集只使用手機實際拍攝的照片。
1.4偏誤與變異分析Bias and Variance
偏誤(bias)與變異(variance)是診斷模型問題最重要的兩個概念。直覺上,偏誤描述模型「平均而言離目標多遠」,變異描述模型「對訓練資料的變動有多敏感」。完整的數學分解請見第 5 章。
以人類表現作為參考
理論上能達到的最低錯誤率稱為貝氏最佳誤差(Bayes optimal error)。它通常無法直接得知,在影像、語音這類人類擅長的任務上,常以人類水準的誤差(human-level error)來近似。有了這個參考點,就能把模型的誤差拆成兩段:
| 誤差的差距 | 名稱 | 代表的問題 |
|---|---|---|
| 人類水準誤差 → 訓練集誤差 | 可避免偏誤(avoidable bias) | 模型擬合不足 |
| 訓練集誤差 → 開發集誤差 | 變異(variance) | 模型無法泛化 |
例如人類誤差為 1%、訓練集誤差 8%、開發集誤差 10%:可避免偏誤是 7%,變異是 2%,應該優先處理偏誤。若訓練集誤差是 2%、開發集誤差 10%,則變異才是主要問題。
對應的處理方式
| 診斷結果 | 優先嘗試 | 說明 |
|---|---|---|
| 偏誤過高 | 更大的網路(更寬或更深)、訓練更久、更好的最佳化演算法、不同的網路架構 | 更大的網路幾乎總是有幫助;訓練更久則不一定 |
| 變異過高 | 收集更多資料、正則化、資料擴增、不同的網路架構 | 更多資料是最可靠的方法,但成本也最高 |
1.5錯誤分析Error Analysis
當模型在開發集上的表現不理想時,與其直接換方法,不如先把預測錯誤的資料點拿出來逐一檢查,找出讓模型失靈的潛在原因。
步驟
- 從開發集中隨機抽出一批預測錯誤的樣本(例如 100 筆)。
- 人工檢視每一筆,標記錯誤的類型。
- 統計各類型所佔的比例,估計「若完全解決這一類錯誤,整體誤差最多能降低多少」,據此決定處理的優先順序。
兩種常見的錯誤類型
- 標註錯誤(mislabeled):資料的標註本身就是錯的,也就是標註值不等於真實值。如果這類錯誤在開發集中佔了相當比例,就值得花時間修正開發集與測試集的標註(兩者要一起修正,才能維持相同分布)。深度學習模型對訓練集中隨機的少量標註錯誤通常相當穩健。
- 模型分類錯誤(misclassification):標註正確,但模型預測錯了。這才是需要透過改進模型處理的部分。
當訓練集與開發集分布不同時
如果訓練集與開發集來自不同的分布,開發集誤差偏高時,就無法判斷原因是過擬合,還是兩者的分布差異(data mismatch)。這時可以從訓練集中切出一小部分作為訓練開發集(train-dev set),它與訓練集同分布,但不參與訓練。
| 誤差比較 | 差距大時代表 |
|---|---|
| 訓練集 → 訓練開發集 | 變異:模型對同分布的新資料也無法泛化 |
| 訓練開發集 → 開發集 | 資料分布不一致(data mismatch) |
| 開發集 → 測試集 | 對開發集過度調校 |
確認是資料分布不一致之後,可以考慮以下做法:
- 重新混合後再隨機切分:如果所有資料其實都同樣具有代表性,把訓練、開發、測試集合併後重新隨機切分,是最直接的解法。
- 調整切分方式:保留真正關心的資料作為開發集與測試集,訓練集則可以混入其他來源的資料,並以訓練開發集監控變異。
- 收集更多貼近目標分布的訓練資料:效果最好,但通常費時費力,可行性需要評估;資料合成(data synthesis)是另一個可考慮的替代方案。
1.6參考資料References
- Andrew Ng, Machine Learning Yearning(2018)。
- deeplearning.ai, Structuring Machine Learning Projects(Coursera 深度學習專項課程第三門課)。
- Goodfellow, Bengio & Courville, Deep Learning, MIT Press, 2016,第 11 章 Practical Methodology。