對已經創建的機器學習模型進行錯誤分析(error analysis)十分必要,並且有針對性地、正確地進行error analysis更加劇要。web
舉個例子,貓類識別問題,已經創建的模型的錯誤率爲10%。爲了提升正確率,咱們發現該模型會將一些狗類圖片錯誤分類成貓。一種常規解決辦法是擴大狗類樣本,加強模型對夠類(負樣本)的訓練。可是,這一過程可能會花費幾個月的時間,耗費這麼大的時間成本究竟是否值得呢?也就是說擴大狗類樣本,從新訓練模型,對提升模型準確率到底有多大做用?這時候咱們就須要進行error analysis,幫助咱們作出判斷。算法
方法很簡單,咱們能夠從分類錯誤的樣本中統計出狗類的樣本數量。根據狗類樣本所佔的比重,判斷這一問題的重要性。假如狗類樣本所佔比重僅爲5%,即時咱們花費幾個月的時間擴大狗類樣本,提高模型對其識別率,改進後的模型錯誤率最多隻會下降到9.5%。相比以前的10%,並無顯著改善。咱們把這種性能限制稱爲ceiling on performance。相反,假如錯誤樣本中狗類所佔比重爲50%,那麼改進後的模型錯誤率有望下降到5%,性能改善很大。所以,值得去花費更多的時間擴大狗類樣本。網絡
這種error analysis雖然簡單,可是可以避免花費大量的時間精力去作一些對提升模型性能收效甚微的工做,讓咱們專一解決影響模型正確率的主要問題,十分必要。app
這種error analysis能夠同時評估多個影響模型性能的因素,經過各自在錯誤樣本中所佔的比例來判斷其重要性。例如,貓類識別模型中,可能有如下幾個影響因素:dom
一般來講,比例越大,影響越大,越應該花費時間和精力着重解決這一問題。這種error analysis讓咱們改進模型更加有針對性,從而提升效率。機器學習
監督式學習中,訓練樣本有時候會出現輸出y標註錯誤的狀況,即incorrectly labeled examples。若是這些label標錯的狀況是隨機性的(random errors),DL算法對其包容性是比較強的,即健壯性好,通常能夠直接忽略,無需修復。然而,若是是系統錯誤(systematic errors),這將對DL算法形成影響,下降模型性能。ide
剛纔說的是訓練樣本中出現incorrectly labeled data,若是是dev/test sets中出現incorrectly labeled data,該怎麼辦呢?性能
方法很簡單,利用上節內容介紹的error analysis,統計dev sets中全部分類錯誤的樣本中incorrectly labeled data所佔的比例。根據該比例的大小,決定是否須要修正全部incorrectly labeled data,仍是能夠忽略。舉例說明,若:學習
上面數據代表Errors due incorrect labels所佔的比例僅爲0.6%,佔dev set error的6%,而其它類型錯誤佔dev set error的94%。所以,這種狀況下,能夠忽略incorrectly labeled data。測試
若是優化DL算法後,出現下面這種狀況:
上面數據代表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,有幾條建議:
對於如何構建一個機器學習應用模型,Andrew給出的建議是先快速構建第一個簡單模型,而後再反覆迭代優化。
當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。這樣保證了驗證集最接近實際應用場合。這種方法較爲經常使用,並且性能表現比較好。
咱們以前介紹過,根據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樣本分佈不一致的問題,有兩條建議:
爲了讓train set與dev/test set相似,咱們可使用人工數據合成的方法(artificial data synthesis)。例如說話人識別問題,實際應用場合(dev/test set)是包含背景噪聲的,而訓練樣本train set極可能沒有背景噪聲。爲了讓train set與dev/test set分佈一致,咱們能夠在train set上人工添加背景噪聲,合成相似實際場景的聲音。這樣會讓模型訓練的效果更準確。可是,須要注意的是,咱們不能給每段語音都增長同一段背景噪聲,這樣會出現對背景噪音的過擬合,效果不佳。這就是人工數據合成須要注意的地方。
深度學習很是強大的一個功能之一就是有時候你能夠將已經訓練好的模型的一部分知識(網絡結構)直接應用到另外一個相似模型中去。好比咱們已經訓練好一個貓類識別的神經網絡模型,那麼咱們能夠直接把該模型中的一部分網絡結構應用到使用X光片預測疾病的模型中去。這種學習方法被稱爲遷移學習(Transfer Learning)。
遷移學習之因此能這麼作的緣由是,神經網絡淺層部分可以檢測出許多圖片固有特徵,例如圖像邊緣、曲線等。使用以前訓練好的神經網絡部分結果有助於咱們更快更準確地提取X光片特徵。兩者處理的都是圖片,而圖片處理是有相同的地方,第一個訓練好的神經網絡已經幫咱們實現如何提取圖片有用特徵了。 所以,即使是即將訓練的第二個神經網絡樣本數目少,仍然能夠根據第一個神經網絡結構和權重係數獲得健壯性好的模型。
遷移學習能夠保留原神經網絡的一部分,再添加新的網絡層。具體問題,具體分析,能夠去掉輸出層後再增長額外一些神經層。
整體來講,遷移學習的應用場合主要包括三點:
顧名思義,多任務學習(multi-task learning)就是構建神經網絡同時執行多個任務。這跟二元分類或者多元分類都不一樣,多任務學習相似將多個神經網絡融合在一塊兒,用一個網絡模型來實現多種分類效果。若是有C個,那麼輸出y的維度是(C,1)。例如汽車自動駕駛中,須要實現的多任務爲行人、車輛、交通標誌和信號燈。若是檢測出汽車和交通標誌,則y爲:
多任務學習模型的cost function爲:
其中,j表示任務下標,總有c個任務。對應的loss function爲:
值得一提的是,Multi-task learning與Softmax regression的區別在於Softmax regression是single label的,即輸出向量y只有一個元素爲1;而Multi-task learning是multiple labels的,即輸出向量y能夠有多個元素爲1。
多任務學習是使用單個神經網絡模型來實現多個任務。實際上,也能夠分別構建多個神經網絡來實現。可是,若是各個任務之間是類似問題(例如都是圖片類別檢測),則可使用多任務學習模型。另外,多任務學習中,可能存在訓練樣本Y某些label空白的狀況,這並不影響多任務模型的訓練。
整體來講,多任務學習的應用場合主要包括三點:
順便提一下,遷移學習和多任務學習在實際應用中,遷移學習使用得更多一些。
端到端(end-to-end)深度學習就是將全部不一樣階段的數據處理系統或學習系統模塊組合在一塊兒,用一個單一的神經網絡模型來實現全部的功能。它將全部模塊混合在一塊兒,只關心輸入和輸出。
以語音識別爲例,傳統的算法流程和end-to-end模型的區別以下:
若是訓練樣本足夠大,神經網絡模型足夠複雜,那麼end-to-end模型性能比傳統機器學習分塊模型更好。實際上,end-to-end讓神經網絡模型內部去自我訓練模型特徵,自我調節,增長了模型總體契合度。
end-to-end深度學習有優勢也有缺點。
優勢:
缺點: