deeplearning.ai 構建機器學習項目 Week 1 聽課筆記
這門課是講一些分析機器學習問題的方法,如何更快速高效的優化機器學習系統,以及NG自己的工程經驗和教訓。
1. 正交化(Othogonalization)
設計機器學習系統時需要面對一個問題是:可以嘗試和改變的東西太多太多了。牛逼的機器學習專家很清楚自己要調什麽以達到什麽目的,這個調參和效果一一對應的關系就是所謂的正交化,調整一個參數的時候,只調整一個對應的性質。或者說各種性質互相正交,互不影響。
機器學習的一般性步驟:
1)在訓練集上表現足夠好,如果不夠好的話,則嘗試更大的神經網絡、用更好的優化算法比如Adam等。
2)在驗證集上表現足夠好,如果不夠好的話,則嘗試正則化、增大訓練集等。
3)在測試集上表現足夠好,如果不夠好的話,則嘗試更大的驗證集等。
4)在實際中表現足夠好,如果不好好的話,則嘗試改變驗證集、改變cost function等。
NG說他不會用提前停止(early stopping)的方法。因為它同時影響了1)和2)。
2. 評價機器學習系統好壞的指標
NG建議用機器學習解決實際問題的時候,設置一個單一的實數來評價機器學習系統的好壞,這會加快調參,因為它可以很快的告訴我們系統變好還是變壞。
常用的評估機器學習系統的指標是Precision(查準率)和Recall(查全率)。比如在訓練集一大堆圖片中識別貓,Precision是給一張圖片系統判定是不是貓的正確率,而Recall是機器學習系統把訓練集中所有貓認出來的百分比。在實際使用中,這兩個指標往往需要做權衡,一個變好,往往另一個變壞,所以NG不推薦使用這種指標。我們需要一個單一的實數來告訴我們系統時好還是壞,很直接簡單,不需要權衡。一種常用的選擇是F1 Score = 2/(1/P+1/R),可以看成是Precision(P)和Recall(R)的平均值,數學定義是Harmonic mean。
所以我們實際評估系統好壞的時候,可以選一個驗證集,外加一個單一實數指標,來快速判斷哪個系統更好。這可以加速改進機器學習算法的叠代過程。
單一實數指標的選擇要跟據實際情況來,如果幾個指標物理意義相似,比如一個算法在世界不同地區的表現,則可以簡單的取平均值。如果幾個指標有不同的物理意義,比如accuracy和running time,則我們往往會選擇一個指標作為優化指標,即希望它越小越好(或者越大越好),而其他指標作為滿足指標,即只需要達到一個閾值就可以了,比如running time要小於100ms,不在乎它是70ms還是90ms。
3. 如何設置驗證集(課程裏也叫開發集development set)/測試集
驗證集和測試集要盡量同分布。可以把 數據隨機洗牌,然後分配驗證集和測試集。
傳統的機器學習算法習慣於按70%/30%的比例分配訓練集/測試集,或者60%/20%/20%分配訓練集/驗證集/測試集。這種分法對於小樣本(幾百、幾千、上萬)的情況是很合理的。但對於現代的大樣本(上百萬)應用,98%/1%/1%的分法更合理,因為一百萬的1%也有1萬,這對於驗證集和測試集足夠了。樣本越多,測試集/訓練集的比例越小。
測試集的目的是評估系統的整體性能,所以它的大小要足夠大到可以提供高置信度的評估結果。一般來說1萬或者10萬的樣本就可以了,這個數目遠遠小於訓練集的需求。在有的應用,甚至我們不需要對系統性能有置信度很高的評估,那麽可以不設立測試集,只需要訓練集和驗證集(有的教程會把樣本分為訓練集和測試集,這裏的測試集就是NG說的驗證集),但NG還是非常建議設立測試集來評估系統性能。
當測試集上的結果和實際運行不符合的時候,這說明要麽樣本集沒有反應實際分布,要麽評估指標不對。評估指標要能正確的反應實際使用中的優劣。
要有正交化的思維,第一步定義好評估指標,這是設立目標;第二步再考慮在這個指標下如何訓練出更好的系統。這是兩個完全獨立的問題。不要把事情混為一談,要一步一步做。
即使無法定義出一個很完美的評估指標和驗證集,也要快速設立一個,然後加速團隊對系統的叠代速度,發現選的不好,有更好的想法,則可以再更改。但千萬不要在還沒有把評估指標和驗證集想清楚的情況下就胡亂的跑算法,那很浪費時間。
4. 為什麽把人的性能(performance)作為深度學習算法的benchmark
兩個原因:1)深度學習算法的性能已經可以和人一較高下;2)算法在達到人類性能之前,進步非常迅速,達到人類性能之後,進展會緩慢下來。
為什麽算法到達人類性能後進展會變緩慢呢?兩個原因:1)人類的性能已經很接近理論極限(Bayes optimal error,這是理論極限,實際永遠不可能達到),進步空間有限;2)只要算法的性能低於人類性能,那麽總有一些工具可以提高性能,而一旦超過人類性能,這些工具就都不太好用了。這些工具包括:獲得更多人標記的數據、人工分析誤差來源(可以通過思考“為什麽人就可以做對”獲得靈感)、更好的分析偏差/方差。理解人類為什麽可以在 特定任務上表現的很好,這對於改進算法很有利。
我們會關註三個誤差,a)Human-level error,近似Bayes optimal error;b)Training error,算法在訓練集上的表現;c)Dev error,算法在驗證集上的表現。a和c之間的差距是可避免偏差(avoidable bias),b和c之間的差距是方差。人類誤差的作用就是幫助我們判斷是聚焦於改善偏差,還是改善方差。
由於我們是用人類誤差近似貝葉斯誤差,所以這裏說的人類誤差是人類能達到的最好水平,比如普通人和專家,那我們要以專家的表現為準。當然,如果算法的實際使用場景只要求達到普通人的水平,那也可以以普通人的誤差為準。
目前的算法對於結構化數據、非自然感知任務、有大量數據的問題的表現要優於人類。
5. 總結
監督學習的兩個步驟:1)算法對訓練集擬合的足夠好,或者說可以做到很小的可避免偏差;2)訓練集上的表現可以泛化到驗證集/測試集上,或者說方差很小。對於第一個步驟,改善的工具有:用更大的網絡(增加層數、隱藏單元數)、訓練更久、用更好的優化算法(Momentum、RMSprop、Adam)、嘗試新的網絡架構(RNN、CNN)、更好的超參數、嘗試新的激活函數。對於第二個步驟,改善的工具有:正則化(L2、dropout、data augmentation)、更多的訓練數據、嘗試新的網絡架構、更好的超參數。
deeplearning.ai 構建機器學習項目 Week 1 聽課筆記