1. 程式人生 > >coursera-斯坦福-機器學習-吳恩達-應用機器學習的建議

coursera-斯坦福-機器學習-吳恩達-應用機器學習的建議

10.1 決定下一步做什麼
參考視訊: 10 - 1 - Deciding What to Try Next (6 min).mkv

到目前為止,我們已經介紹了許多不同的學習演算法,如果你一直跟著這些視訊的進度學習,你會發現自己已經不知不覺地成為一個瞭解許多先進機器學習技術的專家了。

然而,在懂機器學習的人當中依然存在著很大的差距,一部分人確實掌握了怎樣高效有力地運用這些學習演算法。而另一些人他們可能對我馬上要講的東西,就不是那麼熟悉了。他們可能沒有完全理解怎樣運用這些演算法。因此總是把時間浪費在毫無意義的嘗試上。我想做的是確保你在設計機器學習的系統時,你能夠明白怎樣選擇一條最合適、最正確的道路。因此,在這節視訊和之後的幾段視訊中,我將向你介紹一些實用的建議和指導,幫助你明白怎樣進行選擇。具體來講,我將重點關注的問題是假如你在開發一個機器學習系統,或者想試著改進一個機器學習系統的效能,你應如何決定接下來應該選擇哪條道路?為了解釋這一問題,我想仍然使用預測房價的學習例子,假如你已經完成了正則化線性迴歸,也就是最小化代價函式$J$的值,假如,在你得到你的學習引數以後,如果你要將你的假設函式放到一組新的房屋樣本上進行測試,假如說你發現在預測房價時產生了巨大的誤差,現在你的問題是要想改進這個演算法,接下來應該怎麼辦?

實際上你可以想出很多種方法來改進這個演算法的效能,其中一種辦法是使用更多的訓練樣本。具體來講,也許你能想到通過電話調查或上門調查來獲取更多的不同的房屋出售資料。遺憾的是,我看到好多人花費了好多時間想收集更多的訓練樣本。他們總認為,要是我有兩倍甚至十倍數量的訓練資料,那就一定會解決問題的是吧?但有時候獲得更多的訓練資料實際上並沒有作用。在接下來的幾段視訊中,我們將解釋原因。

我們也將知道怎樣避免把過多的時間浪費在收集更多的訓練資料上,這實際上是於事無補的。另一個方法,你也許能想到的是嘗試選用更少的特徵集。因此如果你有一系列特徵比如x_1,x_2,x_3等等。也許有很多特徵,也許你可以花一點時間從這些特徵中仔細挑選一小部分來防止過擬合。或者也許你需要用更多的特徵,也許目前的特徵集,對你來講並不是很有幫助。你希望從獲取更多特徵的角度來收集更多的資料,同樣地,你可以把這個問題擴充套件為一個很大的專案,比如使用電話調查來得到更多的房屋案例,或者再進行土地測量來獲得更多有關,這塊土地的資訊等等,因此這是一個複雜的問題。同樣的道理,我們非常希望在花費大量時間完成這些工作之前,我們就能知道其效果如何。我們也可以嘗試增加多項式特徵的方法,比如x_1的平方,x_2的平方,x_1,x_2的乘積,我們可以花很多時間來考慮這一方法,我們也可以考慮其他方法減小或增大正則化引數$\lambda$的值。我們列出的這個單子,上面的很多方法都可以擴充套件開來擴充套件成一個六個月或更長時間的專案。遺憾的是,大多數人用來選擇這些方法的標準是憑感覺的,也就是說,大多數人的選擇方法是隨便從這些方法中選擇一種,比如他們會說“噢,我們來多找點資料吧”,然後花上六個月的時間收集了一大堆資料,然後也許另一個人說:“好吧,讓我們來從這些房子的資料中多找點特徵吧”。我很遺憾不止一次地看到很多人花了至少六個月時間來完成他們隨便選擇的一種方法,而在六個月或者更長時間後,他們很遺憾地發現自己選擇的是一條不歸路。幸運的是,有一系列簡單的方法能讓你事半功倍,排除掉單子上的至少一半的方法,留下那些確實有前途的方法,同時也有一種很簡單的方法,只要你使用,就能很輕鬆地排除掉很多選擇,從而為你節省大量不必要花費的時間。最終達到改進機器學習系統性能的目的假設我們需要用一個線性迴歸模型來預測房價,當我們運用訓練好了的模型來預測未知資料的時候發現有較大的誤差,我們下一步可以做什麼?
獲得更多的訓練樣本——通常是有效的,但代價較大,下面的方法也可能有效,可考慮先採用下面的幾種方法。

  1. 嘗試減少特徵的數量
  2. 嘗試獲得更多的特徵
  3. 嘗試增加多項式特徵
  4. 嘗試減少正則化程度
  5. 嘗試增加正則化程度

 我們不應該隨機選擇上面的某種方法來改進我們的演算法,而是運用一些機器學習診斷法來幫助我們知道上面哪些方法對我們的演算法是有效的。
         在接下來的兩段視訊中,我首先介紹怎樣評估機器學習演算法的效能,然後在之後的幾段視訊中,我將開始討論這些方法,它們也被稱為"機器學習診斷法"。“診斷法”的意思是:這是一種測試法,你通過執行這種測試,能夠深入瞭解某種演算法到底是否有用。這通常也能夠告訴你,要想改進一種演算法的效果,什麼樣的嘗試,才是有意義的。在這一系列的視訊中我們將介紹具體的診斷法,但我要提前說明一點的是,這些診斷法的執行和實現,是需要花些時間的,有時候確實需要花很多時間來理解和實現,但這樣做的確是把時間用在了刀刃上,因為這些方法讓你在開發學習演算法時,節省了幾個月的時間,因此,在接下來幾節課中,我將先來介紹如何評價你的學習演算法。在此之後,我將介紹一些診斷法,希望能讓你更清楚。在接下來的嘗試中,如何選擇更有意義的方法。

