1. 程式人生 > >Stanford機器學習課程筆記3-學習理論部分

Stanford機器學習課程筆記3-學習理論部分

簡單補充點SVM吧

關於SVM的筆記部落格內沒有整理,主要是因為

另外,關於LibSVM的理論,除了Andrew Ng給的Handout外,推薦的就是林智仁兩份資料:

好了,SVM不多說了,本文主要是要說一些偏機器學習中實踐的東西(雖然標題是學習理論,但其實是機器學習實踐更恰當些)。

偏置(Bias)與方差(variance)

如上圖,左邊是使用一階線性模型欠擬合,右邊是使用高階模型而產生了過擬合。因此,有條很重要的結論:

模型並不是越複雜越好,複雜模型應對簡單問題容易產生過擬合。實踐時要預先對問題進行分析和定義,比如:把資料plot出來看一下

偏置(Bias)對應的就是線性最小二乘中損失函式J的大小,因此偏置越小說明對訓練資料的擬合程度越好。如上右圖偏置最小,儘管如此,我們不能以偏概全(因為偏置是在訓練資料上進行的衡量,對於未知資料的預測效果並不一定很好),因此引入了方差(variance)。方差是指擬合模型的波動程度,如上右圖擬合模型波動太大,產生了過擬合,因此方差也是越小越好。考慮對偏置和方差進行折中,上中圖才是最佳的擬合方案。

對於分類器誤差的衡量有兩個重要的概念應該理解:

  1. 訓練誤差:也有稱經驗風險(emprical risk)/經驗誤差(emprical error),指的是模型在訓練資料集的誤差

  1. 預測誤差:也有稱泛化誤差(generalization error),指的是模型在未知樣本即預測資料集上的誤差

,其中D為預測資料集

如上圖是實際訓練過程中訓練誤差和預測誤差隨訓練樣本數的變化:

  • 在m=m0位置, 很大,即訓練誤差和預測誤差差值很大,主要由於訓練樣本過少造成了過擬合(對應variance很大),導致訓練誤差很小而預測誤差很大,針對上圖的解決方案就是增加m值。應對過擬合問題還有一些其它的方式,當我們的樣本資料集缺乏的時候,其它方案也非常有效(下面會討論)
  • 在m=m1位置, 很小了,訓練誤差接近預測誤差說明模型的泛化能力好,當繼續增加訓練樣本數量已經很難再對模型的效能有很大改善了

如上圖是實際訓練過程中訓練誤差和預測誤差隨訓練樣本數變化的另一種情況:

  • 訓練誤差很大,甚至超過了期望的誤差邊界,這個時候明顯發生了欠擬合,也就是說模型還沒有充分的學習訓練資料特徵。這個時候對應Bias很大,主要可能是兩種情況造成的:
    1. 模型國語簡單,應該提高模型複雜度(比如:從2階線性模型提高到4解線性模型,模型的引數也隨之增加,或者改用更復雜的模型如SVM、深度學習等);
    2. 特徵簡單,區分特性差,應該進行特徵選擇(下面會講到怎麼做),檢驗特徵是否合適並選擇合適的特徵進行訓練

過擬合的解決方案

之前到北京電視臺聽一個現場節目,有個主持人問:怎麼才能做好一個演講?大家莫衷一是,沒想到主持人給的回答卻是:“把話筒對著自己的嘴”。想想,很有道理啊。如何應對過擬合問題?回答是:“你得確定確實已經發生了過擬合”。怎麼確定?上一節其實已經提到過,“排除不是欠擬合(訓練誤差很大)的情況,當訓練誤差和預測誤差相距甚遠的時候(m=m0)的情況就是發生了過擬合”。應對過擬合一般有以下幾種方案:

  1. 減小模型複雜度,降低模型階次。當然,改模型不是最佳的辦法,不得已而用之
  2. 減小特徵維度n,僅保留有利特徵,減少無效特徵的干擾
  3. 增加訓練樣本數量。當然,資料是如此的珍貴,也不是說有就有的,如果有,這無疑是最簡單的辦法
  4. 規則化(Regularization),這是最常用的方法,尤其Paper中很常見。規則化也有多種辦法:
    1. 增加  正則化項
    2. 用MAP替代ML估計,其中的引數先驗概率p()有正則化(避免過擬合)效果。這部分就不做筆記了,詳見Andrew Ng的講義中Bayesian statistics and regularizaiton部分

交叉驗證(Cross validation)

