應(yīng)該說(shuō)這是在看完《統(tǒng)計(jì)學(xué)習(xí)方法》這本書后有的想法,也算是讀書筆記。《統(tǒng)計(jì)學(xué)習(xí)方法》是李航寫的,重點(diǎn)偏向于基于統(tǒng)計(jì)的監(jiān)督學(xué)習(xí),個(gè)人覺(jué)得這本書好的地方是在敘述完理論之后,通常會(huì)有一個(gè)比較形象的小例子,在紙上演算一下具體的過(guò)程。這就讓本來(lái)很抽象的數(shù)學(xué)公式變得相當(dāng)直觀,而且對(duì)于用代碼實(shí)現(xiàn)也會(huì)有比較大的幫助。

對(duì)于程序員來(lái)說(shuō),特別是很少見(jiàn)數(shù)學(xué)公式的來(lái)說(shuō),要讀一本這樣滿是公式的書其實(shí)是比較有挑戰(zhàn)的。我試著從程序員能理解的角度去闡述這些概念。嚴(yán)格意義上來(lái)說(shuō)我只是寫了一年多程序的不合格程序員,所以很多時(shí)候還是得上公式,因?yàn)楣皆诤芏鄷r(shí)候是最精簡(jiǎn)的,就像很多優(yōu)美的代碼一樣,他是無(wú)可替代的。
簡(jiǎn)單的例子
假如有下面這個(gè)問(wèn)題:
一小面店在過(guò)去半年的盈利分別為:10, 12, 9, 13, 11, 12.3 單位為千。然后問(wèn)題是預(yù)測(cè)下個(gè)月的收入是多少?
我估計(jì)絕大部分做過(guò)機(jī)器學(xué)習(xí)的人都會(huì)跟你說(shuō),這是最簡(jiǎn)單的一元線性回歸就能解決的。然后不求甚解的家伙可能會(huì)給你一段代碼,畢竟在Python 里做機(jī)器學(xué)習(xí)scikit-learn 就像是個(gè)大寶箱,基本上所有人都能用。
from sklearn import linear_model
clf = linear_model.LinearRegression()
X = [[1], [2], [3], [4], [5], [6]]
Y = [10.0, 12.0, 9.0, 13.0, 11.0, 12.3]
clf.fit(X, Y)
print clf.predict(7)
然后看到預(yù)測(cè)的結(jié)果是: 12.46666667
好像還不是很離譜的樣子。為什么為第一時(shí)間選擇這樣的方法,這個(gè)過(guò)程到底涉及到哪些知識(shí)。所有基于統(tǒng)計(jì)的方法,甚至是大部分機(jī)器學(xué)習(xí)方法都是基于一個(gè)框架。下面我 們用這個(gè)例子來(lái)拆解它。
統(tǒng)計(jì)學(xué)習(xí)三要素
統(tǒng)計(jì)學(xué)習(xí),甚至我覺(jué)得所有機(jī)器學(xué)習(xí)都是建立在歷史數(shù)據(jù)之上,學(xué)習(xí)的目標(biāo)是讓計(jì)算機(jī)能預(yù)測(cè)。要抄書的話,你會(huì)看到這里面有很多分類,比如監(jiān)督學(xué)習(xí),非監(jiān)督,半監(jiān)督,強(qiáng)化學(xué)習(xí)之類的東西。其實(shí)我想真正可以好好理解下的是統(tǒng)計(jì)學(xué)習(xí)三要素:模型(model)、策略(strategy)、算法(algorithm)。理解這個(gè)過(guò)程,基本能了解機(jī)器學(xué)習(xí)的大部分真相。
model
模型是對(duì)現(xiàn)實(shí)世界的抽象,這些抽象為了能夠比較簡(jiǎn)單都有一些假設(shè)作為前提。對(duì)上面那個(gè)例子來(lái)說(shuō)模型就是:每月的收入是時(shí)間的線性函數(shù)。這樣一來(lái)所有的一元線性函數(shù)都有可能,這些所有可能的一元線性函數(shù)的集合被稱作模型的假設(shè)空間(hypothesis space). 統(tǒng)計(jì)學(xué)習(xí)就是要根據(jù)歷史數(shù)據(jù),從模型的假設(shè)空間中找到一個(gè)確定,也就是上面那段代碼干的事情。
還有另外一種類型的假設(shè)空間,不是函數(shù)組成,是條件概率集合,比如說(shuō)貝葉斯分類器的假設(shè)空間。具體什么是貝葉斯分類器,如果你不懂,后面的文章會(huì)有介紹。
strategy
strategy 可以說(shuō)是學(xué)習(xí)的標(biāo)準(zhǔn),有了這個(gè)才會(huì)有后面的算法。還是上面那個(gè)例子,模型的假設(shè)空間是所有一元線性函數(shù),但是如何從這無(wú)數(shù)的函數(shù)中選擇一個(gè)最好的呢?問(wèn)題如果用數(shù)學(xué)的方式來(lái)說(shuō)就是求一元線性函數(shù)的兩個(gè)參數(shù),一個(gè)是x的系數(shù),一個(gè)是常數(shù)項(xiàng)。然后就有人提出了幾種方法。我知道的就有兩種:
- 最小二乘法
- 極大似然估計(jì)
看著這些名詞很嚇人的樣子,其實(shí)他們的直觀邏輯都是及其簡(jiǎn)單的,雖然背后確實(shí)有復(fù)雜的假設(shè),和數(shù)學(xué)證明。
最小二乘法的思路是:找到一個(gè)函數(shù)使得其在樣本上預(yù)測(cè)值和真實(shí)值之間的誤差平方和最小。
極大似然的想法也是相當(dāng)?shù)闹庇^,我們都在不知不覺(jué)的使用這種思想:舉個(gè)例子, 假如你是女生,你讀書時(shí)候,后面坐著兩個(gè)男生A,B.每天男生A,都在后面動(dòng)你頭發(fā)。突然有天B動(dòng)了下你的頭發(fā),我想你轉(zhuǎn)過(guò)頭肯定還是會(huì)罵A. 極大似然估計(jì)還是大名頂頂?shù)母咚固岢龅摹?shù)學(xué)點(diǎn)兒的描述就是樣本出現(xiàn)的概率最大化。
最終的目標(biāo)是要預(yù)測(cè),所以策略在做的事情就是讓風(fēng)險(xiǎn)最小,然后將問(wèn)題轉(zhuǎn)化成可求解的函數(shù)極值的問(wèn)題。極大似然思想就是一種經(jīng)驗(yàn)風(fēng)險(xiǎn)最小的例子:上面那女生罵A正確的概率肯定要比罵B正確的概率大。
上面兩種strategy 的最終結(jié)果是把一個(gè)模型求解的過(guò)程轉(zhuǎn)化為函數(shù)極值。如果這個(gè)函數(shù)極值有解析解,那后面的算法基本就沒(méi)有必要了。通常是這個(gè)函數(shù)的極值比較復(fù)雜,很難求解或者根本就不存在解析解,那后面的算法就要派上用處了。
algorithm
這個(gè)算法和計(jì)算機(jī)里那個(gè)排序之類的還是有些區(qū)別,這個(gè)主要是說(shuō)的數(shù)值計(jì)算。常見(jiàn)的梯度下降,牛頓法,EM ...... 他們通常都是通過(guò)迭代擬合來(lái)實(shí)現(xiàn)對(duì)一個(gè)函數(shù)求極值。EM 算法的原理也是求函數(shù)下界函數(shù)的極值來(lái)逼近真實(shí)函數(shù)的極值,我見(jiàn)過(guò)的都是在求極值。
上面講了這么多機(jī)器學(xué)習(xí),機(jī)器在這個(gè)過(guò)程中干什么呢?我們都沒(méi)見(jiàn)機(jī)器出場(chǎng)。其實(shí)機(jī)器的核心任務(wù)就是實(shí)現(xiàn)algorithm 的工具,因?yàn)樗惴ㄍǔP枰芏嗟蛧L試,靠人來(lái)做肯定是不行的,但是機(jī)器很在行這個(gè)。所以到這里我想應(yīng)該理解寫程序和機(jī)器學(xué)習(xí)到底是個(gè)什么關(guān)系。如果你不是為了創(chuàng)建一個(gè)新的算法,只是想解決一個(gè)數(shù)據(jù)上的問(wèn)題,其實(shí)你能寫程序就夠了,前提是能看懂?dāng)?shù)學(xué)上的邏輯。如果看不懂,就像寫程序的時(shí)候不知道產(chǎn)品需求一樣,后果如何寫 程序的都知道。
總結(jié)
當(dāng)然機(jī)器學(xué)習(xí)比我說(shuō)的要復(fù)雜的多,這里面也還會(huì)有其他問(wèn)題。比如數(shù)據(jù)預(yù)處理、特征工程、模型評(píng)估、選擇,而且這個(gè)過(guò)程中有很多細(xì)節(jié)的問(wèn)題。但是從上面的描述你應(yīng)該能看到寫程序和數(shù)學(xué)是如何結(jié)合的,機(jī)器學(xué)習(xí)到底是個(gè)什么東西,至少在傳統(tǒng)的基于統(tǒng)計(jì)的方法上是這樣,其實(shí)我想深度學(xué)習(xí)也是在求函數(shù)極值。大部分的數(shù)據(jù)科學(xué)家,都是在利用少部分人發(fā)明出來(lái)的東西,來(lái)解決他們自己的問(wèn)題,在這個(gè)過(guò)程中我認(rèn)為真正重要的還是想象力,和動(dòng)手能力,當(dāng)然你得看得懂?dāng)?shù)學(xué)公式,至少能理解其中的邏輯,還是那句話寫程序之前好好理解需求這是每個(gè)程序員圈子里廣泛傳播的經(jīng)驗(yàn),做機(jī)器學(xué)習(xí)你可能還要看懂公式,這就像是需求的一部分。
你可以在我的博客查看原文 或者搜索微信公眾號(hào):正午不早了