引言
本系列文章是本人對Andrew NG的機器學習課程的一些筆記,如有錯誤,請讀者以課程為准。
在現實生活中,我們每天都可能在不知不覺中使用了各種各樣的機器學習算法。
例如,當你每一次使用 Google 時,它之所以可以運行良好,其中一個重要原因便是由 Google 實現的一種學習算法可以“學會”如何對網頁進行排名。每當你使用 Facebook 或者 Apple 的照片處理應用時,它們都能自動識別出你朋友的照片,這也是機器學習的一種。每當你閱讀電子郵件時,你的垃圾郵件過濾器將幫助你免受大量垃圾郵件的困擾,這也是通過一種學習算法實現的。
我們有這樣一個夢想,就是有朝一日,可以創造出像人類一樣聰明的機器。很多人工智能專家認為實現這一目標最好的途徑便是通過學習算法來模擬人類大腦的學習方式。
機器學習發源於人工智能領域,我們希望能夠創造出具有智慧的機器。我們可以通過編程來讓機器完成一些基礎的工作,例如如何找到從 A 到 B 的最短路徑。但在大多數情況下,我們並不知道如何顯式地編寫人工智能程序來做一些更有趣的任務,例如網頁搜索、標記照片和攔截垃圾郵件等。人們意識到唯一能夠達成這些目標的方法就是讓機器自己學會如何去做。
現今,Machine Learning 已經發展成為計算機領域的一項新能力,並且與工業界和基礎科學界有着緊密的聯系。在硅谷,機器學習引導着大量的課,如自主機器人、計算生物學等。機器學習的實例還有很多,例如數據挖掘。
機器學習之所以變得如此流行,原因之一便是網絡和自動化算法的爆炸性增長。這意味着我們掌握了比以往多得多的數據集。舉例來說,當今有數不勝數的硅谷企業,在收集有關網絡點擊的數據 (Clickstream Data),並試圖在這些數據上運用機器學習的算法來更好的理解和服務用戶,這在硅谷已經成為了一項巨大的產業。
隨着電子自動化的發展,我們擁有了電子醫療記錄,如果我們能夠將這些記錄轉變為醫學知識,那么,我們就能對各種疾病了解的更深入。同時,計算生物學也在電子自動化的輔助下快速發展,生物學家收集了大量有關基因序列以及DNA序列的數據,通過對其應用機器學習的算法可以幫助我們更深入地理解人類基因組及其人類基因組對我們人類的意義。
幾乎工程界的所有領域都在使用機器學習算法來分析日益增長的海量數據集。有些機器應用我們並不能夠通過手工編程來實現。比如說,想要寫出一個能讓直升機自主飛行的程序幾乎是不可能的任務。唯一可行的解決方案就是讓一台計算機能夠自主地學會如何讓直升機飛行。
再比如手寫識別,如今將大量的郵件按地址分類寄送到全球各地的代價大大降低,其中重要的理由之一便是每當你寫下這樣一封信時,一個機器學習的算法已經學會如何讀懂你的筆跡並自動地將你的信件發往它的目的地。
你也許曾經接觸過自然語言處理和計算機視覺。事實上,這些領域都是試圖通過 AI 來理解人類的語言和圖像,如今大多數的自然語言處理和計算機視覺都是對機器學習的一種應用。
機器學習算法也在 self-customizing program 中有着廣泛的應用。每當你使用亞馬遜 Netflix 或 iTunes Genius 的服務時,都會收到它們為你量身推薦的電影或產品,這就是通過學習算法來實現的。很顯然,這些應用都有着上千萬的用戶,而針對這些海量的用戶,編寫千萬個不同的程序顯然是不可能的,唯一有效的解決方案就是開發出能夠進行自我學習,定制出符合你喜好的並據此進行推薦的軟件。
最后,機器學習算法已經被應用於探究人類的學習方式,並試圖理解人類的大腦。
What is machine learning
What is machine learning? 不同人對機器學習有不同的定義。下面是 亞瑟·塞穆爾 (Arthur Samuel) 給出的機器學習的定義:
Arthur Samuel (1959).
Machine Learning: Field of study that gives computers the ability to learn without being explicitly programmed.
亞瑟·塞穆爾將機器學習定義為:在沒有明確為計算機編寫(完成某項具體任務的)程序的情況下,讓計算機擁有 “學習” 能力的一個研究領域。
Samuel 出名是因為在50年代 ,他編程實現了一個玩西洋跳棋的程序。這個跳棋程序的神奇之處在於,他讓程序跟程序自身下了成千上萬盤棋,跳棋程序通過觀察分析什么樣的棋局更容易致勝,什么樣的棋局更容易輸,逐漸學會了什么是好的棋局,什么是壞的棋局。最終,跳棋程序的下棋水平超過了 Samuel 。
這是一個相當了不起的成果,雖然 Samuel 自己並不是一個很好的棋手,但因為計算機(跳棋程序)可以跟自身對弈成千上萬次,通過這樣的訓練,計算機得到了很多的下棋經驗,最終使得計算機最終成為了比 Samuel 更好的棋手。
以上是一個不太正式並且有點老的定義,下面是一個更新的定義,來自 Carnegie Mellon University 的 Tom Mitchell 提出:
Tom Mitchell (1998).
Well-posed Learning Problem: A computer program is said to learn from experience E with respect to some task T and some performance measure P, if its performance on T, as measured by P, improves with experience E.
如果一個計算機程序在任務 T 上的性能度量 P ,通過經驗 E 而提高,那么我們稱這個計算機程序通過經驗 E 來學習。
具體到下跳棋的例子里面,訓練經驗 E 指的是讓計算機程序與 Samuel 對弈成千上萬次的經驗;任務 T 指的的是下跳棋這個任務,性能標准 P
指的是跳棋程序在下一場面對新對手的比賽中獲勝的概率。
學習算法分好幾個類型,主要分成兩大類,分別是監督學習 (Supervised Learning) 和無監督學習 (Unsupervised Learning),在后面的博文中我將介紹這些術語的具體含義。不過歸根到底,Supervised Learning 就是我們要明確告訴計算機如何做某件事情,而 Unsupervised Learning 則意味着我們要讓程序自己進行學習。
在以后的博文中,我們也會討論一些其他術語,比如強化學習 (Reinforcement Learning) 和推薦系統 (Recommender Systems),這些其他類型的機器學習算法,我們在以后都會討論,但兩個最常用的學習算法實際上就是就是 Supervised Learning 和 Unsupervised Learning 。
接下來,我們來討論什么是 Supervised Learning ,什么是 Unsupervised Learning ,並且會討論在什么情況下使用這兩種算法。
Supervised Learning
我們用一個例子開頭,介紹什么是監督學習,正式的定義會在后面介紹。
假設你現在想要預測房價,並且擁有一些關於房價的數據,如下:
其中橫軸表示房子的面積(單位是平方英尺),縱軸表示房價(單位是千美元),假如你有一套750平方英尺大小的房子想要賣掉,那么基於以上數據,你如何推測房子大概值多少錢。
對於這個問題,我們可以應用機器學習算法,在這組數據中畫一條直線或者說是擬合一條直線,根據這條線我們可以推測出這套房子可能賣$150, 000。當然這不是唯一的算法,比如一個二次函數可能更適合已有的數據,我們使用這個二次函數的曲線來進行預測可能效果會更好。
以上就是一個 Supervised Learning 的例子,可以看出 Supervised Learning 指的就是我們給學習算法一個數據集,這個數據集由“正確答案”組成。在房價的例子中,我們給了一系列房子的數據,我們給定數據集中每個樣本的正確價格,即它們實際的售價,然后運用學習算法,計算出更多的正確答案,比如你的那個新房子的價格,用術語來講,這叫做回歸問題。
我們試着推測出一個連續值的結果,即房子的價格。一般房子的價格會記到美分,所以房價實際上是一系列離散的值,但是我們通常又把房價看成實數,看成是標量,因此又把它看成一個連續的數值,回歸這個詞的意思指的就是,我們在試着推測出這一系列連續值屬性。
回歸問題:我們所預測的結果是連續的值。
我們再來討論另外一個監督學習的例子,假使你希望通過查看病例來預測一個乳腺癌是否是良性的,這個數據集中,橫軸表示腫瘤的大小,縱軸上,我標出 1 和 0 來分別表示是惡性腫瘤或者不是惡性腫瘤。我們之前見過的腫瘤,如果是惡性記為1,不是惡性(或者說是良性)則記為0。
假設現在我們有一個朋友很不幸檢查出乳腺腫瘤,假設說她的腫瘤大概這么大,那么機器學習的問題就在於,你能否估算出腫瘤是惡性的或是良性的概率。用術語來講,這是一個分類問題。
分類指的是我們試着推測出離散的輸出值: 0 或 1 、良性或惡性。而事實上在分類問題中,輸出可能不止兩個值。比如說可能有三種乳腺癌,所以你希望預測離散輸出0、1、2、3。其中 0 代表良性,1 表示第一類乳腺癌,2 表示第二類癌症,3 表示第三類。但是,實際上這也是分類問題,因為這幾個離散的輸出分別對應良性、第一類、第二類或者第三類癌症。
在分類問題中我們可以用另一種方式來繪制這些數據點。我們可以用不同的符號來表示這些數據,既然我們把腫瘤的尺寸看做區分惡性或良性的特征,那么我們可以這么畫,用不同的符號來表示良性和惡性腫瘤,或者說是負樣本和正樣本。現在我們不全部畫X,而是改成良性的腫瘤用O表示,惡性的繼續用X表示。我們所做的只是把上面的數據一一映射下來,映射到一根直線上,並且用不同的符號 O 和 X 來表示良性和惡性樣本。
注意,在這個例子中,我們只用了腫瘤的尺寸這一種特征來預測腫瘤的惡性與否,在其它一些機器學習問題中可能會遇到不止一種特征。舉個例子,我們不僅知道腫瘤的尺寸,還知道對應患者的年齡,那現在數據集看起來可能是如下這個樣子:
也就是說,你現有的數據集是不同病人的年齡和她們身上腫瘤的尺寸大小以及這些腫瘤的良性與否。我們以橫坐標為腫瘤的尺寸,以縱坐標為病人的年齡,以 O 代表良性腫瘤,以 X 代表惡性腫瘤。我們的學習算法要做的就是確定出這樣一條直線,把惡性腫瘤和良性腫瘤分開。如果根據你學習算法得出的結論是你朋友的腫瘤落在良性這一邊,那么現實中就更可能是良性的而不是惡性。
在這個例子中,我們有兩種特征,患者年齡和腫瘤大小,而在在其他機器學習問題中,我們通常有更多的特征。就以之前的乳腺癌為例來說,還可以采用這些特征:腫塊密度、腫瘤細胞尺寸的一致性和形狀的一致性等等。
我們之后的博文會介紹一種學習算法,這種學習算法不僅能處理2種、3種或者5種特征,甚至即使有無限多種特征,它也都可以處理。如果你想用無限多種特征,以便讓你的算法可以利用大量的特征或者說是線索來做推測,那么你如何來處理這無限多個特征,甚至怎么來存儲這些特征都存在着很大的問題,比如說你電腦的內存肯定就不夠用。之后我們會介紹這個算法,叫作SVN(支持向量機),里面有一個巧妙的數學技巧,能讓計算機處理無限多個特征。
小結
本章我們介紹了 Supervised Learning ,它的基本思想是我們數據集中的每個樣本都有相應的“正確答案”,再根據這些樣本作出預測,就像房子和腫瘤的例子中做的那樣。
我們還介紹了回歸問題,即通過回歸來推測出一個連續的輸出。之后我們介紹了分類問題,其目標是推測出一組離散的結果。
現在來個小測驗,假設你經營着一家公司,你想開發學習算法來處理以下兩個問題。
第一個問題是,你有一大批相同的貨物,你想預測接下來的三個月能賣出多少件。第二個問題是,你有許多客戶,這時你想寫一個軟件來檢驗每一個用戶的賬戶,而對於每一個賬戶,你要判斷它們是否曾經被盜過。這兩個問題,它們是屬於分類問題,還是回歸問題?
顯然,問題一是一個回歸問題,因為如果有數千件貨物,我們會把它看成一個實數,看成一個連續的值,因此賣出的物品數同樣也是一個連續的值。問題二是一個分類問題,我們可以把預測的值用 0 來表示賬戶未被盜,用 1 表示賬戶曾經被盜過,就像乳腺癌的例子 0 代表良性,1 代表惡性,所以我們根據賬號是否被盜過而把它們定為 0 或 1 ,然后用算法推測一個賬號是 0 還是 1 ,因為只有少數的離散值,所以我們把它歸為分類問題。
以上就是 Supervised Learning 的內容,下面我們來看 Unsupervised Learning 。
Unsupervised Learning
我們現在來討論 Unsupervised Learning ,之前我們已經講過了 Supervised Learning 。回想一下之前的數據集,每個樣本都已經被標明為
正樣本或者負樣本,即良性或惡性腫瘤。因此,對於 Supervised Learning 中的每一個樣本,我們已經被清楚地告知了,什么是所謂的正確答案,即它們是良性還是惡性。
在 Unsupervised Learning 中,我們所用的數據會和 Supervised Learning 里的看起來有些不一樣。在 Unsupervised Learning 中,沒有屬性或標簽這一概念,也就是說所有的數據都是一樣的,沒有區別。
所以在 Unsupervised Learning 中,我們只有一個數據集,沒人告訴我們該怎么做,我們也不知道每個數據點究竟是什么意思。相反,它只告訴我們,現在有一個數據集,你能在其中找到某種結構嗎?
對於給定的數據集,Unsupervised Learning Algorithm可能判定該數據集包含兩個不同的聚類。無監督學習算法會把這些數據分成兩個不同的聚類,這就是所謂的聚類算法。
聚類算法實例
實際上 Unsupervised Learning 被用在許多地方。我們來舉一個聚類算法的例子,是關於Google 新聞的例子。
谷歌新聞每天都在干什么呢?他們每天會去收集成千上萬的網絡上的新聞,然后將他們分組,組成一個個新聞專題。谷歌新聞所做的就是去搜索成千上萬條新聞,然后自動的將他們聚合在一起,有關同一主題的新聞被顯示在一起。
其實,聚類算法和無監督學習算法也可以被用於許多其他的問題。這里,我們舉個它在基因組學中的應用,下面是一個關於基因芯片的例子:
基本的思想是,給定一組不同的個體,對於每個個體,檢測它們是否擁有某個特定的基因。也就是說,你要去分析有多少基因顯現出來了。因此,這些顏色:紅、綠、灰等等,它們展示了這些不同的個體是否擁有一個特定基因的不同程度。
然后你所能做的就是運行一個聚類算法,把不同的個體歸入不同的類或者說歸為不同類型的人,這就是無監督學習。我們沒有提前告知這個算法哪些是第一類的人、哪些是第二類的人、哪些是第三類的人等等。相反我們只是告訴算法,這兒有一堆數據,我不知道這個數據是什么東西,我不知道里面都有些什么類型,叫什么名字,我甚至不知道都有哪些類型。但是,請問你可以自動的找到這些數據中的類型嗎?然后自動的按得到的類型把這些個體分類,雖然事先我並不知道哪些類型,因為對於這些數據樣本來說,我們沒有給算法一個正確答案,所以,這就是無監督學習。
無監督學習或聚類算法在其他領域也有着大量的應用,它被用來組織大型的計算機集群。一些朋友在管理大型數據中心(大型計算機集群),並試圖找出哪些機器趨向於協同工作,如果你把這些機器放在一起,你就可以讓你的數據中心更高效地工作。
還有應用可以用於社交網絡的分析。所以,如果可以得知你用 email 聯系最多的是哪些朋友,或者知道你的 Facebook 好友,或者你 Google+ 里的朋友,知道了這些之后信息后,我們可以自動識別哪些是很要好的朋友組,哪些僅僅是互相認識的朋友組。
還有在市場分割中的應用,許多公司擁有龐大的客戶信息數據庫,那么給你一個客戶數據集,你能否自動找出不同的市場分割,並自動將你的客戶分到不同的細分市場中,從而有助於你在不同的細分市場中進行更有效的銷售,這也是無監督學習。我們現在有這些客戶數據,但我們預先並不知道有哪些細分市場,而且對於我們數據集的某個客戶,我們也不能預先知道誰屬於細分市場一,誰又屬於細分市場二等等。但我們必須讓這個算法自己去從數據中發現這一切。
實際上無監督學習也被用於天文數據分析,通過這些聚類算法,我們發現了許多驚人的、有趣的、以及實用的關於星系是如何誕生的理論,所有這些都是聚類算法的例子。
雞尾酒宴問題
再一個 Unsupervised Learning Algorithm 的例子是雞尾酒宴問題。想象一下,一個宴會有一屋子的人,大家都坐在一起,並且在同時說話,因此會有許多聲音混雜在一起,因為許多人會在同一時間說話,在這種情況下你很難聽清楚你面前的人說的話。
因此,比如有這樣一個場景,宴會上只有兩個人,兩個人同時說話(恩,沒錯…這是個很小的雞尾酒宴會),我們准備好了兩個麥克風,把它們放在房間里,然后因為這兩個麥克風距離這兩個人的距離是不同的,每個麥克風都記錄下了來自兩個人的聲音的不同組合。
也許A的聲音在第一個麥克風里的聲音會響一點,也許B的聲音在第二個麥克風里會比較響一些,因為2個麥克風的位置相對於2個說話者的位置是不同的,但每個麥克風都會錄到來自兩個說話者的重疊部分的聲音。
所以,我們能做的就是把這兩個錄音輸入一種無監督學習算法中,稱為“雞尾酒會算法”。讓這個算法幫你找出其中蘊含的分類,然后這個算法就可以去識別這些錄音,分離出這兩個被疊加到一起的音頻源。以上所說的正是“雞尾酒會問題”的簡化版本。
雞尾酒會問題(Cocktail Party Problem),在一個滿是人的房間中,人們都在互相對話,我們使用一些麥克風錄下房間中的聲音,利用非監督學習算法來識別房間中某一個人所說的話。
總結:根據錄音,算法找出蘊含分類,之后算法就可以識別其他合成的錄音中,哪些是屬於這個分類,哪些是屬於那個分類。
總結
監督學習(分類,回歸)
無監督學習(聚類)