10.2 評估一個假設
參考視訊: 10 - 2 - Evaluating a Hypothesis (8 min).mkv

在本節視訊中我想介紹一下怎樣用你學過的演算法來評估假設函式。在之後的課程中,我們將以此為基礎來討論如何避免過擬合和欠擬合的問題。

                                
         當我們確定學習演算法的引數的時候,我們考慮的是選擇參量來使訓練誤差最小化,有人認為得到一個非常小的訓練誤差一定是一件好事,但我們已經知道,僅僅是因為這個假設具有很小的訓練誤差,並不能說明它就一定是一個好的假設函式。而且我們也學習了過擬合假設函式的例子,所以這推廣到新的訓練集上是不適用的。

那麼,你該如何判斷一個假設函式是過擬合的呢?對於這個簡單的例子,我們可以對假設函式進行畫圖,然後觀察圖形趨勢,但對於特徵變數不止一個的這種一般情況,還有像有很多特徵變數的問題,想要通過畫出假設函式來進行觀察,就會變得很難甚至是不可能實現。

因此,我們需要另一種方法來評估我們的假設函式過擬合檢驗。

為了檢驗演算法是否過擬合,我們將資料分成訓練集和測試集,通常用70%的資料作為訓練集,用剩下30%的資料作為測試集。很重要的一點是訓練集和測試集均要含有各種型別的資料,通常我們要對資料進行“洗牌”,然後再分成訓練集和測試集。


      測試集評估在通過訓練集讓我們的模型學習得出其引數後,對測試集運用該模型,我們有兩種方式計算誤差:對於線性迴歸模型,我們利用測試集資料計算代價函式$J$

對於邏輯迴歸模型,我們除了可以利用測試資料集來計算代價函式外:

                            
誤分類的比率,對於每一個測試集樣本,計算:

                             

然後對計算結果求平均。

10.3 模型選擇和交叉驗證集
參考視訊: 10 - 3 - Model Selection and Train_Validation_Test Sets (12 min).mkv

假設我們要在10個不同次數的二項式模型之間進行選擇:

                              
       顯然越高次數的多項式模型越能夠適應我們的訓練資料集,但是適應訓練資料集並不代表著能推廣至一般情況,我們應該選擇一個更能適應一般情況的模型。我們需要使用交叉驗證集來幫助選擇模型。

即:使用60%的資料作為訓練集,使用 20%的資料作為交叉驗證集,使用20%的資料作為測試集

                               


模型選擇的方法為:

使用訓練集訓練出10個模型

用10個模型分別對交叉驗證集計算得出交叉驗證誤差(代價函式的值)

選取代價函式值最小的模型

用步驟3中選出的模型對測試集計算得出推廣誤差(代價函式的值)

Train/validation/test error

Training error:

                                
Cross Validation error:

                                
Test error:

                             
10.4 診斷偏差和方差
參考視訊: 10 - 4 - Diagnosing Bias vs. Variance (8 min).mkv

當你執行一個學習演算法時,如果這個演算法的表現不理想,那麼多半是出現兩種情況:要麼是偏差比較大,要麼是方差比較大。換句話說,出現的情況要麼是欠擬合,要麼是過擬合問題。那麼這兩種情況,哪個和偏差有關,哪個和方差有關,或者是不是和兩個都有關?搞清楚這一點非常重要,因為能判斷出現的情況是這兩種情況中的哪一種。其實是一個很有效的指示器,指引著可以改進演算法的最有效的方法和途徑。在這段視訊中,我想更深入地探討一下有關偏差和方差的問題,希望你能對它們有一個更深入的理解,並且也能弄清楚怎樣評價一個學習演算法,能夠判斷一個演算法是偏差還是方差有問題,因為這個問題對於弄清如何改進學習演算法的效果非常重要,高偏差和高方差的問題基本上來說是欠擬合和過擬合的問題。

                     


我們通常會通過將訓練集和交叉驗證集的代價函式誤差與多項式的次數繪製在同一張圖表上來幫助分析:

                                    


Bias/variance

Training error:  

Cross Validation error:    

對於訓練集,當 d較小時,模型擬合程度更低,誤差較大;隨著 d的增長,擬合程度提高,誤差減小。

