1. 程式人生 > >機器學習筆記1 - Hello World In Machine Learning

機器學習筆記1 - Hello World In Machine Learning

之間 項目 圍棋 gpu 強勁 大量數據 特殊 轉換成 [1]

前言

Alpha Go在16年以4:1的戰績打敗了李世石,17年又以3:0的戰績戰勝了中國圍棋天才柯潔,這真是科技界振奮人心的進步。伴隨著媒體的大量宣傳,此事變成了婦孺皆知的大事件。大家又開始激烈的討論機器人什麽時候會取代人類統治世界的問題。

其實人工智能在上世紀5、60年代就開始進入了理論研究階段,人們在不斷探索人工智能技術的同時,也擔憂起機器人會不會替代人類。然而現實比理想殘酷的多,由於當時各種條件的限制(理論基礎、技術基礎、數據基礎、硬件性能等),人工智能相關的項目進度緩慢,也缺少實際成效,研發資金、社會關註度也越來越低,人工智能進入第一次低谷期。

到了80年代,卡內基梅隆大學為數字設備公司設計了一套名為XCON的“專家系統”。這是一種,采用人工智能程序的系統,可以簡單的理解為“知識庫+推理機”的組合,XCON是一套具有完整專業知識和經驗的計算機智能系統。人工智能再一次被各國政府和科研機構看好,大量的資金投入到研發中,但是好景不長,幾年後隨著蘋果和IBM公司研發出了性能強勁的PC機,導致“專家系統”變得沒有競爭力,人工智能發展又一次進入寒冬。

隨後若幹年,人工智能的發展趨於平穩和低調。時間來到21世紀,隨著互聯網的普及,大量數據被積累下來;摩爾定律一次又一次的被證實,計算機硬件性能以極快的速度在增長;“雲”的普及,讓普通大眾也能輕松擁有調度大量算力的機會,人工智能不再是科學家和專業人員在實驗室才能研究的東西了。數據+算力+易得這幾方面的因素結合之後,將人工智能再一次推向了高潮。

可能這一波熱潮又是人工智能發展史上的一個波峰,未來人工智能還有很長的路要走。但目前的人工智能發展已經惠及到商業領域,在這樣一種技術+商業的結合中,我個人還是很看好這次浪潮的。尤其是在看過《最強大腦》中,百度在圖像、音頻方面的人工智能技術發展到這樣一個水平之後(圖像識別已經超超越了人類大腦對圖像的識別能力,聲音識別也幾乎和人類最高水平持平),很希望自己也可以有機會涉足到這個領域中。


機器學習基礎入門知識

機器學習是人工智能的一個分支,主要是通過數據+算法來訓練得出模型,再用模型來預測數據的一種技術。

剛開始接觸機器學習,發現基礎理論中好多都是大學裏學過的數理知識(一直以來困擾我的“大學為什麽要學這些東西”的謎團總算被解開了:)。我個人做了Web開發近十載,大部分是應用級的,很少涉及數理算法,看來今後還要慢慢拾起這些知識。不過剛開始入門可以循序漸進,先弄懂機器學習是怎麽回事,動手做一個“Hello world”,然後再逐步深入原理層面的知識。

要涉足機器學習,最好會一種編程語言,這點上我們程序員有先天優勢。目前用於機器學習的主流語言是PythonRR我個人還沒研究過,個人覺得Python

是一個比較好的選擇,流行度高、上手難度低、科學計算類庫豐富、語法精簡,如果本身就有其他面向對象的編程語言基礎,不到一周就可以基本掌握Python了。

機器學習從從業分布來看,可以分成基礎算法研究(設計師)和應(ban)用(zhuan)兩個領域,其中大部分人都是在應(ban)用(zhuan)這個領域。

如果從技術層面來看,機器學習分成監督學習無監督學習以及半監督學習。如何來區分呢?首先解釋下機器學習中的幾個名詞。

  • 特性(Features) - 其實就是數據
  • 分類器(Classifier) - 其實就是算法
  • 標簽(Labels) - 其實就是種類
  • 模型(Models) - 其實就是最終輸出的分類公式

監督學習,就是在有標簽的前提下,找到一種最合適的分類器,分析特性標簽之間的關系。
無監督學習,就是沒有標簽的前提下,將數據進行聚類(Clusting)
半監督學習,就是部分特性標簽,部分則沒有的狀況(大部分特性可能是沒有標簽的情況)下進行分類。

監督學習相對來說最簡單,由已知特性標簽,利用合適的分類器訓練出模型,再以模型套用到數據中來預測出數據的標簽。當然,分類器並不需要我們自己來發明創造,我們大部分人也沒這個能力做這些事情,所有的理論研究、科學論證、代碼實現都是現成的。Python中有很多相關類庫,比如scikit-learn。應用層面的機器學習,其實就是通過不停的調參(收集更多的數據、變換算法、選取合適的特征數據等工作)來找到一種更精準的預測模型的工作。


Hello World In Machine Learning

