Structuring Machine Learning Projects — week 2

Kevin Chiu
CodingJourney
Published in
4 min readAug 3, 2019

Week 2: ML Strategy(2)

上一篇 : week 1

  1. Error Analysis: 錯誤分析
  2. Mismatched training and dev/test set: 當training and dev/test set來自不同資料分佈
  3. Learning from multiple tasks: 遷移學習 & 多任務學習
  4. End-to-end deep learning: 端對端學習分析

1-1. Carrying out error analysis (錯誤分析)

Error analysis是指當模型預測準確度低於人類表現時,我們自行檢查演算法所犯的錯誤,修改模型的流程,進而提升準確度的過程。

對已經建立的機器學習模型進行錯誤分析(error analysis)十分必要,而且有針對性地、正確地進行error analysis更加重要。

舉個例子,貓類識別問題,已經建立的模型的錯誤率為10%。

其中,我們發現該模型會將一些狗類圖片錯誤分類成貓。

常見的解決辦法是擴大狗類樣本,增強模型對狗類(負樣本)的訓練。但是,這一過程可能會花費幾個月的時間,花費這麼多的時間成本是否值得呢?也就是說擴大狗類樣本,重新訓練模型,對提高模型準確率到底有多大作用?

這時候我們就需要進行error analysis,幫助我們做出判斷。

方法很簡單,我們可以從分類錯誤的樣本中統計出狗類的樣本數量(例如選出其中100個被mislabeled的樣本,找出裡面是狗類樣本的比重)。並根據狗類樣本所佔的比重,判斷這一問題的重要性。假如狗類樣本所佔比重僅為5%,即時我們花費很多時間擴大狗類樣本,提升模型對其識別率,改進後的模型錯誤率最多只會降低到9.5%。相比之前的10%,並沒有顯著改善。我們把這種性能限制稱為ceiling on performance。相反,假如錯誤樣本中狗類所佔比重為50%,那麼改進後的模型錯誤率有望降低到5%,性能改善很大。因此,值得去花費更多的時間擴大狗類樣本。

當然也不只有上面的辦法能增進貓類識別器的效能,也包含大貓圖片、模糊圖片都可能造成分類器正確率降低,下圖為各個error analysis的範例。

下圖可以知道Blurry和大貓圖片是造成分類錯誤最大的原因,可能就可以先從這些著手改進模型。

1-2. Cleaning up incorrectly labeled data

在Supervised Learning中,我們會需要標明X.Y資料的Label,但常有機會是訓練樣本有時候會出現輸出y標註錯誤的情況,即incorrectly labeled examples(例如資料為狗圖但Y label標示成是貓)。

如果這些label標錯的情況是隨機性的(random errors),DL算法對其包容性是比較強的,一般可以直接忽略,無需修復。然而,如果是系統錯誤(systematic errors),這將對DL算法造成影響,降低模型性能。

上面提到的情況都是訓練樣本中出現incorrectly labeled data,那如果是在dev/test sets中出現incorrectly labeled data,該怎麼辦呢?

方法很簡單,利用上節內容介紹的error analysis,統計dev sets中所有分類錯誤的樣本中incorrectly labeled data所佔的比例。根據該比例的大小,決定是否需要修正所有incorrectly labeled data,還是可以忽略。

從下圖可以看到,dev分類錯誤的比例為10%,incorrect labeled造成分類錯誤的比例為其中6%,可以得到一張圖片因為incorrect labeled 分類錯誤的機率為0.6%。再根據這0.6%來跟其他分類錯誤原因比較來看是否值得花時間來修正以改進模型準確度。

關於修正incorrect dev/test set data,有下列建議:

  • Apply same process to your dev and test sets to make sure they continue to come from the same distribution
  • Consider examining examples your algorithm got right as well as ones it got wrong
  • Train and dev/test data may now come from slightly different distributions

1-3. Build your first system quickly then iterate

要怎麼快速建構一個學習模型?

拿語音辨識來當例子,建立一個語音辨識模型會有如下圖很多個面向需要顧及並訓練,但在最一開始建立模型是要怎麼選擇呢?

Andrew的建議是先快速構建第一個簡單模型,然後再反覆迭代優化,並在優化過程針對不同問題進行訓練。

  • Set up dev/test set and metric
  • Build initial system quickly
  • Use Bias/Variance analysis & Error analysis to prioritize next steps

2-1. Training and testing on different distribution

當train set與dev/test set不來自同一個分佈的時候,我們應該如何解決這一問題,構建準確的機器學習模型呢?