對於交叉驗證集,當 d較小時,模型擬合程度低,誤差較大;但是隨著 d的增長,誤差呈現先減小後增大的趨勢,轉折點是我們的模型開始過擬合訓練資料集的時候。

如果我們的交叉驗證集誤差較大,我們如何判斷是方差還是偏差呢?根據上面的圖表,我們知道:

                        


訓練集誤差和交叉驗證集誤差近似時:偏差/欠擬合

交叉驗證集誤差遠大於訓練集誤差時:方差/過擬合
10.5 正則化和偏差/方差
參考視訊: 10 - 5 - Regularization and Bias_Variance (11 min).mkv

在我們在訓練模型的過程中,一般會使用一些正則化方法來防止過擬合。但是我們可能會正則化的程度太高或太小了,即我們在選擇λ的值時也需要思考與剛才選擇多項式模型次數類似的問題。

                      
我們選擇一系列的想要測試的值,通常是 0-10之間的呈現2倍關係的值(如:0,0.01,0.02,0.04,0.08,0.15,0.32,0.64,1.28,2.56,5.12,10共12個)。 我們同樣把資料分為訓練集、交叉驗證集和測試集。

                             
選擇的方法為:

  1. 使用訓練集訓練出12個不同程度正則化的模型
  2. 用12個模型分別對交叉驗證集計算的出交叉驗證誤差
  3. 選擇得出交叉驗證誤差最小的模型
  4. 運用步驟3中選出模型對測試集計算得出推廣誤差,我們也可以同時將訓練集和交叉驗證集模型的代價函式誤差與λ的值繪製在一張圖表上:


• 當 較小時,訓練集誤差較小(過擬合)而交叉驗證集誤差較大

• 隨著 的增加,訓練集誤差不斷增加(欠擬合),而交叉驗證集誤差則是先減小後增加
10.6 學習曲線
參考視訊: 10 - 6 - Learning Curves (12 min).mkv

學習曲線就是一種很好的工具,我經常使用學習曲線來判斷某一個學習演算法是否處於偏差、方差問題。學習曲線是學習演算法的一個很好的**合理檢驗**(**sanity check**)。學習曲線是將訓練集誤差和交叉驗證集誤差作為訓練集樣本數量(m)的函式繪製的圖表。

即,如果我們有100行資料,我們從1行資料開始,逐漸學習更多行的資料。思想是:當訓練較少行資料的時候,訓練的模型將能夠非常完美地適應較少的訓練資料,但是訓練出來的模型卻不能很好地適應交叉驗證集資料或測試集資料。

                           
如何利用學習曲線識別高偏差/欠擬合:作為例子,我們嘗試用一條直線來適應下面的資料,可以看出,無論訓練集有多麼大誤差都不會有太大改觀:

                               
也就是說在高偏差/欠擬合的情況下,增加資料到訓練集不一定能有幫助。

如何利用學習曲線識別高方差/過擬合:假設我們使用一個非常高次的多項式模型,並且正則化非常小,可以看出,當交叉驗證集誤差遠大於訓練集誤差時,往訓練集增加更多資料可以提高模型的效果。

                                              


也就是說在高方差/過擬合的情況下,增加更多資料到訓練集可能可以提高演算法效果。
10.7 決定下一步做什麼
參考視訊: 10 - 7 - Deciding What to Do Next Revisited (7 min).mkv

我們已經介紹了怎樣評價一個學習演算法,我們討論了模型選擇問題,偏差和方差的問題。那麼這些診斷法則怎樣幫助我們判斷,哪些方法可能有助於改進學習演算法的效果,而哪些可能是徒勞的呢?

讓我們再次回到最開始的例子,在那裡尋找答案,這就是我們之前的例子。回顧 1.1 中提出的六種可選的下一步,讓我們來看一看我們在什麼情況下應該怎樣選擇:

  1. 獲得更多的訓練樣本——解決高方差
  2. 嘗試減少特徵的數量——解決高方差
  3. 嘗試獲得更多的特徵——解決高偏差
  4. 嘗試增加多項式特徵——解決高偏差
  5. 嘗試減少正則化程度λ——解決高偏差
  6. 嘗試增加正則化程度λ——解決高方差

神經網路的方差和偏差: 

使用較小的神經網路,類似於引數較少的情況,容易導致高偏差和欠擬合,但計算代價較小使用較大的神經網路,類似於引數較多的情況,容易導致高方差和過擬合,雖然計算代價比較大,但是可以通過正則化手段來調整而更加適應資料。

通常選擇較大的神經網路並採用正則化處理會比採用較小的神經網路效果要好。

對於神經網路中的隱藏層的層數的選擇,通常從一層開始逐漸增加層數,為了更好地作選擇,可以把資料分為訓練集、交叉驗證集和測試集,針對不同隱藏層層數的神經網路訓練神經網路,
然後選擇交叉驗證集代價最小的神經網路。

好的,以上就是我們介紹的偏差和方差問題,以及診斷該問題的學習曲線方法。在改進學習演算法的表現時,你可以充分運用以上這些內容來判斷哪些