假設我們現在需要區分皮球(以直徑15cm-25cm之間的球為例)和甜瓜的圖片,如果是傳統的硬編碼的方式來寫代碼的話,可能需要寫幾百上千個if-else才能完成一個基本的算法,而且可擴展性特別差,比如如果圖片是黑白的或者圖片中有幹擾物品,那可能需要修改源代碼,添加更多的if-else來增加準確度。更糟的是,真正執行的時候會遇到很多事先沒有預料到的特殊情況。
但如果通過機器學習,這個事情可能就會變得很簡單。大致步驟如下:

  1. 將圖片轉換成特征向量(這個進階知識不在本篇中涉及)
  2. 決定一種合適當前場景的分類器
  3. 結合1中得到的特征2中得到的分類器訓練出模型
  4. 模型中的公式預測數據,估算出其屬於某個標簽的可能性,最大可能性的那個即模型推算出的結果


數據準備

轉換過程略,假設共N條數據,轉換得到的特性如下:

直徑(厘米) 形狀 顏色 標簽
24 round white melon
35 ellipse white melon
24 round orange ball
24 ellipse yellow melon
22 round yellow ball
... ... ... ...


實現代碼

features = [
    [24, 'round', 'white'],
    [35, 'ellipse', 'white'],
    [24, 'round', 'orange'],
    [24, 'ellipse', 'yellow'],
    [22, 'round', 'yellow'],
    ...
]

labels = ['melon', 'melon', 'ball', 'melon', 'ball']

我們知道,計算機處理基礎數據類型的速度,由快及慢為:boolintfloatstring...,因此,我們在處理數據的過程中,需要把原始數據抽象成計算機能最快處理的數據類型(因為機器學習運算量極大)。因此上面的代碼經過轉換之後:

# round:1, ellipse:2
# white:1, orange:2, yellow: 3
features = [[24, 1, 1], [35, 2, 1], [24, 1, 2], [24, 2, 3], [22, 1, 3]]

# melon:1, ball: 2
labels = [1, 1, 2, 1, 2]

這裏順便提一下,大部分機器學習中,都是以GPU的性能來衡量處理速度的,而不是我們一般使用的CPU,這是因為GPU的物理架構和CPU不一樣,GPU是專門為了處理圖像而設計的,它對浮點數的處理速度是CPU的數十倍乃至數百倍。而機器學習基本上可以看做是對浮點數的大量運算,因此GPU更適合在機器學習領域被使用。


算法選取

機器學習中,解決一個問題的算法並不是唯一的,同一個問題可以適用不同的算法來解決,一般都會在效率準確率之間做權衡。本例中我們使用決策樹(Deccision Tree)作為Classifier,關於決策樹,可參考https://baike.baidu.com/item/%E5%86%B3%E7%AD%96%E6%A0%91。


實現代碼

from sklearn import tree
...
# 實例化classifier
clf = tree.DecisionTreeClassifier()


訓練模型

scikit-learnclassifier中通過方法fit(features, labels)來訓練模型。其返回值即我們所需的模型


實現代碼

...
clf = tree.fit(features, labels)
...


預測數據

有了模型,我們就可以對今後的數據進行預測,以得出label值,從而達到對其歸類的目的。


實現代碼

...
# 假設現在有一個數據[23, 'round', 'white'],我們想知道他應該數據什麽類型,先將其轉換為[23, 1, 1], 然後調用模型的predict方法
print(clf.predict([[23, 1, 1]]))
...

得到的結果為:

# 代表機器學習測算得出結果是melon
[1]  


完整代碼

from sklearn import tree

# round:1, ellipse:2
# white:1, orange:2, yellow: 3
features = [[24, 1, 1], [35, 2, 1], [24, 1, 2], [24, 2, 3], [22, 1, 3]]

# melon:1, ball: 2
labels = [1, 1, 2, 1, 2]

# 實例化classifier
clf = tree.DecisionTreeClassifier()
# 訓練
clf = clf.fit(features, labels)

print(clf.predict([[23, 1, 1]]))


後記

上例中,如果通過真正的人工智能肉眼來看,[23, ‘round‘, ‘white‘]被推算為melon的準確度其實並不高,因為[23, ‘round‘, ‘white‘]歸類為ball也完全是可以的。上文提到過,機器學習其實就是不停的尋找合適的數據和算法以提升準確率的過程。想要提升準確率,我們可以有以下思路:

  • 加大訓練樣本量(訓練樣本必須和訓練效率做好權衡,另外,最好避免重復的特性浪費算力,比如有了直徑這列,就不需要半徑、周長這樣的特性了,這三者代表的是一個意思)
  • 變換算法(可以選用更高級的算法或者多個算法組合,但必須在準確度和效率之間做好權衡)
  • 抽象出更多的特性數據(比如本例中,如果有辦法抽象出質量這樣的特性,那對於預測準確率會有極大的提升)

至此為止,我們機器學習的Hello World程序已經完成了,也基本了解了機器學習是怎麽回事,是不是還挺有意思的?



本文在博客園和我的個人博客www.fujiabin.com上同步發布。轉載請註明來源。

機器學習筆記1 - Hello World In Machine Learning