1. 程式人生 > >淺說機器學習理論

淺說機器學習理論

機器學習是現在在風口上。其包括一系列的具體演算法,學習這些演算法需要一定的數學基礎(線性代數、概率論),網上有大量的資料可以參考學習;對於工程來說門檻就更低了,有許多優秀的現成框架可以使用。雖然我們呼叫一些api、調調引數就能完成很多工作,但是理解這背後的“為什麼”還需要下一番功夫。機器學習理論是該領域的分析框架,這方面的內容比較抽象,且“實用性不強”,所以常常被人忽略。這篇部落格就來通俗地講講這些理論。

1.什麼是機器學習

計算機程式設計演算法是用來解決各種實際問題的。在傳統的演算法中,面對一個實際問題,程式設計師靠個人的智慧推匯出了問題準確的解決方法,然後通過編寫程式解決問題。如果把尋找解決方案的過程比喻成尋寶,把具體解決問題的方案比作寶藏的話,那麼傳統的程式設計就是靠人的推理的推匯出了寶藏的具體位置。但現實中有大量的問題很難由人推測出精確的解決方案,尤其是那些涉及變數很多(高維)的問題。面對這類問題雖然難於給出一個確切的解決方案,但我們總覺得可以找到一個“大概”或者說“模糊”的解決方案(有統計規律)。

機器學習正是為了解決這種問題的,它是對“確切推匯出寶藏位置”這一條件的軟化,雖然我們不能推出寶藏的準確位置,但是我們可以給出這一寶藏的大致範圍(對應著hypothesis set)然後利用演算法通過大量的資料從這個範圍中篩選出“寶藏”。例如在預測房價這種機器學習的典型任務中,影響因素可能上千個,我們不太可能推匯出一個包含這些影響因素的確切方程。但是我們可以給出一個範圍,即一個相對模糊的解決方案,例如:“這些影響因素與房價呈線性關係”,這麼一來我們劃定的寶藏範圍就是“所有的線性方程的集合”,然後機器學習要做的是從這些候選集中通過與大量資料進行“比對”找出一個合適的具體方程當做我們要找的“寶藏”。這就是機器學習演算法的尋寶過程。

一個機器學習演算法要成功,首先這個定的範圍需要能框住正在的“寶藏”,其次這個找寶藏的過程也得合理高效,並且還得有足夠的資料進行比對篩選。下面我們來說說這麼判定我們挖出了真正的寶藏。

2.怎麼判斷機器學習“學”到了東西

前文我們說機器學習是在一堆演算法的候選集中,通過大量資料的“比對”選出一個表現好的演算法。這部分用於“比對”的資料就叫“訓練集”。通過訓練集“選出來”的演算法往往在訓練集上表現很好。但這樣的效果並不僅僅是我們想要的,機器學習演算法的輸出是一個“解決方案”,靠這個“解決方案”去應對所有的輸入情況,而訓練集僅僅包括了輸入可能性的一小部分,我們希望以這一小部分的資料訓練模型,能讓模型處理它沒有見過的資料(泛化)。打個比方,你通過一些例題去教一個孩子線性方程組的解法,教完過後這些孩子對於例題應該都能熟練解答,但是評價這個孩子是否“學會了”不應該拿這些例題去考他,而應該用他沒見過的線性方程組去考他,即看他是否有舉一反三(泛化)的能力。

機器學習中有一套理論去保證泛化能力。為了體現我不是民科,我還是搬幾個公式吧:) 。首先一個理論基礎是霍夫丁不等式Hoeffding Inequality :

 $P(\left | \nu -\mu  \right |> \varepsilon )< 2exp(-2\varepsilon ^{2}N)......(1)$  

這篇文章不打算詳細推導數學,所以這裡我只講公式背後的故事。這個不等式告訴我們的是:我們通過有限資料得到的引數$\nu$(演算法在訓練集上的誤差)與理想中的引數$\mu$(演算法在所有資料上的誤差)之間的關係:$\nu$與$\mu$之間的誤差大於 $\varepsilon$的概率小於不等式的右邊的指數表示式的結果。不等式右邊N是計算出用到的資料量(訓練集大小), $\varepsilon$是允許的誤差。

