Structuring Machine Learning Projects - 第二週

第二週課程目標

Understand what multi-task learning and transfer learning are
Recognize bias, variance and data-mismatch by looking at the performances of your algorithm on train/dev/test sets

Error Analysis

通常針對有監督學習,爲了提高準確率,降低錯誤率,我們需要分析錯誤的原因是什麼,這就涉及到error analysis。通常的做法是可以看下具體是哪些item進行了錯誤的分類,然後可以整理出如下圖所示的表格,從而可以判斷接下來應該如何降低錯誤率。


在進行錯誤分析的時候,也需要注意有些情況下並不是我們的算法有問題,而是樣本標記錯誤導致的。針對這種情況,就需要分析這類錯誤所佔的比例是多少,即可以在上圖的表格當中加入一列'error labeled',如果所佔比例較大,則說明需要去針對錯誤樣本進行重新標記,但是如果比例很小,則不值得我們花精力去做這件事,而且通常DL算法對錯誤樣本是有很強的容忍性的,即可以允許部分樣本的錯誤,對算法的準確度影響很小。 針對標記錯誤的樣本,當我們判斷需要進行更正的時候,那麼有以下原則需要考慮:


  • dev set 和test set服從同一個分佈才能建立統一的驗證標準,從而讓我們能夠準確判斷算法的優劣
  • training set並沒有必要去做更正標籤的工作,這是因爲很多情況下,尤其是做遷移訓練的時候,我們的訓練集本身就是來自很多不同源數據,這並不影響訓練算法。DL算法對於此類問題有健壯性的。
  • 有的時候我們需要考慮預測正確的樣本。因爲有時我們標記錯誤了,但是預測也錯了,這就導致預測結果是正確的(有點繞啊,舉個例子,比如實際是一個狗的照片,你標記的時候,把它標記成貓,你的算法也預測是貓,雖然顯示預測正確因爲跟標記一致,但是實際是錯誤的)

另外,Andrew還強調了要儘快建立第一個模型,然後再通過分析是bias問題還是variance問題來決定下一步的方向,逐漸地迭代改進。這很類似於現在的互聯網產品理念,即最小模型原則,先建立一個基本的原型產品,再跟進用戶反饋快速迭代。所以一開始最好不要想太多,先做出第一個原型產品再說。

Mismatched training and dev/testing set

這一節主要講當training set和dev/test set並非同一個distribution的時候如何處理。當我們只有很小量的實際數據,但是有大量的非實際場景數據(但是仍然是可以遷移使用的,比如都是圖片),這時一種直觀的做法是將所有的數據混合在一起,shuffle之後再按比例切分,但是這種情況下就存在一個問題,我們的dev/test中存在的數據大部分都是非實際場景的數據,這導致了我們的訓練的target就已經不準確了,所以更好的做法是,所有的dev/test set的數據均來源於實際場景的數據,而添加一部分實際場景的數據到training set。

但是,當training set和dev/test set來自不同的distribution的時候又會帶來一個問題,即當training set的error rate和dev set的error rate有較大差距的時候,我們怎麼判斷是存在variance問題,還是由於dev set的數據本身更加難以識別導致的,即有兩種可能的因素,那麼如何區分這兩個因素呢?Andrew在這裏提到了一個新的概念,training-dev set,如下圖所示:

  • 在原先的training set中切分出一小部分作爲training-dev set,這樣保證了training set和training-dev set在同一個distribution
  • 通過在training set上訓練,然後在training-dev set和dev set上分別驗證,然後看這三者之間的差距就可以分析出到底是variance問題還是dev set數據本身的問題。當training set和training-dev set差距比較大時,說明存在variance問題,反之則不是variance問題,而是data mismatch問題。
    總的來說,可以通過如下圖中的表格來展示具體是什麼問題:


那麼問題來了,當我們發現data mismatch問題時,我們該如何處理了,總的來說有兩步,如下圖所示:


  • 第一步是分析到底有哪些不同,比如在車載語音系統中可能實際的聲音會有大量背景噪聲,而訓練集中的聲音大都沒有背景噪音。
  • 第二步就是儘可能讓訓練集的數據與dev set中的數據近似,比如爲訓練集中的語言添加背景噪音

