1. 程式人生 > >結構化機器學習專案——機器學習(8)

結構化機器學習專案——機器學習(8)

1.ML策略

當我們最初得到一個深度神經網路模型時,我們可能希望從很多方面來對它進行優化,例如:

  • Collect more data

  • Collect more diverse training set

  • Train algorithm longer with gradient descent

  • Try Adam instead of gradient descent

  • Try bigger network

  • Try smaller network

  • Try dropout

  • Add L2 regularization

  • Network architecture: Activation functions, #hidden units…

可選擇的方法很多,也很複雜、繁瑣。盲目選擇、嘗試不僅耗費時間而且可能收效甚微。因此,使用快速、有效的策略來優化機器學習模型是非常必要的。

2.正交化

機器學習中有許多引數、超引數需要除錯。通過每次只調試一個引數,保持其它引數不變,而得到的模型某一效能改變是一種最常用的調參策略,我們稱之為正交化方法(Orthogonalization)

Orthogonalization的核心在於每次除錯一個引數只會影響模型的某一個性能。例如老式電視機旋鈕,每個旋鈕就對應一個功能,調整旋鈕會調整對應的功能,而不會影響其它功能。也就是說彼此旋鈕之間是互不影響的,是正交的,這也是Orthogonalization名稱的由來。這種方法能夠讓我們更快更有效地進行機器學習模型的除錯和優化。

對應到機器學習監督式學習模型中,可以大致分成四個獨立的“功能”,每個“功能”對應一些可調節的唯一的旋鈕。四個“功能”及對應“旋鈕”如下:

  • Fit training set well on cost function     \rightarrow優化訓練集可以通過使用更復雜NN,使用Adam等優化演算法來實現

  • Fit dev set well on cost function     \rightarrow優化驗證集可以通過正則化,採用更多訓練樣本來實現

  • Fit test set well on cost function    \rightarrow優化測試集可以通過使用更多的驗證集樣本來實現

  • Performs well in real world    \rightarrow

    提升實際應用模型可以通過更換驗證集,使用新的cost function來實現

這些調節方法(旋鈕)只會對應一個“功能”,是正交的。

順便提一下,early stopping在模型功能除錯中並不推薦使用。因為early stopping在提升驗證集效能的同時降低了訓練集的效能。也就是說early stopping同時影響兩個“功能”,不具有獨立性、正交性。

3.評估指標

單一數字評估指標

滿意和優化指標

4.訓練、驗證、測試集的劃分

Train/dev/test sets如何設定對機器學習的模型訓練非常重要,合理設定能夠大大提高模型訓練效率和模型質量。

原則上應該儘量保證dev sets和test sets來源於同一分佈且都反映了實際樣本的情況。如果dev sets和test sets不來自同一分佈,那麼我們從dev sets上選擇的“最佳”模型往往不能夠在test sets上表現得很好。這就好比我們在dev sets上找到最接近一個靶的靶心的箭,但是我們test sets提供的靶心卻遠遠偏離dev sets上的靶心,結果這支肯定無法射中test sets上的靶心位置。

在之前的課程中我們已經介紹過,當樣本數量不多(小於一萬)的時候,通常將Train/dev/test sets的比例設為60%/20%/20%,在沒有dev sets的情況下,Train/test sets的比例設為70%/30%。當樣本數量很大(百萬級別)的時候,通常將相應的比例設為98%/1%/1%或者99%/1%。

對於dev sets數量的設定,應該遵循的準則是通過dev sets能夠檢測不同演算法或模型的區別,以便選擇出更好的模型。

對於test sets數量的設定,應該遵循的準則是通過test sets能夠反映出模型在實際中的表現

實際應用中,可能只有train/dev sets,而沒有test sets。這種情況也是允許的,只要演算法模型沒有對dev sets過擬合。但是,條件允許的話,最好是有test sets,實現無偏估計。

5.什麼時候可以改變驗證、測試集和指標

演算法模型的評價標準有時候需要根據實際情況進行動態調整,目的是讓演算法模型在實際應用中有更好的效果。

舉個貓類識別的例子。初始的評價標準是錯誤率,演算法A錯誤率為3%,演算法B錯誤率為5%。顯然,A更好一些。但是,實際使用時發現演算法A會通過一些色情圖片,但是B沒有出現這種情況。從使用者的角度來說,他們可能更傾向選擇B模型,雖然B的錯誤率高一些。這時候,我們就需要改變之前單純只是使用錯誤率作為評價標準,而考慮新的情況進行改變。例如增加色情圖片的權重,增加其代價。

概括來說,機器學習可分為兩個過程:

  • Define a metric to evaluate classifiers

  • How to do well on this metric

也就是說,第一步是找靶心,第二步是通過訓練,射中靶心。但是在訓練的過程中可能會根據實際情況改變演算法模型的評價標準,進行動態調整。

另外一個需要動態改變的情況是dev/test sets與實際使用的樣本分佈不一致。比如貓類識別樣本影象解析度差異,這個時候就需要改變驗證測試集。

6.human-level performance

圖中,橫座標是訓練時間,縱座標是準確性。機器學習模型經過訓練會不斷接近human-level performance甚至超過它。但是,超過human-level performance之後,準確性會上升得比較緩慢,最終不斷接近理想的最優情況,我們稱之為bayes optimal error(葉貝絲優化誤差)。理論上任何模型都不能超過它,bayes optimal error代表了最佳表現。

實際上,human-level performance在某些方面有不俗的表現。例如影象識別、語音識別等領域,人類是很擅長的。所以,讓機器學習模型效能不斷接近human-level performance非常必要也做出很多努力:

  • Get labeled data from humans.

  • Gain insight from manual error analysis: Why did a person get this right?

  • Better analysis of bias/variance.