這個公式告訴我們只要使用的資料量足夠大,單個演算法在訓練集的表現能夠代表這個演算法在所有資料上的真實表現。這個公式只是告訴我們一個演算法的情況,但是我們說過機器學習的過程是在所有候選集上挑一個最好的演算法。候選集一多,出現小概率事件的概率會變大。例如買彩票,對於我一個人而言中大獎的概率是微乎其微的,但對於一個集合來說,比如全北京買彩票的中有人中大獎的概率還是很高的。數學上我們用union bound 來代表這類問題:

$P( A_{1}\cup A_{2} ...\cup A_{k} )< P ( A_{1} )+ P ( A_{2} )+...+P( A_{k}  )......(2)$

 在(1)中考慮union bound後可以得到:

$P\left ( \exists h_{i}\in H ,\left | \nu (h_{i})-\mu (h_{i}) \right | >\varepsilon \right ) \leqslant  2kexp(-2\varepsilon^{2}N )......(3)$

與(1)式不同的是(3)式中k是模型候選集的大小,其餘引數基本相同,這個式子告訴我們即使訓練資料足夠大,如果我們的候選集中包含的候選演算法太多(k太大)也可能得到錯誤的結果。這也應了那句諺語“林子大了什麼鳥都有”:)。因此在機器學習中模型複雜度的選擇是一個需要折中考慮的量,一方面模型越複雜即我們劃的“範圍”越大,則這個範圍內包含“寶藏”的概率就越大,另一方面林子變大了出現“壞鳥”的概率也變大了。理想的情況是我們模型的範圍取得“準且小”,這當然需要我們對要解決的這類問題有比較多的先驗知識,一種極端的情況是當我們的先驗知識足夠充分了,就可以把我們的範圍縮小成一個“點”,即直接找到一個具體演算法,這本質上就退化到了傳統程式設計解決問題的方法了。實際上(3)式的刻畫是比較粗糙的,大多數情況下k是無窮大的。在機器學習中為了解決無窮問題又有“打散”、VC維等概念,這些概念的補充對(3)式右邊所代表的上界進行了更精確地刻畫。但是在這裡(3)式足夠表達上述思想了,那些“更精確”的理論這裡就不講了,如果感興趣可以參考相關教材。

        機器學習演算法對應著兩類誤差即偏差和方差,在實際工作中,判斷模型的主要誤差是哪一種是後續進一步優化模型才有正確的方向。你可以在網上查到大量方差和偏差的“正統”定義,在本文裡我就講一講我的偏門理解:偏差度量的是由於圈的地太小了,沒有圈住“寶藏”引起的誤差;方差是指圈的地太大了,林子裡出現了“壞鳥”產生的誤差。當機器學習的誤差由偏差主導時,這時候就可以考慮增大模型的複雜度,即圈更大的範圍。當模型的誤差由方差主導時,這時就需要降低模型的複雜度,加更多的資料(篩選更嚴)或者採用一些正則化的方法。說道正則化,我理解的就是對模型做出一些限制,讓模型選擇的範圍縮小,正則化有效地前提是這樣的範圍縮小是合理的,而要滿足這個要的還是先驗知識。以上就是對機器學習理論的一些理解,下面用一個例子進行說明。

3一個例項

現在以公司招聘為例子對機器學習進行類比。公司招人的目的是找一個合適的員工到公司,對應著機器學習裡面是“訓練”出一個合適的演算法供以後使用。現在假設公司招人的辦法就是出一些題讓候選者解答,從中選出得分最高的人,把這個人招進來;這對應著機器學習裡面通過大量的資料挑選出合適的演算法,此處“題”和“資料”相對應,“候選人”和“候選演算法”相對應。假設公司的題都是選擇題的型別,現在公司有20道這樣的題(資料量),那麼對於一個應聘者來說如果他能全部做對這些題,那麼他大概率是合格的,因為這些題他全部能蒙對的概率很小(0.25^20)。