以貓類識別模型為例子,train set的來源是網絡下載(webpages),圖片比較清晰;dev/test set來自用戶手機拍攝(mobile app),圖片比較模糊。假如train set的大小為200000,而dev/test set的大小為10000,顯然train set要遠遠大於dev/test set。

要怎麼解決這個問題呢?

第一種方法是將train set和dev/test set完全混合,然後在隨機選擇一部分作為train set,另一部分作為dev/test set。這個方法缺點是 dev set的算法模型對比驗證,仍然主要由webpages決定,而不是實際應用的mobile app圖片(我們較在意的,所佔比重很小),達不到驗證效果。

第二種方法是將原來的train set和一部分dev/test set組合當成train set,剩下的dev/test set分別作為dev set和test set。這個方法保證了驗證集最接近實際應用場合,因此較為常用,而且表現較好。

2-2 Bias and Variance with mismatched data distributions

之前介紹過,根據human-level error、training error和dev error的相對值可以判定是否出現了bias或者variance。但需要注意的一點是,如果train set和dev/test set來自於不同分佈,則無法直接根據相對值大小來判斷。

在可能有train set與dev/test set分佈不一致的情況下,要判斷是否出現variance的方法是設置train-dev set。 Andrew給train-dev set的定義是:“Same distribution as training set, but not used for training.”也就是說,從原來的train set中分割出一部分作為train-dev set,train-dev set不作為訓練模型使用,而是與dev set一樣用於驗證。

這樣,我們就有training error、training-dev error和dev error三種error。其中,training error與training-dev error的差值反映了variance;training-dev error與dev error的差值反映了data mismatch problem,即樣本分佈不一致。

舉例說明(如下圖),如果training error為1%,training-dev error為9%,dev error為10%,則variance問題比較突出。如果training error為1%,training-dev error為1.5%,dev error為10%,則data mismatch problem比較突出。通過引入train-dev set,能夠比較準確地定位出現了variance還是data mismatch。

總結human-level error、training error、training-dev error、dev error以及test error之間的差值關係和反映的問題:

取自Coursera吳恩達《構建機器學習項目》課程筆記(2)

下面以透過聲音啟動的Rear-view mirror(後照鏡)作為例子:

2-3. Addressing data mismatch

關於如何解決train set與dev/test set樣本分佈不一致的問題,有下列建議:

  • Carry out manual error analysis to try to understand difference between training dev/test sets
  • Make training data more similar; or collect more data similar to dev/test sets

為了讓train set與dev/test set類似,我們可以使用人工數據合成的方法(artificial data synthesis)。例如說話人識別問題,實際應用場合(dev/test set)是包含背景噪聲的,而訓練樣本train set很可能沒有背景噪聲。為了讓train set與dev/test set分佈一致,我們可以在train set上人工添加背景噪聲,合成類似實際場景的聲音。這樣會讓模型訓練的效果更準確。但是,需要注意的是,我們不能給每段語音都增加同一段背景噪聲,這樣會出現對背景噪音的過擬合(over-fit),效果不佳。這就是人工數據合成需要注意的地方。

3-1. Transfer learning

深度學習非常強大的一個功能之一就是有時候你可以將已經訓練好的模型的一部分知識(網絡結構)直接應用到另一個類似模型中去。

比如我們已經訓練好一個貓類識別的神經網絡模型,那麼我們可以直接把該模型中的一部分網絡結構應用到使用X光片預測疾病的模型中去。這種學習方法被稱為遷移學習(Transfer Learning)。

假設我們已經有一個訓練好的神經網絡,用來做圖像辨識。現在,我們想要構建另外一個通過X光片進行診斷的模型。遷移學習的做法是無需重新構建新的模型,而是利用之前的神經網絡模型,只改變樣本輸入、輸出以及輸出層的權重係數W[L], b[L]W^{[L]}, \ b^{[L]}。

也就是說對新的樣本(X,Y),重新訓練輸出層權重係數W[L], b[L]W^{[L]},\ b^{[L]},而其它層所有的權重係數W[l], b[l]W^{[l]},\ b^{[l]}保持不變。

遷移學習,重新訓練權重係數,如果需要構建新模型的樣本數量較少,那麼可以像剛才所說的,只訓練輸出層的權重係數 W[L] , b[L],保持其它層所有的權重係數 W[l] , b[l]不變。這種做法相對來說比較簡單。

如果樣本數量足夠多,那麼也可以只保留網絡結構,重新訓練所有層的權重係數。這種做法使得模型更加精確,因為畢竟樣本對模型的影響最大。選擇哪種方法通常由數據量決定。

