誤差分析(Error Analysis)
假設你正在通過神經(jīng)網(wǎng)絡構建一個貓分類器,在經(jīng)過訓練數(shù)據(jù)集訓練后,使用調(diào)整集進行調(diào)整的時候發(fā)現(xiàn)算法的出錯率是 10%,其中有很多狗的照片被錯誤的分類成貓。此時,你是否應該集中精力攻克算法對于狗照片的誤識別問題?更極端的,是否干脆直接用接下來的幾個月去做一個狗的分類器?
得出這個問題的答案不應該僅僅依靠直覺或是他人的建議,而是應該試著分析 100 張調(diào)整數(shù)據(jù)集中被錯誤分類的圖片,統(tǒng)計其中由于錯誤的將狗的照片分類導致的誤差的概率:
如果這 100 張照片中只有 5 張來源于此,那么就說明即便你 100% 的解決了狗的照片誤分類問題,也最多能夠讓算法的出錯率從 10% 降到 9.5%,這個 0.5% 被稱為改進上限(ceiling),而很明顯這個結果是不能令人滿意的,此時應該集中精力分析和解決其他可能的影響因素
如果這 100 張照片中有 50 張來源于此,那么就說明如果你 100% 的解決了狗的照片誤判問題,可能能夠讓算法的出錯率從 10% 降到 5%,即改進的上限是 5%,那么此時解決狗的照片誤判問題有可能是一個值得努力的方向
同樣地,如果你已經(jīng)找到了多個可能導致調(diào)整樣本集中照片被錯誤分類的原因,那么分析哪一個方向的改進可以提供更多可能性的時候可以仿照 Andrew 做下面這張表格:
表格的行是待分析的照片,表格的列則列明可能導致錯誤分類的原因,最后一列可以添加一個備注列,便于更詳細的描述相應行的照片的特點。在此基礎上統(tǒng)計每一個原因出現(xiàn)的概率,最終找到那個可能提供更高的改進上限的因素。
處理被錯誤標記的數(shù)據(jù)
有時候你會在調(diào)整數(shù)據(jù)集中發(fā)現(xiàn)有些數(shù)據(jù)的標簽其實是被錯誤的標記了,此時如果你的訓練數(shù)據(jù)集很大,那么如果這些標簽錯誤的原因是隨機和偶發(fā)的(random errors),考慮到神經(jīng)網(wǎng)絡的穩(wěn)健性和重新檢查全部標簽所耗費的時間,其實可以不必去校對訓練數(shù)據(jù)集中的數(shù)據(jù)并重新訓練。此時在調(diào)整數(shù)據(jù)集的調(diào)試過程中,可以在上述表格的基礎上添加一列 Incorrect Labled 來統(tǒng)計有多少誤分類的照片是由于錯誤標記造成的,然后統(tǒng)計出這個因素造成的錯誤比例,進而分析是否需要手動修改調(diào)整數(shù)據(jù)集中被誤標記的數(shù)據(jù)。
如果經(jīng)過一系列調(diào)整使得算法中最終由于誤標記造成的錯誤分類所占的比例上升到一定程度,則此時才應該考慮手動修改調(diào)整集中的錯誤標簽,同時需要注意的是:
如果對于調(diào)整集進行了修改,那么測試集也要進行修改以保證二者的分布情況相同
在修改的時候,不僅要檢查算法錯誤判定的樣本,同樣也要考慮檢查算法正確分類的樣本的標簽是否正確
考慮到訓練集的數(shù)據(jù)量,這些修改不一定要在訓練集中同樣進行
快速搭建你的第一個系統(tǒng)
在神經(jīng)網(wǎng)絡系統(tǒng)的構思過程中,通過對問題的分析可以發(fā)現(xiàn)諸多需要考慮的因素和方向,但在這個階段過多的停留會耽誤很多的時間。所以 Andrew 建議大家在打造一個全新的系統(tǒng)時不要對于問題反復的 “overthink", 盡快建立數(shù)據(jù)集及衡量指標,并隨即著手構建系統(tǒng)原型,在此基礎上再通過偏差分析、方差分析和誤差分析來確認下一步的工作方向。這會大大縮短整個項目的時間,并且分析的結果會自動指明那些可能的方向中真正值得去花時間改進的地方。
采用分布情況不同的訓練集和調(diào)整集
假設需要打造一個用于移動客戶端的手機應用,其功能是通過用戶上傳的手機圖片進行貓的識別,如果手頭上有 100,000 張網(wǎng)絡下載的高清貓圖和另外 10,000 張用戶手機拍攝的相對低質的貓圖,那么數(shù)據(jù)集該如何進行劃分?
方案 A:將所有圖片混合在一起,隨機打亂后按照一定比例劃分訓練數(shù)據(jù)集,調(diào)整數(shù)據(jù)集和測試數(shù)據(jù)集
方案 B:在訓練數(shù)據(jù)集全部使用網(wǎng)絡獲取的圖片,或者添加部分手機獲取的圖片,而在調(diào)整數(shù)據(jù)集和測試數(shù)據(jù)集中全部使用手機圖片
這兩個方案哪一個更好?
很多人可能都會選擇 A,包括我自己,而在 Andrew 看來 B 才是更加合理的選擇,因為這使得系統(tǒng)在使用調(diào)整數(shù)據(jù)集進行調(diào)整時得到的參數(shù)更加接近其真實的工作環(huán)境,進而后期在實際應用中準確率會更高,用戶也會更加滿意。
但這種做法也產(chǎn)生了一個問題:如果測試數(shù)據(jù)集和調(diào)整數(shù)據(jù)集的分布情況相同,那么如果系統(tǒng)在測試數(shù)據(jù)集和調(diào)整數(shù)據(jù)集上分別的誤差值為 1% 和 10%,那么此時可以放心的下結論說系統(tǒng)的方差值較高,即此時應該納入更多的數(shù)據(jù)或者正則化來改進系統(tǒng)。而當測試數(shù)據(jù)集和調(diào)整數(shù)據(jù)集不再具有相同的分布,那么這個結論將無法確定的得出。比如對應前面的貓分類器的例子,很可能訓練集上表現(xiàn)更好是因為采用的是高清的網(wǎng)絡圖片,而調(diào)整集中的相對較差的表現(xiàn)主要可以歸因于較差的圖片質量。
得出更確切的結論的辦法就是在訓練數(shù)據(jù)集中再單獨分出一個小的數(shù)據(jù)集,在此稱為 training-dev set。將系統(tǒng)用剩余的訓練數(shù)據(jù)集重新進行訓練并得到誤差值之后,再測試系統(tǒng)在這個 training-dev set 和調(diào)整數(shù)據(jù)集上的誤差值:
如果系統(tǒng)在三個數(shù)據(jù)集上的誤差值分別為 1%, 9.5%, 10% ,那么此時可以判斷系統(tǒng)具有較高的方差值,因為其在前兩個數(shù)據(jù)集上具有較大差異的表現(xiàn)
如果系統(tǒng)在三個數(shù)據(jù)集上的誤差值分別為 1%,1.5% ,10%,那么此時我們可以判定差別主要來源于數(shù)據(jù)的不匹配(mismatch)
當然前面這個例子的判斷基于假設人類在類似問題的錯誤率為 0% 或接近 0%,如果人類的表現(xiàn)不是這個數(shù)值,那么這些數(shù)值的相對大小則需要另行判斷。
再一次地,不同誤差之間的相對值大小對應模型的問題如下:
人類水平表現(xiàn) VS 訓練集誤差值間的差異衡量的是可避免偏差大小
訓練集與 training-dev set 之間的誤差相對大小反映系統(tǒng)的方差情況
而 training-dev set 與驗證數(shù)據(jù)集之間的誤差相對大小反映數(shù)據(jù)不匹配對于誤差的貢獻情況
驗證數(shù)據(jù)集和測試數(shù)據(jù)集間的誤差相對大小反映系統(tǒng)對于驗證數(shù)據(jù)集是否存在過擬合情況
數(shù)據(jù)不匹配的處理
對于數(shù)據(jù)不匹配問題目前并沒有系統(tǒng)性的解決方案,Andrew 在這里建議應該首先分析訓練數(shù)據(jù)集和驗證數(shù)據(jù)集的差異主要來源于哪里,在找到這些差異之后可以通過收集更多接近于驗證數(shù)據(jù)集的數(shù)據(jù),或者通過人工數(shù)據(jù)合成向測試數(shù)據(jù)集添加相應的差異因素等方式來使其更加接近于驗證集。需要注意的是如果通過合成的方式進行數(shù)據(jù)修飾,那么要防止引入的修飾成分過于單一而使得算法對于這一修飾做出過擬合,即應該盡量多樣化。
遷移學習(Transfer learning)
這是一個我之前一直沒有花時間理解的概念,一直以為遷移學習是和深度學習、機器學習等并列的一項技術,但實際上遷移學習是指把之前在一項任務上學習得到的知識/模型稍作修改應用在另一個任務上去,也就是對于學習到的知識的遷移,所以我個人覺得更直觀的翻譯是學習的遷移。
例如假設我們已經(jīng)有一個通過足夠動物數(shù)據(jù)訓練后的動物圖像識別模型,如果此時需要一個醫(yī)療影像識別模型,那么可能可以通過修改最后一層的輸出,并用新任務的數(shù)據(jù)來重新訓練網(wǎng)絡。由于在之前的訓練中,網(wǎng)絡已經(jīng)對于如何識別物體建立了相當程度的基礎,因此可以假設其對于如醫(yī)學影像中的腫瘤識別等問題也具有一定的解決能力。此時動物圖像識別的訓練就稱為基礎訓練或者叫預訓練,在預訓練的基礎上采用新任務的數(shù)據(jù)進行訓練的過程叫做微調(diào)(fine-tuning)。
遷移學習常見的應用場景是預訓練任務的數(shù)據(jù)量遠高于被遷移到的新領域的數(shù)據(jù)量,否則就沒有必要做這個遷移,應該一開始就采用新任務的數(shù)據(jù)進行訓練。在后面 Andrew 會講到遷移學習中取決于新任務的數(shù)據(jù)量,一般會對預訓練得到的參數(shù)全部或部分的進行凍結,即不通過微調(diào)改變這些參數(shù),使得網(wǎng)絡對于之前的知識得以保留。當新任務的數(shù)據(jù)量足夠多的時候也可以選擇將預訓練的參數(shù)作為初始化的值,而不是隨機初始化,在此基礎上對網(wǎng)絡進行微調(diào)。由于計算機視覺相關應用訓練所需數(shù)據(jù)量通常要更大,所以訓練一個網(wǎng)絡需要很長的時間,所以這個領域的研究者更多的會采用遷移學習來加速自己的工作。
多任務學習(Multi-task learning)
與每一次只執(zhí)行一個任務,例如單個物體的識別不同的是可以通過神經(jīng)網(wǎng)絡一次性執(zhí)行多個任務,例如在自動駕駛中,需要自動駕駛車輛同時識別行人、其他車輛、路標、交通指示燈等等。
多任務對應的網(wǎng)絡的輸出層有多個輸出值,此時的成本函數(shù)的定義為:
J = ∑∑L(?j(i), yj(i)) / m = ∑∑(-yj(i)log?j(i) - (1 - yj(i))log(1 - ?j(i))) / m,其中最外層的 ∑ 是加總所有 m 個訓練樣本,即 i = 1, 2, 3,..., m,而內(nèi)層的 ∑ 則是加總輸出特征的數(shù)量 n,j = 1, 2, 3,..., n
注意多任務與 softmax 不同的是后者會給每一個樣本提供一個標簽,而多任務可以對于同一個樣本提供多個標簽。同時,如果輸入數(shù)據(jù)的標簽不完整,即只標記了部分的標簽值,輸入的矩陣中未標記標簽部分會被設置為 “?”,此時在加總計算時忽略掉這部分即可。
已經(jīng)有研究證明,當神經(jīng)網(wǎng)絡足夠大的時候,多任務的表現(xiàn)要優(yōu)于將這些任務分拆為多個子任務并獨立訓練的結果。例如對于前面的自動駕駛的例子,由于對于各個對象的識別所需要的網(wǎng)絡的基礎架構是相通的,或者說基礎能力是相同的,假設對于上述四個特征做過標記的獨立數(shù)據(jù)各自有 100,000 個,那么此時采用 400,000 數(shù)據(jù)來訓練一個多任務系統(tǒng),其表現(xiàn)通常會優(yōu)于分別用 100,000 輸入來訓練 4 個獨立的網(wǎng)絡。
所以總結起來多任務的應用前提是:
這些多個任務之間共享相當多的底層特征
對于執(zhí)行各個子任務來說都有幾乎相同數(shù)量的數(shù)據(jù)
神經(jīng)網(wǎng)絡要足夠大
端對端的深度學習
端到端的深度學習之所以如此得名是因為相比將一項復雜的任務分成多個階段來執(zhí)行的方式,端對端學習方式通過構建一個龐大的神經(jīng)網(wǎng)絡,直接從輸入(一端)構建與輸出(另一端)間的關系,省去了中間的任務切割和逐個擊破的步驟。聽起來似乎端對端的深度學習可以直接解決所有的問題,但其實端對端的深度學習只有在具備海量的數(shù)據(jù)和使用龐大的神經(jīng)網(wǎng)絡的時候才能達到或超越分階段執(zhí)行的效果。具體到在應用中如何選擇,Andrew 總結端對端深度學習的優(yōu)勢和缺點如下:
優(yōu)點:
讓數(shù)據(jù)自己說話:不人為的要求系統(tǒng)按照人類的思維去解釋現(xiàn)象,而是讓系統(tǒng)自己尋找規(guī)律
需要更少的手工設計算法的過程和時間
缺點:
- 收集海量數(shù)據(jù)和構建龐大的神經(jīng)網(wǎng)絡所需的資源、成本和技術能力限制
盡管神經(jīng)網(wǎng)絡領域里的很多研究者對于在系統(tǒng)中實施手工設計比較抵觸,但在 Andrew 看來神經(jīng)網(wǎng)絡學習的知識來源于兩個方面:
數(shù)據(jù)本身
算法設計者手工在算法中添加的促進算法學習的設計,如特定特征的引導識別,網(wǎng)絡架構設計等
因此當數(shù)據(jù)量本身非常大的時候,當然可以盡量減少人工干預,讓數(shù)據(jù)自己說話。但當你所有具備的數(shù)據(jù)量非常小的時候,系統(tǒng)中的人工干預部分可以使得人類將已有的知識傳遞給系統(tǒng),并在很大程度上決定最終系統(tǒng)表現(xiàn)的優(yōu)劣。
所以對于是否采用端對端的深度學習,總結一句話就是:
Do you have sufficient data to learn a function of the complexity needed to map x to y?
你是否具備足夠多的數(shù)據(jù)來使得系統(tǒng)能夠構建出具備直接從 x 映射到 y 所需的復雜度要求的函數(shù)?再翻譯一下就是:如果數(shù)據(jù)數(shù)量和技術能力不達標,分階段執(zhí)行!