導(dǎo)讀:機器是怎樣學習的,都學到了什么?人類又是怎樣教會機器學習的?本文通過案例給你講清楚各類算法的原理和應(yīng)用。
機器學習,一言以蔽之就是人類定義一定的計算機算法,讓計算機根據(jù)輸入的樣本和一些人類的干預(yù)來總結(jié)和歸納其特征和特點,并用這些特征和特點和一定的學習目標形成映射關(guān)系,進而自動化地做出相應(yīng)反應(yīng)的過程。這個反應(yīng)可能是做出相應(yīng)的標記或判斷,也可能是輸出一段內(nèi)容——圖片、程序代碼、文本、聲音,而機器自己學到的內(nèi)容我們可以描述為一個函數(shù)、一段程序、一組策略等相對復(fù)雜的關(guān)系描述。
算法這種東西在最初出現(xiàn)的時候是一種確定性的機器指令執(zhí)行序列,也就是說,機器需要怎么做早就在程序一開始就設(shè)定好。雖然說在程序執(zhí)行的過程中可以依靠有限的參數(shù)對程序執(zhí)行過程所涉及的對象,執(zhí)行次數(shù),執(zhí)行分支條件等進行設(shè)定,但是基本行為邏輯已經(jīng)大抵確定。
在這個過程中,機器——計算機是非常被動的,它老老實實地嚴格執(zhí)行程序員賦予它們的指令執(zhí)行序列,沒有任何“學習”的行為。這也沒辦法,因為最開始的圖靈機模型在設(shè)計的時候就是期望計算機以這種方式。
機器學習從學習的種類來說,最常見的我們習慣分作兩種,一種叫“無監(jiān)督學習”(Unsupervised Learning),一種叫“有監(jiān)督學習”(Supervised Learning) 。
所謂“無監(jiān)督學習”,是指人們在獲得訓練的向量數(shù)據(jù)后在沒有標簽的情況下嘗試找出其內(nèi)部蘊含關(guān)系的一種挖掘工作,這個過程中使用者除了可能要設(shè)置一些必要的“超參數(shù)”(Hyper-parameter)以外不用對這些樣本做任何的標記甚至是過程干預(yù);“有監(jiān)督學習”與此不同,每一個樣本都有著明確的標簽,最后我們只是要總結(jié)出這些訓練樣本向量與標簽的映射關(guān)系。
所以這在這兩種方式下,處理的邏輯有很大的區(qū)別,對于初學的朋友需要格外注意。
01 聚類
聚類——英文為Clustering,它就是我們說的典型的“無監(jiān)督學習”的一種,就是把物理對象或抽象對象的集合分組為由彼此類似的對象組成的多個類的分析過程。
聚類這種行為我們不要覺得很神秘,也不要覺得這個東西是機器學習所獨有的,恰恰相反,聚類的行為本源還是人自身。我們學習的所有的數(shù)據(jù)挖掘或者機器學習的算法或者思想的來源都是人類自己的思考方式,只不過我們把它教給機器讓它們代勞,讓他們成為我們肢體和能力的延伸而不是讓他們替我們做創(chuàng)造和思考。
聚類是一種什么現(xiàn)象呢?我們?nèi)祟愒谡J識客觀世界的過程中其實一直遇到容量性的問題,我們遇到的每一棵樹、每一朵花、每一只昆蟲、每一頭動物、每一個人、每一棟建筑……每個個體之間其實都不同,有的差距還相當大。那么我們?nèi)嗽谡J知和記憶這些客觀事物的過程中就會異常痛苦,因為量實在是大到無法承受的地步。
因此人類才會在“自底向上”的認識世界的過程中“偷懶”性地選擇了歸納歸類的方式,注意“偷懶”的這種方式是人類與生俱來的方法。
我們在小時候被父母用看圖說話的方式來教咿呀學語的時候就有過類似的體會了,圖片上畫了一只猴子,于是我們就認識了,這是一只猴子;圖片上畫了一輛汽車,于是我們就了解了,這是一輛汽車……
等我們上街或者去動物園的時候再看,猴子也不是畫上的猴子,而且眾多猴子之間也長得各式各樣,每個都不同,我們會把它們當成一個一個的新事物去認識嗎?我們看汽車也同樣,大小,顏色,樣式,甚至是喇叭的聲音也是形形色色五花八門,它們在我們眼里是一個個新的事物嗎?不,它們都還是汽車。
這些事物之間確實有所不同,但是它們對我們的認知帶來了很大的困擾嗎?并沒有。我們無論如何是不會把猴子和汽車當成一類事物去認知的,猴子彼此之間是不同,但是體格、毛發(fā)、行為舉止,種種形態(tài)讓我們認為這些不同種類的猴子都還是猴子一個大類的動物,別說是和汽車混為一談,就是跟狗、馬匹、熊這些脊椎動物我們也能輕易地分開。
人類天生具備這種歸納和總結(jié)的能力,能夠把認知的事物相似地放到一起來作為一類事物做認識,它們之間可以有彼此的不同,但是有一個我們心里的“限度”,只要在這個限度內(nèi),特征稍有區(qū)別無關(guān)大礙,它們?nèi)匀贿€是這一類事物。
在這一類事物的內(nèi)部,同樣有這種現(xiàn)象,一部分個體之間比較相近,而另一部分個體之間比較相近,這兩部分個體彼此之間我們?nèi)诉€是能夠明顯認知到差別,那么這個部分的事物又會在大類別的內(nèi)部重新劃分成兩個不同的部分進行認知。比如汽車直觀從樣子上可以分成小轎車、卡車、面包車等種類,蟲子們也被人輕易地從外型上區(qū)別為飛蟲、爬蟲、毛毛蟲……
在沒有人特意教給我們不同小種群的稱謂與特性之前,我們自然具備的這種由我們主觀的認知能力,以特征形態(tài)的相同或近似將它們劃在一個概念下,特征形態(tài)的不同劃在不同的概念下,這本身就是聚類的思維方式。
比較常用的聚類算法有K-Means、DBSCAN等幾種,基本思路都是利用每個向量之間的“距離”——這里指的是空間中的歐氏距離或者曼哈頓距離。從遠近來進行彼此是否更適于從屬與同一類別來做的分類判斷。
假如有三個1維樣本,一個180,一個179,一個150,這三個向量如果要分成兩類的話,應(yīng)該是180和179這兩個分在一個類別,150單一個類別。原因就是180和179兩個的距離為1,而180和179距離150分別為30和29個單位——非常遠,就是從肉眼感官上來看也是這樣。用機器來做學習的話,它也能夠通過算法自動去感知到這些向量之間的距離,然后將它們彼此之間那些靠得近的分在一起以區(qū)別于其他類簇。
在用機器做聚類學習的時候,我們每種算法都對應(yīng)有相應(yīng)的計算原則,可以把輸入的各種看上去彼此“相近”的向量分在一個群組中。然后下一步,人們通常更有針對性地去研究每一組聚在一起的對象所擁有的共性以及那些遠離各個群組的孤立點——這種孤立點研究在刑偵、特殊疾病排查等方面都有應(yīng)用。
在這個過程中,從獲得到具體的樣本向量,到得出聚類結(jié)果,人們是不用進行干預(yù)的,這就是“非監(jiān)督”一詞的由來。
02 回歸
回歸是一種解題方法,或者說“學習”方法,也是機器學習中一塊比較重要的概念。
回歸的英文是Regression,單詞原型的regress大概的意思是“回退,退化,倒退?!逼鋵峈egression——回歸分析的意思是借用里面“倒退,倒推”的含義。簡單說就是“由果索因”的過程,是一種歸納的思想——當我看到大量的事實所呈現(xiàn)的樣態(tài),我推斷出原因或客觀蘊含的關(guān)系是如何的;當我看到大量的觀測而來的向量(數(shù)字)是某種樣態(tài),我設(shè)計一種假說來描述出它們之間蘊含的關(guān)系是如何的。
在機器學習領(lǐng)域,最常用的回歸是兩大類——一類是線性回歸,一類是非線性回歸。
所謂線性回歸,就是在觀察和歸納樣本的過程中認為向量和最終的函數(shù)值呈現(xiàn)線性的關(guān)系。而后設(shè)計這種關(guān)系為:
這里的w和x分別是1×n和n×1的矩陣,wb則指的是這兩個矩陣的內(nèi)積。具象一點說,例如,如果你在一個實驗中觀察到一名病患的幾個指標呈現(xiàn)線性關(guān)系(注意這個是大前提,如果你觀察到的不是線性關(guān)系而用線性模型來建模的話,是會得到欠擬合的結(jié)果的)。
拿到的x是一個5維的向量,分別代表一名患者的年齡、身高、體重、血壓、血脂這幾個指標值,y標簽是描述他們血糖程度的指標值,x和y都是觀測到的值。在拿到大量樣本(就是大量的x和y)后,我猜測向量 (年齡,身高,體重,血壓,血脂) 和與其有關(guān)聯(lián)關(guān)系的血糖程度y值有這樣的關(guān)系:
y=w1×年齡+w2×身高+w3×體重+w4×血壓+w5×血脂+b
那么就把每一名患者的 (年齡,身高,體重,血壓,血脂) 具體向量值帶入,并把其血糖程度y值也帶入。這樣一來,在所有的患者數(shù)據(jù)輸入后,會出現(xiàn)一系列的六元一次方程,未知數(shù)是w1~w5和b——也就是w矩陣的內(nèi)容和偏置b的內(nèi)容。而下面要做的事情就是要把w矩陣的內(nèi)容和偏置b的內(nèi)容求出一個最“合適”的解來。這個“合適”的概念就是要得到一個全局范圍內(nèi)由f(x)映射得到的y和我真實觀測到的那個y的差距的加和,寫出來是這種方式:
怎么理解這個Loss的含義呢?右面的
表示加和,相當于做一個一個循環(huán),i是循環(huán)變量,從1做到n,覆蓋訓練集當中的每一個樣本向量。加和的內(nèi)容是wxi+b和yi的差值,每一個訓練向量xi在通過我們剛剛假設(shè)的關(guān)系f(x)=wx+b映射后與實際觀測值yi的差距值。取絕對值的含義就是指這個差距不論是比觀測值大或者觀測值小,都是一樣的差距。將全局范圍內(nèi)這n個差距值都加起來我們管他叫總差距值好了,就是這個 的含義。那么顯而易見,這個映射關(guān)系中如果w和b給的理想的話,應(yīng)該這個差距值是0,因為每個x經(jīng)過映射都“嚴絲合縫”地和觀測值一致了——這種狀況太理想了,在實際應(yīng)用中是見不到的。不過,Loss越小就說明這個映射關(guān)系描述越精確,這個還是很直觀的。那么想辦法把Loss描述成:
Loss=f(w, b)
再使用相應(yīng)的方法找出保證Loss盡可能小的w和b的取值,就算是大功告成了。我們后面會講計算機怎么來求這一類的解——放心,有辦法的,即便不用聯(lián)立解方程。一旦得到一個誤差足夠小的w和b并能夠在驗證用的數(shù)據(jù)集上有滿足當前需求的精度表現(xiàn)后就可以了。例如,預(yù)測病患的血糖誤差為誤差平均小于等于0.3為容忍上線,訓練后在驗證集上的表現(xiàn)為誤差平均為0.2,那就算是合格了。
請注意,在傳統(tǒng)的機器學習中回歸、分類這些算法里都有一個要把獲取到的數(shù)據(jù)集分成訓練集合驗證集的過程。用訓練集數(shù)據(jù)來做訓練,歸納關(guān)系用;用驗證集數(shù)據(jù)來做驗證,避免過擬合現(xiàn)象,如果你不太明白過擬合是什么意思也沒關(guān)系后面我們會講的,不必著急。數(shù)據(jù)集的劃分三七開也可以,二八開也沒什么不行,現(xiàn)在生產(chǎn)環(huán)境中大致用的都是這樣一種比例,反正訓練集一側(cè)用數(shù)據(jù)多的那部分。
由于這種假設(shè)中輸入的x向量與標簽值y是一種線性關(guān)系y=f(x)=wx+b,所以才叫做線性回歸。最常見的形式是y=f(x)=ax+b這種形式,也就是x是一個一維向量,w也是一個一維向量的情況。如果是呈現(xiàn)其他關(guān)系比如指數(shù)關(guān)系,對數(shù)關(guān)系,那么這種時候你用線性回歸去做擬合會發(fā)現(xiàn)它的損失函數(shù)非常大,在驗證集上表現(xiàn)出來的誤差也非常大,這是一種欠擬合現(xiàn)象,我們后面同樣會講,大家先技術(shù)這樣一個名詞。
非線性回歸之中在機器學習領(lǐng)域應(yīng)用最多的當屬邏輯回歸。它和線性回歸都叫回歸,但是邏輯回歸看上去更像分類。我們先在回歸這一節(jié)提一下這種回歸的工作方式。與前面我們說的線性回歸不同,在這種模型中觀察者假設(shè)的前提是y只有兩種值,一種是1,一種是0,或者說“是”或“否”的這種判斷。
這里面的wx+b和前面線性回歸中所說的wx+b是一個概念,都是指一個w矩陣和x做了內(nèi)積再和偏置b做了一個加和。如果設(shè)z=wx+b那么這個回歸的分類模型表達式就可以改寫為:
函數(shù)圖像為:
橫軸是z,縱軸是y,一個多維的x經(jīng)過這樣兩次映射后最后投射在y上是一個取值只有1和0二項分布。也就是我們前面說的產(chǎn)生了一個“是”或“否”的分類。
訓練的過程跟普通線性回歸也是一樣的,只不過損失函數(shù)的形式不同。但是,它的損失函數(shù)的含義仍舊是表示這種擬合殘差與待定系數(shù)的關(guān)系,并通過相應(yīng)的手段進行迭代式的優(yōu)化,最后通過逐步調(diào)整待定系數(shù)減小殘差。邏輯回歸的表達式的定義本源是來自于伯努利分布的,后面我們也會有相對詳細的說明,這里先做一個感性認識。
03 分類
分類是我們在利用機器學習中使用的最多的一大類算法,我們通常也喜歡把分類算法叫“分類器”。
這個說法其實也非常形象,在我們看來,這就是一個黑盒子,有個入口,有個出口。我們在入口丟進去一個“樣本”,在出口期望得到一個分類的“標簽”。
比如,一個分類器可以進行圖片內(nèi)容的分類標簽,我們在“入口”丟進去一張老虎的照片,在“出口”得到“老虎”這樣一個描述標簽;而當我們在“入口”丟進去一張飛機的照片,在“出口”得到“飛機”這樣一個描述標簽,這就是一個分類器最為基本的分類工作過程。
一個分類器模型在它誕生(初始化)的時候其實是不具備這種功能的,而要讓它具備這種功能只有通過給予它大量的圖片以及圖片所對應(yīng)的標簽分類,讓它自己進行充分地總結(jié)和歸納,才能具備這樣一種能力。
在剛剛看到的邏輯回歸這種方式中我們已然看到了一些端倪。邏輯回歸和普通的線性回歸不同,它的擬合是一種非線性的方式。而最終輸出“標簽值”雖然是一種實數(shù)變量,而最終分類的結(jié)果卻期望是一種確定的值“是”(1)或“不是”(0)。其他各種分類器的輸出通常也是離散的變量,體現(xiàn)出來也多是非線性的分類特點。
我們在編寫代碼教會分類器怎么做學習的時候,其實是在教它如何建立一種輸入到輸出的映射邏輯,以及讓它自己調(diào)整這種邏輯關(guān)系,使得邏輯更為合理。
而合理與否的判斷也非常明確,那就是召回率和精確率兩個指標——召回率指的是檢索出的相關(guān)樣本和樣本庫(待測對象庫)中所有的相關(guān)樣本的比率,衡量的是分類器的查全率。精確率是檢索出的相關(guān)樣本數(shù)與檢索出的樣本總數(shù)的比率,衡量的是分類器的查準率。
具體來說,譬如有一個1000個樣本的訓練集,是1000張照片,里面有200張是貓,200張是狗,600張是兔子,一共分成三類。我們將每個照片向量化后,加上它的標簽
“貓”——“0”
“狗”——“1”
“兔子”——“2”
這相當于一個x和y的對應(yīng)關(guān)系,把它們輸入到訓練集去訓練(但是這個地方的標簽0、1、2并不是實數(shù)定義,而是離散化的標簽定義,通常習慣用one-hot獨熱編碼的方式來表示)。經(jīng)過多輪訓練之后,分類器將邏輯關(guān)系調(diào)整到了一個相對穩(wěn)定的程度,然后用這個分類器再對這200張貓,200張狗,600張兔子進行分類的時候。發(fā)現(xiàn):
200張貓的圖片中,有180張可以正確識別為貓,而有20張誤判為狗。
200張狗的圖片可以全部判斷正確為狗。
600張兔子的圖片中,有550張可以正確識別為兔子,還有30張被誤判為貓,20張誤判為狗。
你可不要覺得奇怪,在所有的機器學習或者深度學習訓練的工程中,誤判率幾乎是沒有辦法消滅的,只能用盡可能科學的手段將誤判率降低。不要太難為機器,其實人都沒辦法保證所有的信息100%正確判斷,尤其是在圖片大小、圖片清晰程度、光線明暗懸殊的情況下,不是嗎?那就更別說機器了,它更做不到。
我們還是來解釋召回率和精確率的問題,就剛才這個例子來說,一共1000張圖片中,200張是貓,但是只能正確識別出180張,所以貓的召回率是180÷200=90%,600張兔子中正確識別550張,所以兔子的召回率是550÷600≈91.7%,就這樣計算。
而在1000中圖片中,當我檢索狗的時候會檢索出240張狗的圖片,其中有200張確實是狗,有20張是被誤判的貓,還有20張是被誤判的兔子,所以240張狗的圖片中正確的僅有200張而已,那么狗的精確率為200÷240≈83.3%。怎么樣,這兩個概念不難理解吧。
分類的訓練過程和回歸的訓練過程一樣,都是極為套路化的程序。
第一,輸入樣本和分類標簽。
第二,建立映射假說的某個y=f(x)的模型。
第三,求解出全局的損失函數(shù)Loss和待定系數(shù)w的映射關(guān)系,Loss=g(w)。
第四,通過迭代優(yōu)化逐步降低Loss,最終找到一個w能滿足召回率和精確率滿足當前場景需要。注意這說的尤其指的是在驗證數(shù)據(jù)集上的表現(xiàn)。
大家請注意這4個步驟,我們從前面最簡單的機器學習的例子中已經(jīng)總結(jié)出來一個最為有概括性的科學性流程。這種流程廣泛使用,并且在其它機器學習的場景中也是可以順利落地的。
分類器的訓練和工作過程就是這個樣子了,聽起來分類器的工作過程非常簡單,但是要知道人的智能行為其實就是一種非常精妙或者稱為完美的分類器。他能夠處理極為復(fù)雜,極為抽象的輸入內(nèi)容——不管是文字、聲音、圖像,甚至是冷、熱、刺痛感、瘙癢感這種難以名狀的刺激,并且能夠在相當短的時間內(nèi)進行合理的輸出——例如對答、附和、評論,亦或是尖叫、大笑等各種喜怒哀樂的反應(yīng)與表現(xiàn)。從定義的角度上來說,人其實就是一種極為復(fù)雜的且極為智能的分類器。而我們在工業(yè)上使用的分類器則通常是非常片面的,偏門的,只研究一種或幾個事物的“專業(yè)性”的分類器,這和我們?nèi)祟惖姆诸惸芰^(qū)別就太大了。
04 綜合應(yīng)用
到現(xiàn)在為止,我們看到的絕大多數(shù)的機器學習的應(yīng)用環(huán)境都非常單純——向量清洗到位,邊界劃定清晰。
例如,垃圾郵件的分揀,能夠通過郵件內(nèi)容的輸入來判斷郵件是否為垃圾郵件;新聞的自動分類,能夠通過欣慰內(nèi)容的分類來判斷新聞的類別或描述內(nèi)容的屬性;攝像頭對車牌號的OCR電子識別手寫識別,這些應(yīng)用可以通過輸入一個圖像來得到其中蘊含的文字信息向量,諸如此類等等,這些都是早些年應(yīng)用比較成熟的領(lǐng)域,在這種應(yīng)用場景中機器通過學習能夠取代一些純粹的體力勞動。
在近幾年,隨著計算機能力的提升,尤其是GPU并行計算的普及化,使得很多原來高密度計算的場景變得門檻越來越低,人們在商用領(lǐng)域已經(jīng)開始尋找用深度學習的網(wǎng)絡(luò)來做一些原來不可想象的事情。
例如這種使用卷積神經(jīng)網(wǎng)絡(luò)對照片進行風格處理,拿一張輸入的普通照片,再拿一張有著較強藝術(shù)風格的繪畫作品,然后通過卷積網(wǎng)絡(luò)進行處理,最后由計算機“創(chuàng)作”出一幅內(nèi)容基于照片但是風格基于繪畫作品的新作出來。而這種事情在幾年前是難以想象的,因為這看上去太“智能”了,太有“創(chuàng)造力”了。
還有類似這種,我們輸入一張照片,然后讓計算機根據(jù)這張照片的風格和內(nèi)容,憑空創(chuàng)造一張很像但不一樣的照片出來。注意哦,這個跟Photoshop的功能可是完全不同的,它是全自動。在這些圖中,右側(cè)的圖都是源圖,左側(cè)的圖都是計算機生成的圖,有水波紋、云朵、花叢、還有隨意的藝術(shù)涂鴉。怎么樣,有不少真的是可以以假亂真了吧。這都是使用深度神經(jīng)網(wǎng)絡(luò)處理的結(jié)果。
那么除此之外,像語音識別以及視頻中存在物體的檢出,這些內(nèi)容也是屬于近幾年研究比較熱門并逐漸趨于成熟的應(yīng)用領(lǐng)域。實際上,在實現(xiàn)層面有很多種實現(xiàn)方式可以完成像這樣的應(yīng)用。
而在學術(shù)領(lǐng)域,也有一類新興的基于深度學習神經(jīng)網(wǎng)絡(luò)的研究領(lǐng)域,叫做“對抗學習”可以實現(xiàn)類似的方式。在深度學習領(lǐng)域我們會使用“生成對抗網(wǎng)絡(luò)”(Generative Adversial Network),這種網(wǎng)絡(luò)的特點就是可以進行復(fù)雜內(nèi)容的生成,而非生成一個標簽這么簡單。
關(guān)于作者:高揚,歡聚時代資深大數(shù)據(jù)專家,曾任金山軟件西山居大數(shù)據(jù)架構(gòu)師。有多年服務(wù)器端開發(fā)經(jīng)驗(多年日本和澳洲工作經(jīng)驗),多年大數(shù)據(jù)架構(gòu)設(shè)計與數(shù)據(jù)分析、處理經(jīng)驗,目前負責歡聚時代直播部深度學習落地相關(guān)的研究。擅長傳統(tǒng)機器學習、深度學習、數(shù)據(jù)建模、關(guān)系型數(shù)據(jù)庫應(yīng)用以及大數(shù)據(jù)框架等的應(yīng)用。
聯(lián)系客服