天天看點

機器學習溫和指南

機器學習溫和指南

【編者按】機器學習是如今人工智能領域中進展最大的方面,更多的初學者開始進入了這個領域。在這篇文章中,機器學習與nlp專家、monkeylearn聯合創始人&ceo; raúl garreta面向初學者大體概括使用機器學習過程中的重要概念,應用程式和挑戰,旨在讓讀者能夠繼續探尋機器學習知識。

機器學習是人工智能的一個分支,它通過建構算法讓計算機學習,并且在資料集上使用這些算法來完成任務,而不需要進行明确編碼。

明白了嗎?我們可以讓機器去學習如何做事情!當我第一次聽到它的時候,讓我非常興奮。那意味着我們可以對計算機進行編碼,讓它們自己去學習東西!

學習的能力是智能最重要的一個方面。将這種能力運用到機器上,應該是向讓計算機更智能邁出了一大步。事實上,機器學習是如今人工智能領域中進展最大的方面;現在它是個時髦的話題,并且使用機器學習也非常可能造就出更智能機器。

這篇文章将會向初學者簡要介紹機器學習。我将大體概括使用機器學習過程中的重要概念,應用程式和挑戰。給出機器學習正式的詳盡的說明不是本文的宗旨,而是向讀者介紹一些初步概念,讓讀者能夠繼續探尋機器學習知識。

機器學習真面目

好了,并不是所有事物都和聽說的那樣美好,機器學習也有它的局限之處。我們不能建構類似于《星際迷航》中的data或者《2001太空漫遊》中的hal 9000這樣的智能機器。但是,我們擁有足夠的現實世界的應用程式,機器學習在此神奇般的起着作用。下面是一些實用機器學習應用中最常見的分類:

圖像處理

圖像處理的問題基本上都需要分析圖像擷取資料或是做一些轉換。下面是一些例子:

圖像标記,比如在facebook中,算法可以自動檢測照片中出現的你的或者你朋友的臉。基本上是機器學習算法從你手動标記的照片中學習。

光學字元識别(ocr),算法學會将手稿或者掃描文本轉換成數字化版本。該算法需要學會将手寫字元圖像轉換成相應的數字化字母。

自動駕駛汽車,讓汽車通過圖像處理來自動駕駛的機制之一。機器學習算法通過錄影機拍攝的每一幀圖像來學習哪裡是道路的邊緣,是否有停車标志或者是否有車靠近。

文本分析

文本分析是我們從文本檔案,比如推特,郵件,聊天記錄,文檔等中提取或分類資訊。下面是一些流行的例子:

垃圾郵件過濾,是最為人知也是最常用的文本分類應用(給文本分類)之一。垃圾郵件過濾器學習如何基于内容和主題将郵件歸類為垃圾郵件。

情感分析,文本分類的另一個應用,該算法必須學會基于作者表達的情緒,來将一個觀點分類成積極、中立或者消極。

資訊提取,從文本中,學會提取特定的資訊或資料塊,比如,提取位址,實體,關鍵詞等。

資料挖掘

資料挖掘是用來從資料中發現某些模式或者做出預測。這個定義有點普通,不過你可以了解成從海量資料庫表中挖掘有用的資訊。每一行都可以是我們的訓練執行個體,每一列都可以作為一個特征。我們可能會感興趣用表中剩下的列來預測一條新的列,或者發現某種模式來對行進行分組。比如:

異常檢測:檢測異常值,例如信用卡欺詐檢測,你可以從一個使用者平常的購物模式來檢測哪些購物方式是異常行為。

關聯規則:比如,在超市或者電子商務網站,你可以通過觀察哪些産品會一起被購買來發現客戶的購買習慣。這些資訊可以用于營銷目的。

分組:比如,在saas平台,可以通過使用者行為和資料來對使用者進行分組。

預測:從剩餘變量中預測出另一個變量(資料庫中的一列)。比如,你可以通過對現有客戶資料和信用評分這些資訊來學習并預測新客戶的信用評分。

視訊遊戲與機器人

視訊遊戲和機器人是機器學習得到應用的一個巨大領域。一般來說我們有一個agent(遊戲角色或機器人),它必須根據環境(視訊遊戲中的虛拟環境或者對于機器人來說的真實環境)來行動。機器學習可以使這個agent執行任務,比如移動到某個環境中而同時避開障礙或者敵人。在這些情形下一個最受歡迎的機器學習技術是強化學習,agent通過學習環境的強化系數(如果agent碰到了障礙物強化系數則為負,如果達到目标則為正)來執行任務。

好了,我現在知道什麼是機器學習了,但是它是如何工作的呢?

大約10年前我讀過的第一批關于機器學習書籍中有一本是tom mitchell寫的《機器學習》。這本書是1997年寫的,但是書中的總體概念在今天仍然有用。

在那本書中,我喜歡書中對機器學習的正式定義,如下:

對于某類任務t和性能度量p,如果一個計算機程式在t上以p衡量的性能随着經驗e而自我完善,那麼我們稱這個計算機程式在從經驗e學習。

比如,人工遊戲玩家要學會下國際象棋(任務t),可以通過檢視以前國際象棋比賽或與導師對弈(經驗e)來學習。它的性能p可以用它與人類玩家對弈獲勝的比例來度量。

讓我們用更多例子來闡述:

案例1:向系統中輸入一張圖檔,系統需要判别圖檔中是否有巴拉克·奧巴馬的臉(一般來說是類似于facebook的圖像自動标記)。

案例2:向系統中輸入一條推文,系統判别這條推文是否帶有積極或消極情感。

案例3:向系統中輸入某人的一些資訊,系統計算出此人償還信用卡貸款的機率。

在案例1中,系統任務是檢測巴拉克·奧巴馬的臉何時在圖像中出現。可以将他出現在哪些照片或不出現在哪些照片中的資訊作為經驗。系統的性能可以用系統正确識别出奧巴馬臉的次數比例來度量。

在案例2中,系統任務是對一條推文進行情感分析。系統的經驗可以是一組推文和與它們相對應的情緒。系統的性能可以由系統對新推文情感分析正确的比例來度量。

在案例3中,系統任務是進行信用評分。系統可以将一系列使用者資料和相對應的信用評分作為經驗。可以用平方誤差(預測和預期得分之間的差異)作為性能度量。

為了讓算法學習将輸入轉換成期望的輸出,你必須提供訓練執行個體或者訓練樣例,也就是mitchell所定義的經驗e。一組訓練集是一系列執行個體的集合,它們将作為樣例,機器學習算法從這些樣例中學習并且完成預期任務。很好了解,不是嗎?這就像你給小孩示範如何扔球一樣,你扔幾次球來教他如何做,然後通過觀看那些樣例,他開始學會自己扔球了。

每一個訓練執行個體通常表示為一組固定的屬性或特征。特征是用來表示每一個執行個體的方式。例如,在案例1中,一張圖檔可以由每個像素的灰階級别來表示。在案例2中,推文可以用推文中出現的字詞來表示。在案例3中,信用記錄可以用此人的年齡、薪水、職業等來表示。

計算和選擇合理的特征來表示一個執行個體是使用機器學習的過程中最重要的任務之一,在本文稍後部分我們将讨論這點。

機器學習算法的種類

在本節中我們将讨論兩大類機器學習算法:監督式學習和非監督式學習算法。這兩類算法的主要差別在于我們提供給算法的訓練樣例,算法使用樣例的方式以及它們解決問題的類别。

監督式學習

在監督式學習中,機器學習算法可以看作是将特定輸入轉換成期望輸出的過程。

機器學習需要學會如何将所有可能輸入轉換成正确/期望輸出,是以每個訓練樣例都有特定的輸入和期望輸出。

