深度學習筆記(十)——結構化機器學習項目(機器學習(ML)策略(2))

1.進行誤差分析

舉個例子,貓類識別問題,已經建立的模型的錯誤率爲10%。爲了提高正確率,我們發現該模型會將一些狗類圖片錯誤分類成貓。一種常規解決辦法是擴大狗類樣本,增強模型對夠類(負樣本)的訓練。但是,這一過程可能會花費幾個月的時間,耗費這麼大的時間成本到底是否值得呢?也就是說擴大狗類樣本,重新訓練模型,對提高模型準確率到底有多大作用?這時候我們就需要進行error analysis,幫助我們做出判斷。

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

這種error analysis雖然簡單,但是能夠避免花費大量的時間精力去做一些對提高模型性能收效甚微的工作,讓我們專注解決影響模型正確率的主要問題,十分必要。

這種error analysis可以同時評估多個影響模型性能的因素,通過各自在錯誤樣本中所佔的比例來判斷其重要性。例如,貓類識別模型中,可能有以下幾個影響因素:

  • Fix pictures of dogs being recognized as cats

  • Fix great cats(lions, panthers, etc…) being misrecognized

  • Improve performance on blurry images

通常來說,比例越大,影響越大,越應該花費時間和精力着重解決這一問題。這種error analysis讓我們改進模型更加有針對性,從而提高效率。

2.清楚標註錯誤的數據

監督式學習中,訓練樣本有時候會出現輸出y標註錯誤的情況,即incorrectly labeled examples。如果這些label標錯的情況是隨機性的,一般可以直接忽略,無需修復。然而,如果是系統錯誤,這將降低模型性能。

剛纔說的是訓練樣本中出現incorrectly labeled data,如果是dev/test sets中出現incorrectly labeled data,該怎麼辦呢?

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

  • Overall dev set error: 10%

  • Errors due incorrect labels: 0.6%

  • Errors due to other causes: 9.4%

上面數據表明Errors due incorrect labels所佔的比例僅爲0.6%,佔dev set error的6%,而其它類型錯誤佔dev set error的94%。因此,這種情況下,可以忽略incorrectly labeled data。

如果是下面這種情況:

  • Overall dev set error: 2%

  • Errors due incorrect labels: 0.6%

  • Errors due to other causes: 1.4%

上面數據表明Errors due incorrect labels所佔的比例依然爲0.6%,但是卻佔dev set error的30%,而其它類型錯誤佔dev set error的70%。因此,這種情況下,incorrectly labeled data不可忽略,需要手動修正。

dev set的主要作用是在不同算法之間進行比較,選擇錯誤率最小的算法模型。但是,如果有incorrectly labeled data的存在,當不同算法錯誤率比較接近的時候,無法僅根據Overall dev set error準確指出哪個更好,必須修正incorrectly labeled data。

關於修正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

3.快速搭建你的第一個系統,並進行迭代

對於如何構建一個機器學習應用模型,Andrew給出的建議是先快速構建第一個簡單模型,然後再反覆迭代優化。

  • Set up dev/test set and metric

  • Build initial system quickly

  • Use Bias/Variance analysis & Error analysis to prioritize next steps

4.在不同的劃分上進行訓練並測試

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

這裏寫圖片描述

雖然dev/test set質量不高,但是模型最終主要應用在對這些模糊的照片的處理上。面對train set與dev/test set分佈不同的情況,有兩種解決方法。

第一種方法是將train set和dev/test set完全混合,然後在隨機選擇一部分作爲train set,另一部分作爲dev/test set。例如,混合210000例樣本,然後隨機選擇205000例樣本作爲train set,2500例作爲dev set,2500例作爲test set。這種做法的優點是實現train set和dev/test set分佈一致,缺點是dev/test set中webpages圖片所佔的比重比mobile app圖片大得多。例如dev set包含2500例樣本,大約有2381例來自webpages,只有119例來自mobile app。這樣,dev set的算法模型對比驗證,仍然主要由webpages決定,實際應用的mobile app圖片所佔比重很小,達不到驗證效果。因此,這種方法並不是很好。

