1. 程式人生 > >deeplearning.ai第三課:結構化機器學習專案

deeplearning.ai第三課:結構化機器學習專案

1 正交化

正交化的含義是在設計系統時,應該使得系統一個元件/引數的變化對另一個元件/引數的影響儘可能小。這樣就可以相對簡單的實驗系統的各個組成部分,可以減小系統的驗證和測試時間。

開發一個有監督機器學習系統時,應該依次序完成四件事情:

  • 訓練集要對代價函式擬合的很好,如果擬合的不好,可以嘗試規模更大的網路結構或者嘗試使用更好的優化演算法;
  • 驗證集要對代價函式擬合的很好,如果擬合的不好,可以嘗試新增正則化或者增加訓練集的規模;
  • 測試集要對代價函式擬合的很好,如果擬合的不好,可以使用一個更大的驗證集;
  • 訓練結果要在實際應用中表現的很好,如果表現不好,說明沒有設定正確的驗證/測試集,或者定義的代價函式沒有很好的描述實際應用。

2 單實數評價指標

在開始機器學習模型訓練之前,首先確定一個單實數的評價指標,從而可以快速的驗證自己使用不同策略訓練得到的模型的優劣。接著再以最好的那個模型為起點,繼續除錯改善演算法效能。

對於二分類任務,主要的指標有查準率(precision)和查全率(recall)。

actual True actual False
predict True true positive(TP) false positive(FP)
predict False false negative(FN) true negative(TN)

查準率,預測為正例的樣本中有多少是真正的正例。
P = T P T

P + P F P = \frac{TP}{TP + PF}

查全率,真實正例中有多少被預測為正例。
R = T P T P + F N R = \frac{TP}{TP + FN}

用於劃分為正例的閾值越大,查準確越高,但查全率越低;閾值越小,查準率越低,但查全率越高。如何使用一個指標兼顧查準率和查全率呢?答案是使用查準率和查全率的調和平均。即單一的實數評價指標: F 1 = 2 1 p + 1 R = 2 P R P + R F1 = \frac{2}{\frac{1}{p}+\frac{1}{R}} = \frac{2PR}{P + R} ,F1值越大,表示模型的整體效能越好。

滿足指標和優化指標
設計一個機器學習系統時,需要考慮很多的效能指標,很多時候把這些效能指標組成一個單實數評價指標難度很大,此時可以根據具體的需要將效能指標分為滿足效能指標和優化效能指標兩類。

如下圖所示的示例,假設對系統的要求時在執行時間小於100ms的情況下最大化識別精度。我們可以設計一個單實數評價指標為 a c c 0.5 r u n n i n g   t i m e acc - 0.5 * running~time ,但是這個評價指標設計的太過刻意。我們可以將指標分為優化指標和滿足指標兩類,在本例中,可以把執行時間小於等於100ms作為滿足指標,把準確率作為優化指標。最終得到的評價標準為:
m a x   a c c s . t .    r u n n i n g   t i m e 100 m s max ~ acc \\ s.t.~~running ~ time \leq 100ms
在這裡插入圖片描述
一般在N個評價指標的情況下,會選擇其中一個作為優化指標,剩餘的N-1個指標作為滿足指標。比如在人臉識別任務中,我們可以要求在誤識率小於1e-3且識別時間小於500ms的情況下最大化識別準確率,那麼誤識率和識別時間就是滿足指標,準確率就是優化指標。

3 訓練/驗證/測試集的劃分

各資料集作用:
訓練集用於訓練模型;
驗證集用於對不同的演算法/超引數進行交叉驗證選擇最優演算法/超引數,再基於選定的演算法/超引數在訓練集上進行模型訓練;
測試集用於最終的模型測試。

訓練/驗證/測試集的劃分對最終的系統性能具有關鍵的影響。

劃分原則:
應該按照同分布的原則隨機選取驗證/測試集,也就是說應該把全部資料打散,抽取驗證集和測試集,在驗證集上交叉驗證選擇演算法/超引數,在測試集上進行模型的測試。驗證集表示訓練過程要瞄準的靶心,如果驗證集和測試集分佈不一致或者給了錯誤的評價指標,那麼就表示給定了一個錯誤的靶心,這種情況下想在測試集上取得好的實際應用效果是不可能的。目標錯了,走的越遠,錯的越離譜。

驗證/測試集一定要能夠表徵在實際應用中擬處理的資料的分佈情況。驗證&測試&實際應用中處理的資料必須是同分布的

各資料集大小比例:
傳統機器學習任務中,按照70%,30%的比例劃分訓練集和測試集,或者按照60%,20%,20%的比例劃分訓練、驗證、測試集。但是在深度學習時代,由於總的訓練樣本規模很大,假設在大於1,000,000的情況下,可以按照98:1:1的比例劃分訓練/驗證/測試集。

什麼時候應該改變驗證/測試集或者改變評價標準?
如果原始定義的驗證/測試集+評價標準不符合使用者的喜好或者在實際應用中表現不好,那麼就應該修改驗證/測試集和評價標準。

4 機器學習的參考標準

在這裡插入圖片描述
如上圖所示,貝葉斯最優可以認為是可能達到的最小誤差,之所以有貝葉斯最優而不是達到真正的100%的準確率是因為可能在影象識別的任務中,某些影象質量太差以至於根本無法正確識別。或者是在語音識別示例中,某些輸入音訊噪聲太大以至於根本無法正確識別資訊。所以貝葉斯最優估計的準確率也是低於1的。

在機器學習系統的準確度低於人臉識別準確度的情況下,可以通過使用多種手段快速提升機器學習系統的效能,但機器學習系統的效能一旦超過了人類的識別精度,再想快速提升就比較困難了。

為什麼要對標人類的表現?
因為人類的確比較擅長某些任務,比如影象識別、音訊分析等,人類能夠取得的精度非常接近貝葉斯最優估計的精度。那麼在機器學習演算法的效能劣於人類表現時,可以通過獲取更多的人類標註的資料、分析人類為何能夠對某些樣本進行正確識別、更好的進行方差和偏差的均衡等手段提升演算法的表現。但是一旦通過這些手段將機器學習演算法的效能提升到超過人類表現之後,再想繼續提升演算法效能時,上述三種手段都已失效,因此也就沒有了更多的辦法繼續快速提升。

可避免偏差
在計算機視覺任務中,可以把人類的表現近似認為是貝葉斯最優估計。

假設在兩個不同的計算機視覺分類任務上取得了下表所示的結果。

人類分類錯誤率 1% 7.5%
訓練集分類錯誤率 8% 8%
驗證集分類錯誤率 10% 10%
處理方案 降低偏差 降低方差

第一個任務中,訓練集分類錯誤率和分類分類錯誤率之間的gap遠大於訓練集和驗證集之間的分類錯誤率,因此改善模型效果的正確的做法降低偏差,可以使用更大的網路或者進行更多次的迭代優化等降低偏差的手段;第二個任務中,訓練集和驗證集分類錯誤率之間的gap遠大於訓練集和人類之間的分類錯誤率,所以改善模型效能的首要做法是降低模型的方差,可以通過使用更多的訓練資料或者新增正則化等手段。在第二個任務中,努力嘗試降低人類表現和訓練集分類錯誤率之間的gap是非常難的。

將貝葉斯最優估計與模型在訓練集上表現之間的差值稱之為可避免誤差;將訓練集和驗證集上表現之間的差值成為方差。

理解人類表現
在這裡插入圖片描述
上圖問題的正確答案是應該把0.5% error作為人類的表現。這是因為人類表現作為貝葉斯最優的近似,那麼既然一隊有經驗的醫生可以達到0.5%的錯誤率,那麼就應該把這個最優秀的結果作為人類表現。

