機器學習並沒有那麼深奧,它還很有趣
編者按:在科技圈,如果你不懂“機器學習”,那你就 out 了。當別人在談論機器學習娓娓道來時,你卻一頭霧水,怎麼辦?在跟同事的聊天中,你只能頻頻點頭卻插不上話,怎麼辦?讓我們來做些改變!Adam Geitgey 撰寫了一份簡單易懂的《機器學習,樂趣無限》的資料,共分爲5個部分,主要針對所有對“機器學習”感興趣,卻苦於不知從何下手的朋友,希望。能借此讓更多人認識瞭解“機器學習”,激發其對“機器學習”的興趣。
相信很多人都已經厭倦了維基百科上的長篇累牘,迫切地希望能有人給出個更準確、更高水平的解釋。這些,正是“機器學習”將爲你做到的!
什麼是“機器學習”?
機器學習,意味着你不再需要編寫那些紛繁複雜的特定傳統代碼,機器運用一套通用的算法——泛型算法,就能告訴你關於一組數據的有趣之處。不需要寫代碼、編程序,只要把數據交給泛型算法,它就能自動建立起數據邏輯。
舉個例子:用於分類的泛型算法是能夠把一組數據分門別類的,用於識別手寫數字的分類泛型算法同樣能夠做到在不改變代碼的條件下將垃圾郵件和非垃圾郵件區分開。兩者使用的是同一種泛型算法,但是因爲輸入的數據不同,所以輸出的分類邏輯是不一樣的。
這一種機器學習算法相當於一個黑盒子,能夠處理各種有關分類的問題。
“機器學習”是一個呈傘狀結構的體系,除了分類算法以外,還覆蓋了各種各樣其他的泛型算法。
兩類機器學習算法
你可以把機器學習算法暫且想象爲擁有着兩大類分支的體系——有監督學習和無監督學習。這兩者的區別顯而易見,不外乎是有無監督之差,但是其重要性卻是不容忽視的。
有監督學習
假設,你現在是房地產經紀人,你的業務持續增長,所以你必須僱一幫新的實習代理幫忙。然而當下的問題是:你只要隨便一瞥就能知道一間房子大概的價值,但是你僱來的實習代理不行,他們不如你經驗豐富,還做不到對房子進行相對準確的估價。
那麼爲了幫助你的實習代理(當然同時也是爲了給你自己放假),你可以編寫一個能夠完成房產估價工作的應用程序,這個程序能夠根據房子的大小、周邊環境等條件找出相似的房子,然後進行價格預估。
因此,你需要記錄下你所在城市三個月內房產交易的信息。針對每筆交易,你需要記錄下一系列細節信息,比如:房間數目、房子大小、周邊地區環境,等等,最重要的是要記錄下交易的最終價格。
以上就是我們收集到的數據,專業地稱之爲“訓練數據”,我們希望通過這些數據建立一個程序,來幫助我們對我們所在區域的其他房子進行估價。當然,我們同時也希望能通過這些數據,對區域以外的其他房子進行價格預估。
這種模式就叫做“有監督學習”。
你從一開始就知道了每間房子的價格,換句話說,你已經知道了一個問題的答案,而且你能夠原路返回,重新思考這個問題,從而建立起一個解決這個問題的思路和邏輯。
那麼建立一個能預估房價的應用程序,你需要把關於每間房子的數據信息——“訓練數據”——輸入你的機器學習算法中,算法就會得出用於解決這些數據關係的一套數學公式。
這就有點像一份數學考試的答案紙被塗掉了所有的算術符號,就像下面這張圖。
天啊!老師答案紙上的算術符號不知道被哪個淘氣的學生都塗掉了!這個時候你應該很難看出這次考試考的是什麼數學問題,到底是加法還是減法?
所以要解決到底是加法還是減法的問題,你這時就需要對左邊和右邊的數字進行一些“計算加工”來弄清他們之間的關係了。
通過這種“有監督學習”,你可以讓電腦幫你完成一系列的“計算加工”工作。當你弄清楚等式左右兩邊的數學關係以後,你就會知道用什麼方法解決這個數學問題了,那麼類似的問題也就迎刃而解啦!
無監督學習
我們再回到前面提到的房地產經紀人的例子。假如就連作爲房地產經紀人的你,對每間房子的價格都不確定,那該怎麼辦?
如果你瞭解到的只有房子的大小、位置這些信息,那也沒關係,用我接下來介紹的“無監督學習”你一樣能有所作爲。
機器學習可以讓你在沒有掌握有決定性意義的數字信息(這裡指的是房子的價格)的條件下也能有所作爲。
這就有點兒像,有個人遞給你一張紙,上面寫着一串數字(這裡指的是除了房價以外的其他數據信息)然後告訴你“我也不知道這一大串數字是什麼意思,但是你應該能從中得出些隱含的信息,好好幹,祝你好運!”
我們拿到這串數字數據能做些什麼呢?對於一個新手來說,你可以用一個算法自動識別出你的數據內部的細分市場區隔。你可能就會發現鄰近大學地區的一些買家傾向於購買房間多、面積小的房子,而在郊區的買家則比較青睞建築面積大的,房間數量不需要多的(大概只需三個)房子。瞭解了不同客戶的不同需求能夠對你的市場推廣工作起到很大的指導作用。
除此之外,你能做的還有就是自動識別出那些與其他不同的離羣孤立的房子,可能那些孤立出來的房子都是高樓大廈,所以你可以有針對性地把銷售主力集中在這個區域。
在這篇帖子接下來的部分,我們將會更多地關注在“有監督學習”上,但這並不代表“無監督學習”就是無用的。事實上,隨着算法的不斷完善,“無監督學習”變得越來越重要,因爲它在數據沒有被貼上正確答案標籤的條件下同樣能使用。
給學者們的附註:確實是有很多不同類型的機器學習的泛型算法,但是對於剛入門的新手來說,從這兩類算法開始確實是一個不錯的選擇。
運用“機器學習”給房子進行估價確實很酷,但是這真的算是學習嗎?
作爲人類,你的大腦可以解決很多種突發狀況,而且在沒有明確的指示的情況下同樣可以學會處理這些狀況。如果你很長一段時間都在做房屋銷售,那麼你就會對房屋的正確估價、房屋的營銷策略、房屋的潛在客戶等產生本能的反應。而強大的人工智能調查的目的就是把產生這種本能反應的能力在電腦上覆制下來。但是就現在來說,機器學習算法還沒能達到那麼高的水平,它暫時只適用於一些特定的、有限的問題。因此,在這種情況下,“學習”被定義爲“根據示例數據得出相應的公式來解決特定的問題”可能更爲恰當。但是很顯然“機器運用根據示例數據得出的公式解決特定問題”這個定義不能作爲個好名字,所以,我們乾脆就直接稱之爲“機器學習”。
當然,可能在50年後人工智能已經強大到那種地步了,那麼你一定會覺得我寫的這篇帖子裡有點奇怪。如果真是如此,請你放下這篇帖子,讓你的機器人保姆給你做個三明治,盡情享受人工智能帶來的便捷和舒適吧。
話不多說,我們試試編寫那個房屋估價的程序吧!
我們到底怎麼編寫一個能夠對房子進行估價的程序呢?往下讀之前,請你先在自己的腦海裡想想。
假設你現在對“機器學習”一無所知,你大概會寫一些房屋估價相關的一些基本規律和規則吧?就像這樣:
如果你能耐下性子細細研究上面這些代碼,說不定你會寫出個像樣的估價程序。但是,這個估價程序並不是完美的,當價格出現波動時,你的估價程序可能就不適用了。
如果電腦能夠幫你輸出一個相對準確的估價函數豈不是更好?只要這個函數輸出的估價能跟原始數據中的價格相吻合,沒有人會在乎這個函數到底是怎麼來的。
換種方式來理解這個問題:如果把房子的最終價格比作一碗湯,而湯中的食材就是“房間數目”、“房子大小面積”、“周邊環境”這些必需的信息。如果你瞭解每種食材(房產估價的所需信息)分別對這鍋湯(預估的價格)的影響程度,你應該就會有一個相對確切的“燉湯食材比例”,這個比例同樣也能用來對房子進行估價。
你會發現,以上那些假設雖然不甚恰當,且略微不切實際,但是會把你的原先的複雜的函數簡化到以下程度:
留意一下以下加粗的幾組數字:841231951398213, 1231.1231231, 2.3242341421, 以及201.23432095。這些就是我們用於權衡計算的指標數字,如果我們能計算出適用於所有房子的完美指標,那麼程序就能預估房子的價格了。
計算出這個完美指標最笨的方法就像這樣:
第一步:
把各個指標設置爲1.0
第二步:
運用所有你瞭解的房產價格信息來測試你的程序,檢查你求得的函數輸出的結果與實際房價的偏差。
用你求得的函數來對每間房子進行價格預估。
比如說,假設第一間房子實際售價爲250,000美元,但是你的函數輸出的預估價爲178,000美元,那麼就這一間房子而言,程序價格預估的偏差就是72,000美元。
現在把你數據庫裡所有的每間房子價格偏差的平方值相加。
假如你數據庫裡有500個房屋成交信息,而通過測試這些交易信息得出的你的函數預估偏差總值達到了86,123,373美元,這數字就代表着你的函數當前的偏差總值。現在,把這個偏差總值除以500,得出每間房子預估偏差的平均值,把這個平均值暫且先稱爲函數的“成本費用”。如果你能通過對權衡指標的把玩從而把“成本費用”降低至零,那麼你的程序就完美了。這就意味着,根據輸入的數據信息,你的程序就能夠相對準確地對房子價值進行預估。
第三步:
運用所有可能的指標組合重複第二步。找到能讓你函數的“成本費用”最大程度地降至零的指標組合,那你的問題就解決了。
三個步驟很簡單吧!現在來看看我們前面都做了些什麼吧:首先,你拿到了一些數據信息,然後把它運用到三個非常簡單的、通用的步驟,最後得到了一個能對你所在地區的房產進行價格預估的應用程序(函數)。
“機器學習”如此神通廣大,Zillow(美國一家房地產估價網站)可要當心咯!
然而,下面的這些問題可能會給你帶來些困擾。
1. 最近40年以來,像語言學、翻譯學等許多不同領域的調查顯示,這些用於煮出一鍋“數據燉湯”(根據剛剛燉湯例子創出的新詞)的通用算法比人類自己琢磨出的一套規則有用多了,就連最笨的機器學習工具都要比專家級別的人類強。
2. 你最後研究出來的那個函數對“房間的大小面積”或是“房間數目”一概不知,它只知道通過那些輸入的已知數據來算出最正確的估價答案。
3. 很可能你完全不瞭解一組指標數據是怎麼預估出房產價值的,也就是說你得到了一個你不完全瞭解其工作原理,只知道它能幫你預估房價的函數。
4. 想象一下,假如你剛剛研究出來的房產價值預估的函數輸入的不是係數變量“房產面積”和“房間數目”,而是一大串數字,而這其中的每個數字都代表着用裝在你車頂上的相機所拍下的照片的像素亮度值。那麼這個時候,把輸出的預估結果稱作“房產價格”就似乎不太貼切了,稱之“方向盤轉向度”才更恰當。至此,你就已經研究出一個能讓汽車自己掌握方向的函數了。很神奇吧?
前面第三步中提到的“運用所有可能的指標”是怎麼回事呢?
當然,你不可能通過一個個地嘗試完所有可能的指標來找出一個完美的組合,因爲這要花費你一輩子的時間去嘗試無窮無盡的數字。
爲了克服這種低效率的嘗試,數學家們已經研究出許多種更爲簡單有效的方法。下面是其中之一:
首先,根據上面提到的步驟二中的數據信息寫一個簡單的等式關係:
這個就是你的“成本費用函數”
現在,試着用機器學習的數學術語把這個等式關係重寫一次
代表你當前的指標數,J( )代表在當前的指標數下你的成本費用。這個等式關係就代表着我們現在的價值預估函數與實際的偏差程度。
如果我們把這個成本費用函數加入所有可能的指標數據,用曲線圖像表示出來,我們會得到一個像這樣的曲線圖:
我們的成本費用函數曲線圖圖像呈現一個碗狀,縱座標表示成本費用。這個圖像中藍色的最低點就是我們成本費用的最低值,意味着我們的函數偏差值最小。相反,最高點就是我們函數偏差值達到最大。所以,當我們找到能使這個圖像達到最低點的指標值的時候,問題就解決了。
因此,我們要不斷地調整我們的指標值來接近圖像的最低點,就像在走下山路。只要我們能在不斷的調整中,一點點接近圖像最低點,我們最終就能在不一個個嘗試數字的情況下找到最合適的函數方程式。
如果你還記得微積分學的一些知識的話,你應該會記得如果你求出了函數的導數,就相當於知道了這個函數在各個點的切線斜率。換句話來說,就是知道了哪個方向角度能使我們在圖像上呈下降趨勢,我們可以藉助這些知識來接近圖像最低點。
如果我們能運用每個指標值求出了成本費用函數的部分導數,那麼我們就能相應地減少每個指標的值,我們就能離“山腳”更進一步了,終究會達到最低點,找出那個最佳的指標值。(如果上面的做法都不奏效,別擔心,繼續往下讀。)
上面的是爲函數找出最佳指標值的方法之一的相對高級的總結,我們稱之爲“梯度下降法”。如果你對這些細節感興趣的話,可以深入探究一下。
當你使用機器學習軟件工具庫去解決一個實際的問題,以上的工作你都不用擔心。但是瞭解它實際工作流程也是很有必要。
機器學習還給你帶來了哪些方便?
從專業的角度講,前面提到的泛型算法三步走也被稱作“多元線性迴歸”。我們嘗試着研究出一個能適用於所有房屋數據信息的等式關係,然後用這個等式關係去對一間你完全沒有見過的房子進行價值預估。能夠用這個看似虛擬的等式關係來解決實實在在的問題確實很讓人吃驚。
然而,我前面介紹的方法在一些簡單的案例中能奏效,但它並不是萬無一失的。原因之一就在於房價的非線性的特點,也就是說房價是沒有特定規律可循的。
所幸的是我們有很多方法去克服房價的不確定性。還有很多其他的機器學習算法能夠解決非線性數據,像類神經網絡或是有核支持向量機等;而且還有很多針對複雜的線性問題使用的線性迴歸方法。總之,不論哪種方法都是以找出最佳指標值爲目的的。
然而,和大多數人一樣,我還是忽略了過度擬合的問題。我們在初期很容易就能找出一系列切合你原始房產數據庫的指標值,但是這些指標值僅僅適用於你的原始數據,對於原始數據庫之外的新的房產數據就不起作用了。針對這個問題,我們同樣有方法去解決,比如說正則化處理,或者使用交叉驗證數據集。懂得怎麼處理這些問題正是掌握機器學習的關鍵。
換言之,儘管基礎理念都很簡單,但是你要真正掌握機器學習並且取得成效是需要一些技巧和經驗的。所幸,這些技巧和經驗,是每個開發人員都能夠通過學習掌握的。
機器學習的神奇之處在哪?
一旦你見證了運用機器學習技術就能輕輕鬆鬆完成一件貌似非常難的任務(比如字跡識別),你就會明白只要有足夠的數據信息,就能用機器學習解決很多複雜的問題。你只需簡簡單單地輸入數據信息,等着電腦給你輸出一個適用於你的數據的等式關係。
但你必須要清楚機器學習只能夠解決數據問題,所以你要確保你輸入的數據信息對解決問題是有幫助的。
比如說,假如你建立了一個房價預估模型,而這個模型的依據是房子內盆栽植物種類,顯然這個預估模型是不可能預估出房產價值的。因爲盆栽植物種類與這間房子的價格是沒有任何關係的,所以電腦是沒辦法導出這兩者之間的關係式的。
你只能建立一個實際存在的關係模型。所以切記,如果一個專家都不能人工地用那個數據去解決問題,那麼電腦同樣也是不能的。不要說既然人類都能解決,那麼要機器何用,我們應該關注在機器在解決問題上幫人類省下了多少時間。
怎樣進一步瞭解機器學習?
在我看來,當前機器學習的最大問題就是它的使用僅侷限於部分學術界和商業調研,普及度尚待提高;同時,由於缺少簡單易懂的行內資料,一些希望對機器學習有進一步瞭解的外行人只能望而卻步。不過,這些問題正一步步被人類解決。
由Andrew Ng在Coursera開設的免費機器學習課程是相當有價值的,我強烈推薦從這個課程開始瞭解機器學習。它對那些有計算機科學學位的人和有一點點起碼的數學基礎的人來說更易理解。
你可以下載安裝SciKit-Learn,這是個涵蓋所有標準算法的Python框架,你能用它對各種不同的機器學習算法進行把玩研究。
注:本文由「圖普科技」編譯,您可以關注微信公衆號tuputech,獲得最新、最好的人工智能資訊。