1. 程式人生 > >Andrew NG機器學習課程筆記系列之——Introduction to Machine Learning

Andrew NG機器學習課程筆記系列之——Introduction to Machine Learning

引言

本系列文章是本人對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

我們用一個例子開頭,介紹什麼是監督學習,正式的定義會在後面介紹。

假設你現在想要預測房價,並且擁有一些關於房價的資料,如下:

image

其中橫軸表示房子的面積(單位是平方英尺),縱軸表示房價(單位是千美元),假如你有一套750平方英尺大小的房子想要賣掉,那麼基於以上資料,你如何推測房子大概值多少錢。

對於這個問題,我們可以應用機器學習演算法,在這組資料中畫一條直線或者說是擬合一條直線,根據這條線我們可以推測出這套房子可能賣$150, 000。當然這不是唯一的演算法,比如一個二次函式可能更適合已有的資料,我們使用這個二次函式的曲線來進行預測可能效果會更好。

以上就是一個 Supervised Learning 的例子,可以看出 Supervised Learning 指的就是我們給學習演算法一個數據集,這個資料集由“正確答案”組成。在房價的例子中,我們給了一系列房子的資料,我們給定資料集中每個樣本的正確價格,即它們實際的售價,然後運用學習演算法,計算出更多的正確答案,比如你的那個新房子的價格,用術語來講,這叫做迴歸問題。

我們試著推測出一個連續值的結果,即房子的價格。一般房子的價格會記到美分,所以房價實際上是一系列離散的值,但是我們通常又把房價看成實數,看成是標量,因此又把它看成一個連續的數值,迴歸這個詞的意思指的就是,我們在試著推測出這一系列連續值屬性

迴歸問題:我們所預測的結果是連續的值。

我們再來討論另外一個監督學習的例子,假使你希望通過檢視病例來預測一個乳腺癌是否是良性的,這個資料集中,橫軸表示腫瘤的大小,縱軸上,我標出 1 和 0 來分別表示是惡性腫瘤或者不是惡性腫瘤。我們之前見過的腫瘤,如果是惡性記為1,不是惡性(或者說是良性)則記為0。

image

假設現在我們有一個朋友很不幸檢查出乳腺腫瘤,假設說她的腫瘤大概這麼大,那麼機器學習的問題就在於,你能否估算出腫瘤是惡性的或是良性的概率。用術語來講,這是一個分類問題。

分類指的是我們試著推測出離散的輸出值: 0 或 1 、良性或惡性。而事實上在分類問題中,輸出可能不止兩個值。比如說可能有三種乳腺癌,所以你希望預測離散輸出0、1、2、3。其中 0 代表良性,1 表示第一類乳腺癌,2 表示第二類癌症,3 表示第三類。但是,實際上這也是分類問題,因為這幾個離散的輸出分別對應良性、第一類、第二類或者第三類癌症。

在分類問題中我們可以用另一種方式來繪製這些資料點。我們可以用不同的符號來表示這些資料,既然我們把腫瘤的尺寸看做區分惡性或良性的特徵,那麼我們可以這麼畫,用不同的符號來表示良性和惡性腫瘤,或者說是負樣本和正樣本。現在我們不全部畫X,而是改成良性的腫瘤用O表示,惡性的繼續用X表示。我們所做的只是把上面的資料一一對映下來,對映到一根直線上,並且用不同的符號 O 和 X 來表示良性和惡性樣本。

注意,在這個例子中,我們只用了腫瘤的尺寸這一種特徵來預測腫瘤的惡性與否,在其它一些機器學習問題中可能會遇到不止一種特徵。舉個例子,我們不僅知道腫瘤的尺寸,還知道對應患者的年齡,那現在資料集看起來可能是如下這個樣子:

image

也就是說,你現有的資料集是不同病人的年齡和她們身上腫瘤的尺寸大小以及這些腫瘤的良性與否。我們以橫座標為腫瘤的尺寸,以縱座標為病人的年齡,以 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 中的每一個樣本,我們已經被清楚地告知了,什麼是所謂的正確答案,即它們是良性還是惡性。

image

在 Unsupervised Learning 中,我們所用的資料會和 Supervised Learning 裡的看起來有些不一樣。在 Unsupervised Learning 中,沒有屬性或標籤這一概念,也就是說所有的資料都是一樣的,沒有區別。

image

所以在 Unsupervised Learning 中,我們只有一個數據集,沒人告訴我們該怎麼做,我們也不知道每個資料點究竟是什麼意思。相反,它只告訴我們,現在有一個數據集,你能在其中找到某種結構嗎?

對於給定的資料集,Unsupervised Learning Algorithm可能判定該資料集包含兩個不同的聚類。無監督學習演算法會把這些資料分成兩個不同的聚類,這就是所謂的聚類演算法。

