一、進行誤差分析
很多時候我們發現訓練出來的模型有誤差后,就會一股腦的想着法子去減少誤差。想法固然好,但是有點headlong~
這節視頻中吳大大介紹了一個比較科學的方法,具體的看下面的例子
還是以貓分類器為例,假設我們的模型表現的還不錯,但是依舊存在誤差,預測后錯誤標記的數據中有一部分狗圖片被錯誤的標記成了貓。這個時候按照一般的思路可能是想通過訓練出狗分類器模型來提高貓分類器,或者其他的辦法,反正就是要讓分類器更好地區分狗和貓。
但是現在的問題是,假如錯誤分類的100個樣本中,只有5個狗樣本被錯誤的標記成了貓,那么你費盡千辛萬苦也最多只能提高一丟丟的准確度。所以對誤差進行分析就顯得比較重要,而且可以幫助我們在未來的工作中指明優化方向,節省時間。具體的方法按吳大大的說法是可以人工的對錯誤標記的樣本進行再處理、分析。
下面以一個例子來介紹一下操作步驟
- 1.人工標記
將錯誤標記樣本以表格的形式列舉出來,然后人工的標記處樣本的分類,最后統計出各種分類(或者說錯誤標記的原因)所占比例。
Image | Dog | Great cats(大型貓科動物,如獅子) | Blurry(圖片模糊) | Comments |
---|---|---|---|---|
1 | √ | |||
2 | √ | 眯着眼 | ||
3 | √ | √ | 在動物園,且下着雨 | |
…… | ||||
% of total | 8% | 43% | 61% |
注意:上面的分類並不是互相獨立的,只是舉個例子。。。我抄的吳大大的PPT
- 2.分析誤差
又上面的結果可以知道,誤差樣本中只有8%是狗狗的圖片,而43%是大型貓科動物,61%是因為圖片模糊。很顯然此時你即使用畢生所學去優化區別狗和貓的算法,整個模型的准確率提升的空間也遠不如后兩個特征高。所以如果人手夠的話,也是可以選擇幾個特征進行優化的。
二、清楚標注錯誤的數據
機器預測可能會出錯,那么人當然也有可能會出錯。所以如果訓練集和驗證集中認為添加的標簽Y出現誤差該怎么處理呢?
這里分兩種情況:
- 1.隨機誤差
這種情況比較好,因為如果人為誤差比較接近隨機誤差,那么可以睜一只眼閉一只眼,因為深度學習算法對於隨機誤差還是有一定的健壯性的。
- 2.非隨機誤差
PS:不知道有沒有非隨機誤差這個詞。。我只是為了行文方便取的一個名字。
對於隨機誤差正常人可能都會問“what?我怎么知道是不是接近隨機誤差”,所以視頻里吳大大也給咱們提供了一個方法,這個方法和上一節中的表格法一樣一樣的:
Image | Dog | Great cats(大型貓科動物,如獅子) | Blurry(圖片模糊) | Incorrectly labeled | Comments |
---|---|---|---|---|---|
1 | √ | ||||
2 | √ | √ | 只是一只手畫的的貓,不是真的貓 | ||
3 | √ | 背景的角落里有一只貓 | |||
…… | |||||
% of total | 8% | 43% | 61% | 6% |
有了上面這個表格,那么問題來了,此時我還需要修正這6%標記錯誤的樣本嗎?還是舉個例子:
假設我們有如下數據:
- 總體驗證集誤差:10%
- 由人工錯誤標記引起的錯誤樣本比例: 0.6%
- 由其他原因引起的錯誤樣本比例:10%-0.6%=9.4&
所以這種情況下我們應該集中精力找出引起9.4%誤差的原因,並進行修正,當然如果有余力也還是可以休整一下人工錯誤標記的數據的。
假如你通過優化算法,減少了因其他原因引起的誤差,並且使得總體驗證集誤差降到了2%,此時我們再分析一下:
很顯然,因為並沒有對人工誤差進行優化,所以由人工錯誤標記引起的錯誤樣本比例依舊是0.6%(這個數據可能有點不能理解,要注意這個0.6%是相對於整體驗證集而言的,所以不會變),那么人工誤差在總誤差中所占的比例則達到了0.6%/2%=30%,相比於之前的6%影響力打了不小哦,所以此時則應該考慮對人工誤差動手了。
三、快速搭建第一個系統,並進行迭代
說白了就是少bb,直接干
當然也不是說瞎干,還是有一個步驟流程的:
- 1.建立訓練集,驗證集,測試集
- 2.迅速搭建初始化系統
- 3.使用前面提到的Bias/Variance分析和誤差分析來確定接下來的優化方向
四、在不同的划分上進行訓練並測試
這一節的內容和之前的DeepLearning.ai學習筆記(三)結構化機器學習項目--week1 機器學習策略很類似,就不加贅述了。簡單地說就是將各種不同分布的數據混合,打散,然后用來訓練模型。
五、不匹配數據划分的偏差和方差
對上面的PPT截圖進行解釋:
左邊
首先還是以喵咪分類器作為例子,假設人類的誤差接近貝葉斯誤差0%。而訓練集誤差和開發集誤差分別為1%和10%,二者相差9%,而且如果兩個數據集來自同一個分布,那么我們就可以說模型訓練結果方差較大。
但是當兩個數據集來自不同的分布時,我們就不能得出上面的結論了。另外,這9%的方差可能有兩個原因導致的,一是我們自己實現的代碼有問題,二是數據分布不同,所以你很難確定哪個是更主要的原因。因此為了改變找出是哪個原因我們做如下的事情:
創建Training-dev set(訓練-開發集),其實就是從原來的訓練集中抽取一部分數據出來,但是不喂給模型。(如上圖所示)
右邊
那怎么操作呢?很簡單,下面以幾個例子來說明:
1.因為Training-dev set(訓練-開發集)和Training set同分布,所以假設訓練出來的結果如下:
- training error: 1%
- training-dev error: 9$
- dev error: 10%
此時可以看到來自同分布數據的訓練誤差和訓練-開發誤差存在較大的方差,所以我們就可以確定肯定是我們滴代碼還需要完善啦~
2.假設訓練出來的結果如下:
- training error: 1%
- training-dev error: 1.5$
- dev error: 10%
此時就可以說不是我程序員的問題了,而是發生了data mismatch(數據不匹配問題)
右下角
1.假設人類的誤差接近貝葉斯誤差0,且訓練誤差如下:
- training error: 10%
- training-dev error: 11$
- dev error: 12%
此時我們會認為模型與人類誤差相比存在較大的偏差。所以就朝着減小偏差的方向努力吧少年~
2.同樣假設人類的誤差接近貝葉斯誤差0,且訓練誤差如下:
- training error: 10%
- training-dev error: 11$
- dev error: 20%
此時我們會認為存在兩個問題:
- 高偏差
- 數據不匹配問題
少年。。。祝福你,繼續修改代碼吧
六、定位數據不匹配
這一節視頻就是舉了幾個例子,不想詳述了。。。
至於怎么定位上一節說的很清楚了。。
七、遷移學習
簡單的解釋就是假如我們之前訓練好了一個喵咪分類器,后來我們有了新任務——做一個海豚分類器,那么就可以將之前創建的喵咪分類器模型運用到新任務中去
舉個栗子,假設我們對信號燈的紅、綠燈進行了大量數據的學習,現在有了新任務,即需要識別黃燈,此時我們就不需要從頭搭建模型,我們可以繼續使用紅綠燈網絡框架,只需修改神經網絡最后一層,即輸出層,然后用已經訓練好的權重參數初始化這個模型,對黃燈數據進行訓練學習。
為什么可以這么做呢?因為盡管最后的標簽不一致,但是之前學習的紅綠燈模型已經捕捉和學習了很多有用的特征和細節,這對於黃燈的學習十分有幫助,而且這么做也可以大大的加快模型的構建速度。
課后習題可以更清楚地解釋遷移學習。
但是一般來說是有條件限制的,如下:
(假如想將A模型運用到B模型)
- A和B需要有相類似的輸入數據集,例如要么都是圖像識別,要么是語音識別
- A的數據集要足夠多,即遠多於B
- A中學到一些low level features要對B有所幫助
八、多任務學習
在遷移學習中,整個過程是串行的,即咱們首先得實現A模型,然后在運用到B模型。而在多任務學習中,可以是同時開始學習。
舉個栗子:
現在很火的無人駕駛汽車,在行駛路上需要識別很多類型的物體,如行人、紅綠燈、指路標志等等,所以此時可以使用多任務學習來實現。神經網絡示意圖如下:
如圖示,最后的\(\hat{y}\)是一個有4元素的向量,假設分別是行人、汽車、停車標志、信號燈。如果識別出圖片中有哪一個元素,對應位置則輸出1。
注意:這要與softmax進行區分,softmax只是一次識別一種物體,比如說識別出是行人,則輸出[1,0,0,0],而不會說同時識別出行人和信號燈。
適用情況:
最后,吳大大說在實際中遷移學習使用頻率要遠高於多任務學習,但是有個例外就是視覺檢測項目中用多任務學習比較多。
九、什么是端到端的深度學習
首先以現在廣泛使用的人臉識別技術解釋一下什么是端到端的深度學習。
假如咱們走進一個攝像頭,最開始離得較遠的時候攝像頭捕捉到的是我們的全身,此時系統不會將這種照片喂給模型,而是通過算法找到人臉的位置,然后切割放大,最后喂給模型進行識別。總結起來就是:
1.找人臉位置
2.將人臉圖像切割放大,並喂給模型
感受一下吳大大的抽象畫風~233
所以,簡單地說端到端的深度學習其實就有點像將問題細分化,流水線化,每個步驟各司其職,下一層依賴上一層。