如果出現了下表所示的情況:

一組人類專家的分類錯誤率 0.5
訓練集分類錯誤率 0.3
驗證集分類錯誤率 0.4

在這種情況下,表示沒有足夠的資訊決定下一步應該如何做。因為訓練集誤差小於了人類的分類誤差,此時無法確定是因為我們人類專家並沒有做到最好的分類判斷而貝葉斯最優估計誤差小於0.3%,還是因為貝葉斯最優錯誤率就是0.5%而我們的模型對訓練集過擬合造成了訓練集錯誤率達到了0.3%。此時無法確定可避免偏差和方差的大小,因此就無法確定下一步的優化方向。

提升模型表現
在這裡插入圖片描述

5 進行誤差分析

在完成一個模型的訓練之後,假設模型在驗證集/測試集上的效果不足夠理想,應該針對錯誤樣本進行鍼對性的誤差分析。分析的方法是,選取一定量的錯誤處理的測試樣本,統計錯誤樣本的類別,根據各型別樣本的比例從大到小針對性處理,改善模型效果。

核心點就是,分析錯誤樣本型別,先處理主要矛盾,再解決次要矛盾。

6 如何處理誤標記的訓練樣本

深度學習演算法對於訓練樣本集中的隨機誤標記樣本是非常魯棒的。少量的誤標記訓練樣本對模型訓練影響不大。但若是發生了大量的系統性的誤標記,那麼可能影響就無法忽略了。

如何判斷是否應該花費時間去修正錯誤標記的訓練樣本?答案是選取一定量的錯誤分類的驗證/測試樣本,統計由於誤標記造成的錯誤處理的樣本所佔的比例,比如一張用於驗證的貓的影象,模型識別其為貓,但由於影象誤標記為狗造成了誤識別,就需要統計這部分樣本的比例。如果該比例值較大,則需要進行誤標記訓練樣本的修正。

如果經過分析決定修正誤標記的樣本,那麼有兩條準則需要遵守:

  • 同時尋找驗證集和測試集中誤標記的樣本,之所以這樣做,是要保證驗證集和測試集服從同一分佈,這個的重要性不再重複強調了,只有給定正確的靶心才能取得良好的效果;
  • 一般訓練集的規模遠大於驗證集和測試集,所以如果只修正了驗證集和測試集,不進行訓練集的誤標記修正也是可以的,這樣訓練集和驗證/測試集的分佈就存在了細微的差異,可以通過其他的手段進行處理,這一點後續介紹。

7 開發一個機器學習任務的基本法則

處理新的問題:
快速設立驗證/測試集,明確驗證標準;
快速訓練一個初始的模型;
基於初始模型的偏差/方差分析,決定下一步的修正方向。持續迭代,優化模型效能。

處理已有很多參考經驗的問題:
分析state-of-art論文,站在巨人的肩膀上繼續優化。

8 訓練集和測試集分佈存在差異時如何處理

如何劃分資料集
假如準備訓練一個貓分類模型。手頭有爬取的20萬張高清影象和1萬張使用者上傳的模糊、角度不理想的影象。如何分配訓練/驗證/測試集?

方案一是將全部的21萬張影象全部打散,選取205000影象作為訓練集,2500驗證集,2500測試集。這樣做,保證了訓練/驗證/測試集全部服從同一分佈,但是這樣違背了最重要的原則,驗證/測試集和實際應用時的資料分佈不一致,這樣就表示給定了一個錯誤的target。因此,該方案不可取。

正確的做法是,選取20萬張網路高清影象+5000張使用者上傳影象作為訓練集,2500張使用者上傳影象作為驗證集,2500張使用者上傳影象作為測試集。這樣雖然訓練集和驗證/測試集的分佈略微不一致,但是驗證/測試集和實際應用處理的資料分佈一致,保證給定了一個正確的target。這樣才可以保證訓練出實際應用效果最優的模型。