順便提一下,如果重新訓練所有權重係數,初始 W[l] , b[l]由之前的模型訓練得到,這一過程稱為pre-training。之後,不斷嘗試、優化 W[l] , b[l] 的過程稱為fine-tuning。Pre-training和fine-tuning分別對應上圖中的黑色箭頭和紅色箭頭。

遷移學習之所以能這麼做的原因是,神經網絡淺層部分能夠檢測出許多圖片固有特徵,例如圖像邊緣、曲線等。使用之前訓練好的神經網絡部分結果有助於我們更快更準確地提取X光片特徵。二者處理的都是圖片,而圖片處理是有相同的地方,第一個訓練好的神經網絡已經幫我們實現如何提取圖片有用特徵了。因此,即便是即將訓練的第二個神經網絡樣本數目少,仍然可以根據第一個神經網絡結構和權重係數得到健壯性好的模型。

遷移學習可以保留原神經網絡的一部分,再添加新的網絡層。具體問題,具體分析,可以去掉輸出層後再增加額外一些神經層。

Andrew舉了image recognition和speech recognition作為Transfer learning的範例

總結來說,遷移學習的應用場合主要包括三點:

  • Task A and B have the same input x.
  • You have a lot more data for Task A than Task B.
  • Low level features from A could be helpful for learning B.

3-2. Multi-task learning

多任務學習(multi-task learning)就是構建神經網絡同時執行多個任務。這跟二元分類或者多元分類都不同,多任務學習類似將多個神經網絡融合在一起,用一個網絡模型來實現多種分類效果。如果有C個,那麼輸出y的維度是(C,1)。例如汽車自動駕駛中,需要實現的多任務為行人、車輛、交通標誌和信號燈,在一張圖片中辨識出多個標籤(one image ->multi labels)。

多任務學習是使用單個神經網絡模型來實現多個任務。實際上,也可以分別構建多個神經網絡來實現。但是,如果各個任務之間是相似問題(例如都是圖片類別檢測),則可以使用多任務學習模型。另外,多任務學習中,可能存在訓練樣本Y某些label空白的情況(如上圖的矩陣),這並不影響多任務模型的訓練。

總體來說,多任務學習的應用場合主要包括三點:

  • Training on a set of tasks that could benefit from having shared lower-level features.
  • Usually: Amount of data you have for each task is quite similar.
  • Can train a big enough neural network to do well on all the tasks.

遷移學習和多任務學習在實際應用比較,遷移學習使用得更多一些,多任務學習目前多應用在電腦視覺(CV)的物件偵測上。

4-1. What is end-to-end deep learning?

端到端(end-to-end)深度學習就是將所有不同階段的數據處理系統或學習系統模塊組合在一起,用一個單一的神經網絡模型來實現所有的功能。

它將所有模塊混合在一起,只關心輸入和輸出。以語音識別為例,傳統的算法流程(上圖)和end-to-end模型(下圖)的區別如下:

如果訓練樣本足夠大,神經網絡模型足夠複雜,那麼end-to-end模型性能比傳統機器學習分塊模型更好。實際上,end-to-end讓神經網絡模型內部去自我訓練模型特徵,自我調節,增加了模型整體契合度。

但不是所有情況都適合端對端的應用

以人臉辨識作為範例:

第一個方法是端對端直接辨識,但會造成一些角度或方向上的人臉誤差的問題(資料量不夠來直接應用在端對端)

第二個方法是將人臉辨識分成兩部分: (1)找出臉的區塊 (2)放大並辨識

這時方法二的準確率會相對更高

分別以1.機器翻譯(Machine Translation) 2.透過X光預估孩童年齡作為例子

1. 將英文翻譯成法文便適合以端對端方法來進行翻譯 (因為有足夠多英文轉換法文的data)

2. 資料量尚不足以直接透過X光判斷孩童年齡

4-2. Whether to use end-to-end deep learning

介紹完end-to-end deep learning,我們要更了解什麼時候適合使用

End-to-end深度學習有優點也有缺點:

優點:

  • Let the data speak
  • Less hand-designing of components needed

缺點:

  • May need large amount of data
  • Excludes potentially useful hand-designed

自駕車為例,端對端深度學習模型並不適合應用。

因為自駕車會使用到多個模型及模組,例如辨識路人、車輛...,移動路徑規劃(例如其他車輛和行人的移動,Andrew特別提到這部分不是由深度學習所控制,而是一門robotic的課稱為"Motion Planning, 移動規劃"),控制剎車油門...等等。

--

--