在人工國際象棋手的案例中,輸入可以是特定的棋盤狀态,輸出則可能是在這一狀态下最好的下棋方式。

根據輸出的不同,我們又可以把監督式學習分為兩小類:

分類

當輸出值屬于離散和有限集合,那麼這就是一個分類問題。案例2可以看作是一個分類問題,輸出是一個有限集合:積極,消極或者中立,我們的訓練樣例是這樣的:

回歸

當輸出是連續的數值,比如,機率,那麼這就是一個回歸問題。案例3就是一個回歸問題,因為結果是介于0到1的數字,它代表一個人償還債務的機率。在這個案例下,我們的訓練樣例是這樣的:

監督式學習是機器學習算法中最受歡迎的一類。使用這種方法的缺陷是,對于每一個訓練樣例,我們都需要提供與之對應的正确輸出,在大多情況下,這會耗費大量人力物力财力。比如,在情感分析案例中,如果我們需要10000條訓練案例(推文),我們需要對每一條推文都标記上正确的情感(積極,消極或者中立)。這将需要一組人來閱讀并标記每一條推文(非常耗時又無聊的工作)。這通常是機器學習算法最常見的瓶頸:收集正确标記的訓練資料。

非監督式學習

第二類機器學習算法叫做非監督式學習。在這種情況下,訓練資料隻需要輸入到算法中即可,不需要有與之對應的期望輸出。典型的用例就是發現訓練樣例之間隐藏的結構或者關系。典型的案例就是聚類算法,我們學習找到相似執行個體或者一組執行個體(叢集)。比如我們有一條新聞,我們希望推薦一條相似的新聞。一些聚類算法比如k-means從輸入資料中來學習。

機器學習算法

好了,現在來講講數學和邏輯知識了。為了将輸入轉換成期望輸出,我們可以使用不同的模型。機器學習并不是唯一的算法,你可能聽說過支援向量機,樸素貝葉斯,決策樹或者深度學習。那些是不同的機器學習算法,它們都可以解決同樣的問題:學習将輸入轉換成正确的輸出。

那些不同的機器學習算法使用不同的範式或技術來執行學習過程,并将它們所學知識表示出來。

在我們講解每一個算法之前,我們要了解,最常見的原則是,機器學習算法試圖達到一般化。也就是說,它們試圖用最簡單的理論來解釋事物,這被稱為奧卡姆剃刀原則。所有機器學習算法,不管它所使用的範式如何,都将嘗試建立最簡單的假設(做出最少假設的那個)來說明大部分的訓練執行個體。

有很多機器學習算法,不過我們來簡要介紹下三種流行的算法:

支援向量機:該模型試圖建構一個超平面高維空間集,它試圖通過計算與最近執行個體最大距離來區分不同類的執行個體。這個概念直覺簡單,但是該模型有時候也會非常複雜和強大。事實上,對于某些領域支援向量機是你目前可以使用的最好的機器算法之一。

機率模型:這類模型通常通過對問題進行機率分布模組化來預測正确的響應。這類算法中最流行的可能要屬樸素貝葉斯分類器了,它使用貝葉斯定理和特征之間獨立性假設來建構分類器。這個模型的優勢之一是即簡單又強大,而且不僅會傳回預測值還會傳回預測值的确定度,這是非常有用的。

深度學習:是基于大名鼎鼎的人工神經網絡模型的機器學習的新領域。神經網絡有着聯結的操作方式,它們試圖模仿(以非常簡單的方式)大腦的工作方式。基本上,它們由一組互相關聯的神經元(處理的基本機關)組成,這些神經元被組織成許多層。簡單來說,深度學習使用更深的層建構了新的結構,通過高層次抽象改進了算法,不僅改進了學習方式,而且建構了自動表示最重要特征的結構。

機器學習中的重要方面

機器學習聽起來是個美妙的概念,它确實如此,但是機器學習中有一些過程并不是那麼自動完成的。事實上,在設計解決方案時,很多時候需要人工操作。然而,這是得到優良結果至關重要的一環。其中一些方面有:

我該使用哪類機器學習算法?

監督式還是非監督式?

你有标記的資料嗎?也就是輸入和對應的輸出。如果有,那麼你可以使用監督式學習算法。如果沒有,那麼使用非監督式算法可以解決問題。

分類,回歸還是聚類?

這主要取決于你想要解決什麼樣的問題。如果你想标記資料(用離散的選項來标記),分類可能是正确的選擇。相反,如果你想選擇一個數字,比如說分數,回歸則是你最佳的選擇。或者你想在電子商務網站上針對使用者目前浏覽資訊來推薦相似産品,那麼聚類則是你最好的選擇。

深度學習,svm,樸素貝葉斯,決策樹···哪個最好?

我的答案是:沒有最好的。顯然,深度學習和支援向量機已經證明,在不同應用中它們是最強大和最靈活的算法。但考慮到根據不同特定應用,一些機器學習算法可能比其他算法更好。分析它們各自的優勢并且使用它們!

特征工程

特征工程是我們提取、選擇用來表示訓練樣例和執行個體的最重要的特征供機器學習算法處理的過程。這個過程是機器學習(有時沒有給予足夠的贊譽和重視)中最重要的方面。

請注意:如果你不向算法提供有品質保證的特征,結果會是糟糕的,即使你使用了此情形下最好的機器學習算法。這就像是你在黑暗中努力學習如何用肉眼閱讀,不管你有多聰明你都不能做到。

特征提取

為了向機器學習算法輸入資料,你通常需要将原始資料轉換成算法能夠“了解”的東西。這個過程被稱作特征提取。通常我們将原始資料轉換成特征向量。

在案例1中,我們如何向機器學習算法輸入一張圖像呢?

一個直接的方式就是将圖像轉換成向量,每一個成分是圖像中每一個像素的灰階值。是以每一個成分或者特征,都可以用0到255的值表示,0表示黑色,255表示白色,1到254是不同程度的灰色。

這種方式可能可行,但是如果我們提供更高層次的特征可能會工作得更好:

圖像包含人臉嗎?

膚色是什麼?

眼睛是什麼顔色的?

臉上有毛發嗎?

這些是更高層次特征,它們向算法提供了更多的知識而不隻是每個像素的灰階值(它們的計算可以用其他機器學習算法來完成)。通過提供更高層次特征我們就在“幫”機器學習算法得到更好的學習資訊來判斷我的或者其他某個人的臉是否出現在一張圖像中。

如果我們實施更好的特征提取:

我們算法能夠學習并得到預期結果的可能性會更高。

我們可能不需要那麼多訓練樣例。

這樣一來,我們可以顯著減少訓練模型所需的時間。

特征選擇

有些時候(并不是大多情況下),我們選擇向算法輸入的特征可能并沒多大用處。比如,當對一條推文進行情感标記的時候,我們可能将推文的長度,推文發表的時間等作為特征,這些特征可能有用也可能沒有用,而且有自動的方法來識别它們是否有用。直覺地,特征選擇算法通過技術手段對每條特征打分,然後根據它們的分值傳回最重要的那些特征。

另一個需要記住的要點是:避免使用海量特征集。有些人可能嘗試添加所有可能的特征到模型中讓算法來學習。但這不是個好主意,當我們添加更多的特征來代表執行個體時,空間的次元就增加了,使得矩陣更加稀疏。直覺地,因為我們得到更多的特征,我們必須有非常多的執行個體在表示每個特征的組合。這就是所謂的次元災難,随着模型複雜度的增長,訓練樣例的數目需要以指數形式随着增長,相信我,這将是棘手的問題。

訓練樣例

你必須向機器學習算法輸入訓練樣例。取決于你想要解決的問題,我們将會使用到幾百,幾千,幾百萬甚至上億的訓練樣例。而且,保持樣例的品質也至關重要,如果你向算法中輸入了錯誤的樣例,得到良好結果的可能性會降低。

