何謂機器學習 機器學習能做些什麼?

袁野發表於2013-04-24

最近我和一對夫婦共進晚餐,他們問我從事什麼職業,我回應道:“機器學習。”
妻子回頭問丈夫:“親愛的,什麼是機器學習?”
她的丈夫答道:“T-800型終結者。”
在《終結者》系列電影中,T-800是人工智慧技術的反面樣板工程。不過,這位朋友對機器學習的理解還是有所偏差的。

機器學習能讓我們自資料集中受到啟發,換句話說,我們會利用計算機來彰顯資料背後的真實含義,這才是機器學習的真實含義。它既不是隻會徒然模仿的機器人,也不是具有人類感情的仿生人。

enter image description here

T-800型終結者(圖片來源網路)

現今,機器學習已應用於多個領域,遠超出大多數人的想象,下面就是假想的一日,其中很多場景都會碰到機器學習:假設你想起今天是某位朋友的生日,打算通過郵局給她郵寄一張生日賀卡。你開啟瀏覽器搜尋趣味卡片,搜尋引擎顯示了10個最相關的連結。你認為第二個連結最符合你的要求,點選了這個連結,搜尋引擎將記錄這次點選,並從中學習以優化下次搜尋結果。然後,你檢查電子郵件系統,此時垃圾郵件過濾器已經在後臺自動過濾垃圾廣告郵件,並將其放在垃圾箱內。接著你去商店購買這張生日卡片,並給你朋友的孩子挑選了一些尿布。結賬時,收銀員給了你一張1美元的優惠券,可以用於購買6罐裝的啤酒。之所以你會得到這張優惠券,是因為款臺收費軟體基於以前的統計知識,認為買尿布的人往往也會買啤酒。然後你去郵局郵寄這張賀卡,手寫識別軟體識別出郵寄地址,並將賀卡傳送給正確的郵車。當天你還去了貸款申請機構,檢視自己是否能夠申請貸款,辦事員並不是直接給出結果,而是將你最近的金融活動資訊輸入計算機,由軟體來判定你是否合格。最後,你還去了賭場想找些樂子,當你步入前門時,尾隨你進來的一個傢伙被突然出現的保安給攔了下來。“對不起,索普先生,我們不得不請您離開賭場。我們不歡迎老千。” 圖1.1集中展示了使用到的機器學習應用。

enter image description here

圖1-1 機器學習在日常生活中的應用,從左上角按照順時針方向依次使用到的機器學習技術分別為:人臉識別、手寫數字識別、垃圾郵件過濾和亞馬遜公司的產品推薦

上面提到的所有場景,都有機器學習軟體的存在。現在很多公司使用機器學習軟體改善商業決策、提高生產率、檢測疾病、預測天氣,等等。隨著技術指數級增長,我們不僅需要使用更好的工具解析當前的資料,而且還要為將來可能產生的資料做好充分的準備。

感測器和海量資料

雖然我們已從網際網路上獲取了大量的人為資料,但最近卻湧現了更多的非人為資料。感測器技術並不時髦,但如何將它們接入網際網路確實是新的挑戰。有預測表明,20%的網際網路非視訊流量都將由物理感測器產生。

地震預測就是一個很好的例子,感測器收集了海量的資料,如何從這些資料中抽取出有價值的資訊是一個非常值得研究的課題。1989年,洛馬·普列埃塔地震襲擊了北加利福尼亞州,63人死亡,3757人受傷,成千上萬人無家可歸;然而,相同規模的地震2010年襲擊了海地,死亡人數卻超過23萬。洛馬·普列埃塔地震後不久,一份研究報告宣稱低頻磁場檢測可以預測地震, 但後續的研究顯示,最初的研究並沒有考慮諸多環境因素,因而存在著明顯的缺陷。如果我們想要重做這個研究,以便更好地理解我們這個星球,尋找預測地震的方法,避免災難性的後果,那麼我們該如何入手才能更好地從事該研究呢?我們可以自己掏錢購買磁力計,然後再買一些地來安放它們,當然也可以尋求政府的幫助,讓他們來處理這些事。但即便如此,我們也無法保證磁力計沒有受到任何干擾,另外,我們又該如何獲取磁力計的讀數呢?這些都不是理想的解決方法,使用行動電話可以低成本的解決這個問題。

