当你在应用机器学习时你应该想什么
如今, 機器學習變得十分誘人, 它已在網頁搜索, 商品推薦, 垃圾郵件檢測, 語音識別, 圖像識別, 自然語言處理等諸多領域發揮重要作用. 和以往我們顯式地通過編程告訴計算機如何進行計算不同, 機器學習是一種數據驅動方法(data-driven approach). 然而, 有時候機器學習像是一種”魔術”, 即使是給定相同的數據, 一位機器學習領域專家和一位新手訓練得到的結果可能相去甚遠. 本文簡要討論了實際應用機器學習時九個需要注意的重要方面.
我該選什么學習算法?
這可能是你面對一個具體應用場景想到的第一個問題. 你可能會想”機器學習里面這么多算法, 究竟哪個算法最好”. 很”不幸”的是, 沒有免費午餐定理(No Free Lunch Theorem)告訴我們對于任意兩個學習算法, 如果其中一個在某些問題上比另一個好, 那么一定存在一些問題另一個學習算法更好. 因此如果考慮所有可能問題, 所有算法都一樣好.
“好吧”, 你可能會接著想, “沒有免費午餐定理假定所有問題都有相同機會發生, 但我只關心對我現在面對的問題, 哪個算法更好”. 又很”不幸”的是, 有可能你把機器學習里面所謂”十大算法”都試了一遍, 然后感覺機器學習”這東西根本沒用, 這些算法我都試了, 沒一個效果好的”. 前一段時間”約戰比武”的話題很熱, 其實機器學習和練武術有點像, 把太極二十四式朝對方打一遍結果對方應聲倒下這是不可能的. 機器學習算法是有限的, 而現實應用問題是無限的, 以有限的套路應對無限的變化, 一定是會存在有的問題你無法用現有的算法解決的, 豈有不敗之理?
因此, 該選什么學習算法要和你要解決的具體問題相結合. 不同的學習算法有不同的歸納偏好(inductive bias), 你使用的算法的歸納偏好是否適應要解決的具體問題直接決定了學得模型的性能, 有時你可能需要改造現有算法以應對你要解決的現實問題.
我該選什么目標函數?
目標函數用于刻畫什么樣的模型是好的, 和選擇學習算法一樣, 選什么目標函數也要和具體問題相結合. 大部分的教材和文獻重點在呈現算法, 對目標函數和優化方法的選擇通常使用缺省值. 以分類問題為例, 我們缺省地優化分類均等代價(cost)下的錯誤率. 但是在你所要解決的問題中, 問問自己這些問題:
你真正關心的是錯誤率嗎(比如還有查準率(precision), 查全率(recall)等其他指標)? 數據中有沒有類別不平衡(class-imbalance)的現象(比如信用卡欺詐檢測中, 欺詐用戶數遠小于正常用戶數)? 不同類型錯誤所造成的損失是一樣的嗎(比如醫療診斷中, 錯誤地把患者診斷為健康人與錯誤地把健康人診斷為患者的代價截然不同)? 還有沒有其他類型的代價(除了誤分類代價外, 還有測試代價, 標記代價, 特征(feature)代價等)?除此之外還有其他的一些問題. 這些問題存不存在, 要不要考慮, 該怎么考慮都是和你要處理的實際問題有關, 最終體現在你的目標函數之中.
我該選什么優化方法?
“我是誰? 我從哪里來? 我往哪里去?”是哲學里避不開的三個問題, 而”選什么算法? 選什么目標函數? 選什么優化方法?”是機器學習里經常遇到的三個問題, 這三者的組合就構成了一個機器學習解決方案基本框架. 通常, 我們使用現有的數值優化方法對目標函數進行優化, 比如梯度下降(gradient descent), 牛頓法等.
但是當目標函數非凸(non-convex), 有多個局部極小(local minima)時, 選什么優化方法會對結果產生直接影響. 比如深度學習中通常目標函數有多個局部極小, 使用不同的參數初始化方法(如高斯(Gaussian)隨機初始化, Xavier初始化, MSRA初始化等), 不同的優化方法(如SGD, 帶動量(momentum)的SGD, RMSProp, ADAM等), 或不同的學習率(learning rate)策略等, 都會對結果有很大影響.
另一方面, 即使目標函數是凸函數, 設計合適的優化方法可能會使你的訓練過程有質的飛躍. 比如SVM的優化是一個二次規劃(quadratic programming)問題, 可以通過調用現成的QP軟件包進行優化. 然而, 這個二次規劃問題的大小和訓練樣本數成線性關系, 當數據量很大時將導致巨大的開銷. 為了避開這個障礙, 人們根據SVM的特點設計出了SMO (sequential minimal optimization)這樣的高效優化方法.
不要偷看測試數據
我們希望學習器能從訓練數據中盡可能學出適用于所有潛在樣本(sample)的普遍規律, 從而能很好的泛化(generalize)到新樣本. 為了評估模型的泛化能力, 我們通常收集一部分數據作為測試集(testing set)計算測試誤差用以作為泛化誤差的近似. 為了能得到較準的近似, 我們不能在訓練階段以任何方式偷看測試數據.
一個常見錯誤做法是用測試數據調模型的參數. 這相當于老師在考試前向學生透露考試原題, 這雖然可能會使學生在這次考試中拿到高分, 但這不能有效反應學生是否對這門課學的很好, 獲得了對所學知識舉一反三的能力, 得到的將是過于樂觀的估計結果. 調參的正確做法是從訓練數據中再劃分出一部分作為驗證集(validation set), 用訓練集(training set)剩下的數據做訓練, 用驗證集調參.
另一個常見錯誤是用測試數據參加訓練數據預處理(data pre-processing). 通常, 數據在輸入給模型之前會經過一些預處理, 比如減去各維的均值, 除以各維的方差等. 如果這個均值和方差是由訓練集和測試集數據一起計算得到的, 這相當于間接偷看了測試數據. 這相當于老師在考前向學生劃重點, 雖然比直接透露原題好一些, 由于學生知道了考試范圍(即測試數據分布), 也會使我們得到過于樂觀的估計. 正確做法是只從訓練數據中計算預處理所用的統計量, 將這個量應用于測試集.
欠擬合/過擬合: 認準你的敵人
欠擬合(underfitting)通常是由于學習器的學習能力不足, 過擬合(overfitting)通常是由于學習能力過于強大. 兩者都會影響模型的泛化能力, 但是解決這兩個問題的方法迥然不同. 解決欠擬合可以通過使用更復雜的模型, 增加訓練輪數等. 緩解過擬合可以通過使用簡單模型, 正則化(regularization), 訓練早停(early-stopping)等. 欠擬合比較容易解決, 而過擬合是無法徹底避免的, 我們只能緩和, 減小其風險.
因此, 問題的關鍵在于認準你當前的敵人是欠擬合還是過擬合. 判斷欠擬合或過擬合最簡單直接的方法是畫出學習曲線(learning curve). 過擬合的表現是: 訓練誤差很低(甚至為0), 而測試誤差很高, 兩者有很大的差距. 而欠擬合的表現是: 訓練誤差和測試誤差很接近, 但都很高, 下圖是兩個例子, 你能看出來哪個處于過擬合, 哪個處于欠擬合嗎?
機器智能+人類智能
經過前面這幾部分你可能已經意識到了, 機器學習不是把數據扔給機器然后自己可以撒手不管. 機器學習不是”空手套白狼”, 如果我們對問題/數據認識的越深刻, 我們越容易找到歸納假設與之匹配的學習算法, 學習算法也越容易學到數據背后的潛在規律.
數據中特征的好壞直接影響學習算法的性能. 如果數據之間相互獨立并且與數據的標記有很好的相關性, 學習過程將相對容易. 但很多情況下, 你手中數據的原始特征并沒有這么好的性質, 特征和標記之間是一個非常復雜的映射關系. 這時候機器智能需要人類智能的配合, 我們需要從原始數據中構造合適的特征. 這個過程叫做特征工程(feature engineering), 這通常需要領域知識和你對這個問題的認識.
你可能會想”既然機器學習可以學到從數據的表示到標記的映射, 那么我們能不能讓機器自動地從數據的原始特征中學習到合適的表示呢”, 表示學習(representation learning)就專門研究這方面的內容. 深度學習的最大優點就在于其表示學習能力, 通過很多層的堆疊, 深度神經網絡可以對輸入數據進行逐層加工, 從而把初始的, 與輸出目標關系不密切的表示轉化為與輸出目標關系密切的表示. 這樣將低層表示轉化為高層表示后, 用”簡單模型”即可完成復雜的學習任務. 因此, 深度學習才能在計算機視覺, 自然語言處理, 語音識別這樣數據的原始表示和數據的合適表示相差很大的任務上大放異彩.
高維”災難”
經過上一節你可能會想”既然特征工程這么重要, 那我就把想到的所有的特征組合都作為數據的特征不就好了嗎”. 這么做的結果會使特征維數增加, 一方面會增加存儲和計算開銷, 更重要的是, 它會招來機器學習擔憂的另一頭猛獸: 維數災難(curse of dimensionality).
由于你能拿到手中的訓練數據是有限的, 當維數增加時, 輸入空間(input space)的大小隨維數指數級增加, 訓練數據占整個數據空間的比例將急劇下降, 這將導致模型的泛化變得更困難. 在高維空間中, 樣本數據將變得十分稀疏, 許多的相似性度量在高維都會失效. 比如下圖中, 最左邊的是原圖, 右邊三張圖看上去差別很大, 但和原圖都有著相同的歐氏距離.
解決維數災難的一個重要途徑是降維(dimension reduction), 即通過一些手段將原始高維空間數據轉變為一個低維子空間, 在這個子空間中樣本密度大幅提高, 距離計算也更容易. 特征選擇(feature selection)和低維投影(如PCA)是用來處理高維數據的兩大主流技術.
數據! 數據!
看了前面各部分的討論可能你已經有點受不了了: “機器學習沒有通式通法, 要根據任務具體情況具體分析; 要小心翼翼, 不能偷看測試數據, 要設法避免過擬合和欠擬合; 特征工程很重要, 但是特征又不能太多… 哦天吶! 這太麻煩了! 有沒有什么能提升性能直截了當的方法啊!”. 有! 那就是收集更多的數據. 通常情況下, 你有很多的數據但是學習算法一般和你設計出了很好的學習算法但手中數據不足相比, 前者效果會更好. 這是因為收集更多的數據是緩解過擬合最直接有效的方法.
收集更多的數據通常有下面兩種辦法: 一種方法是收集更多的真實數據, 這是最直接有效的方法. 但有時收集數據很昂貴, 或者我們拿到的是第二手數據, 數據就這么多. 這就需要另一個方法: 從現有數據中生成更多數據, 用生成的”偽造”數據當作更多的真實數據進行訓練. 這個過程叫做數據擴充(data augmentation). 以圖像數據做分類任務為例, 把圖像水平翻轉, 移動一定位置, 旋轉一定角度, 或做一點色彩變化等, 這些操作通常都不會影響這幅圖像對應的標記. 并且你可以嘗試這些操作的組合, 理論上講, 你可以通過這些組合得到無窮多的訓練樣本.
在收集/生成數據過程中一個要注意的關鍵問題是: 確保你的數據服從同一分布. 這比如說老師教了學生一學期的英語結果期末考試卻是考俄語, 雖然英語和俄語在語言學上有一定的相似性, 但是這給學習過程增加了很多困難. 遷移學習(transfer learning)旨在研究數據分布變化情況下的學習算法的泛化能力, 但如果你的目的不是做遷移學習方面的科學研究, 建議你確保你的訓練和測試數據服從同一分布, 這會使問題簡單許多.
集成學習: 以柔克剛
面對大多數的任務, 集成學習應當是你的必備招式. 集成學習的目的在于結合多個弱學習器的優點構成一個強學習器, “三個臭皮匠, 頂個諸葛亮”講的就是這個道理. 在各種機器學習/數據挖掘競賽中, 那些取得冠軍的隊伍通常會使用集成學習, 有的甚至用成百上千個個體學習器來做集成. 通常我們面對一個實際問題時會訓練得到多個學習器, 然后使用模型選擇(model selection)方法來選擇一個最優的學習器. 而集成學習則相當于把這些學習器都利用起來, 因此, 集成學習的實際計算開銷并不比使用單一學習器大很多.
目前的集成學習方法大致可以分為兩大類, 以Boosting為代表的集成學習方法中每個個體學習器相互有強依賴關系, 必須序列化生成; 以Bagging為代表的集成學習方法中每個個體學習器不存在強依賴關系, 可以并行化生成. 而從偏差-方差分解(bias-variance decomposition)的角度看, Boosting主要關注降低偏差, 而Bagging主要關注降低方差. 欠擬合/過擬合這兩個敵人是不是又一次出現在你眼前了呢?
本文轉載自:https://zhuanlan.zhihu.com/p/27345831
參考文獻
Domingos, Pedro. "A few useful things to know about machine learning." Communications of the ACM 55.10 (2012): 78-87. Glorot, Xavier, and Yoshua Bengio. "Understanding the difficulty of training deep feedforward neural networks." Aistats. Vol. 9. 2010. He, Kaiming, et al. "Delving deep into rectifiers: Surpassing human-level performance on imagenet classification." Proceedings of the IEEE international conference on computer vision. 2015. Kingma, Diederik, and Jimmy Ba. "Adam: A method for stochastic optimization." arXiv preprint arXiv:1412.6980 (2014). Li, Fei-Fei, Andrej Karpathy, and Justin Johnson. CS231n: Convolutional Neural Networks for Visual Recognition. Stanford. 2016. Lin, Hsuan-Tien. Machine Learning Foundations. National Taiwan University. Lin, Hsuan-Tien. Machine Learning Techniques. National Taiwan University. Murphy, Kevin P. Machine learning: a probabilistic perspective. MIT press, 2012. Ng, Andrew. Machine learning yearning. Draft, 2016. Ng, Andrew. CS229: Machine Learning. Stanford. Platt, John. "Sequential minimal optimization: A fast algorithm for training support vector machines." (1998). Tieleman, Tijmen, and Geoffrey Hinton. "Lecture 6.5-rmsprop: Divide the gradient by a running average of its recent magnitude." COURSERA: Neural networks for machine learning 4.2 (2012). Wei, Xiu-Shen. Must Know Tips/Tricks in Deep Neural Networks. http://lamda.nju.edu.cn/weixs/project/CNNTricks/CNNTricks.html. Wolpert, David H. "The lack of a priori distinctions between learning algorithms." Neural computation 8.7 (1996): 1341-1390. Wolpert, David H., and William G. Macready. No free lunch theorems for search. Vol. 10. Technical Report SFI-TR-95-02-010, Santa Fe Institute, 1995. Zhou, Zhi-Hua. Ensemble methods: foundations and algorithms. CRC press, 2012. Zhou, Zhi-Hua. "Learnware: on the future of machine learning." Frontiers of Computer Science 10.4 (2016): 589-590. 周志華 著. 機器學習, 北京: 清華大學出版社, 2016年1月.
總結
以上是生活随笔為你收集整理的当你在应用机器学习时你应该想什么的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 李宏毅机器学习课程10~~~卷积神经网络
- 下一篇: 深度学习(Deep Learning)读