機器學習訓練祕籍_學習筆記
本文主要參考“吳恩達deeplearning.ai——機器學習訓練祕籍”(https://accepteddoge.github.io/machine-learning-yearning-cn/)進行學習整理的筆記。
一、訓練集、開發集、測試集
訓練集(training set)用於執行你的學習演算法。
開發集(development set)用於調整引數,選擇特徵,以及對學習演算法作出其它決定。有時也稱為留出交叉驗證集(hold-out cross validation set)。
測試集(test set)用於評估演算法的效能,但不會據此決定使用什麼學習演算法或引數。
機器學習中的,一種常見的啟發式策略是將 30% 的資料用作測試集,這適用於資料量規模一般的情況(比如 100 至 10,000 個樣本)。但是在大資料時代,實際上開發集和測試集的比例會遠低30%。
開發集和測試集應該服從同一分佈
舉個例子,假設你的團隊開發了一套能在開發集上執行效能良好,卻在測試集上效果不佳的系統。如果開發集和測試集分佈相同,那麼你就會非常清楚地知道問題在哪:在開發集上過擬合了(overfit)。解決方案顯然就是獲得更多的開發集資料。但是如果開發集和測試集來自不同的分佈,解決方案就不那麼明確了。
在處理第三方基準測試(benchmark)問題時,提供方可能已經指定了服從不同分佈的開發集和測試集資料。與資料分佈一致的情況相比,此時運氣帶來的效能影響將超過你所使用的技巧帶來的影響。找到能夠在某個分佈上進行訓練,並能夠推廣到另一個分佈的學習演算法,是一個重要的研究課題。但如果你想要在特定的機器學習應用上取得進展,而不是搞研究,我建議你嘗試選擇服從相同分佈的開發集和測試集資料,這會讓你的團隊更有效率。
特例:
比如大型的神經網路,對於貓咪檢測器的示例,我們不會將使用者上傳的所有 10000 個影象放到開發/測試集合中,而是將其中 5000 張放入。 這樣的話,訓練集中的 205000 個樣本的分佈將來自現有的開發/測試集,以及 200000 張網路圖片。
新增額外的 20000 張圖片會產生以下影響:
它給你的神經網路提供了更多關於貓咪外貌的樣本。這是很有幫助的,因為網際網路圖片和使用者上傳的移動應用圖片確實有一些相似之處。你的神經網路可以將從網際網路影象中獲得的一些知識應用到移動應用影象中。
它迫使神經網路花費部分容量來學習網路影象的特定屬性(比如更高的解析度,不同畫面結構影象的分佈等等)。如果這些屬性與移動應用影象有很大的不同,那麼它將“耗盡”神經網路的一些表徵能力,導致從移動應用影象的分佈識別資料的能力就會降低,而這正是你真正關心的東西。從理論上講,這可能會損害演算法的效能。
訓練集:這是演算法將學習的資料(例如,網際網路影象+移動應用影象)。這並不需要我們從與真正關心的相同分佈(開發/測試集分佈)的資料中提取。
訓練開發集:這些資料來自與訓練集相同的分佈(例如,網際網路影象+移動應用影象)。它通常比訓練集要小;它只需要足夠大到來評估和跟蹤我們的學習演算法的進展。
開發集:這是從與測試集相同分佈的資料中抽取出來的,它反映了我們最終關心的資料的分佈(例如,移動應用影象) 。
測試集:這是從與開發集相同分佈的資料中抽取出來的(例如,移動應用影象)。
有了這四個獨立的資料集,你現在可以評估:
訓練誤差,對訓練集進行評估。
該演算法能夠泛化到與訓練集相同分佈資料的能力,並對訓練開發集進行評估。
演算法在你實際關心的任務上的效能,通過對開發集 和/或 測試集評估。
開發集的規模應該大到足以區分出你所嘗試的不同演算法間的效能差異。例如,如果分類器 A 的準確率為 90.0% ,而分類器 B 的準確率為 90.1% ,那麼僅有 100 個樣本的開發集將無法檢測出這 0.1% 的差異。相比我所遇到的機器學習問題,一個樣本容量為 100 的開發集的規模是非常小的。通常來說,開發集的規模應該在 1,000 到 10,000 個樣本資料之間,而當開發集樣本容量為 10,000 時,你將很有可能檢測到 0.1% 的效能提升。
從理論上說,還可以檢測演算法的變化是否會在開發集上造成統計學意義上的顯著差異。 然而在實踐中,大多數團隊並不會為此而煩惱(除非他們正在發表學術研究論文),而且我在檢測過程中並沒有發現多少有效的統計顯著性檢驗。
用於選擇開發集大小的大多數指導原則也適用於訓練開發集。
擁有開發集、測試集和單值評估指標可以幫你快速評估一個演算法,從而加速迭代過程。
在不同的分佈上訓練集與開發/測試集的選擇?
- 如果有足夠的計算能力來構建一個足夠大的神經網路,可以考慮對訓練集額外加入不同於開發集/測試集的資料。相反,應該更加關注訓練資料,需要與開發/測試集的分佈相匹配
- 考慮對開發/測試集額外加入不同於訓練集的資料。例如,假設你的開發/測試集主要包含一些內容是人員、地點、地標、動物的任意圖片。同時假設集合裡面有大量的歷史文件掃描圖片,這些檔案不包含任何類似貓的東西,它們看起來和開發/測試集的分佈完全不同,沒有必要將這些資料作為負樣本,你的神經網路幾乎沒有任何東西可以從這些資料中學習,加入它們將會浪費計算資源和神經網路的表徵能力。但它們可以應用到開發/測試集中,
二、單值評估指標、優化指標、滿意度指標
單值評估指標(single-number evaluation metric)有很多,分類準確率就是其中的一種。相比之下,查準率(Precision,又譯作精度)和查全率(Recall,又譯作召回率)均不是單值評估指標,可以使用二者的平均值,F1分數(F1 score),加權平均值等指標。
當開發集和評估指標不再能給團隊一個正確的導向時,就儘快修改它們:(i) 如果你在開發集上過擬合,則獲取更多的開發集資料。(ii) 如果開發集和測試集的資料分佈和實際關注的資料分佈不同,則獲取新的開發集和測試集。 (iii) 如果評估指標不能夠對最重要的任務目標進行度量,則需要修改評估指標。
三、誤差分析
誤差分析(Error Analysis) 指的是檢查被演算法誤分類的開發集樣本的過程,以便幫助你找到造成這些誤差的原因。這將協助你確定各個專案的優先順序並且獲得探索新方向的靈感。
假設你已檢查了100 個開發集的誤分類樣本,可以得到下面的表格:
影象 狗 大貓 模糊 備註
1 √ 不常見的美國位元犬
2 √
3 √ √ 獅子;雨天在動物園拍攝的圖片
4 √ 樹木後的美洲豹
… … … …
佔全體比例 8% 43% 61%
檢視誤分類樣本的這一過程稱為誤差分析。在上面的例子中,如果只有 5% 誤分類的影象是狗,那麼無論你在狗的問題上做多少的演算法改進,最終都不會消除超過原有的 5% 誤差 . 也即是說 5% 是該計劃專案所能起到幫助的“上限”(最大可能值)。所以如果整個系統當前的精度為 90%(對應誤差為 10%),那麼這種改進最多能將精度提升到 90.5% (對應誤差下降到 9.5% , 改進了原有 10% 誤差其中的 5%)。
相反,如果你發現 50% 的誤分類影象是狗,那就可以自信地說這個專案將效果明顯,它可以將精度從 90% 提升到 95% (相對誤差減少 50%,整體誤差由 10% 下降到 5%)。
“誤標註”指的是影象在使用演算法處理前,已經被負責標註的人員進行了錯誤的標註,也就是說,某個樣本 的分類標籤(label) 的值並不正確。例如,一些不是貓的圖片被誤標註為貓,反之亦然。如果你不確定這些被誤標註的圖片是否起著關鍵作用,可以新增一個類別來跟蹤記錄誤標註樣本的比例:
影象 狗 大貓 模糊 誤標註 備註
…
89 √ 標註者忽略了背景中的貓
99 √
100 √ 貓的畫像;非真貓
佔全體比例 8% 43% 61% 6%
將開發集明確地分為 Eyeball 和 Blackbox 開發兩個子集將很有幫助,它使你瞭解在人為的誤差分析過程中 Eyeball 開發集何時開始發生過擬合。
Eyeball 和 Blackbox 開發集該設定多大?
假設你的分類器有 5% 的錯誤率。為了確保在 Eyeball 開發集中有約 100 個誤分類的樣本,樣本開發集應該有約 2000 個樣本(因為 0.05 * 2000 = 100)。分類器的錯誤率越低,為了獲得足夠多的錯誤樣本進行誤差分析,需要的 Eyeball 開發集就越大。
Blackbox 開發集有約 1000-10000 個樣本是正常的 。完善一下該陳述,一個有 1000-10000 個樣本的 Blackbox 開發集通常會為你提供足夠的資料去調超參和選擇模型,即使資料再多一些也無妨。而含有 100 個樣本的 Blackbox 開發集雖然比較小,但仍然是有用的。
在 Eyeball 和 Blackbox 開發集之間,我認為 Eyeball 開發集更加重要(假設你正在研究一個人類能夠很好解決的問題,檢查這些樣本能使得你更有洞悉力)。如果你只有一個 Eyeball 開發集,你可以在這個開發集上進行誤差分析、模型選擇和超引數調整,缺點是過擬合開發集的風險更大。
四、偏差和方差:誤差的兩大來源
粗略地說,偏差指的是演算法在大型訓練集上的錯誤率;方差指的是演算法在測試集上的表現低於訓練集的程度。當你使用均方誤差(MSE)作為誤差度量指標時,你可以寫下偏差和方差對應的兩個公式,並且證明總誤差=偏差+方差。但在處理機器學習問題時,此處給出的偏差和方差的非正式定義已經足夠。
最優錯誤率(“不可避免偏差”):14%。假設我們決定,即使是世界上最好的語音系統,仍會有 14% 的誤差。我們可以將其認為是學習演算法的偏差“不可避免”的部分。最優錯誤率也被稱為貝葉斯錯誤率(Bayes error rate),或貝葉斯率
可避免偏差:1%。即訓練錯誤率和最優誤差率之間的差值。
方差:15%。即開發錯誤和訓練錯誤之間的差值。
如果可避免偏差值是負的,即演算法在訓練集上的表現比最優錯誤率要好。這意味著你正在過擬合訓練集,並且演算法已經過度記憶(over-memorized)訓練集。你應該專注於有效降低方差的方法,而不是選擇進一步減少偏差的方法。
偏差 = 最佳誤差率(“不可避免偏差”)+ 可避免的偏差
加大模型的規模通常可以減少偏差,但也可能會增加方差和過擬合的風險。然而,這種過擬合風險通常只在你不使用正則化技術的時候出現。如果你的演算法含有一個精心設計的正則化方法,通常可以安全地加大模型的規模,而不用擔心增加過擬合風險。
如果具有較高的可避免偏差,那麼加大模型的規模(例如通過新增層/神經元數量來增加神經網路的大小)。
如果具有較高的方差,那麼增加訓練集的資料量。
假設你正在應用深度學習方法,使用了 L2 正則化和 dropout 技術,並且設定了在開發集上表現最好的正則化引數。此時你加大模型規模,演算法的表現往往會保持不變或提升;它不太可能明顯地變差。這種情況下,不使用更大模型的唯一原因就是這將使得計算代價變大。
減少可避免偏差的技術
加大模型規模(例如神經元/層的數量):這項技術能夠使演算法更好地擬合訓練集,從而減少偏差。當你發現這樣做會增大方差時,通過加入正則化可以抵消方差的增加。
根據誤差分析結果修改輸入特徵:假設誤差分析結果鼓勵你增加額外的特徵,從而幫助演算法消除某個特定類別的誤差。(我們會在接下來的章節深入討論這個話題。)這些新的特徵對處理偏差和方差都有所幫助。理論上,新增更多的特徵將增大方差;當這種情況發生時,你可以加入正則化來抵消方差的增加。
減少或者去除正則化(L2 正則化,L1 正則化,dropout):這將減少可避免偏差,但會增大方差。
修改模型架構(比如神經網路架構)使之更適用於你的問題:這將同時影響偏差和方差。
有一種方法並不能奏效:
新增更多的訓練資料:這項技術可以幫助解決方差問題,但它對於偏差通常沒有明顯的影響。
減少方差的技術
新增更多的訓練資料:這是最簡單最可靠的一種處理方差的策略,只要你有大量的資料和對應的計算能力來處理他們。
加入正則化(L2 正則化,L1 正則化,dropout):這項技術可以降低方差,但卻增大了偏差。
加入提前終止(例如根據開發集誤差提前終止梯度下降):這項技術可以降低方差但卻增大了偏差。提前終止(Early stopping)有點像正則化理論,一些學者認為它是正則化技術之一。
通過特徵選擇減少輸入特徵的數量和種類:這種技術或許有助於解決方差問題,但也可能增加偏差。稍微減少特徵的數量(比如從 1000 個特徵減少到 900 個)也許不會對偏差產生很大的影響,但顯著地減少它們(比如從 1000 個特徵減少到 100 個,10 倍地降低)則很有可能產生很大的影響,你也許排除了太多有用的特徵。在現代深度學習研究過程中,當資料充足時,特徵選擇的比重需要做些調整,現在我們更可能將擁有的所有特徵提供給演算法,並讓演算法根據資料來確定哪些特徵可以使用。而當你的訓練集很小的時候,特徵選擇是非常有用的。
減小模型規模(比如神經元/層的數量):謹慎使用。這種技術可以減少方差,同時可能增加偏差。然而我不推薦這種處理方差的方法,新增正則化通常能更好的提升分類效能。 減少模型規模的好處是降低了計算成本,從而加快了你訓練模型的速度。如果加速模型訓練是有用的,那麼無論如何都要考慮減少模型的規模。但如果你的目標是減少方差,且不關心計算成本,那麼考慮新增正則化會更好。
下面是兩種額外的策略,和解決偏差問題章節所提到的方法重複:
根據誤差分析結果修改輸入特徵:假設誤差分析的結果鼓勵你建立額外的特徵,從而幫助演算法消除某個特定類別的誤差。這些新的特徵對處理偏差和方差都有所幫助。理論上,新增更多的特徵將增大方差;當這種情況發生時,加入正則化,這可以消除方差的增加。
修改模型架構(比如神經網路架構)使之更適用於你的問題:這項策略將同時影響偏差和方差。
五、繪製學習曲線
存在訓練集噪聲致使難以正確理解曲線的變化時,有兩種解決方案:
與其只使用 10 個樣本訓練單個模型,不如從你原來的 100 個樣本中進行隨機有放回抽樣,選擇幾批(比如 3-10 )不同的 10 個樣本進行組合。在這些資料上訓練不同的模型,並計算每個模型的訓練和開發錯誤。最終,計算和繪製平均訓練集誤差和平均開發集誤差。
如果你的訓練集偏向於一個類,或者它有許多類,那麼選擇一個“平衡”子集,而不是從 100 個樣本中隨機抽取 10 個訓練樣本。例如,你可以確保這些樣本中的 2/10是正樣本,8/10 是負樣本。更常見的做法是,確保每個類的樣本比例儘可能地接近原始訓練集的總體比例。
在實踐中,用有放回抽樣和無放回抽樣的差異不大,但是前者更為常見。
六、構建機器學習系統
處理人類擅長的任務時:
1、易於從人為標籤中獲取資料。
2、基於人類直覺進行誤差分析。
3、使用人類表現水平來估計最優錯誤率,並設定可達到的“期望錯誤率”。
處理人類不擅長的任務時:
1、獲取標籤資料很難。
2、人類的直覺難以依靠。
3、最優錯誤率和合理的期望錯誤率難以確定。
同時,可以根據這三點對學習系統進行改良。
七、優化驗證測試
可以判斷出改進學習演算法與改進得分函式哪個更重要。
八、端到端的學習
在資料量十分豐富的問題上,端到端系統往往很奏效,但它並不總是一個很好的選擇。
什麼時候選擇流水線?資料可用性,人物簡單性。
流水線例子:
假設你正在構建一個暹羅貓檢測器。下面是一個純粹的端到端架構:
與此相反,你可以分成兩個步驟來形成流水線:
與僅僅使用標籤 0/1 來訓練一個純粹的端到端分類器相比,流水線中的兩個元件——貓咪檢測器和貓種類分類器——似乎更容易進行學習,而且需要更少的資料。(其中每個元件都是一個相對 “簡單” 的功能,因此只需要從少量的資料中學習。)
端到端例子:
這體現了深度學習的高速變化趨勢:當你有正確的(輸入,輸出)標籤對的時候,有時可以進行端到端學習,即使輸出是一個句子、影象、音訊,或者其它的比一個數字更豐富的輸出形式。
九、根據元件進行誤差分析
非正式:檢視每個元件的輸出,並看看是否可以決定哪個部分出錯了。
正式:對每個元件提供“完美”輸入,再判斷誤差。比如,貓檢測器輸出了邊界框將貓咪切斷,用手動標記的邊界框替換貓檢測器的輸出,然後判斷貓種類分類器。
元件誤差分析與人類水平對比
1、在檢測汽車時,汽車檢測元件與人類水平表現相差多少?
2、在檢測行人時,行人檢測元件與人類水平表現相差多少?
3、整個系統的效能與人類表現相差多少?在這裡,人類水平的表現假定:人類必須僅根據前兩個流水線元件的輸出(而不是訪問攝像機影象)來規劃汽車的路徑。
ML 流水線存在缺陷
如果你認為,即使每個元件都具有人類級別的效能(請記住,你要與被給予與元件相同輸入的人類進行比較),流水線整體上也不會達到人類水平的效能,則表明流水線有缺陷,應該重新設計。
在前一章中,我們提出了這三個部分元件的表現是否達到人類水平的問題。假設所有三個問題的答案都是肯定的,也即是說:
汽車檢測部件(大概)是人類級別的效能,用於從攝像機影象中檢測汽車。
行人檢測元件(大概)是人類級別的效能,用於從攝像機影象中檢測行人。
與僅根據前兩個流水線元件的輸出(而不是訪問攝像機影象)規劃汽車路徑的人相比,路徑規劃元件的效能處於類似水平。
然而,你的自動駕駛汽車的整體效能遠遠低於人類水平。即,能夠訪問攝像機影象的人可以為汽車規劃出明顯更好的路徑。據此你能得出什麼結論?唯一可能的結論是ML 流水線存在缺陷。
十、小技巧_擴大訓練集
1、不同分佈的訓練集和開發/測試集,然後給不同的資料加上不同的權重
例如,訓練集包含了網際網路影象+移動應用影象,而開發/測試集只包含移動應用影象。只有當你懷疑這些額外的資料(網路影象)與開發/測試集分佈不一致,或者額外的資料規模比與相同分佈的開發/測試集(手機影象)資料規模大得多時,這種型別的權重加權才需要。
此時需要四個資料子集:
訓練集:這是演算法將學習的資料(例如,網際網路影象+移動應用影象)。這並不需要我們從與真正關心的相同分佈(開發/測試集分佈)的資料中提取。
訓練開發集:這些資料來自與訓練集相同的分佈(例如,網際網路影象+移動應用影象)。它通常比訓練集要小;它只需要足夠大到來評估和跟蹤我們的學習演算法的進展。
開發集:這是從與測試集相同分佈的資料中抽取出來的,它反映了我們最終關心的資料的分佈(例如,移動應用影象) 。
測試集:這是從與開發集相同分佈的資料中抽取出來的(例如,移動應用影象)。
有了這四個獨立的資料集,你現在可以評估:
訓練誤差,對訓練集進行評估。
該演算法能夠泛化到與訓練集相同分佈資料的能力,並對訓練開發集進行評估。
演算法在你實際關心的任務上的效能,通過對開發集/測試集評估。
評估解讀:
假設在貓咪檢測任務中,人類獲得了近乎完美的效能(0%誤差),因此最優錯誤率大約為 0%。
1% 的訓練集誤差;5% 的訓練開發集誤差;5% 的開發集誤差——>高方差
10% 的訓練集誤差;11% 的訓練開發集誤差;12% 的開發集誤差——>高偏差
10% 的訓練集誤差;11% 的訓練開發集誤差;20% 的開發集誤差——>高偏差、高方差
2、人工合成數據
當你在合成數據時,請考慮一下你是否真的在合成一組具有代表性的樣本。儘量避免給出合成數據的屬性,防止過擬合。
附件1:中英文對照
機器學習:machine learning
神經網路:NN,neural network
梯度下降:gradient descent
層:layer
隱藏元:hidden units
引數:parameters
標籤:label
線性迴歸:linear regression
對數機率迴歸/邏輯迴歸:logistic regression
資料可用性:data availability
計算規模:computational scale
效能表現:performance
學習演算法:learning algo
小型:small
中型:medium
大型:large
訓練集:training set
開發集:development set
留出交叉驗證集:hold-out cross validation set
測試集:test set
分類器:classifier
泛化:generalize
實際分佈:actual distribution
過擬合:overfit
過擬合:overfitting
欠擬合:underfitting
基準測試:benchmark
單值評估指標:single-number evaluation metric
查準率/精確度:Precision
查全率/召回率:Recall
想法:idea
程式碼:code
實驗:experiment
誤差分析:Error Analysis
被誤標註:mislabeled
偏差:bias
方差:variance
學習曲線:Learning curves
優化驗證測試:Optimization Verification test
附件2:定義及公式
1、F分數
分數( Score),又稱平衡F分數(balanced F Score),它被定義為精確率和召回率的調和平均數。
更一般的,我們定義
分數為
、 、 分數在統計學中也得到大量的應用
分數中,召回率的權重高於準確率
分數中,準確率的權重高於召回率
2、G分數
F分數是準確率和召回率的調和平均數,G分數被定義為準確率和召回率的幾何平均數。