# 吳恩達老師_深度學習_建構機器學習_第二週_策略(2) ###### tags: `deep learning` `Andrew Ng` ## 2-1.Carrying out error analysis  **課程說明**:如何執行誤差分析 ### Look at dev examples to evaluate ideas  假設你有一個用來分辨貓的模型,而它的誤差率目前10%,透過分辨錯誤的照片你發現有兩張狗狗照片看起來有點像貓。(也許可以多弄點狗狗照片的資料,或是特別對狗處理的演算法。) 現在的問題是,是否應該投入專案來專門處理狗狗問題。 投入可能經過半年之後沒有任何的進步,這時候可以透過誤差分析流程來確認是否值得往此方向執行。 * 收集100個錯誤標記的開發資料集範例並且手動確認錯誤資料。(那此是標成狗的) * 假設有5張照片錯誤。(代表5%) * 代表你處理掉狗狗問題的時候也僅修正這5%的錯誤,誤差率最多從10%降為9.5% * 處理之前至少先確認處理該問題的價值可以提升多少模型效能。 ### Evaluate multiple ideas in parallel  執行誤差分析的時候可以同時進行評估多個想法,此例來看除了可以針對狗來優化之外,也可以針對同為貓科的錯誤分類、或是圖像過於模糊的圖像... 再透過表格將相關錯誤統計比例,這種方式有時候可以發現其它類型的錯誤,這至少可以讓你初步了解那些錯誤是需要優先去處理的。 | 手動查閱錯誤分類照片 | 狗狗問題 | 貓科問題 | 模糊問題|備註| | :-----:| ----- | ----- |----- |-----| | 1 | V | | | | | 2 | | V | | | | 3 | | | V | | |total|5%| 15%| 80%| ## 2-2.Cleaning up Incorrectly labeled data  **課程說明**:清楚標註錯誤的數據 ### Icorrectly labeled examples  1代表貓咪,0代表不是貓咪,上例來看右2照片標記錯誤,也許工作人員在標記資料的時候手誤了,這時候是否應該調整呢? * 以訓練資料集來看 * 事實證明,深度學習中對於訓練集內的隨機誤差的耐性極高,只要誤差夠隨機,那是沒問題的。(只要數據夠大,影響不大) * 如果真的要修復也是可以的。 * 如果有人一直把白色的狗標成貓,那就不是隨機誤差,而是系統性的誤差,這時候是有影響的。 ### Error analysis  * 在開發驗證、測試資料集來看 * 可以在誤差分析的時候將標記錯誤也當做一個項目 * 如果標記錯誤的資料嚴重影響到效能評估的指標,那就應該花時間修正錯誤的標記。 * 以你的誤差分析來判斷要將寶貴的時間花在那邊。 ### Correcting incorrect dev/test set examples  如果真的要調整標記錯誤的資料,有幾點要注意: * 不管如何要同時作用到開發驗證集與測試資料集 * 因為需要來自同一個分佈 * 同時檢驗算法判斷正確與錯誤的例子(避免偏差) * 找錯的資料簡單,找躲在對的資料裡面的錯比較難 * 但真的很難做到,2%的錯98%的對,難以從98%的資料找出錯誤 * 對於訓練資料集可能需要,也可能不需要做調整 * 訓練資料集相對的大很多 * 開發集與測試集來自同一個分佈更為重要 ## 2-3.Build your first system quickly then iterate  **課程說明**:建置你的系統,然後快速迭代吧! ### Speedch recognition example  以語音辨示系統為例,你可以考慮很多,像是特定的技術可以讓語音辨識系統對噪音背景更強健或是對部份口音的辨別性更高...讓你聽寫下來的文本可讀性更高,你有很多工具可以選擇!挑戰在於,如何選擇一個方向集中精神處理。 如果你想建置一個模型,實務上建議,快速的建置你的第一代系統之後開始迭代,意思是說: 1. 很快速的設置開發集與測試集以及指標(先決定目標) 2. 開始訓練模型 3. 利用偏差方差分析、誤差分析來確認下一步優化 快速建置一個系統的用意在於讓你先確認偏差方差的範圍,以此了解下一步該如何處理。 不過如果領域範圍已經有相關文獻可以參考(如人臉辨識),那就可以以此基礎出發。 ## 2-4.Training and testing on different distributions  **課程說明**:利用來自不同分佈的資料集 ### Cat app example  以貓咪辨識系統為例,訓練資料集也許是自己寫了一個爬蟲到網路上找了很多的照片,而用戶端上傳的是手機拍攝的,取景與對焦上沒有那麼專業,這時候資料分佈並不相同。我們要觀注的是,在這種情況下辨識效果如何? 如果你的用戶不多,可能你擁有的手機貓咪照片也不會多,也許只有一萬,如果你選擇了以這一萬張照片當訓練集又太小,這很為難,因為你要辨識的是來自另一個分佈的資料集。 這時候你可以有幾種選擇: 1. (x)將兩個資料集合併,並且隨機分配到train/dev/test * 這樣做的好處是你的資料集都來自同一分佈 * 壞處是,你真正需要關心到的手機上傳用戶還是太小了,你優化的是爬蟲出來的效能。 1. (o)將原始資料集加上一半的手機資料做訓練資料集,讓dev/test通通都是手機圖 * dev的用意是要確認有沒有命中目標,而手機用戶的問題才是我們要克服的,訓練集除了包含了原始資料集之外也含有手機用戶圖。 * 雖然這時候的train與dev/test分佈並不來自同一地方,但長期來說這對系統效能是好的。 ### Speedch recongnition example  另一個案例,如果我們正在開發語音啟動後視鏡車載系統!(中國真的有) 我們需要對後照鏡說出命令,該如何收集訓練語音辨識系統? * 將手上有的所有語音(x)/文字(y)當做訓練資料集 * 將用戶真的用來做命令的語句拿來當做dev/test * 像帶我去xx地方、xx加油站 * 因為這才是我們真的希望辨識的目標 * 可以部份切割給予訓練資料集使用 ## 2-5.Bias and Variance with mismatched data distributions  **課程說明**:了解當數據分佈不同時對偏差與方差的處理為何不同! ### Cat classifier example  以貓咪辨識為例,人類在這部份幾乎是完美的,這代表貝葉斯誤差幾乎是0%,這時候要進行誤差分析通常是看訓練誤差與開發誤差。 假如資料集訓練誤差如下: * train:1% * dev:10% 相同分佈下你可以說,這模型有方差問題,但是當資料來源分佈不相同的時候,就不能直接下這個結論,為什麼?因為訓練集的照片都是好分辨的,而開發集都是手機照片,有的還失焦! 這種情況下有兩件事改變了: 1. 演算法只看過train的資料,沒看過dev的資料 2. dev的資料來自不同分佈 也因此,很難再將dev效能從10%降到1%,這因為無法了解到有多少佔比是因為演算法沒看過dev資料集的數據而導致(方差問題)。 所以我們要定義一個新的數據集train-dev 原本我們的資料集切割成train/dev/test,現在,我們將train隨機打散之後再切割一部份做train-dev,現在我們的資料集變成train/train-dev/dev/test,而訓練模型的時候我們並不會將train-dev投入。 這時候,就可以分別觀查train-dev/dev的誤差,以此分析判斷問題。 舉例來說: * train:1%,train-dev:9%,dev-10%,這時候就可以確定這模型存在著方差問題,因為就連在同一分佈的train-dev資料集上也有著9%的誤差率! * train:1%,train-dev:1.5%,dev-10%,現在就不是方差問題了,因為在相同分佈的資料集上誤差值不大,我們現在可以確定,這是一個數據不匹配問題。 * train:10%,train-dev:11%,dev-12%,如果貝葉斯誤差是接近0%的話,這時候模型就真的存在偏差問題。 * train:10%,train-dev:11%,dev-20%,這有兩個問題,可避免誤差過高,並且數據不匹配問題很大。 ### Bias/variance on mismatched training and dev/test sets  $human level 4\% \rightarrow train error 7\%\rightarrow train-dev error 10\% \rightarrow dev error 12\% \rightarrow test error 12\%$ $human level \rightarrow train error:$可避免誤差 $train error \rightarrow train-dev error:$方差 $train-dev error \rightarrow dev error:$數據不匹配問題 $dev error \rightarrow test error:$擬合狀況 ### More general formulation  對誤差分析的判斷也可以透過表格化來呈現,以智慧後照鏡為例。 | | 原始取得資料 | 車載取得資料 | | -------- | -------- | -------- | | 人類水平 | 4\% | 6\% | | error on train on | train error 7\% | 6\% | | error on not train on | train-dev error 10% | dev/test error 6\% | error on train on代表用以訓練的資料集 error on not train on 代表未用以訓練的資料集 這表格可以依不同資料分佈來了解模型狀況,原始取得資料是一個分佈,透過車載取得的資料是一個分佈,再觀察誤差值之間的差異。 車載的人類水平如果可以讓人做標記分析的話,也是有用的,將它跟原始資料做比對也許可以了解到,人工標記誤差來到6%,與模型相去不遠,這對模型評估是有幫助的,或是將車載資料置入訓練集用以了解數據不匹配問題。 現在我們除了偏差、方差問題之外,又多了一個數據不匹配的問題,這下節會討論如何處理。 ## 2-6.Addressing data mismatch  **課程說明**:如何盡可能的處理數據不匹配的問題 ### Addressing data mismatch  關於數據不匹配的問題並沒有一個完整的系統性處理方式,只能盡可能的嚐試。 * 做誤差分析,嚐試了解train與dev的具體差異。 * 技術上為了避免對test的overfitting,會只針對dev做差異了解。 * 收集更多類似於dev與test的數據 * 假如你發現你的語音辨識系統的背景噪音是誤差主要來源,那就可以模擬些類似聲音數據。 * 或者主要誤差是辨識門牌號碼數字,那就加多點人說數字的音頻數據。 ### Artificial data synthesis  如果目標是讓train資料集更接近dev,那可以利用人工合成數據的方式來處理。 也許你手上有的都是乾淨的音頻,你可以利用一段有汽車噪音的音頻來合成一個有噪音背景的音頻做訓練。 但有一個要注意的是,如果你原始資料中有10000萬小時的音頻,而汽車噪音為100小時,這時候雖然你可以利用重覆疊加100次讓噪音變10000小時,對人耳來說沒有影響,但對神經網路來說會對這100小時的噪音造成可能的過度擬合。最好的方式還是取得相對應的不重覆的噪音! ### Artificial data synthesis  相同的場景到了機器視覺還是一樣,重點在於整體集合內的一個子集合過於集中會造成overfitting。 如果你拿了一些小部份的車子去做成千上百的合成,依然會對這小這部份的車子圖片過度擬合。 事實證明,人工合成的資料是有效的,但要記住你可能從所有可能性空間中選了一小部份去做合成。 ## 2-7.Transfer learning  **課程說明**:遷移學習 ### Transfer learning  比方說你已經訓練好一個動物辨識的神經網路,假如你把這個神經網路拿來適應(adapt)或稱遷移(transfer)在不同任務中學到知識,比如X光片.. 作法上,將最後一層的輸出層拿走,以及刪掉進入最後一層的權重,接著替最後一層輸出層重新產生隨機權重,讓它在X光片的數據上重新訓練。 經驗法則上,如果你的X光片數據少少的,那就只刪掉最後一、兩層,但如果你的數據很多也許就可以重新訓練所有參數。如果你選擇重新訓練所有參數,那之前的訓練一般稱為預訓練(PRE-TRAINING),後續再用X光片數據訓練即稱為微調(FINE TUNING) 這樣做為何有效果?有很多的低層次的特徵,如邊緣檢測、曲線檢測、陽性對象檢測,從非常大的影像資料集中學到這些能力有助於演算法在X光片上的診斷做的更好。 另一個案例,如果你已經訓練好一個語音轉文字的系統,現在要去訓練一個喚醒詞(如OK GOOGLE..),這時候要做的是拿掉最後一個輸出層再加入喚醒詞的LABEL,不一定只能加一層,也可以加多層。 這可以幫你從數據大的模型遷移到數據小的目標資料集。但反過來就比較沒有意義了,訓練100張的圖再移到100、1000張的目標圖片模型。 ### When transfer learning makes sense  如果你想從任務A學習並且遷移一些知識到任務B, 什麼時候遷移學習是有意義的? * 當任務A與B都有同樣的輸入X的時候(一樣是圖片,一樣是語音..) * 任務A的資料比B大的多的時候 * 任務A的低層次特徵對B有幫助的時候 ## 2-8.Multi-task learning  **課程說明**:多任務學習 ### Simplified autonomous driving example  假設你正在做無人駕駛研究,那無人駕駛車可能會需要同時檢測不同的物體,如行人、車輛、停車標識等。 上圖中,車子看到了一個停車標識,但沒有行人、紅綠燈..所以對這個車子來說,會有多個label(依你的檢測目標而定),舉例來說有四個,那y就會是一個(4,m)矩陣,如果過去的案例只有一個輸出的話,那就是(1,m) ### Neural network architecture  現在,我們的輸出層是(4,1)的向量,第一個節點是有沒有行人,第二個節點是有沒有車,第三個是有沒有停車標識,最後是有沒有紅綠燈。 對於這個神經網路,我們定義成本函數$Loss:\hat{y}^{(i)}_{4,1}=\frac{1}{m}\sum^m_{i=1}\sum^4_{j=1}L(\hat{y}_j^{(i)}, y_j^{(i)})$ 成本函數來看,一次計算了四個偵測目標的logistic損失($L$),這跟softmax的不同在於,它一次可以給定多個label,而softmax是只有一個label。 如果以此模式來訓練神經網路,就是在執行多任務學習,建立單個神經網路,觀察每張圖,然後解決四個問題,系統再回饋每張圖片是否有這四個物體,當然也可以訓練四個神經網路來分別處理,不過在神經網路的一些早期特徵在識別不同物體都會用到,所以訓練一個神經網路來處理四個偵測效能會比訓練四個神經網路來各別辨識好。 並非以多任務學習方式建模之後每次給定的預測標籤就一定要是足量的,上例來說,有了四個標籤預測,也可以只預測是否影像中有人、或是有車有停車標識! ### When multi-task learning makes sense  什麼時候multi-task learning是有意義的? * 當低層次的特徵可以共用的時候 * 自動駕駛來看,一次辨識車、標識、行人是有意義的,這些物體有相似的特徵 * 每一個任務的數據量是接近的 * 假如你有100個task,每個task有1000個樣本,當你想單獨使用第100個task的時候單1000個樣本其實是非常不足的,但是因為有前面99\*1000個樣本,就會有如遷移學習般的效果出現。 * 訓練一個足夠大的神經網路,同時做好所有工作。 * 在神經網路不夠深不夠大的情況之下,才會造成效能比單一標籤預測還要差。 實務上多任務學習的使用會比遷移學習還要少。 ## 2-9.What is end-to-end deep learning  **課程說明**:端對端深度學習 ### What is end-to-end learning?  以語音辨識為例,輸入$(x)$是音頻,輸出$(y)$是文字。 傳統上,語音辨識需要很多階段的處理,提取特徵(MFCC)$\rightarrow$透過機器學習取得音位(聲音的基本單位)$\rightarrow$將音位串起來成一個詞$\rightarrow$將詞串起變成最後的輸出文本。 端對端深度學習做的就是,訓練一個巨大的神經網路,輸入一樣是音頻,輸出就直接是文本。(這對很多終其一身研究pipline來處理過程的人員難以接受) 實施end-to-end的重點在於需要有大數據,如果你只有3000小時的音頻,那使用傳統的pipline效果會比較好。 ### Face recognition  上圖是百度的人臉辨識系統,你靠近門禁的時候系統就辨識,確認之後就直接放行,你不需要rfid工卡在身上。 實作上,我們不會直接將cam取到的照片當x去做y的預測,因為會有太多不同角度跟距離的情況出現。 所以,第一要先檢測到人臉,第二放大人臉,讓人臉置中,再將這個人臉丟到神經網路去預測。 將工作切成兩部效果更好的原因有二: * 拆解問題之後,每一個問題都會更簡單 * 兩個子任務的訓練數據都很多 將上面的範例拆成兩個工作會比純粹的end-to-end的表現更好,如果你有更大的數據那或許end-to-end也是不錯的選擇。 ### More examples  再來看機器翻譯的案例,傳統上機器翻釋也會有pipline的執行。 輸入文本,文本分析....最後翻譯出相對應語言。這情況下使用端對端是個不錯的選擇,因為現行有足夠的x-y數據的對應收集。 另外一個案例是,以小孩的手掌骨x光片來判斷他的年齡。 處理的方式是採Non end-to-end,輸入照片,接著判斷每一個骨頭,再判斷年齡,如果想要直接輸入不做骨頭判斷就預測年齡的話,現在來說還沒有足夠的數據可以提供訓練。 ## 2-10.Whether to use end-to-end learning  **課程說明**:何時該使用端對端學習 ### Pros and cons of end-to-end deep learning  端對端學習的優點: * 讓數據說話 * 以語音辨識為例,中間尚需透過特徵取得來擷取音位,這是一個人為的操作,如果數據量,那讓神經網路自己學習,整體表現可能更好。 * 更少的手工設計元件 * 可以減化工作流程 端對端學習的缺點: * 需要大量的數據 * 直接數據x學習到對應的y * 排除掉所有手工設計的資源 * 如果你沒有大數據,那就沒有辦法從小的資料集中獲得相關資訊,這時候手工設計的元件就是將人類知識直接注入演算法的途徑 ### Applying end-toend deep learning  對於是否使用end-to-end deep learning最關鍵的因素在於是否有足夠的數據來直接學習x映射到y。
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up