那麼如何讓訓練集中數據更像dev set中的數據呢,這主要是通過兩種方式來實現:

  • 最好是收集更多的實際數據,然後充實到訓練集中
  • 可以用合成的方式來生成模擬數據,比如dev set的聲音有背景噪音,那麼我們就可以通過合成背景噪音的方式來生成模擬數據

生成模擬數據需要注意的是,我們的生成數據因爲只是實際數據的一個非常小的子集,這可能導致我們的模型針對這部分數據過擬合。

Learning for multiple tasks

作者首先在這節講述了什麼是transfer learning


  • 作者舉了一個例子是說首先訓練了一個圖片識別的神經網絡,之後如果我們需要一個X射線診斷的模型,我們可以將最後一層的輸出層替換掉,然後再針對X射線診斷進行訓練,這樣最終的模型的訓練會更加有效,之前的訓練獲得的知識可以轉移到新的模型當中來。
  • 針對新模型進行再訓練有兩種模式,一種是當實際的數據集較小時,我們可以只針對最後一層輸出層進行訓練;另一種是當我們有大量的實際數據時,我們可以針對整個神經網絡進行重新訓練。
  • 針對第二種訓練方式,這裏會有兩個概念。之前針對圖像識別的訓練我們可以叫做pre-training,之後的針對X射線的訓練可以叫做fine tuning
  • 那麼爲什麼這樣是有效的呢?這是因爲神經網絡之前通過訓練習得的knowledge如對於圖像邊緣的識別,對於曲線和物體的識別這些low level的knowledge對於新模型仍然是有效的

那麼在什麼情況下我們需要使用transfer learning呢?


接下來講了什麼是multi-task learning


  • 可以看出最終的輸出不再是單個的output,而是多個output,最終輸出結果是一個vector
  • 也就是一個神經網絡可以針對多個target進行結果輸出。這裏需要對multi-class和multi-label進行區分(具體參考multi-class vs multi-label):

Multiclass classification means a classification task with more than two classes; e.g., classify a set of images of fruits which may be oranges, apples, or pears. Multiclass classification makes the assumption that each sample is assigned to one and only one label: a fruit can be either an apple or a pear but not both at the same time.
Multilabel classification assigns to each sample a set of target labels. This can be thought as predicting properties of a data-point that are not mutually exclusive, such as topics that are relevant for a document. A text might be about any of religion, politics, finance or education at the same time or none of these.

下圖展示了一個multi-task neural network:


  • 在計算loss function的時候,需要將4個output的y hat都相加來計算的總的loss
  • 通常這種多任務的神經網絡也可以分開成single target的神經網絡,比如只去標記行人,但是,通常情況下把其變成多任務的神經網絡performance更好,這是由於其low level的knowledge可以互相share,這樣通常有助於提高神經網絡的性能
  • 另外,當某些樣本沒有針對某個target進行標記的時候也不影響神經網絡的訓練,因爲在計算的時候,如果發現某個label沒有標記,就不會對其損失函數進行加總,也不影響其最終結果

那麼什麼情況下multi-task learning是有意義的?


End-to-end deep learning

什麼是end-to-end deep learning?作者首先舉了個例子


  • 在之前的人工智能很多時候我們人爲的分成了不同階段(作者舉了speech recognition的例子),但是通過神經網絡我們不需要人工的區分階段,通過輸入audio,輸出transcript,直接可以訓練出end-to-end的模型

之後,作者舉了個人臉識別的例子,這個例子表明有的時候分步進行又是有意義的:


  • 這裏當我們將人臉識別程序分爲兩步時,通常效果更好,我們可以先從圖中識別人臉,第二部再講人臉放大到一定比例後進行鑑別(跟存儲的人像進行比較)。通常分成兩步會提高系統的整體性能。

那麼什麼情況下使用end-to-end,什麼情況下使用分步法比較好呢?
這通常跟我們的數據有極大的關係,當我們有大量的input和output數據的時候,我們可以直接使用end-to-end的方式,但是當我們的數據的模式是input->step output, step output-> output的時候,那麼我們就需要分步來做,總的來說跟你的數據模式有關係。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章