訓練集和驗證/測試集分佈不一致時如何進行偏差/方差分析
原來訓練/驗證/測試集分佈一致時,我們可以根據貝葉斯最優估計誤差、訓練集誤差、驗證集誤差三者之間的差值決定下一步的優化方向是減小偏差還是方差。但是如果訓練集和驗證/測試集分佈不一致時,該如何進行判斷?

正確的做法是,從訓練集中劃出一部分不參與訓練的資料集,稱之為training-dev set。這部分資料集和訓練集同分布,但不參與模型的訓練過程。最終比較貝葉斯最優估計、訓練集誤差、training-dev set的誤差和驗證集誤差,就可以得到下一步的優化方向。如果主要差距來自於貝葉斯最優估計和訓練集誤差,那麼下一步應該減小偏差;如果主要差距來自於訓練集誤差和training-sev set的誤差,那麼下一步應該減小方差;如果主要差距來自於training-dev set和驗證集的誤差,那麼差距主要是由於data mismatch造成的。

貝葉斯最優誤差
      ~~~~~\Uparrow
可避免偏差
      ~~~~~\Downarrow
訓練集誤差
      ~~~~~\Uparrow
方差
      ~~~~~\Downarrow
training-dev set 誤差
      ~~~~~\Uparrow
data mismatch誤差
      ~~~~~\Downarrow
驗證集誤差
      ~~~~~\Uparrow
對驗證集過擬合的程度
      ~~~~~\Downarrow
測試集誤差

如何解決資料不匹配造成的誤差?
人工進行誤差分析,定位訓練集和驗證/測試集之間的偏差;
對訓練資料進行處理,使其更加接近於驗證/測試資料。或者收集更多類似於驗證/測試資料的訓練樣本。
可以人工合成訓練資料,但是一定要小心,避免模型對人工合成數據的過擬合。

9 遷移學習

什麼時候適合使用遷移學習,比如把針對任務A訓練的模型進行遷移使其適用於任務B以提升任務B的效能?

  • 任務A和B具有相同型別的輸入,都是影象或者都是音訊;
  • 針對任務A的訓練資料遠多於針對任務B的訓練資料;
  • 任務A的低層特徵對任務B有益。

10 多工學習

多工學習是指一個模型實現多個任務且比多個獨立的模型效能更好。

多工學習用多個logistic regression作為輸出,因為一副影象既可以包含行人,又可以包含車輛。如果用softmax regression作為輸出,一副影象只能有一個輸出label,不適合用於多工學習。

進行多工分類時,預測結果為 ( n j , m ) (n_j,m) 的矩陣, n j n_j 表示多工的任務數, m m 表示樣本數量,計算損失函式時使用 1 m i = 1 m j = 1 n j L ( y ^ j ( i ) , y j ( i ) ) \frac{1}{m}\sum_{i=1}^{m}\sum_{j=1}^{n_j}L(\hat y_j^{(i)},y_j^{(i)}) ,即計算各類別所有樣本總的損失均值。

假設進行人、車、交通標誌、紅綠燈的分類,某幅影象標記了包含行人、不包含車輛,但沒有標記是否包含交通標誌和紅綠燈。這樣的樣本也可以應用於多工分類。只是在計算損失函式時,對 j j 的求和不再是全部類別,而是標記了 0 / 1 0/1 的類別。即 1 m i = 1 m j = 1 n j [ 1 { y j ( i ) = 0 } L ( y ^ j ( i ) , y j ( i ) ) + 1 { y j ( i ) = 1 } L ( y ^ j ( i ) , y j ( i ) ) ] \frac{1}{m}\sum_{i=1}^{m}\sum_{j=1}^{n_j}[1\{y_j^{(i)} = 0\}L(\hat y_j^{(i)},y_j^{(i)})+1\{y_j^{(i)} = 1\}L(\hat y_j^{(i)},y_j^{(i)})]