enter image description here

地震示意圖(圖片來源網路)

現今市面上銷售的行動電話和智慧手機均帶有三軸磁力計,智慧手機還有作業系統,可以執行我們編寫的應用軟體,十幾行程式碼就可以讓手機按照每秒上百次的頻率讀取磁力計的資料。此外,行動電話上已經安裝了通訊系統,如果可以說服人們安裝執行磁力計讀取軟體,我們就可以記錄下大量的磁力計資料,而附帶的代價則是非常小的。除了磁力計,智慧電話還封裝了很多其他感測器,如偏航率陀螺儀、三軸加速計、溫度感測器和GPS接收器,這些感測器都可以用於測量研究。

移動計算和感測器產生的海量資料意味著未來我們將面臨著越來越多的資料,如何從海量資料中抽取到有價值的資訊將是一個非常重要的課題。

機器學習非常重要

在過去的半個世紀裡,已開發國家的多數工作崗位都已從體力勞動轉化為腦力勞動。過去的工作基本上都有明確的定義,類似於把物品從A處搬到B處,或者在這裡打個洞,但是現在這類工作都在逐步消失。現今的情況具有很大的二義性,類似於“最大化利潤”,“最小化風險”、“找到最好的市場策略”......諸如此類的任務要求都已成為常態。雖然可從網際網路上獲取到海量資料,但這並沒有簡化知識工人的工作難度。針對具體任務搞懂所有相關資料的意義所在,這正成為基本的技能要求。正如谷歌公司的首席經濟學家Hal Varian所說的那樣:

“我不斷地告訴大家,未來十年最熱門的職業是統計學家。很多人認為我是開玩笑,誰又能想到計算機工程師會是20世紀90年代最誘人的職業呢?如何解釋資料、處理資料、從中抽取價值、展示和交流資料結果,在未來十年將是最重要的職業技能,甚至是大學,中學,小學的學生也必需具備的技能,因為我們每時每刻都在接觸大量的免費資訊,如何理解資料、從中抽取有價值的資訊才是其中的關鍵。這裡統計學家只是其中的一個關鍵環節,我們還需要合理的展示資料、交流和利用資料。我確實認為,能夠從資料分析中領悟到有價值資訊是非常重要的。職業經理人尤其需要能夠合理使用和理解自己部門產生的資料。”

——McKinsey Quarterly,2009年1月

大量的經濟活動都依賴於資訊,我們不能在海量的資料中迷失,機器學習將有助於我們穿越資料霧靄,從中抽取出有用的資訊。

Python語言的優勢

基於以下三個原因,我們選擇Python作為實現機器學習演算法的程式語言:(1) Python的語法清晰;(2) 易於操作純文字檔案;(3) 使用廣泛,存在大量的開發文件。

enter image description here

可執行虛擬碼

Python具有清晰的語法結構,大家也把它稱作可執行虛擬碼(executable pseudo-code)。預設安裝的Python開發環境已經附帶了很多高階資料型別,如列表、元組、字典、集合、佇列等,無需進一步程式設計就可以使用這些資料型別的操作。使用這些資料型別使得實現抽象的數學概念非常簡單。此外,讀者還可以使用自己熟悉的程式設計風格,如物件導向程式設計、程式導向程式設計、或者函數語言程式設計。

Python語言處理和操作文字檔案非常簡單,非常易於處理非數值型資料。Python語言提供了豐富的正規表示式函式以及很多訪問Web頁面的函式庫,使得從HTML中提取資料變得非常簡單直觀。

