吳恩達 DeepLearning.ai 課程提煉筆記(3-2)結構化機器學習項目 --- 機器學習策略(2)

以下為在Coursera上吳恩達老師的DeepLearning.ai課程項目中,第三部分《結構化機器學習項目》第二周課程「機器學習策略(2)」關鍵點的筆記。本次筆記並幾乎涵蓋了所有視頻課程的內容。在閱讀以下筆記的同時,強烈建議學習吳恩達老師的視頻課程,視頻請至 Coursera 或者 網易雲課堂。


1. 誤差分析

當我們在訓練一個模型的時候,如一個貓和狗分類模型,最終得到了 90\% 的精確度,即有 10\% 的錯誤率。所以我們需要對模型的一些部分做相應調整,才能更好地提升分類的精度。

如果不加分析去做,可能幾個月的努力對於提升精度並沒有作用。所以一個好的誤差分析的流程就相當重要。

收集錯誤樣例:

在開發集(測試集)中,獲取大約100個錯誤標記的例子,並統計其中有多少個是狗。

  • 假設一種情況是100個數據中,有5個樣例是狗,那麼如果我們對數據集的錯誤標記做努力去改進模型的精度,那麼可以提升的上限就是 5\% ,即僅僅可以達到 9.5\% 的錯誤率,這有時稱為性能上限。那麼這種情況下,可能這樣耗時的努力方向就不是很值得的一件事情。
  • 另外一種假設是100個數據中,有50多個樣例是狗,那麼這種情況下,我們去改進數據集的錯誤標記,就是一個比較值得的改進方向,可以將模型的精確度提升至 95\%

並行分析:

  • 修改那些被分類成貓的狗狗圖片標籤;
  • 修改那些被錯誤分類的大型貓科動物,如:獅子,豹子等;
  • 提升模糊圖片的質量。

為了並行的分析,建立表格來進行。以單個錯誤分類樣本為對象,分析每個樣本錯誤分類的原因。

最後,統計錯誤類型的百分比,這個分析步驟可以給我們一個粗略的估計,讓我們大致確定是否值得去處理每個不同的錯誤類型。

2. 清除錯誤標記的樣本

下面還是以貓和狗分類問題為例子,來進行分析。如下面的分類中的幾個樣本:

情況一:

深度學習演算法對訓練集中的隨機誤差具有相當的魯棒性。

只要我們標記出錯的例子符合隨機誤差,如:做標記的人不小心錯誤,或按錯分類鍵。那麼像這種隨機誤差導致的標記錯誤,一般來說不管這些誤差可能也沒有問題。

所以對於這類誤差,我們可以不去用大量的時間和精力去做修正,只要數據集足夠大,實際誤差不會因為這些隨機誤差有很大的變化。

情況二:

雖然深度學習演算法對隨機誤差具有很好的魯棒性,但是對於系統誤差就不是這樣了。

如果做標記的人一直把如例子中的白色的狗標記成貓,那麼最終導致我們的分類器就會出現錯誤。

dev、test集中錯誤標記的情況:

如果在開發集和測試集中出現了錯誤標記的問題,我們可以在誤差分析的過程中,增加錯誤標記這一原因,再對錯誤的數據進行分析,得出修正這些標記錯誤的價值。

修正開發、測試集上錯誤樣例:

  • 對開發集和測試集上的數據進行檢查,確保他們來自於相同的分布。使得我們以開發集為目標方向,更正確地將演算法應用到測試集上。
  • 考慮演算法分類錯誤的樣本的同時也去考慮演算法分類正確的樣本。(通常難度比較大,很少這麼做)
  • 訓練集和開發/測試集來自不同的分布。

3. 搭建系統

  • 設置開發、測試集和優化指標(確定方向);
  • 快速地建立基本的系統;
  • 使用偏差方差分析、誤差分析去確定後面步驟的優先步驟。

總的來說,如果我們想建立自己的深度學習系統,我們就需要做到:快速的建立自己的基本系統,並進行迭代。而不是想的太多,在一開始就建立一個非常複雜,難以入手的系統。

4. 不同分布上的訓練和測試

在深度學習的時代,因為需求的數據量非常大,現在很多的團隊,使用的訓練數據都是和開發集和測試集來自不同的分布。

下面是一些處理訓練集和測試集存在差異的最佳的做法。以前一周中的貓的分類問題為例:

我們可以從網上獲取大量的高清晰的貓的圖片去做分類,如200000張,但是只能獲取少量利用手機拍攝的不清晰的圖片,如10000張。但是我們系統的目的是應用到手機上做分類。

也就是說,我們的訓練集和開發集、測試集來自於不同的分布。

方法一:

將兩組數據合併到一起,總共得到21萬張圖片樣本。將這些樣本隨機分配到訓練、開發、測試集中。

  • 好處:三個集合中的數據均來自於同一分布;
  • 壞處:我們設立開發集的目的是瞄準目標,而現在我們的目標絕大部分是為了去優化網上獲取的高清晰度的照片,而不是我們真正的目標。

該方法不是一個好的方法,不推薦。

方法二:

訓練集均是來自網上下載的20萬張高清圖片,當然也可以加上5000張手機非高清圖片;對於開發和測試集都是手機非高清圖片。

  • 好處:開發集全部來自手機圖片,瞄準目標;
  • 壞處:訓練集和開發、測試集來自不同的分布。

從長期來看,這樣的分布能夠給我們帶來更好的系統性能。

5. 不同分布上的偏差和方差

通過估計學習演算法的偏差和方差,可以幫助我們確定接下來應該優先努力的方向。但是當我們的訓練集和開發、測試集來自不同的分布時,分析偏差和方差的方式就有一定的不同。

方差和分布原由分析

以貓分類為例,假設以人的分類誤差 0\% 作為貝葉斯誤差。若我們模型的誤差為:

  • Training error: 1\%
  • Dev error: 10\%

如果我們的訓練集和開發、測試集來自相同的分布,那麼我們可以說模型存在很大的方差問題。但如果數據來自不同的分布,那麼我們就不能下這樣的定論了。

那麼我們如何去確定是由於分布不匹配的問題導致開發集的誤差,還是由於演算法中存在的方差問題所致?

設立「訓練開發集」

訓練開發集,其中的數據和訓練數據來自同一分布,但是卻不用於訓練過程。

如果最終,我們的模型得到的誤差分別為:

  • Training error: 1\%
  • Training-dev error: 9\%
  • Dev error: 10\%

那麼,由於訓練開發集儘管和訓練集來自同一分布,但是卻有很大的誤差, 模型無法泛化到同分布的數據,那麼說明我們的模型存在方差問題

但如果我們的模型得到的誤差分別為:

  • Training error: 1\%
  • Training-dev error: 1.5\%
  • Dev error: 10\%

那麼在這樣的情況下,我們可以看到,來自同分布的數據,模型的泛化能力強,而開發集的誤差主要是來自於分布不匹配導致的。

分布不同的偏差方差分析

通過:Human level、Training set error、Training-dev set error、Dev error、Test error 之間誤差的大小,可以分別得知我們的模型,需要依次在:可避免的偏差、方差、數據分布不匹配、開發集的或擬合程度,這些方面做改進。

誤差分析

通常情況下來說,通過不同的集合上的誤差分析,我們得出的結果會是中間一列誤差由小變大,即誤差上升的情況。但是也有一定的可能會出現右邊一列誤差在開發測試集上又表現的好的情況。

下面通過一個後視鏡語音檢測的例子來說明。我們以該例子建立更加一般的表格。

其中,橫向分別是:普通語音識別數據、後視鏡語音識別數據;縱向分別是:Human level、訓練數據誤差、未訓練數據誤差。表格中不同的位置分別代表不同的數據集。

通常情況下,我們分析誤差會是一個遞增的情況,但是對於我們的模型,在後視鏡語音識別的數據數據上,可能已經可以達到人類水平誤差的 6\% 了,而最終的開發測試集也會 6\% 的誤差,要比訓練誤差和訓練開發誤差都要小。所以如果遇到這種情況,就要利用上表進行分析。

6. 解決數據分布不匹配問題

如果通過上一節的誤差分析,我們可以得知,模型最終在開發和測試集上的誤差最終是由於數據分布不匹配而導致。那麼這樣的情況下如何解決?

  • 進行人工誤差分析,嘗試去了解訓練集和開發測試集的具體差異在哪裡。如:噪音等;
  • 嘗試把訓練數據變得更像開發集,或者收集更多的類似開發集和測試集的數據,如增加噪音;

7. 遷移學習

將從一個任務中學到的知識,應用到另一個獨立的任務中。

遷移學習的意義:

遷移學習適合以下場合:遷移來源問題有很多數據,但是遷移目標問題卻沒有那麼多的數據。

假設圖像識別任務中有1百萬個樣本,裡面的數據相當多;但對與一些特定的圖像識別問題,如放射科圖像,也許只有一百個樣本,所以對於放射學診斷問題的數據很少。所以從圖像識別訓練中學到的很多知識可以遷移,來幫助我們提升放射科識別任務的性能。

同樣一個例子是語音識別,可能在普通的語音識別中,我們有龐大的數據量來訓練模型,所以模型從中學到了很多人類聲音的特徵。但是對於觸發字檢測任務,可能我們擁有的數據量很少,所以對於這種情況下,學習人類聲音特徵等知識就顯得相當重要。所以遷移學習可以幫助我們建立一個很好的喚醒字檢測系統。

遷移學習有意義的情況:

  • 任務A和任務B有著相同的輸入;
  • 任務A所擁有的數據要遠遠大於任務B(對於更有價值的任務B,任務A所擁有的數據要比B大很多);
  • 任務A的低層特徵學習對任務B有一定的幫助。

8. 多任務學習

與遷移學習的串列學習方式不同,在多任務學習中,多個任務是並行進行學習的,同時希望各個任務對其他的任務均有一定的幫助。

自動駕駛的例子:

假設在自動駕駛的例子中,我們需要檢測的物體很多,如行人、汽車、交通燈等等。

對於現在的任務,我們的目標值變成了一個向量的形式向量中的每一個值代表檢測到是否有如行人、汽車、交通燈等,一張圖片有多個標籤。

hat y^{(i)}=left[ egin{array}{l} 1\ 0\ 1\ 0 end{array} 
ight] left| egin{array}{l} Pedestrians\ Cars\ Road signs-Stop\ Traffic lights end{array} 
ight.

模型的神經網路結構如下圖所示:

該問題的 Loss function

loss = dfrac{1}{m}sumlimits_{i=1}^{m}sumlimits_{j=1}^{4}L(hat y^{(i)}_{j},y^{(i)}_{j})=dfrac{1}{m}sumlimits_{i=1}^{m}sumlimits_{j=1}^{4}(y^{(i)}_{j}log (hat y^{(i)}_{j})+(1-y^{(i)}_{j})log(1-hat y^{(i)}_{j}))

對於這樣的問題,我們就是在做多任務學習,因為我們建立單個神經網路,來解決多個問題。

特定的對於一些問題,例如在我們的例子中,數據集中可能只標註了部分信息,如其中一張只標註了人,汽車和交通燈的標識沒有標註。那麼對於這樣的數據集,我們依舊可以用多任務學習來訓練模型。當然要注意這裡Loss function求和的時候,只對帶0、1標籤的 j 進行求和。

多任務學習有意義的情況:

  • 如果訓練的一組任務可以共用低層特徵;
  • 通常,對於每個任務大量的數據具有很大的相似性;(如,在遷移學習中由任務A「100萬數據」遷移到任務B「1000數據」;多任務學習中,任務 A_{1},...,A_{n} ,每個任務均有1000個數據,合起來就有1000n個數據,共同幫助任務的訓練)
  • 可以訓練一個足夠大的神經網路並同時做好所有的任務。

9. 端到端深度學習

端到端學習的定義:

相對於傳統的一些數據處理系統或者學習系統,它們包含了多個階段的處理過程,而端到端的深度學習則忽略了這些階段,用單個神經網路來替代。

語音識別例子:

在少數據集的情況下傳統的特徵提取方式可能會取得好的效果;如果在有足夠的大量數據集情況下,端到端的深度學習會發揮巨大的價值。

優缺點:

  • 優點:
  1. 端到端學習可以直接讓數據「說話」;
  2. 所需手工設計的組件更少。
  • 缺點:
  1. 需要大量的數據;
  2. 排除了可能有用的手工設計組件。

應用端到端學習的 Key question:是否有足夠的數據能夠直接學習到從 x 映射到 y 的足夠複雜的函數。


本文將同時更新在我的CSDN博客

吳恩達Coursera深度學習課程 DeepLearning.ai 提煉筆記(3-2)-- 機器學習策略(2)

歡迎關注,一起學習一起進步喲。^_^

推薦閱讀:

基於注意力機制的四種增強型RNN(下)

TAG:深度学习DeepLearning | 机器学习 | 人工智能 |