那既然不能用訓練誤差衡量分類器的好壞,那如何在訓練資料集上衡量一個分類器的好壞呢。或者說,如何選擇最佳的分類器引數呢?對了,就是交叉驗證(CV)。CV是用來驗證分類器的效能一種統計分析方法,基本思想是把在某種意義下將原始資料(dataset)進行分組,一部分做為訓練集(train set),另一部分做為驗證集(validation set),首先用訓練集對分類器進行訓練,在利用驗證集來測試訓練得到的模型(model),以此來做為評價分類器的效能指標。

  1. Hold-Out Method

    將原始資料隨機分為兩組,一組做為訓練集,一組做為驗證集,利用訓練集訓練分類器,然後利用驗證集驗證模型,記錄最後的分類準確率為此Hold-OutMethod下分類器的效能指標.此種方法的好處的處理簡單,只需隨機把原始資料分為兩組即可,其實嚴格意義來說Hold-Out Method並不能算是CV,因為這種方法沒有達到交叉的思想,由於是隨機的將原始資料分組,所以最後驗證集分類準確率的高低與原始資料的分組有很大的關係,所以這種方法得到的結果其實並不具有說服性.

  2. K-fold Cross Validation(記為K-CV)

    將原始資料分成K組(一般是均分),將每個子集資料分別做一次驗證集,其餘的K-1組子集資料作為訓練集,這樣會得到K個模型,用這K個模型最終的驗證集的分類準確率的平均數作為此K-CV下分類器的效能指標.K一般大於等於2,實際操作時一般從3開始取,只有在原始資料集合資料量小的時候才會嘗試取2.K-CV可以有效的避免過學習以及欠學習狀態的發生,最後得到的結果也比較具有說服性.

  3. Leave-One-Out Cross Validation(記為LOO-CV)

    如果設原始資料有N個樣本,那麼LOO-CV就是N-CV,即每個樣本單獨作為驗證集,其餘的N-1個樣本作為訓練集,所以LOO-CV會得到N個模型,用這N個模型最終的驗證集的分類準確率的平均數作為此下LOO-CV分類器的效能指標.相比於前面的K-CV,LOO-CV有兩個明顯的優點:

    • 每一回閤中幾乎所有的樣本皆用於訓練模型,因此最接近原始樣本的分佈,這樣評估所得的結果比較可靠。
    • 實驗過程中沒有隨機因素會影響實驗資料,確保實驗過程是可以被複制的。

    但LOO-CV的缺點則是計算成本高,因為需要建立的模型數量與原始資料樣本數量相同,當原始資料樣本數量相當多時,LOO-CV在實作上便有困難幾乎就是不顯示,除非每次訓練分類器得到模型的速度很快,或是可以用並行化計算減少計算所需的時間.

在LibSVM中,可以通過設定svm-train的-v引數設定交叉驗證,-v表示交叉驗證的分組數。

特徵選擇

現在面臨這麼一個問題:現在採集了很多特徵,有些對分類是有效的,有些是無效的,但不知道哪些有效,哪些無效。如何從這些特徵集合F中選擇有效的特徵子集Fi,這本身是一個NP-Hard問題,如果隨機組合特徵放進訓練機訓練,則自少要有2^N種情況,N是特徵類別數。有一種啟發式的方法可以進行特徵選擇操作:

然而,上面的方法效果一般來說還是不錯,但依然很慢,需要O(N^2),該方法稱為Forward search。當然,上面是一個個地加特徵,也先設F為特徵全集,然後一個個地減特徵,這種方式稱為Backward search。Andrew Ng老師還提供了複雜度更低,但相對效果要差一些的演算法:Filter feature selection。計算特徵xi和label y之間的相關特性,使用互資訊(mutual information)來度量,

其中p(xi,y)、p(xi)、p(y)都可以從訓練資料中估計出來,上面的MI(x,y)其實就是KL距離,

KL距離表示了兩個向量之間的diffrence,MI越接近0,說明特徵xi與y之間的獨立性越好,特徵對label y的貢獻越小。最後對MI排個序,選擇相關性最大的K個特徵就好。不過,實際效果聽說要比直接用Forward search差不少,主要優勢就是複雜度低O(1)。

實際中各元件對分類的貢獻(Error Analysis)

Andrew Ng老師下面的Face Recognition任務,任務中提取特徵包括很多元件(背景移除、人臉檢測、眼睛分割、鼻子分割、嘴分割),怎麼衡量各個元件對最終分類效果的影響?

先搭建系統原型(Overall system),直接輸入影象作為特徵進行識別,再逐一加入特徵,沒次加入特徵後都與Groudtruth進行對比得到精度:

從表中可以看出,從remove background到Face detection提升效果顯著91%-85.1%,而remove background僅提升了1%,所以remove background是無關緊要的特徵,而Face detection操作卻非常重要。