聚類演算法例項

實際上 Unsupervised Learning 被用在許多地方。我們來舉一個聚類演算法的例子,是關於Google 新聞的例子。

image
谷歌新聞每天都在幹什麼呢?他們每天會去收集成千上萬的網路上的新聞,然後將他們分組,組成一個個新聞專題。谷歌新聞所做的就是去搜索成千上萬條新聞,然後自動的將他們聚合在一起,有關同一主題的新聞被顯示在一起。

其實,聚類演算法和無監督學習演算法也可以被用於許多其他的問題。這裡,我們舉個它在基因組學中的應用,下面是一個關於基因晶片的例子:

image
基本的思想是,給定一組不同的個體,對於每個個體,檢測它們是否擁有某個特定的基因。也就是說,你要去分析有多少基因顯現出來了。因此,這些顏色:紅、綠、灰等等,它們展示了這些不同的個體是否擁有一個特定基因的不同程度。

然後你所能做的就是執行一個聚類演算法,把不同的個體歸入不同的類或者說歸為不同型別的人,這就是無監督學習。我們沒有提前告知這個演算法哪些是第一類的人、哪些是第二類的人、哪些是第三類的人等等。相反我們只是告訴演算法,這兒有一堆資料,我不知道這個資料是什麼東西,我不知道里面都有些什麼型別,叫什麼名字,我甚至不知道都有哪些型別。但是,請問你可以自動的找到這些資料中的型別嗎?然後自動的按得到的型別把這些個體分類,雖然事先我並不知道哪些型別,因為對於這些資料樣本來說,我們沒有給演算法一個正確答案,所以,這就是無監督學習。

無監督學習或聚類演算法在其他領域也有著大量的應用,它被用來組織大型的計算機叢集。一些朋友在管理大型資料中心(大型計算機叢集),並試圖找出哪些機器趨向於協同工作,如果你把這些機器放在一起,你就可以讓你的資料中心更高效地工作。

還有應用可以用於社交網路的分析。所以,如果可以得知你用 email 聯絡最多的是哪些朋友,或者知道你的 Facebook 好友,或者你 Google+ 裡的朋友,知道了這些之後資訊後,我們可以自動識別哪些是很要好的朋友組,哪些僅僅是互相認識的朋友組。

還有在市場分割中的應用,許多公司擁有龐大的客戶資訊資料庫,那麼給你一個客戶資料集,你能否自動找出不同的市場分割,並自動將你的客戶分到不同的細分市場中,從而有助於你在不同的細分市場中進行更有效的銷售,這也是無監督學習。我們現在有這些客戶資料,但我們預先並不知道有哪些細分市場,而且對於我們資料集的某個客戶,我們也不能預先知道誰屬於細分市場一,誰又屬於細分市場二等等。但我們必須讓這個演算法自己去從資料中發現這一切。

實際上無監督學習也被用於天文資料分析,通過這些聚類演算法,我們發現了許多驚人的、有趣的、以及實用的關於星系是如何誕生的理論,所有這些都是聚類演算法的例子。

雞尾酒宴問題

再一個 Unsupervised Learning Algorithm 的例子是雞尾酒宴問題。想象一下,一個宴會有一屋子的人,大家都坐在一起,並且在同時說話,因此會有許多聲音混雜在一起,因為許多人會在同一時間說話,在這種情況下你很難聽清楚你面前的人說的話。

因此,比如有這樣一個場景,宴會上只有兩個人,兩個人同時說話(恩,沒錯…這是個很小的雞尾酒宴會),我們準備好了兩個麥克風,把它們放在房間裡,然後因為這兩個麥克風距離這兩個人的距離是不同的,每個麥克風都記錄下了來自兩個人的聲音的不同組合。

image

也許A的聲音在第一個麥克風裡的聲音會響一點,也許B的聲音在第二個麥克風裡會比較響一些,因為2個麥克風的位置相對於2個說話者的位置是不同的,但每個麥克風都會錄到來自兩個說話者的重疊部分的聲音。

所以,我們能做的就是把這兩個錄音輸入一種無監督學習演算法中,稱為“雞尾酒會演算法”。讓這個演算法幫你找出其中蘊含的分類,然後這個演算法就可以去識別這些錄音,分離出這兩個被疊加到一起的音訊源。以上所說的正是“雞尾酒會問題”的簡化版本。

雞尾酒會問題(Cocktail Party Problem),在一個滿是人的房間中,人們都在互相對話,我們使用一些麥克風錄下房間中的聲音,利用非監督學習演算法來識別房間中某一個人所說的話。

總結:根據錄音,演算法找出蘊含分類,之後演算法就可以識別其他合成的錄音中,哪些是屬於這個分類,哪些是屬於那個分類。