現在公司定了個演算法:去外面大街拉50個人來做題,如果能全部做對就認為他是合格的候選者。這個演算法的缺點是很可能這50個人裡面沒一個人做得好,所以招不到合適的人,這對應著機器學習裡的欠擬合:由於模型不夠強(候選集太小)導致的效果不好;而且這個例子中是“去大街上拉50個人”,這個模型的選取沒有利用好先驗知識,這在機器學習中屬於模型選取不當,比如本來應該用gmm模型而實際用成了hmm模型。

由於上面的方法沒招到人,於是老闆說:“既然候選人太少了,那咱多拉點人來,反正咱們國家最不缺的就是人”,然後拉了1億人來做題。這種情況下有候選人拿了滿分,那麼這個人就是合格的嗎?在上一個50個候選人的情況下如果有人全做對我們可以認為他大概率很優秀,但是現在這個基數變成了1億人,一個人要全部蒙對的概率很小,但是1億人中出一個全蒙對的概率還是很大。所以這對應著機器學習裡面的“過擬合”問題,演算法在訓練集上表現很好,但實際應用時卻效果卻很差(這個憑運氣進入公司的人並不能勝任工作)。面對這種問題可以出更有難度的試題(更好的資料)或這增加題量(加資料)來讓蒙對的概率變低。另外也可以換候選者範圍(對應著換演算法或加正則化),讓候選者的範圍合理地變小一點。

例如在這個例子中更理性一點的演算法是將候選者範圍換成大學本科畢業相關專業的幾百個人,再讓他們來答題,這樣的話大概率能選出我們的要的人。機器學習裡面有個定理叫“沒有免費午餐定律”說的就是不能拋開具體的任務,去評價演算法。因為一個機器學習演算法對應著一個候選的範圍,當我們問題的答案落在了這個範圍內,有足夠的資料就能訓練出合適的答案。另一方面如果一個演算法非常強大,但它的範圍沒包含我們的答案,那麼有再多的資料也白搭,其效果可能還不如那些不那麼“強大”的演算法。這就是我對於機器學習理論的一些理解,希望能夠對你有點啟發,如果想要全面、嚴謹、數學化的理解機器學習的理論我推薦林軒田的《機器學習基石》的公開課。

4人工智慧“智慧”嗎

人工智慧很火,但現在的人工智慧真的智慧嗎?讓我們從之前的分析中看一下在機器學習中有多少是人的“智慧”,又有多少是機器的“智慧”。還是以尋找寶藏為例,首先判斷有沒有寶藏可尋,即判斷一個問題是否有統計規律可循,這是人的“智慧”做出的判斷;其次劃定寶藏的範圍也是人做的決定(選模型及模型的規模);最後劃定範圍後確定怎麼去找寶藏(優化函式、優化演算法)也是由人指定的。因此縱觀整個機器學習的過程,基本還是靠人類的智慧在解決問題,機器只是按部就班地服從人的指揮,在一定的範圍中執行優化演算法去找寶藏,這個過程中並沒有展現出機器“智慧”。

雖然目前的人工智慧還根本談不上“智慧”,但是我們也不必沮喪。機器學習的演算法讓計算機能解決更多的問題,從以前的“確定性”問題到現在的“範圍”問題。而“能夠解決更多的問題”這本身就是一個巨大的進步。

這幾年機器學習裡面成功的技術是深度學習。這類演算法也並未跳出上述機器學習的理論框架。但是其在計算機視覺、自然語言處理等領域表現出了最好的效果、在某些子領域中其效果甚至能超過人類。我們對深度學習為什麼有效或者說深度學習模型圈下的是怎樣一塊地還不甚清楚,期待後續這方面的研究能夠揭示出“智慧”的一些邊邊角角。