1-1 機器學習策略
後續會討論分析機器學習問題的方法。
1-2 正交化
構建機器學習應用的一大挑戰是有眾多的方案與選項可以選擇和調整,像是超參數。
在調優的過程中,需要明確進行什麼樣的調整,可以達到什麼樣的目的,將各個問題獨立開來,在互不影響的情況下分別進行調優,正交化(Orthogonalization)的解決各個問題。
例如對於監督學習系統,通常需要通過調優,確保模型:
- 能夠在成本函數上很好的擬合訓練集
- 能夠在成本函數上很好的擬合開發集
- 能夠在成本函數上很好的擬合測試集
- 能夠在現實世界的實際問題中也具有很好的性能
當模型不能很好的擬合訓練集:
存在高偏差問題時,解決方法有使用更大的網絡、調整優化算法(如使用Adam)等;
當模型能夠很好的擬合訓練集,但不能很好的擬合開發集時:
說明可能存在過擬合,解決方法有使用正則化、使用更大的訓練集等;
當模型能夠很好的擬合開發集,但不能很好的擬合測試集時:
說明模型可能過調於開發集,可以嘗試使用更大的開發集;
當模型能夠很好的擬合測試集,但在實際問題上性能不佳時:
說明開發集和測試集的分佈不一致,或者使用的成本函數不能準確地衡量實際問題,需要調整開發集或者成本函數。
在進行調優或出現問題時,首先應當定位系統性能的瓶頸或問題的原因,然後選擇合適的方式,避免在解決問題的同時影響到另一個問題,由此可以降低調優過程的複雜度。而前面的提前終止則嘗試同時解決擬合訓練集與避免過度擬合兩個問題,會帶來額外的複雜度。
1-3 單一評估指標
機器學習涉及很多可以選擇的演算法與需要調優的超參數,往往難以在一開始就找到最佳選擇。而使用單一評估指標來對模型性能進行評估,可以立即知道所進行的調整是否有效,有利於提高迭代的效率。
例如使用不同的超參數得到了兩個分類器A與B,為了判斷二者誰更好,比較它們的準確率(Precision)與召回率(Recall)如下表:
分類器 | 準確率 | 召回率 |
A | 95% | 90% |
B | 98% | 85% |
此時,需要找到一個新的評價指標,這個指標能夠綜合準確率與召回率。
常見方法是使用F1分數,即準確率P與召回率R的調和平均數。
1-4 滿足與優化指標
難以將所有評價標準整合到一個指標中,需要分清主次,設定滿足指標(Satisficing Metric)和優化指標(Optimizing Metric)。
例如,對於某個特定問題,我們關心分類器的準確率與執行預測所需的運行時間,此時有三個分類器的性能如下表:
分類器 | 準確率 | 運行時間 |
A | 90% | 80ms |
B | 92% | 95ms |
C | 95% | 1500ms |
若使用加權平均數來綜合準確率與運行時間,而兩者沒有什麼必然的關係,並無說服力。
更合理的做法是,選擇準確率作為優化指標,即希望其最大化;運行時間作為滿足指標。
例如限制運行時間不能大於100 ms,此時分類器C被排除;
在剩下的A和B中,不再關心運行時間,只選擇準確率最大的分類器,即B。
1-5 訓練/開發/測試集分佈
訓練集、開發集、測試集的選擇會極大地影響到模型迭代的效率。
還是以從圖片中識別貓的分類器為例,假設這個應用主要針對以下地區:
- 美國
- 英國
- 其他歐洲地區
- 南美
- 印度
- 中國
- 其他亞洲地區
- 澳大利亞
要從這些地區的資料中選擇開發集與測試集。合理的選擇方式是,先將所有8個地區的資料混合起來,然後再從中分出開發集與測試集,使其倆具有同樣的分佈。
總而言之,開發集與測試集要能夠反映未來實際應用中真正重要的資料且具有相同的分佈。
1-6 開發/測試集大小
現代機器學習領域,使用的資料量有了巨幅的提升。例如有100萬個樣本,此時則應使用98% / 1% / 1% 的比例劃分訓練集、開發集與測試集。雖然開發集與測試集只佔了很小的比例,但由於樣本基數很大,兩者也都有10000個樣本,足夠用於測試。而深度學習往往需要大量的資料,因此要把更多的資料留給訓練集。
測試集用來得到對最終系統性能的無偏估計,其大小只要能給出對系統整體性能的高置信的評估即可,一般不需要特別大。除非要獲得非常精確的系統性能,才需要使用更大的測試集。若不需要對最終系統性能進行評估,則也可以不使用測試集,只劃分訓練集和開發集。
1-7 替換開發/測試集指標
設定測試集與唯一的評價指標,相當於確定所要瞄準的靶子。但有時項目進行到一半,發現靶子放錯地方了,這是就需要重新調整靶子的位置,即替換開發/測試集指標。
例如從圖片中識別貓的分類器,使用分類錯誤率作為評價標準:算法A有3%的錯誤率,算法B有5%的錯誤率,這樣來看算法A 具有更好的性能。但之後通過更細緻的檢查發現...
算法A會誤將一些色情圖片也識別為貓。雖然使用者可以看到更多的貓,但一些色情圖片也會被誤判為貓並推薦,這是不能容忍的。
算法B雖然錯誤率較高,但不會將色情圖片誤判為貓,此時無論從公司還是從使用者的角度,都會選擇算法B。雖然透過錯誤率指標,可以判定A更好,但實際上卻選擇了B。
上面例子使用錯誤率作為評估指標,即:
mdev為開發集樣本數,I為恆等函數,y(i)pred和y(i)分別為第i個樣本的預測與真實標籤,在不等於時為1,反之為0。
在上面例子中使用錯誤率作為評價指標的問題是,錯誤率對於色情圖片和非色情圖片一視同仁:都是計為1次錯誤。而實際中我們不希望出現色情圖片,需要增大將色情圖片分類為貓的懲罰力度,例如添加一個權重w(i),以增大將色情圖片分類為貓的錯誤的權重:
if(色情圖片) w(i)=10 else w(i)=1
當評估指標不再能正確地反映模型的真實性能,不再能給出模型性能的正確排序時,就需對其進行調整,有時還需要調整開發集。
解決上面例子中問題的思路也體現了正交化的思想,即首先定義一個評估指標,然後再考慮如何讓模型在這個指標上獲得更好的性能,這兩個步驟是獨立的、互不影響的。仍使用靶子的比喻來講,就是首先確定要把靶子放在哪裡,然後再考慮如何準確地射中靶子。
當使用開發集與測試集在評估指標上達到很好的效果,並不能保證在實際關心的應用場景也具有很好的效果時,此時也需要修改評價指標與開發/測試集。
1-8 為何要達到人類性能水平?
為的更容易設計與搭建機器學習系統,來解決一些人類也可以解決的問題。
隨著時間的推進,在演算法的性能到達人類水平之前,進展會比較快;
而當演算法性能超過人類水平後,提升速度就會降低,其錯誤率最終會無限接近於貝葉斯錯誤率(Bayes Error Rate),其是可能達到的最佳錯誤率。
e.g.例如一些語音非常不清晰,根本無法識別說的是什麼,因此識別率無法達到100%。
當演算法性能低於人類水平時,透過一些手段可以提升性能:
- 透過人類獲取標記資料,即讓人來標記資料,這樣演算法就有更多的資料用於訓練。
- 透過手工錯誤分析,理解演算法與人類的差距,如讓人來分析算法預測錯誤的樣本,嘗試找出算法預測錯誤的原因。
- 可以更好地分析偏差和方差問題。
而當演算法性能超過人類水平後,就難以透過以上方法來提升演算法的性能了。
1-9 可避免的偏差
透過與人類水平進行比較,才能知道演算法要在訓練集上達到什麼樣的性能才是最佳的。
錯誤率(%) | ||
情況A | 情況B | |
人類 | 1 | 7.5 |
訓練集 | 8 | 8 |
開發集 | 10 | 10 |
對於情況B:訓練集錯誤率與人類錯誤率差不多,提升空間不大;而開發集錯誤率與訓練集錯誤率之間有較大的差距,說明算法不能很好地一般化,需要集中精力降低方差。
從上面的兩個例子可以看出,雖然兩個例子中的訓練集錯誤率與開發集錯誤率都相同,但透過比較人類在具體任務和場景中的水平(或者說是貝葉斯錯誤率) ,我們可以對演算法應該達到的性能做出估計,據此採取不同的手段來提升演算法的性能。訓練集錯誤率與貝葉斯錯誤率之間的差距稱為可避免的偏差(Avoidable Bias)。
1-10 了解人類性能指標
前面使用人類水平的錯誤率作為貝葉斯錯誤率的估計,那麼要如何定義人類水平呢?
例如對於某個識別X光片的任務,人類存在不同的錯誤率:
- 普通人的錯誤率:3%
- 普通醫生的錯誤率:1%
- 有經驗的醫生的錯誤率:0.7%
- 一群有經驗的醫生進行會診的錯誤率:0.5%
雖然不同的人具有不同的錯誤率,但由上面的資料可以知道人類所能達到的最低錯誤率,使用0.5%作為人類水平的錯誤率,即貝葉斯錯誤率的估計。
1-11 超越人類水平的表現
在一些領域中,機器學習算法的性能大幅超過了人類水平,例如線上廣告中預測使用者點擊廣告的機率、進行商品推薦、預測交通/物流耗時、貸款審批等。這些都是從海量的結構化資料中進行學習,演算法所看過的資料量遠遠大於任何人類,電腦更擅長從海量資料中提取統計上的特定模式,其性能更容易超過人類水平。
而對於自然感知上的問題,如電腦視覺、語音識別、自然語言處理等,這是人類非常擅長的領域,要在這些領域超越人類往往更加困難。雖然讓電腦在自然感知的問題上超過人類水平並不容易,但隨著深度學習的發展,對於某些單一的監督學習問題,如語音識別與某些圖像識別,電腦的水平已經可以超過單個人類。
1-12 改善模型性能
監督學習演算法的訓練過程相當於努力完成以下兩個目標:
- 可以非常好的擬合訓練集,相當於可避免的偏差很低。
- 演算法在訓練集上的性能可以一般化到開發集與測試集,相當於方差很低。
透過比較訓練集錯誤率與人類水平(即貝葉斯錯誤率的估計),可以得知可避免的偏差大小,即在訓練集上的性能還有多大的提升空間;
透過比較開發集錯誤率與訓練集錯誤率,可以得知方差的大小,即在一般化能力上還有多大的提升空間。
應用正交化,可以獨立地解決高偏差與高方差的問題。解決高偏差問題的方法有:
- 訓練更大的模型
- 訓練更長時間
- 用更好的優化演算法(如使用動量、RMSprop、Adam等)
- 進行超參數搜索
- 調整神經網路結構(如調整網絡層數、激活函數、使用CNN/RNN等)
解決高方差問題的方法有:
- 獲取更多資料
- 正規化(如L2正規化、Dropout等)
- 進行超參數搜索
- 調整神經網路結構
2-1 進行錯誤分析
- 解決將狗識別為貓的問題
- 解決將大型貓科動物(如獅子、黑豹等)識別為貓的問題
- 提高在模糊圖片上的性能
錯誤分析透過手工檢查在開發集中給出錯誤預測的樣本,對各種錯誤的原因進行統計,可以預估進一步各個方案的潛在收益,決定前進的方向,有時還可以發現新的錯誤類型。
2-2 清除標籤錯誤的資料
比較標籤錯誤資料帶來的錯誤率佔比,決定其處理的優先級。
修復具有標籤錯誤的資料時,建議遵循以下準則:
- 對開發集與測試集應用同樣的處理流程,保證它們來自相同的分佈。
- 考慮同時修復算法預測與標籤一致,但實際上資料標籤有誤的樣本。檢查算法預測與標籤不一致的樣本,從中找出並修復標籤有誤的資料比較容易,但也存在算法預測與標籤相符,而樣本本身的標籤有誤,實際上是算法預測錯誤的情況。這樣做的難度較大,因為需要檢查所有(開發/測試集)資料,而不僅僅是算法預測與標籤不符的一小部分。
- 若只修復了開發集與測試集,而沒有修復訓練集,此時訓練集與開發/測試集就會具有不同的分佈,這是可以接受的,學習演算法足夠克服這一問題。但開發/集合/測試集必須具有相同的分佈。
2-3 快速構建第一個系統後迭代
在構建一個全新的機器學習應用時,往往會面臨很多的選擇和提升系統性能的方向,一個建議是快速構建第一個系統,然後迭代,即:
- 設置開發/測試集與指標
- 快速建立初始系統
- 使用偏差/方差分析與誤差分析以決定後續步驟的優先級
快速構建初始系統的意義在於,訓練中透過各種分析方法與工具快速找到前進的方向。
對於所要解決的問題若你已有豐富經驗,或者對於該問題已經有了大量的研究與文獻可供參考,則也可以利用這些經驗,在初始階段就構建一個複雜的系統。
對於首次接觸的問題,則一開始不必將問題考慮得過於復雜,先快速搭建一個初始的系統,找到努力的方向,進行迭代。
2-4 不同分佈的訓練集與測試集
兩種獲得訓練資料的途徑:
- 使用者實際上傳貓的圖片-通常分辨率不高、拍攝質量也不佳,是我們真正關心的資料,即我們希望應用能在這些圖片上有較好的性能,但數量少,如有1萬個樣本。
- 從網上收集貓的圖片-在網上排名較高的圖片往往具有很高分辨率,由專業攝影師拍攝,質量也很高,且數量龐大,如20萬個樣本。
有兩種做法劃分集合:
訓練集 | 開發集 | 測試集 | |
A、隨機混合在一起 | 205,000 | 2,500 | 2,500 |
B、有意的分配 | 205,000 | 2,500 | 2,500 |
A是混成共21萬筆資料再分配,雖然三集合成相似分佈但不能很好的反映真實性能。
B則是將使用者上傳的圖片做5000, 2500, 2500分佈在各集合,與前述反之。
2-5 不同資料分佈的偏差與方差
前面(1-9)提到透過錯誤率比例能發現偏差與方差的問題,但那是資料分佈相同的狀況。
可以先建立一個訓練-開發集(Training-Dev Set),其中的資料具有與訓練集相同的分佈,但未用於訓練。即隨機從訓練集中抽取一小部分資料不用做訓練。
錯誤率(%) | ||||
A | B | C | D | |
人類 | 趨近0 | 趨近0 | 趨近0 | 趨近0 |
訓練集 | 1 | 1 | 10 | 10 |
訓練-開發集 | 9 | 1.5 | 11 | 11 |
開發集 | 10 | 10 | 12 | 20 |
問題點 | 高方差 | 資料不匹配 | 高偏差 | 高偏差且 資料不匹配 |
2-6 解決資料不匹配
- 透過人工錯誤分析,找出訓練集與開發/測試集之間的差別。
- 讓訓練集中的資料更加一致,或收集更多與開發/測試集相似的資料:可透過人工資料合成(Artificial Data Synthesis)增加更多資料,不過需要注意必須反映真實場景。
2-7 遷移學習(Transfer Learning)
將一個神經網絡從某個任務中習得的知識應用到另一個任務上。
假設訓練了一個用於圖形識別的神經網路,現要將其學到的知識遷移到放射診斷上。
即輸入X光片,輸出診斷結果。
一種做法是移除原網路的輸出層及其參數(上圖ŷ前一層),然後創建一層新的網路,作為新的輸出層,它的輸出為診斷結果。接著對新輸出層的參數進行隨機初始化,使用新任務的資料集,即X光片的作為輸入,重新進行訓練。
- 若新任務的資料集較小,可以只訓練新的輸出層,保持其他各層的參數不變。
- 若資料量足夠,也可以重新訓練其他各層,此時對原圖形識別網路的訓練就稱為預先訓練(Pre-Training),在新的放射診斷的任務上的訓練稱為微調(Fine Tuning)。
如果想要從任務A遷移到任務B,需要滿足:
- 任務A與任務B具有相同的輸入x(如皆為圖片)
- 任務A的可用資料遠多於任務B(任務B中單個樣本的價值需高於任務A中的單個樣本)
- 任務A的低層特徵有益於任務B的學習(如邊緣檢測)
2-8 多目標學習
訓練一個網路來進行多個任務,每一個任務的學習都可能有助於其他任務的學習。
Softmax回歸中每個樣本只能具有多種標籤中的一個,而多目標學習中的每個樣本可以同時具有多個標籤。
使用場景為:
- 所訓練的多個任務具有共同的低層特徵,能互相從學習中獲益。
- (通常)每個任務上能夠使用的資料量很少。
- 能夠訓練一個足夠大的模型,以在各個任務上都具有很好的性能。
2-9 什麼是端到端深度學習?(End-to-End Deep Learning)
一些複雜的學習系統通常具有多個處理階段,其將這些不同的處理階段替換為一個神經網路。
其可以簡化學習系統的結構,不需要人工設計各個組件。但有時並不能帶來理想的性能。
傳統的語音識別 | 端到端深度學習 |
輸入語音資料 | 輸入語音資料 |
從語音中提取一些人工設計的特徵 | 預先使用大量資料訓練的一個非常大的神經網路 |
透過機器學習演算法提取音素(Phoneme) | |
將音素串連成單字 | |
將單字串聯成文本 | |
輸出文本 | 輸出文本 |
2-10 是否使用端到端學習?
優點
- 讓資料說話:使用大量資料訓練的算法能夠更好地發現資料中的統計特徵,從而更好地習得從特徵到標籤的映射,避免引入人類的偏見。
- 更少的人工設計元件:端到端學習直接完成了從初始輸入到預測的整個過程,不再需要人工設計系統中的各個元件與處理步驟。
缺點
- 可能需要非常大量的資料:收集這些資料有一定難度。
- 排除了人工設計的潛在效用:直接從資料中完成全部學習,不使用人工設計的元件,也就排除了人工設計所能帶來的潛在收益。(如人工選擇的特徵、處理步驟等)
人工設計是一把雙面刃,合理的人工設計有助於演算法的學習,但使用人工設計也會在一定程度上限制算法的性能。在資料量較少時,人工設計通常利大於弊。
使用端到端學習決定性因素是:是否有足夠的資料,來習得從x到y的足夠複雜的映射函數。
※絕大部分圖片與內容取自nex3z's blog。
※教材為Andrew Ng的Deep Learning課程。
※擷取至 topic3 week1-2。