Python比較流行

Python語言使用廣泛,程式碼範例也很多,便於讀者快速學習和掌握。此外,在開發實際應用程式時,也可以利用豐富的模組庫縮短開發週期。

在科學和金融領域,Python語言得到了廣泛應用。SciPy和NumPy等許多科學函式庫都實現了向量和矩陣操作,這些函式庫增加了程式碼的可讀性,學過線性代數的人都可以看懂程式碼的實際功能。另外,科學函式庫SciPy和NumPy使用底層語言(C和Fortran)編寫,提高了相關應用程式的計算效能。

Python的科學工具可以與繪圖工具Matplotlib協同工作。Matplotlib可以繪製2D、3D圖形,也可以處理科學研究中經常使用到的圖形。

Python開發環境還提供了互動式shell環境,允許使用者開發程式時檢視和檢測程式內容。

Python開發環境將來還會整合Pylab模組,它將NumPy、SciPy和Matplotlib合併為一個開發環境。雖然Pylab還沒有併入Python環境,但是不遠的將來我們肯定可以在Python開發環境找到它。

Python語言的特色

諸如MATLAB和Mathematica等高階程式語言也允許使用者執行矩陣操作,MATLAB甚至還有許多內嵌的特徵可以輕鬆地構造機器學習應用,而且MATLAB的運算速度也很快。然而MATLAB的不足之處是軟體費用太高,單個軟體授權就要花費數千美元。雖然也有適合MATLAB的第三方外掛,但是沒有一個有影響力的大型開源專案。

Java和C等強型別程式設計語言也有矩陣數學庫,然而對於這些程式設計語言來說,最大的問題是即使完成簡單的操作也要編寫大量的程式碼。程式設計師首先需要定義變數的型別,對於Java來說,每次封裝屬性時還需要實現getter和setter方法。另外還要記著實現子類,即使並不想使用子類,也必須實現子類方法。為了完成一個簡單的工作,我們必須花費大量時間編寫了很多無用冗長的程式碼。Python語言則與Java和C完全不同,它清晰簡練,而且易於理解,即使不是程式設計人員也能夠理解程式的含義,而Java和C對於非程式設計人員則像天書一樣難於理解。

所有人在小學二年級已經學會了寫作,然而大多數人必須從事其他更重要的工作。

——鮑比·奈特

也許某一天,我們可以在這句話中將“寫作”替代為“編寫程式碼”,雖然有些人對於編寫程式碼很感興趣,但是對於大多數人來說,程式設計僅是完成其他任務的工具而已。Python語言是高階程式語言,我們可以花費更多的時間處理資料的內在含義,而無須花費太多精力解決計算機如何得到資料結果。Python語言使得我們很容易表達自己的目的。

Python語言的缺點

Python語言唯一的不足是效能問題。Python程式執行的效率不如Java或者C程式碼高,但是我們可以使用Python呼叫C編譯的程式碼。這樣,我們就可以同時利用C和Python的優點,逐步地開發機器學習應用程式。我們可以首先使用Python編寫實驗程式,如果進一步想要在產品中實現機器學習,轉換成C程式碼也不困難。如果程式是按照模組化原則組織的,我們可以先構造可執行的Python程式,然後再逐步使用C程式碼替換核心程式碼以改程式序的效能。C++ Boost庫就適合完成這個任務,其他類似於Cython和PyPy的工具也可以編寫強型別的Python程式碼,改進一般Python程式的效能。

如果程式的演算法或者思想有缺陷,則無論程式的效能如何,都無法得到正確的結果。如果解決問題的思想存在問題,那麼單純通過提高程式的執行效率,擴充套件使用者規模都無法解決這個核心問題。從這個角度來看,Python快速實現系統的優勢就更加明顯了,我們可以快速地檢驗演算法或者思想是否正確,如果需要,再進一步優化程式碼。

相關文章