收集大量的優質資料來訓練機器學習算法通常是一項耗費人力物力的工作。除非你已經有标記好的資料,否則你需要自己手動或者雇傭他人來标記資料。一些衆包平台的工具嘗試解決這樣的問題,你可以在這裡找到一些工具來完成任務。或者通過使用自己的機器學習模型生成的輔助程式也可以将标記操作變得更高效。

訓練樣本的一般規則是:你收集了越是優質的訓練資料,你可能就可能得到更好的訓練結果。

測試樣本和性能名額

在我們訓練完一個機器學習模型之後,我們需要測試它的性能。這是非常重要的,否則你不知道你的模型是否學會了東西!

這個概念非常簡單,我們使用一個測試集,一個不包含在訓練集中的執行個體集合。基本上,我們将輸入每個測試樣本到模型中,然後觀察它是否會得出預期結果。在監督式學習分類的情形中,我們隻需要輸入每條測試資料,然後檢查模型輸出是否與預期一樣。如果我們的模型正确得出了95%的測試樣本的結果,我們說這個模型的準确率是95%。

需要牢記的是,訓練和測試資料集不能重合,這是測試模型泛化能力和預測能力的唯一途徑。你可能在你的訓練資料上能夠得到較高的準确率,但如果在單獨的測試集上則得到較差的準确率。這就是過拟合,也就是算法對訓練樣本過度拟合導緻糟糕的預測能力。通常避免過拟合的方法是使用較少特征的,更簡單的模型,簡化模型,并使用更大更具代表性的訓練集。

準确率是最基本的名額,同時你也應該關注其他的名額,比如精準度和召回率,這将會告訴你算法的在每一個分類上(當使用監督式學習分類時)的性能如何。混淆矩陣是觀察分類算法在哪裡出現混淆預測的好工具。

對于回歸和聚類問題,有其他的名額來度量算法的性能。

性能

在實際應用中,如果你要實施解決方案,你必須建立一個強大和高性能的解決方案。在機器學習應用中,這會是一個複雜的任務。

首先,你需要選擇機器學習架構,這不是項容易的工作,因為并不是所有的程式設計語言都有相關的強大工具。python和scikit-learn是建構強大機器學習架構可以使用的程式設計語言的良好例子。

選擇好架構之後,就要考慮性能問題了。取決于資料量,複雜度和設計的算法,運作訓練算法可能會耗費大量的計算時間和記憶體。你可能需要運作多個訓練算法直到得到優良的結果。而且,通常你可能會用新執行個體來重新訓練模型來提高準确率。

為了在使用時訓練大量模型并快速的到結果,我們通常使用較大記憶體和多核處理器的機器來并行訓練模型。這些大多是實際問題,如果你想部署機器學習解決方案到實際應用中,考慮這些問題是非常重要的。

結束語

就是這樣,我簡要概述了什麼是機器學習。還有許多實際應用以及機器學習算法和概念本文沒有涉及,我們将這留給讀者自行研究。機器學習是很強大的,但訓練它也是艱難的,這篇文章中所說的訓練模型時可能出現的困難隻是冰山一角。通常具有計算機科學特别是機器學習的背景是取得優良結果所必須的。一個人可能會在步入正軌前因為諸多困難而失望。

這就是我們建立monkeylearn的原因,使用于文本分析的機器學習技術大衆化。避免重新發明輪子,讓每一個軟體開發人員或企業家迅速獲得實用的結果。以下是我們主要的工作方面,抽象所有這些問題的最終使用者,從機器學習複雜度到實際擴充性來排序,得到即插即用的機器學習。

原文釋出時間為:2015-09-14

本文來自雲栖社群合作夥伴“大資料文摘”,了解相關資訊可以關注“bigdatadigest”微信公衆号

繼續閱讀