第二種方法是將原來的train set和一部分dev/test set組合當成train set,剩下的dev/test set分別作爲dev set和test set。例如,200000例webpages圖片和5000例mobile app圖片組合成train set,剩下的2500例mobile app圖片作爲dev set,2500例mobile app圖片作爲test set。其關鍵在於dev/test set全部來自於mobile app。這樣保證了驗證集最接近實際應用場合。這種方法較爲常用,而且性能表現比較好。

5.不匹配數據劃分的偏差和方差

根據human-level error、training error和dev error的相對值可以判定是否出現了bias或者variance。但是,如果train set和dev/test set來源於不同分佈,則無法直接根據相對值大小來判斷。例如某個模型human-level error爲0%,training error爲1%,dev error爲10%。根據我們之前的理解,顯然該模型出現了variance。但是,training error與dev error之間的差值9%可能來自算法本身(variance),也可能來自於樣本分佈不同。比如dev set都是很模糊的圖片樣本,本身就難以識別,跟算法模型關係不大。因此不能簡單認爲出現了variance。

在可能伴有train set與dev/test set分佈不一致的情況下,定位是否出現variance的方法是設置train-dev set。從原來的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之間的差值關係和反映的問題:

這裏寫圖片描述

一般情況下,human-level error、training error、training-dev error、dev error以及test error的數值是遞增的,但是也會出現dev error和test error下降的情況。這主要可能是因爲訓練樣本比驗證/測試樣本更加複雜,難以訓練。

6.定位數據不匹配

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

關於如何解決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

總而言之,就是找出訓練集和開發/測試集的不同,並儘量使他們相同。

7.遷移學習

深度學習非常強大的一個功能之一就是有時候你可以將已經訓練好的模型的一部分知識(網絡結構)直接應用到另一個類似模型中去。比如一個已經訓練好的貓類識別的神經網絡模型,可以直接把該模型中的一部分網絡結構應用到使用X光片預測疾病的模型中去。這種學習方法被稱爲遷移學習(Transfer Learning)。

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

這裏寫圖片描述

遷移學習需要重新訓練權重係數,如果新模型的樣本數量較少,那麼只訓練輸出層的權重係數,保持其它層所有的權重係數不變。如果樣本數量足夠多,那麼也可以只保留網絡結構,重新訓練所有層的權重係數。這種做法使得模型更加精確,因爲畢竟樣本對模型的影響最大。選擇哪種方法通常由數據量決定。

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

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

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

這裏寫圖片描述

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

  • 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.

8.多任務學習

遷移學習是串行的,模型從A遷移到B;多任務學習是構建神經網絡同時執行多個任務。這跟二元分類或者多元分類都不同,多任務學習類似將多個神經網絡融合在一起,用一個網絡模型來實現多種分類效果。如果有C個,那麼輸出y的維度是(C,1)。例如汽車自動駕駛中,需要實現的多任務爲行人、車輛、交通標誌和信號燈。如果檢測出汽車和交通標誌,則y爲:

y= \left[ \begin{matrix} 0\\ 1\\ 1\\ 0 \end{matrix} \right]

多任務學習模型的cost function爲:

\frac1m\sum_{i=1}^m\sum_{j=1}^cL(\hat y_j^{(i)},y_j^{(i)})

其中,j表示任務下標,總有c個任務。對應的loss function爲:

L(\hat y_j^{(i)},y_j^{(i)})=-y_j^{(i)}log\ \hat y_j^{(i)}-(1-y_j^{(i)})log\ (1-\hat y_j^{(i)})

值得一提的是,Multi-task learning與Softmax regression的區別在於Softmax regression是single label的,即輸出向量y只有一個元素爲1;而Multi-task learning是multiple labels的,即輸出向量y可以有多個元素爲1。

多任務學習是使用單個神經網絡模型來實現多個任務。實際上,也可以分別構建多個神經網絡來實現。但是,如果各個任務之間是相似問題(例如都是圖片類別檢測),則可以使用多任務學習模型。另外,多任務學習中,可能存在訓練樣本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.

遷移學習和多任務學習在實際應用中,遷移學習使用得更多一些。

9.什麼是端到端的深度學習

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

以語音識別爲例,傳統的算法流程和end-to-end模型的區別如下:

這裏寫圖片描述

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

10.是否要使用端到端的深度學習

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

優點:

  • Let the data speak

  • Less hand-designing of components needed

缺點:

  • May need large amount of data

  • Excludes potentially useful hand-designed

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章