偏差和方差

實際應用中,要看human-level error,training error和dev error的相對值。例如貓類識別的例子中,如果human-level error為1%,training error為8%,dev error為10%。由於training error與human-level error相差7%,dev error與training error只相差2%,所以目標是儘量在訓練過程中減小training error,即減小偏差bias。如果圖片很模糊,肉眼也看不太清,human-level error提高到7.5%。這時,由於training error與human-level error只相差0.5%,dev error與training error只相差2%,所以目標是儘量在訓練過程中減小dev error,即方差variance。這是相對而言的。

對於物體識別這類CV問題,human-level error是很低的,很接近理想情況下的bayes optimal error。因此,上面例子中的1%和7.5%都可以近似看成是兩種情況下對應的bayes optimal error。實際應用中,我們一般會用human-level error代表bayes optimal error。

通常,我們把training error與human-level error之間的差值稱為bias,也稱作avoidable bias;把dev error與training error之間的差值稱為variance。根據bias和variance值的相對大小,可以知道演算法模型是否發生了欠擬合或者過擬合。

理解 human-level performance

我們說過human-level performance能夠代表bayes optimal error。但是,human-level performance如何定義呢?舉個醫學影象識別的例子,不同人群的error有所不同:

  • Typical human : 3% error

  • Typical doctor : 1% error

  • Experienced doctor : 0.7% error

  • Team of experienced doctors : 0.5% error

不同人群他們的錯誤率不同。一般來說,我們將表現最好的那一組,即Team of experienced doctors作為human-level performance。那麼,這個例子中,human-level error就為0.5%。但是實際應用中,不同人可能選擇的human-level performance基準是不同的,這會帶來一些影響。

假如該模型training error為0.7%,dev error為0.8。如果選擇Team of experienced doctors,即human-level error為0.5%,則bias比variance更加突出。如果選擇Experienced doctor,即human-level error為0.7%,則variance更加突出。也就是說,選擇什麼樣的human-level error,有時候會影響bias和variance值的相對變化。當然這種情況一般只會在模型表現很好,接近bayes optimal error的時候出現。越接近bayes optimal error,模型越難繼續優化,因為這時候的human-level performance可能是比較模糊難以準確定義的。

超過 human-level performance

對於自然感知類問題,例如視覺、聽覺等,機器學習的表現不及人類。但是在很多其它方面,機器學習模型的表現已經超過人類了,包括:

  • Online advertising

  • Product recommendations

  • Logistics(predicting transit time)

  • Loan approvals

實際上,機器學習模型超過human-level performance是比較困難的。但是隻要提供足夠多的樣本資料,訓練複雜的神經網路,模型預測準確性會大大提高,很有可能接近甚至超過human-level performance。值得一提的是當演算法模型的表現超過human-level performance時,很難再通過人的直覺來解決如何繼續提高演算法模型效能的問題。

7.改善模型表現

提高機器學習模型效能主要要解決兩個問題:avoidable bias和variance。我們之前介紹過,training error與human-level error之間的差值反映的是avoidable bias,dev error與training error之間的差值反映的是variance。

解決avoidable bias的常用方法包括:

  • Train bigger model

  • Train longer/better optimization algorithms: momentum, RMSprop, Adam

  • NN architecture/hyperparameters search

解決variance的常用方法包括:

  • More data

  • Regularization: L2, dropout, data augmentation

  • NN architecture/hyperparameters search

8.誤差分析

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

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

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

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

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

  • 把狗錯誤識別成貓

  • 把大型貓科動物錯誤識別成貓

  • 模糊影象造成的錯誤識別

可以從錯誤樣本中隨機選取100個樣本人工​​​​​​統計這些錯誤的所佔比例:

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

清除錯誤標記資料

監督式學習中,訓練樣本有時候會出現輸出y標註錯誤的情況,即incorrectly labeled examples。如果這些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,還是可以忽略。舉例說明,若:

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

如果優化DL演算法後,出現下面這種情況:

  • 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,有幾條建議:

  • 當你修正驗證集式一定也要修正測試集,要保證兩個資料集仍處於同一分佈

  • 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(訓練集可以不修正)

9.構建機器學習模型

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

  • Set up dev/test set and metric

  • Build initial system quickly

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

10.不同分佈的訓練、測試集

當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。

雖然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。這樣保證了驗證集最接近實際應用場合。這種方法較為常用,而且效能表現比較好。

如何解決train set與dev/test set樣本分佈不一致的問題

我們之前介紹過,根據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。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之間的差值關係和反映的問題:

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

關於如何解決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上人工新增背景噪聲,合成類似實際場景的聲音。這樣會讓模型訓練的效果更準確。但是,需要注意的是,我們不能給每段語音都增加同一段背景噪聲,這樣會出現對背景噪音的過擬合,效果不佳。這就是人工資料合成需要注意的地方。

11.遷移學習

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

如果我們已經有一個訓練好的神經網路,用來做影象識別。現在,我們想要構建另外一個通過X光片進行診斷的模型。遷移學習的做法是無需重新構建新的模型,而是利用之前的神經網路模型,只改變樣本輸入、輸出以及輸出層的權重係數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],這一過程稱為pre-training。之後,不斷除錯、優化W[l], b[l]的過程稱為fine-tuning。pre-training和fine-tuning分別對應上圖中的黑色箭頭和紅色箭頭。

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

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

12.多工學習

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

順便提一下,遷移學習和多工學習在實際應用中,遷移學習使用得更多一些。

13.端到端的深度學習

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

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

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

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

優點:

  • Let the data speak

  • Less hand-designing of components needed

缺點:

  • May need large amount of data

  • Excludes potentially useful hand-designed