淺談機(jī)器學(xué)習(xí)基礎(chǔ)(上)

注:題中所指的『機(jī)器學(xué)習(xí)』不包括『深度學(xué)習(xí)』。本篇文章以理論推導(dǎo)為主,不涉及代碼實(shí)現(xiàn)。

前些日子定下了未來三年左右的計(jì)劃,其中很重要的一點(diǎn)是成為一名出色的人工智能產(chǎn)品經(jīng)理,說是要每月至少讀一本人工智能相關(guān)書籍,現(xiàn)在一個(gè)半月過去了,書讀了一些,資料也看了不少,算是小有所成,所以希望分享一些內(nèi)容出來,既是對(duì)自己的督促總結(jié),將自己學(xué)到的東西整理妥當(dāng),也是希望把我在做的事情說出來,以期結(jié)識(shí)同好。

本篇文章在整理時(shí)主要參考了 Peter Harrington 的《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》。

機(jī)器學(xué)習(xí)簡(jiǎn)介

Arthur Samuel非正式的定義過,機(jī)器學(xué)習(xí)是在不直接針對(duì)問題進(jìn)行編程的情況下,賦予計(jì)算機(jī)學(xué)習(xí)能力的一個(gè)研究領(lǐng)域。

簡(jiǎn)單的來講,我們給計(jì)算機(jī)足量的數(shù)據(jù),這些數(shù)據(jù)可以是已標(biāo)注過判定結(jié)果的(監(jiān)督學(xué)習(xí)),也可以是沒有經(jīng)過標(biāo)注的(無監(jiān)督學(xué)習(xí)),計(jì)算機(jī)從這些數(shù)據(jù)中抽象出模型,也即可以看做發(fā)現(xiàn)這些數(shù)據(jù)的之間的規(guī)律與聯(lián)系,然后當(dāng)訓(xùn)練完成后,給予其訓(xùn)練集之外的數(shù)據(jù)(測(cè)試集),計(jì)算機(jī)就能『舉一反三』,根據(jù)學(xué)習(xí)訓(xùn)練樣本所得到的模型,去預(yù)測(cè)測(cè)試樣本的相關(guān)屬性。

我們根據(jù)訓(xùn)練樣本以及所需解決問題的不同選擇恰當(dāng)?shù)臋C(jī)器學(xué)習(xí)算法,建立恰當(dāng)?shù)哪P?,以求得到最好的預(yù)測(cè)效果。

這里我采用吳恩達(dá)博士的分法,將機(jī)器學(xué)習(xí)分為四類:監(jiān)督學(xué)習(xí)、無監(jiān)督學(xué)習(xí)、強(qiáng)化學(xué)習(xí)、遷移學(xué)習(xí)。

監(jiān)督學(xué)習(xí):是利用已知類別的樣本(即有標(biāo)記的樣本 labeled sample,已知其相應(yīng)的類別),調(diào)整分類器的參數(shù),訓(xùn)練得到一個(gè)最優(yōu)模型,使其達(dá)到所要求性能,再利用這個(gè)訓(xùn)練后的模型,將所有的輸入映射為相應(yīng)的輸出,對(duì)輸出進(jìn)行簡(jiǎn)單的判斷,從而實(shí)現(xiàn)分類的目的,這樣,即可以對(duì)未知數(shù)據(jù)進(jìn)行分類。
通俗的來講,我們給計(jì)算機(jī)一堆選擇題(訓(xùn)練樣本),并同時(shí)提供了它們的標(biāo)準(zhǔn)答案,計(jì)算機(jī)努力調(diào)整自己的模型參數(shù),希望自己推測(cè)的答案與標(biāo)準(zhǔn)答案越一致越好,使計(jì)算機(jī)學(xué)會(huì)怎么做這類題。然后再讓計(jì)算機(jī)去幫我們做沒有提供答案的選擇題(測(cè)試樣本)。

無監(jiān)督學(xué)習(xí):實(shí)現(xiàn)沒有有標(biāo)記的、已經(jīng)分類好的樣本,需要我們直接對(duì)輸入數(shù)據(jù)集進(jìn)行建模,例如聚類,最直接的例子就是我們常說的『人以群分,物以類聚』。我們只需要把相似度高的東西放在一起,對(duì)于新來的樣本,計(jì)算相似度后,按照相似程度進(jìn)行歸類就好。
通俗的來講,我們給計(jì)算機(jī)一堆選擇題(訓(xùn)練樣本),但是不提供標(biāo)準(zhǔn)答案,計(jì)算機(jī)嘗試分析這些題目之間的關(guān)系,對(duì)題目進(jìn)行分類,計(jì)算機(jī)也不知道這幾堆題的答案分別是什么,但計(jì)算機(jī)認(rèn)為每一個(gè)類別內(nèi)的題的答案應(yīng)該是相同的。

強(qiáng)化學(xué)習(xí):所謂強(qiáng)化學(xué)習(xí)就是智能系統(tǒng)從環(huán)境到行為映射的學(xué)習(xí),以使獎(jiǎng)勵(lì)信號(hào)(強(qiáng)化信號(hào))函數(shù)值最大,強(qiáng)化學(xué)習(xí)不同于連接主義學(xué)習(xí)中的監(jiān)督學(xué)習(xí),主要表現(xiàn)在教師信號(hào)上,強(qiáng)化學(xué)習(xí)中由環(huán)境提供的強(qiáng)化信號(hào)是對(duì)產(chǎn)生動(dòng)作的好壞作一種評(píng)價(jià)(通常為標(biāo)量信號(hào)),而不是告訴強(qiáng)化學(xué)習(xí)系統(tǒng)RLS(reinforcement learning system)如何去產(chǎn)生正確的動(dòng)作。
通俗的來講,我們給計(jì)算機(jī)一堆選擇題(訓(xùn)練樣本),但是不提供標(biāo)準(zhǔn)答案,計(jì)算機(jī)嘗試去做這些題,我們作為老師批改計(jì)算機(jī)做的對(duì)不對(duì),對(duì)的越多,獎(jiǎng)勵(lì)越多,則計(jì)算機(jī)努力調(diào)整自己的模型參數(shù),希望自己推測(cè)的答案能夠得到更多的獎(jiǎng)勵(lì)。不嚴(yán)謹(jǐn)?shù)闹v,可以理解為先無監(jiān)督后有監(jiān)督學(xué)習(xí)。

遷移學(xué)習(xí):考慮到大部分?jǐn)?shù)據(jù)或任務(wù)是存在相關(guān)性的,所以通過transfer learning我們可以將已經(jīng)學(xué)到的parameter 分享給新模型從而加快并優(yōu)化模型的學(xué)習(xí)不用像之前那樣learn from zero。把已學(xué)訓(xùn)練好的模型參數(shù)遷移到新的模型來幫助新模型訓(xùn)練數(shù)據(jù)集。

深度學(xué)習(xí)是機(jī)器學(xué)習(xí)的一種,是一種『抽象出的模型』在結(jié)構(gòu)上比較特殊(有深度且可以堆疊,比如各類神經(jīng)網(wǎng)絡(luò))的機(jī)器學(xué)習(xí)方法。深度學(xué)習(xí)將在下一篇文章中詳談,本文將不會(huì)主要涉及。

監(jiān)督學(xué)習(xí)

k-近鄰(kNN)算法

一句話概要,將標(biāo)注好類別的訓(xùn)練樣本映射到X(選取的特征數(shù))維的坐標(biāo)系之中,同樣將測(cè)試樣本映射到X維的坐標(biāo)系之中,選取距離該測(cè)試樣本歐氏距離(兩點(diǎn)間距離公式)最近的k個(gè)訓(xùn)練樣本,其中哪個(gè)訓(xùn)練樣本類別占比最大,我們就認(rèn)為它是該測(cè)試樣本所屬的類別。kNN是監(jiān)督學(xué)習(xí)算法。

kNN的缺點(diǎn)在于計(jì)算的時(shí)間空間復(fù)雜度都太高,首先內(nèi)存中需要存儲(chǔ)所有的訓(xùn)練樣本點(diǎn),而且每個(gè)新測(cè)試樣本需要通過kNN算法分類,都要計(jì)算這個(gè)測(cè)試樣本與所有訓(xùn)練樣本點(diǎn)的歐式距離。

kNN可以處理數(shù)值型(從無限的數(shù)值集合中取值,如0.100,42.001等)和標(biāo)稱型(只在有限目標(biāo)集中取值,如真與假)數(shù)據(jù)。一種特征對(duì)應(yīng)一個(gè)維度,一種特征下的數(shù)據(jù)可以數(shù)值型的也可以是標(biāo)稱型的。

第一個(gè)例子,利用kNN來優(yōu)化婚戀網(wǎng)站配對(duì)效果。

A是某婚戀網(wǎng)站的忠實(shí)會(huì)員,她在這個(gè)網(wǎng)站上約過很多很多人,她把這些人分為3類:不喜歡、感覺一般、很有好感。她希望在下次約會(huì)之前能夠根據(jù)網(wǎng)站上已有的信息預(yù)測(cè)一下對(duì)方會(huì)不會(huì)是自己很有好感的類型。

她選出了3種特征(三個(gè)維度):每年的飛行里程公里數(shù)、每周玩游戲所花費(fèi)的小時(shí)數(shù)、每周吃掉的零食的斤數(shù)。

她過去約過1000個(gè)人,每個(gè)人相當(dāng)于1個(gè)訓(xùn)練樣本,這個(gè)訓(xùn)練樣本有4個(gè)屬性(3個(gè)特征值、1個(gè)類別),比如:
B: 4000公里、2小時(shí)、1.5斤、很有好感
C: 200公里、22小時(shí)、5斤、感覺一般

我們拿3種特征做成一個(gè)三維的坐標(biāo)系,依照每個(gè)訓(xùn)練樣本的各個(gè)特征值,把這1000個(gè)訓(xùn)練樣本標(biāo)到這個(gè)三維坐標(biāo)系的對(duì)應(yīng)位置(更高維度也同理)。也即完成了訓(xùn)練過程。

接著,A又認(rèn)識(shí)了一個(gè)新人D:4800公里、1小時(shí)、0.5斤,A把D作為一個(gè)點(diǎn)標(biāo)到了之前訓(xùn)練好的那個(gè)三維坐標(biāo)系上,發(fā)現(xiàn)距離D最近(利用歐氏距離公式計(jì)算)的10個(gè)人(這里取k=10)當(dāng)中,有8個(gè)人都是『很有好感』一類的,所以A覺得,D有很大可能性也會(huì)是『很有好感』一類。

上面的理論很簡(jiǎn)單,但是存在一個(gè)小問題,我們知道歐氏距離公式會(huì)極大地受到數(shù)值本身大小的影響,比如兩個(gè)人的飛行里程可能很容易就相差2000,但吃掉的零食斤數(shù)最多可能也就差10,這樣算出來的距離就幾乎只受飛行里程影響,而對(duì)于A來說,3個(gè)特征是同等重要的。為了解決這個(gè)問題,我們需要對(duì)這三個(gè)特征的特征值進(jìn)行歸一化處理,使得它們的取值范圍都落在0到1之間。比如用(當(dāng)前值-最小值)/取值范圍。

第二個(gè)例子,我們嘗試用戶kNN做手寫數(shù)字(0到9)的圖像識(shí)別。這看起來似乎比較難,但是所用的原理與上例相同。

手寫數(shù)字的圖片是32x32的,我們將它轉(zhuǎn)成一個(gè)32x32的數(shù)字矩陣,留下筆跡的地方是1,空白的地方是0。

我們有2000張這樣32x32的手寫數(shù)字的數(shù)字矩陣,還有每張手寫數(shù)字?jǐn)?shù)字矩陣的類別,也即寫的到底是幾。

我們?nèi)?2x32=1024個(gè)特征,每個(gè)特征只有兩個(gè)值,0或1。我們把這2000張手寫數(shù)字?jǐn)?shù)字矩陣標(biāo)進(jìn)這個(gè)1024維的坐標(biāo)系中(過高維度沒辦法實(shí)際去畫圖,只為了理解)。也即完成了訓(xùn)練過程。

接下來我們拿到了一張新的手寫數(shù)字圖片(32x32),把它轉(zhuǎn)成一個(gè)32x32的數(shù)字矩陣,進(jìn)而我們知道了它在這1024維度中,每個(gè)維度上的值。然后我們利用歐氏距離公式計(jì)算,離它最近的k個(gè)點(diǎn)中,出現(xiàn)次數(shù)最多的類別是什么,也即推測(cè)出了這張手寫數(shù)字寫的究竟是幾。

決策樹ID3算法

一句話概要,決策樹算法的核心在于決策樹的構(gòu)建,每次選擇讓整體數(shù)據(jù)香農(nóng)熵(描述數(shù)據(jù)的混亂程度)減小最多的特征,使用其特征值對(duì)數(shù)據(jù)進(jìn)行劃分,每次消耗一個(gè)特征,不斷迭代分類,直到所有特征消耗完(選擇剩下數(shù)據(jù)中出現(xiàn)次數(shù)最多的類別作為這堆數(shù)據(jù)的類別),或剩下的數(shù)據(jù)全為同一類別,不必繼續(xù)劃分,至此決策樹構(gòu)建完成,之后我們依照這顆決策樹對(duì)新進(jìn)數(shù)據(jù)進(jìn)行分類。

決策樹長(zhǎng)什么樣?


決策樹示例

決策樹算法較之于kNN算法一個(gè)很顯著的不同在于,kNN算法需要持續(xù)使用全部的訓(xùn)練數(shù)據(jù),而決策樹算法經(jīng)過訓(xùn)練構(gòu)建出決策樹之后,就不再需要將所有的訓(xùn)練樣本保持在內(nèi)存中了,這顆決策樹就是在訓(xùn)練樣本中抽象出來的模型。

香農(nóng)(信息)熵用來描述數(shù)據(jù)的混亂度,混亂度越大熵越大,計(jì)算公式如下:


分類前整個(gè)數(shù)據(jù)集的熵

Pi指第i種數(shù)據(jù)在這個(gè)數(shù)據(jù)集中所占的比例。
定性理解,如果這個(gè)數(shù)據(jù)集中所包含的數(shù)據(jù)類別越少,它的熵也就越?。厥钦龜?shù),因?yàn)閷?duì)數(shù)算出來的結(jié)果是負(fù)數(shù))。
如果我們將這個(gè)數(shù)據(jù)集按照數(shù)據(jù)的某個(gè)特征(不是按數(shù)據(jù)類別分,因?yàn)槲覀冏龅氖菍W(xué)習(xí)+預(yù)測(cè),不是對(duì)訓(xùn)練樣本分類)進(jìn)行了分類,分成了多個(gè)小數(shù)據(jù)集,那整個(gè)數(shù)據(jù)集熵的計(jì)算公式如下:

按某種特征分類后整個(gè)數(shù)據(jù)集的熵

我們需要知道按照這個(gè)特征分類過后,整個(gè)數(shù)據(jù)集的熵減少了多少,也就是信息增益是多少,計(jì)算公式如下:


信息增益

信息增益越大,也就是我們對(duì)數(shù)據(jù)的分類越有效,整個(gè)數(shù)據(jù)集的熵減小的越多。

在整個(gè)數(shù)據(jù)集的基礎(chǔ)上,挑選使熵減小最多的特征對(duì)數(shù)據(jù)集進(jìn)行分類,將整個(gè)數(shù)據(jù)集按照上一步所選定的特征的特征值分成多個(gè)(可以超過2個(gè))小數(shù)據(jù)集,然后對(duì)每個(gè)小數(shù)據(jù)集重復(fù)進(jìn)行以上的操作,直到某個(gè)小數(shù)據(jù)集內(nèi)部數(shù)據(jù)的數(shù)據(jù)類別全部相同,或者沒有可以繼續(xù)分類的特征了,這個(gè)時(shí)候我們把剩下的數(shù)據(jù)集里面出現(xiàn)最多的數(shù)據(jù)類別作為這個(gè)小數(shù)據(jù)集的類別。

然后我們就得到了一顆決策樹,當(dāng)需要處理新樣本的時(shí)候,我們按照決策樹對(duì)特征的使用順序和新樣本的各個(gè)特征值,逐步對(duì)這個(gè)樣本進(jìn)行分類,直到?jīng)Q策樹的葉子節(jié)點(diǎn)處,最后這個(gè)葉子節(jié)點(diǎn)數(shù)據(jù)集的數(shù)據(jù)類別就是我們根據(jù)決策樹算法所推斷出來的新樣本的數(shù)據(jù)類別。

樸素貝葉斯分類算法

一句話概要,樸素貝葉斯算法普遍用在文本處理中的垃圾郵件過濾,先計(jì)算聯(lián)合概率分布,然后再利用貝葉斯公式計(jì)算給定某個(gè)樣本數(shù)據(jù)后,被分到每個(gè)類別的概率分別是多少,然后取被分到概率最大的類別作為該樣本數(shù)據(jù)的類別。樸素貝葉斯算法是生成方法,而前面講過的兩種算法是判別方法(后面會(huì)詳細(xì)講)。

樸素貝葉斯算法的『樸素』在于這樣一個(gè)假設(shè),每個(gè)單詞(特征)出現(xiàn)的可能性是完全獨(dú)立的,和其他單詞是否出現(xiàn)、出現(xiàn)在哪無關(guān)。樸素貝葉斯算法的另一個(gè)假設(shè)在于,每個(gè)單詞(特征)對(duì)于判定整條文檔的類型同等重要。這兩個(gè)假設(shè)都是有瑕疵的,某些單詞就是大多同時(shí)出現(xiàn),判斷一條文檔的基本類別也不需要閱讀整條文檔的每一個(gè)單詞,但是即使這樣,樸素貝葉斯算法在實(shí)際應(yīng)用中的表現(xiàn)也是很好的。

什么是貝葉斯公式?


貝葉斯公式

貝葉斯公式是概率論中一定會(huì)講到的內(nèi)容,這里cx均指『某種情況』,而p(c)、p(x)指發(fā)生這兩種情況的概率,p(x|c)指在已知c情況發(fā)生的條件下x情況發(fā)生的概率,p(c|x)同理。

舉個(gè)例子,我們有三個(gè)棋子、兩個(gè)碗,第一個(gè)碗里一個(gè)黑子一個(gè)白子,第二個(gè)碗里只有一個(gè)白子,我們要計(jì)算已知取到白子的情況下,這個(gè)白子是在第一個(gè)碗里取出的概率,如果用貝葉斯公式計(jì)算,我們先算分母,取到白子的概率是3/4,再算分子,取到第一個(gè)碗的概率是1/2,在取到第一個(gè)碗的前提情況下,取到白子的概率是1/2,最后算出已知取到白子的情況下,這個(gè)白子是在第一個(gè)碗里取出的概率是1/3。想一想,是不是如果不斷的抽棋,抽到的白子更多的來源于第二個(gè)碗,抽到第二個(gè)碗里的白子的情況已經(jīng)占到所有情況的1/2了,剩下的1/2還要分一半給第一個(gè)碗里的黑子。

在樸素貝葉斯算法中,我們用到的貝葉斯公式是經(jīng)過拓展的:


拓展后的貝葉斯公式

這里的w替代了x,wx的區(qū)別在于w是一個(gè)向量,而x是一個(gè)值,w是一系列情況,x是一個(gè)情況。如果將w展開,p(w|c)=p(w0,w1,w2,w3···|c),又因?yàn)槲覀冎暗摹簶闼亍患僭O(shè),每個(gè)特征(單詞)的出現(xiàn)概率都是獨(dú)立的,和其他特征(單詞)的出現(xiàn)沒有關(guān)系,所以我們的p(w0,w1,w2,w3···|c)=p(w0|c) x p(w1|c) x p(w2|c) x p(w3|c)···,p(w)、p(c|w)同理。

在樸素貝葉斯分類算法中,我們通常用c代指『文檔屬于某種類別』這種情況,用w向量代指這個(gè)文檔本身,w0、w1···這些用來表示文檔中是否含有(或含有幾個(gè),是否含叫做詞集模型,含有幾個(gè)叫做詞袋模型)某特定單詞(在樸素貝葉斯算法中,所有的訓(xùn)練文檔中出現(xiàn)過的所有單詞去重的數(shù)量,就是w所包含的維度個(gè)數(shù),w相當(dāng)于一個(gè)單詞表)。

以垃圾郵件過濾舉例講整個(gè)樸素貝葉斯算法的流程。

首先是建立單詞表(也就是建立w)和用單詞表表示所有的訓(xùn)練文檔。我們遍歷所有的訓(xùn)練文檔,把所有出現(xiàn)過的單詞去重放進(jìn)一個(gè)數(shù)組里面。然后用這個(gè)單詞表w表示我們所有的訓(xùn)練文檔,每條訓(xùn)練文檔被表示成和單詞表數(shù)組等長(zhǎng)的一個(gè)數(shù)組,如果是詞集模型,就用0、1分別表示對(duì)應(yīng)位置的單詞在這條文檔里是否出現(xiàn),如果是詞袋模型,就用對(duì)應(yīng)位置的數(shù)字表示對(duì)應(yīng)位置單詞的出現(xiàn)次數(shù),這個(gè)數(shù)組叫做這條文檔的詞向量。同時(shí)我們的樸素貝葉斯算法是監(jiān)督學(xué)習(xí)算法,我們還需要有一個(gè)標(biāo)注數(shù)組,這個(gè)數(shù)組的大小和訓(xùn)練文檔的條數(shù)相同,用于記錄這些訓(xùn)練文檔哪幾條是垃圾郵件,是的標(biāo)0,不是的標(biāo)1。

我們用p(c0|w)p(c1|w)分別代表這個(gè)詞向量所對(duì)應(yīng)的文檔屬于垃圾郵件或正常郵件的概率,如果p(c0|w) > p(c1|w)那我們就認(rèn)定其為垃圾郵件。

當(dāng)接到新文檔后,先將其轉(zhuǎn)化為詞向量,然后代入貝葉斯公式計(jì)算,根據(jù)貝葉斯公式,需要求出p(c0|w)p(c1|w),因?yàn)榉帜?code>p(w)對(duì)于該條文檔來講是個(gè)常數(shù),與cc0還是c1無關(guān),所以可以不計(jì)算,只需要計(jì)算分子p(c)p(w|c)p(c0)、p(c1)分別代表文檔是垃圾郵件和正常郵件的概率,這個(gè)很好算,用前面的標(biāo)注數(shù)組就能算出,也就是用訓(xùn)練文檔是垃圾郵件和正常郵件的概率來代替。

然后我們只需要計(jì)算這個(gè)新文檔的p(w|c0)p(w|c1),也就是c0(垃圾郵件)和c1(正常郵件)中出現(xiàn)該文檔的概率(即該文檔所包含的每個(gè)單詞出現(xiàn)概率的乘積,文檔中幾次出現(xiàn)該單詞,就乘以幾次這個(gè)單詞的出現(xiàn)概率),即可根據(jù)p(w|c)p(c)的大小判定該樣本的類別。

新樣本的p(w|c0)p(w|c1)如何計(jì)算?上面說了,是用兩種郵件的訓(xùn)練樣本中每個(gè)詞(包含在新樣本中的每個(gè)詞)出現(xiàn)概率的乘積求出,那兩種郵件的訓(xùn)練樣本每個(gè)詞出現(xiàn)的概率怎么求?我們把之前的訓(xùn)練文檔按照垃圾郵件和正常郵件分開處理,用每個(gè)詞的出現(xiàn)次數(shù)(這里用詞袋模型)除以總詞數(shù),即可得出垃圾郵件和正常郵件訓(xùn)練樣本中所有單詞的出現(xiàn)概率,然后根據(jù)單詞在新樣本中的出現(xiàn)次數(shù),將其出現(xiàn)概率相乘,得到新文檔的p(w|c0)p(w|c1),然后分別乘以p(c0)、p(c1),比較其大小,即可得出新樣本的類別。

樸素貝葉斯分類算法的思想如上文所述,但還存在著一些特殊情況需要處理,比如我們上面說計(jì)算新文檔的p(w|c0)p(w|c1)時(shí),要分別用到新文檔中包含的單詞分別在垃圾郵件樣本和正常郵件樣本中所出現(xiàn)的概率,但要是新文檔中有個(gè)單詞在垃圾郵件(或正常郵件)中從來都沒出現(xiàn)過怎么辦,那概率就是0,再乘以其他單詞的在垃圾郵件(或正常郵件)中的出現(xiàn)概率,最終結(jié)果一定是0,也就是這條文檔已經(jīng)被宣判不可能是垃圾郵件(或正常郵件)了,這樣太過武斷,所以我們做一下修改,在訓(xùn)練時(shí),讓每個(gè)單詞的初始出現(xiàn)次數(shù)都設(shè)置為1,總出現(xiàn)次數(shù)初始設(shè)置為2,以避免上面提到的問題。

那要是有些單詞在新文檔里面出現(xiàn)次數(shù)為0怎么辦?那就不乘進(jìn)去。

還有個(gè)小問題就是因?yàn)槌说臄?shù)都小于1,乘的次數(shù)又那么多,所以會(huì)出現(xiàn)下溢出,最后的結(jié)果四舍五入都變成0了,所以我們采用自然對(duì)數(shù)函數(shù)來解決這個(gè)問題,乘變成了加,乘方變成了直接相乘,如果出現(xiàn)次數(shù)為0,那一項(xiàng)就為0,不加進(jìn)去,也就相當(dāng)于不乘進(jìn)去了,這里不再詳細(xì)講。

還有一點(diǎn),如果某個(gè)特征取值是連續(xù)的怎么辦,就不適宜按照某個(gè)特定值計(jì)算概率了,上例中的特征都是單詞的出現(xiàn)次數(shù),都是離散的,但是如果我想再增加考慮比如郵件的發(fā)送時(shí)間,時(shí)間是連續(xù)的,如果不是同一秒發(fā)送的郵件就被認(rèn)為不同,那對(duì)于分類幾乎沒有幫助(可以理解為上例中我們的單詞表里又增加了許多單詞,但是這些單詞不論在垃圾郵件還是正常郵件里出現(xiàn)的概率都極低,對(duì)于分類沒有幫助),解決方法是我們按時(shí)間段劃分,比如分為上午、下午、傍晚、深夜,即相當(dāng)于在單詞表中添加了四個(gè)單詞,不同的文檔都會(huì)包含這四個(gè)單詞中的其中一個(gè),如果垃圾郵件的發(fā)送時(shí)間絕大多數(shù)都在深夜,那在使用垃圾郵件訓(xùn)練樣本訓(xùn)練時(shí),深夜這個(gè)單詞的出現(xiàn)概率就會(huì)非常高,如果新文檔也是在深夜發(fā)送,就會(huì)顯著提高這條新文檔被認(rèn)為是垃圾郵件的概率。

另外還有一點(diǎn)就是最開始概要的時(shí)候所提到的生成方法和判別方法,生成方法和判別方法是對(duì)監(jiān)督學(xué)習(xí)算法的分類,前面講到的kNN和決策樹是判別方法,而這部分講的樸素貝葉斯分類算法是生成方法,由判別方法學(xué)到的模型叫做判別模型,由生成方法學(xué)到的模型叫做生成模型。

判別方法由數(shù)據(jù)直接學(xué)習(xí)決策函數(shù)Y=f(X)或者條件概率分布P(Y|X)作為預(yù)測(cè)的模型,即判別模型。基本思想是有限樣本條件下建立判別函數(shù),不考慮樣本的產(chǎn)生模型,直接研究預(yù)測(cè)模型。典型的判別模型包括k近鄰,感知機(jī),決策樹,支持向量機(jī)等。

生成方法由數(shù)據(jù)學(xué)習(xí)聯(lián)合概率密度分布P(X,Y),然后求出條件概率分布P(Y|X)作為預(yù)測(cè)的模型,即生成模型:P(Y|X)= P(X,Y)/ P(X)?;舅枷胧鞘紫冉颖镜穆?lián)合概率概率密度模型P(X,Y),然后再得到后驗(yàn)概率P(Y|X),再利用它進(jìn)行分類。

判別方法更多的關(guān)注各個(gè)類別之間的區(qū)別,而生成方法更多關(guān)注各個(gè)類別內(nèi)部的相似度。判別方法畫一條線,明確這種差別,線左邊是類別A,線右邊是類別B;生成方法拿樣本去比較兩個(gè)類別的已有數(shù)據(jù),看看這個(gè)樣本生成自哪個(gè)類別的可能性更大。

由生成模型可以得到判別模型,但由判別模型得不到生成模型。

Logistic回歸算法

一句話概要,我們被給予一堆X維的數(shù)據(jù),我們希望通過一條直線將這堆數(shù)據(jù)正確的分為兩類(不是所有的數(shù)據(jù)都能通過線性模型被正確分類)。我們建立了一個(gè)線性函數(shù)模型t=w*xwx均為X維的向量。先將w置為初始向量,輸入訓(xùn)練數(shù)據(jù)x后,將得到的t帶入Sigmoid函數(shù),將0.5作為閾值,大于0.5的為一類,小于0.5的為另一類。訓(xùn)練過程為,先利用最大似然估計(jì)得到目標(biāo)函數(shù),再利用梯度上升算法優(yōu)化目標(biāo)函數(shù),使得訓(xùn)練樣本生成概率最大化。

雖然名字叫做Logistic回歸算法,不過它和之前三個(gè)算法一樣都是分類算法,它將給定數(shù)據(jù)劃分到兩個(gè)類別之一,并屬于判定方法,監(jiān)督學(xué)習(xí)算法。

Logistic回歸算法的原理并不困難,但有幾個(gè)點(diǎn)需要介紹,比如Sigmoid函數(shù)、梯度上升算法、隨機(jī)梯度上升算法等,這些概念都廣泛應(yīng)用于深度學(xué)習(xí)之中。

什么是Sigmoid函數(shù)?


Sigmoid函數(shù)表達(dá)式

Sigmoid函數(shù)的圖像是什么樣的?


Sigmoid函數(shù)圖像

我們可以看到Sigmoid函數(shù)是一個(gè)階躍函數(shù),不管輸入什么樣的值,輸出的值都在0到1之間,在Logsitic回歸算法之中,我們?nèi)?.5為閾值,大于0.5的為一類,小于0.5的為另一類(即屬于某一類的概率大于0.5則歸于這一類,小于0.5則歸于另一類)。

我們通過Sigmoid函數(shù)得到數(shù)據(jù)類別,通過縮減其與標(biāo)注結(jié)果的差距,來優(yōu)化回歸系數(shù)w的值(實(shí)際上是通過優(yōu)化w的值來讓模型輸出與訓(xùn)練樣本標(biāo)注結(jié)果相同的概率盡可能大)。這個(gè)過程我們靠的是梯度上升算法,該算法與深度學(xué)習(xí)中使用廣泛的梯度下降算法原理相同。

在介紹梯度上升算法之前,我們要先確定我們的目標(biāo)函數(shù)是什么,用什么函數(shù)來表示Sigmoid函數(shù)輸出與標(biāo)注結(jié)果相同的概率,才能去優(yōu)化它,讓它盡可能大。

下面這段求目標(biāo)函數(shù)的推導(dǎo)過程中,暫時(shí)用z代替t、θ代替w,原式t=w*x暫時(shí)寫為z=θ*x,z=θ*x與下面的z=θTx意義相同,都是指θx的內(nèi)積。這段內(nèi)容是Logistic回歸算法的推導(dǎo)核心。

Logistic本質(zhì)上是一個(gè)基于條件概率的判別模型(DiscriminativeModel)。利用了Sigmoid函數(shù)值域在[0,1]這個(gè)特性。


我們將Sigmoid函數(shù)的表達(dá)式重寫如下:


根據(jù)Sigmoid函數(shù)的特性,我們定義這兩個(gè)式子:


上式即為在已知樣本x和參數(shù)θ的情況下,樣本x屬于正類(y=1)和負(fù)類(y=0)的條件概率。

Sigmoid的函數(shù)的輸出就是樣本x屬于正類(y=1)的概率,也就是前面提到的,如果該值大于0.5則認(rèn)定樣本x屬于正類(y=1),用1-該概率則是屬于負(fù)類(y=0)的概率。

然后我們將這兩個(gè)式子合成一個(gè):


將y=0和y=1分別代入,結(jié)果就是上面的兩個(gè)式子。既然概率出來了,那么最大似然估計(jì)也該出場(chǎng)了。假定樣本與樣本之間相互獨(dú)立,那么整個(gè)樣本集生成的概率即為所有樣本生成概率的乘積:


其中,m為樣本的總數(shù),y(i)表示第i個(gè)樣本的類別,x(i)表示第i個(gè)樣本,需要注意的是θ是多維向量,x(i)也是多維向量。

為了簡(jiǎn)化問題,我們對(duì)整個(gè)表達(dá)式求對(duì)數(shù)(將指數(shù)問題對(duì)數(shù)化是處理數(shù)學(xué)問題常見的方法):


這也就得出了我們的目標(biāo)函數(shù),我們希望優(yōu)化θ的值,來讓目標(biāo)函數(shù)的值越大越好,也就是我們的模型能夠生成訓(xùn)練樣本的概率越大越好。

這里插入一個(gè)小問題,Logistic回歸是判別方法,不是生成方法,但上面式子算樣本生成概率的方法好像與前面樸素貝葉斯算法這種生成方法非常相似。這里我的理解是(可能有誤),生成方法還是判別方法與目標(biāo)函數(shù),或者講損失函數(shù)無關(guān),Logistics最后判斷類別的時(shí)候用的是Sigmoid函數(shù)的輸出,然后定了個(gè)閾值,并沒有先計(jì)算聯(lián)合分布概率,所以Logistic回歸是判別方法。

然后繼續(xù),我們?cè)鯓诱{(diào)整θ讓目標(biāo)函數(shù)的值增大呢,這里就要用到梯度上升算法了(之后θ替換回w)。

梯度上升(下降)算法要用到梯度的概念,梯度方向就是該函數(shù)函數(shù)值變化最快的方向,而梯度的概念源自偏導(dǎo)數(shù),偏導(dǎo)數(shù)可以理解為該X維數(shù)據(jù)對(duì)總表達(dá)式的函數(shù)值在每個(gè)維度上的導(dǎo)數(shù),即總X維函數(shù)曲面被每個(gè)維度面相切所得到的曲線的導(dǎo)數(shù),而導(dǎo)數(shù)代表著變化的快慢,若其為正則意味著總函數(shù)值隨著該維度下自變量的增大而增大,若為負(fù)則相反,導(dǎo)數(shù)絕對(duì)值越大,則意味著其變化速度越快、變化曲線越陡峭。如果我們想讓總體函數(shù)的函數(shù)值增大,那我們?cè)诿總€(gè)導(dǎo)數(shù)為正的維度增加自變量的值,在每個(gè)導(dǎo)數(shù)為負(fù)的維度減小自變量的值,也即選擇了梯度上升的方向,總函數(shù)值增大最快的方向,梯度下降原理相同。

梯度上升算法參數(shù)向量的迭代式如下:

梯度上升算法迭代式

式中的w即為原線性函數(shù)模型中的參數(shù)向量,α在這里叫做步長(zhǎng),α后面的表達(dá)式就是包含各個(gè)維度下偏導(dǎo)數(shù)的向量,其維數(shù)自然與w的維數(shù)相同。依照上一段的原理,詳細(xì)一些講,對(duì)于w中的每個(gè)維度,因?yàn)槭阶又虚g是加號(hào),α為正值,若其對(duì)應(yīng)的偏導(dǎo)數(shù)為正,與α相乘后仍為正值,與w中該維度原有自變量值相加后,自變量是增大了,而又因?yàn)槠湓谠摼S度此自變量值下的偏導(dǎo)數(shù)為正,總函數(shù)值當(dāng)下隨著這個(gè)維度自變量值的增大而增大,所以總函數(shù)值是會(huì)增大的,每個(gè)維度同理,所有維度的自變量都在朝著讓總函數(shù)函數(shù)值增大的方向去改變自己,而且每次迭代后都會(huì)重新計(jì)算各個(gè)維度的偏導(dǎo)數(shù)值,保證各個(gè)維度自變量每次變化的方向均正確,而α作為乘在導(dǎo)數(shù)前面的系數(shù),決定了每個(gè)維度按當(dāng)前使函數(shù)值最大的方向移動(dòng)的距離大小,即步長(zhǎng),如果步長(zhǎng)過大,可能走過去了發(fā)現(xiàn)走過了,該維度該自變量值下偏導(dǎo)數(shù)為負(fù)了,需要減小自變量值,如果步長(zhǎng)過小,則整個(gè)函數(shù)函數(shù)值改變的速度太慢,效率太低。

梯度下降算法原理完全相同,表達(dá)式上的區(qū)別在于中間的加號(hào)改為減號(hào),即所有維度的自變量都朝著讓總函數(shù)值減小的方向去改變自己,深度學(xué)習(xí)中應(yīng)用梯度下降算法時(shí),字母α通常用字母η代替,稱其為學(xué)習(xí)速率。

接下來要介紹的是隨機(jī)梯度上升算法,與前面講的梯度上升算法原理基本相同,但區(qū)別在于梯度上升算法每次參數(shù)向量迭代要遍歷所有的訓(xùn)練樣本,運(yùn)算量相當(dāng)大,例如每個(gè)訓(xùn)練樣本有2個(gè)特征,加上方便計(jì)算的特征w0,一共3個(gè)特征,若我們有100個(gè)訓(xùn)練樣本,那每一次參數(shù)向量迭代就要計(jì)算300次,如果訓(xùn)練樣本的數(shù)量不是100而是100萬,總特征數(shù)是10個(gè),那每迭代一次就要計(jì)算1000萬次,而且我們還不知道要迭代多少次才能得到穩(wěn)定的向量值。所以那我們想,如果我們不每次都拿所有的樣本訓(xùn)練,每次按順序從所有訓(xùn)練樣本中抽出一個(gè)訓(xùn)練,抽完一輪再?gòu)念^開始,那計(jì)算量是不是就大幅減小了?這就叫做隨機(jī)梯度上升算法。

實(shí)驗(yàn)證明,使用隨機(jī)梯度上升算法,參數(shù)向量達(dá)到較為穩(wěn)定狀態(tài)所需要的總迭代次數(shù)要少于原始的梯度上升算法。

隨機(jī)梯度上升算法

我們可以看到,在訓(xùn)練參數(shù)向量時(shí),當(dāng)大的波動(dòng)停止后,還有一些小的周期性波動(dòng),這是因?yàn)閿?shù)據(jù)集中總是存在一些不能被線性模型分類的樣本點(diǎn),在每次迭代時(shí)會(huì)引發(fā)系數(shù)的劇烈波動(dòng),我們期望算法能夠避免來回波動(dòng),從而收斂到某個(gè)值。

想要降低劇烈的周期性波動(dòng),首先是要使α隨著迭代次數(shù)的增多而減小但永遠(yuǎn)不會(huì)減小到零,這會(huì)緩解數(shù)據(jù)的波動(dòng)幅度,而又保證迭代多次后數(shù)據(jù)仍然具有一定的影響。其次是上面我們是按順序抽取樣本的,這里我們更換為隨機(jī)抽取,以消除數(shù)據(jù)變化的周期性。

改進(jìn)后的梯度上升算法

經(jīng)過若干次隨機(jī)梯度上升算法的優(yōu)化迭代后,我們的參數(shù)向量w終于穩(wěn)定下來,將w代入t=w*x所得到t,再將t代入Sigmoid函數(shù),所分得的類別,與標(biāo)注結(jié)果的誤差穩(wěn)定在一個(gè)較小的值上。

采用改進(jìn)隨機(jī)梯度上升算法的分類結(jié)果

Logistic回歸這部分還有些其他的東西,例如,當(dāng)處理現(xiàn)實(shí)數(shù)據(jù)的時(shí)候,我們往往會(huì)遇到數(shù)據(jù)缺失問題,比如每個(gè)樣本應(yīng)該有50個(gè)特征,但有些特征的特征值我們是沒有的(可能因?yàn)闄C(jī)器上的某個(gè)傳感器損壞),那我們這些數(shù)據(jù)還能用嗎,難道因?yàn)槿鄙賻讉€(gè)特征值就丟到整個(gè)數(shù)據(jù),這是不合理的。我們這里通常的做法有下面幾種:

  • 使用可用特征值的均值來填補(bǔ)缺失值
  • 使用特殊值來填補(bǔ)缺失值,比如-1
  • 忽略有缺失值的樣本
  • 使用相似樣本的均值填補(bǔ)缺失值
  • 使用另外的機(jī)器學(xué)習(xí)算法預(yù)測(cè)缺失值

在Logistic回歸之中,我們選擇用實(shí)數(shù)0來替換所有缺失值,因?yàn)樵贚ogistic回歸中,若該特征值為零,則該特征值不會(huì)影響到系數(shù)w的迭代優(yōu)化,如果某樣本中的某特征值為0,那么該特征的系數(shù)將不做更新。

上面講的是特征值缺失,如果缺失的不是特征值,而是類別標(biāo)簽,那么我們的簡(jiǎn)單做法是將該條數(shù)據(jù)丟棄,因?yàn)轭悇e標(biāo)簽與特征值不同,很難采用某個(gè)合適的值來替換。

關(guān)于Logisitic回歸還有一些拓展內(nèi)容:二元的最大熵模型就是Logistic回歸模型,多元的Logistic回歸模型就是最大熵模型。另外,在計(jì)算概率時(shí),Logistic回歸也用到了樸素貝葉斯的假設(shè),用概率圖模型的語(yǔ)言來說,Maximum Entropy Model(或者說Logistic Regression)和Naive Bayes形成一個(gè)discriminative- generative pair,區(qū)別僅僅在于一個(gè)是生成模型一個(gè)判別模型,其他都一樣。

支持向量機(jī)SVM

一句話概要,SVM希望通過N-1維的分隔超平面線性分開N維的數(shù)據(jù),距離分隔超平面最近的點(diǎn)被叫做支持向量,我們利用SMO(SVM實(shí)現(xiàn)方法之一)最大化支持向量到分隔面的距離,這樣當(dāng)新樣本點(diǎn)進(jìn)來時(shí),其被分類正確的概率也就更大。我們計(jì)算樣本點(diǎn)到分隔超平面的函數(shù)間隔,函數(shù)間隔為正,分類正確,為負(fù)則分類錯(cuò)誤。函數(shù)間隔的絕對(duì)值除以||w||就是幾何間隔,幾何間隔始終為正,可以理解為樣本點(diǎn)到分隔超平面的幾何距離。若數(shù)據(jù)不是線性可分的,那我們引入核函數(shù)的概念,從某個(gè)特征空間到另一個(gè)特征空間的映射是通過核函數(shù)來實(shí)現(xiàn)的,我們利用核函數(shù)將數(shù)據(jù)從低維空間映射到高維空間,低維空間的非線性問題在高維空間往往會(huì)成為線性問題,再利用N-1維分割超平面對(duì)數(shù)據(jù)分類。

什么叫分隔超平面?如果數(shù)據(jù)的N維的,分隔超平面就是N-1維的,比如給出的數(shù)據(jù)點(diǎn)分布在二維平面之中,那分割超平面就是一條直線,如果數(shù)據(jù)點(diǎn)分布在三維空間之中,那分割超平面就是個(gè)平面,更高維同理。

我們的目的是最大化離分隔超平面最近的點(diǎn)(支持向量)與分隔超平面的距離,因?yàn)槲覀兊挠?xùn)練數(shù)據(jù)有限,所以希望能給出足夠大的犯錯(cuò)空間,當(dāng)新樣本進(jìn)來時(shí)也能將其正確分類,讓我們的分類器足夠健壯。

為了理解函數(shù)間隔和幾何間隔,我們定義一個(gè)式子:


yf(x)就是我們說的函數(shù)間隔,這里y是提前提供的對(duì)樣本的標(biāo)注結(jié)果,不同于Logistic回歸中用0和1作為分類標(biāo)簽,SVM中取-1和1,這樣使函數(shù)間隔不至于為0,使我們可以用函數(shù)間隔的符號(hào)作為判斷分類是否正確的依據(jù),那為什么函數(shù)間隔的符號(hào)可以判斷分類是否正確?f(x)有這樣一個(gè)特質(zhì),分隔超平面兩側(cè)的樣本點(diǎn)代入f(x)后,一側(cè)的計(jì)算全為正值,一側(cè)全為負(fù)值,如果計(jì)算出正值的那一側(cè)的標(biāo)注結(jié)果y的值為1,那函數(shù)間隔為正,分類正確,計(jì)算出負(fù)值的那一側(cè)標(biāo)注結(jié)果為-1,函數(shù)間隔也為正,分類正確;如果計(jì)算出正值的那一側(cè)的點(diǎn)標(biāo)注結(jié)果為-1,則函數(shù)間隔為負(fù),分類錯(cuò)誤,計(jì)算出負(fù)值的那一側(cè)標(biāo)注結(jié)果為1,則函數(shù)間隔為負(fù),分類錯(cuò)誤。所以,函數(shù)間隔為正,分類正確,函數(shù)間隔為負(fù),分類錯(cuò)誤。

|yf(x)|/||w||就是幾何間隔,也就是樣本點(diǎn)到分隔超平面的真實(shí)距離,距離越大,則幾何間隔越大,||w||是向量w的2-范數(shù),即向量w元素絕對(duì)值的平方和再開方。

我們要通過最大化支持向量與分隔超平面的距離來求得分隔超平面,又因?yàn)橹С窒蛄渴蔷嚯x分隔超平面最近的樣本點(diǎn),這就可以寫作:


最大化支持向量與分隔超平面的距離

上式直接求解起來相當(dāng)困難,我們利用拉格朗日乘子法以及引入松弛變量C來?yè)Q一種更簡(jiǎn)單的方式表述我們要解決的問題,這里推導(dǎo)較為難理解,簡(jiǎn)要的講,通過SVM的原始問題,構(gòu)造拉格朗日函數(shù),并通過對(duì)偶換算得出對(duì)偶問題,而對(duì)偶問題的KKT條件又與對(duì)偶問題等價(jià)。換句話說,就是只要找到對(duì)應(yīng)的α滿足了下列KKT條件,那么原始問題和對(duì)偶問題就都解決了,最終得到約束條件如下:

達(dá)到最終優(yōu)化目標(biāo)約束條件

通俗的來講,常數(shù)C取得越大,就是對(duì)錯(cuò)分樣本的懲罰越大,極端情況下,就是訓(xùn)練出來的分類器使得每個(gè)訓(xùn)練樣本都正確分類。那么想象一下,在有噪聲樣本的情況下,這么做會(huì)導(dǎo)致過擬合。常數(shù)C取得越小,就會(huì)有越多的樣本被訓(xùn)練出來的分類器錯(cuò)分,一些正常的樣本也被當(dāng)成噪聲處理了。

α是我們需要不斷優(yōu)化選取的,優(yōu)化目標(biāo)是訓(xùn)練時(shí)讓盡可能多的訓(xùn)練樣本點(diǎn)被正確分類并且讓支持向量與分隔超平面的間隔最大化,對(duì)于SVM我們要求解α,如果α的所有分量滿足SVM對(duì)偶問題的KKT條件,那么這個(gè)問題的解就求出來了,我們SVM模型學(xué)習(xí)也就完成了。如果沒有滿足KKT,那么我們就在α中找兩個(gè)分量αi和αj,其中αi是違反KKT條件最嚴(yán)重的分量,固定其它變量,增大其中一個(gè)同時(shí)減少另一個(gè),針對(duì)這兩個(gè)變量構(gòu)建一個(gè)二次規(guī)劃問題,使得αi和αj滿足KKT條件,直到α的所有分量都滿足KKT條件。而且這個(gè)計(jì)算過程是收斂的,因?yàn)槊看斡?jì)算出來的新的兩個(gè)分量,使得對(duì)偶問題中要優(yōu)化的目標(biāo)函數(shù)值更小。至于為什么是收斂的,是因?yàn)?,每次求解的那兩個(gè)分量,是要優(yōu)化問題在這兩個(gè)分量上的極小值,所以每一次優(yōu)化,都會(huì)使目標(biāo)函數(shù)比上一次的優(yōu)化結(jié)果的值變小。這里用到的方法就叫做SMO(序列最小優(yōu)化),SMO的具體實(shí)現(xiàn)細(xì)節(jié)這里不詳述。

我們上面講的SVM只能處理線性可分的數(shù)據(jù),但實(shí)際上生活中存在著大量線性不可分的數(shù)據(jù),根據(jù)『低維空間的非線性問題在高維空間往往會(huì)成為線性問題』,我們利用核函數(shù)將低維度下的非線性可分的數(shù)據(jù)升維成高維度下線性可分的數(shù)據(jù),再采用我們之前講的方法去處理。

『低維空間的非線性問題在高維空間往往會(huì)成為線性問題』這句話可能很抽象,這里我舉個(gè)例子:


我們看到圖中有個(gè)圈,我們姑且認(rèn)為圈里面都是藍(lán)點(diǎn),圈外面都是紅點(diǎn),那我們?cè)趺从靡粭l直線(圖是2維平面,則分隔超平面為1維直線)把紅點(diǎn)和藍(lán)點(diǎn)分開呢?

答案是這樣:


我們啪的一下一拍桌子,這些紅點(diǎn)藍(lán)點(diǎn)全部都飛了起來,然后我們找準(zhǔn)時(shí)機(jī),一刀劃出一個(gè)平面把兩種點(diǎn)分開,2維線性不可分的數(shù)據(jù)成為了3維線性可分的數(shù)據(jù),3維條件下分隔超平面為2維的平面。

接下來我們講核函數(shù),核函數(shù)被用來實(shí)現(xiàn)從某個(gè)特征空間到另一個(gè)特征空間的映射,我們可以把核函數(shù)理解成類似于歐氏距離公式一樣的距離計(jì)算的方法,只要是滿足了Mercer條件的函數(shù),都可以作為核函數(shù),又因?yàn)镾VM中所有的運(yùn)算都可以寫成內(nèi)積的形式,我們可以直接把內(nèi)積運(yùn)算換成核函數(shù),而不必做進(jìn)一步的簡(jiǎn)化處理,核函數(shù)接受低維空間的輸入值,卻能算出高維空間的內(nèi)積值。徑向基核函數(shù)是SVM中常用的一個(gè)核函數(shù),它采用向量作為自變量,能夠基于向量距離運(yùn)算輸出一個(gè)標(biāo)量。徑向基核函數(shù)還有高斯版本,被稱為高斯核函數(shù),感興趣的讀者可以自己了解一下具體的推導(dǎo)和代碼編寫過程。

對(duì)于核函數(shù),這里還需要提一點(diǎn),其實(shí)只處理低維下線性可分問題的SVM也是用了核函數(shù)的,只是使用的核函數(shù)不具備將低維數(shù)據(jù)映射到高維的功能,被稱為線性核函數(shù)(Linear Kernel)。

用SVM同樣可以實(shí)現(xiàn)我們?cè)谥v解kNN算法時(shí)所實(shí)現(xiàn)的那個(gè)手寫數(shù)字識(shí)別,SVM的優(yōu)勢(shì)在于,它不用保留所用的訓(xùn)練樣本用于計(jì)算,而只用保留那幾個(gè)支持向量就夠了,極大地減小了內(nèi)存的占用,而效果卻不差。

此外SVM這里還有很重要的一個(gè)點(diǎn)需要提,就是SVM與上一節(jié)的Logistic回歸的異同點(diǎn)。

首先是第一點(diǎn),Kernel不是SVM專有的,Kernel Logistic Regression(KLR)也很常見。

從目的和方法的角度講:
SVM只考慮支持向量,也就是和分類最相關(guān)的少數(shù)點(diǎn),去訓(xùn)練分類器,然后希望最大化間隔與盡可能的正確分類樣本點(diǎn)。而邏輯回歸通過非線性映射Sigmoid函數(shù),大大減小了離分類平面較遠(yuǎn)的點(diǎn)的權(quán)重,相對(duì)提升了與分類最相關(guān)的數(shù)據(jù)點(diǎn)的權(quán)重(Sigmoid函數(shù)的取值范圍是(0,1),對(duì)距離進(jìn)行了壓縮,距離非常大時(shí),它在損失函數(shù)中的貢獻(xiàn)不會(huì)隨著距離的增大線性增加),目的也在于盡可能的正確分類樣本點(diǎn)。

從使用場(chǎng)景的角度,Andrew NG講:

  • 如果Feature的數(shù)量很大,跟樣本數(shù)量差不多,這時(shí)候選用LR或者是Linear Kernel的SVM
  • 如果Feature的數(shù)量比較小,樣本數(shù)量一般,不算大也不算小,選用SVM+Gaussian Kernel
  • 如果Feature的數(shù)量比較小,而樣本數(shù)量很多,需要手工添加一些feature變成第一種情況

從效率與效果的角度講:
訓(xùn)練數(shù)據(jù)量不是太大的話,用SVM,SVM得到的結(jié)果要優(yōu)于LR,如果數(shù)據(jù)量太大,用LR,LR的運(yùn)行速度會(huì)比SVM快得多。

從損失函數(shù)的角度來講(重要):
SVM是用的是Hinge loss function,是需要最大化間隔的,而LR用的是最大似然估計(jì),也就是log-likehood loss function(對(duì)數(shù)似然損失函數(shù))。

Hinge loss 的標(biāo)準(zhǔn)形式

其實(shí)就是我們上面提到過的:


最大化支持向量與分隔超平面的距離

那損失函數(shù)是什么?損失函數(shù)衡量的是模型預(yù)測(cè)錯(cuò)誤的程度,也就代表了模型預(yù)測(cè)結(jié)果與訓(xùn)練樣本標(biāo)注結(jié)果的差別,我們希望最小化損失函數(shù)的函數(shù)值,損失函數(shù)的函數(shù)值越小,就相當(dāng)于我們的預(yù)測(cè)結(jié)果與真實(shí)結(jié)果越相近。通常而言,損失函數(shù)由損失項(xiàng)(loss term)和正則項(xiàng)(regularization term)組成。

常見的損失函數(shù)有0-1損失函數(shù)、絕對(duì)值損失函數(shù)、平方損失函數(shù)(最小二乘法)、hinge loss function(SVM)、log loss function(LR)、指數(shù)損失函數(shù)(AdaBoost)等,這些損失函數(shù)用到了的時(shí)候會(huì)分別講。在邏輯回歸模型中,我們最大化似然函數(shù)和最小化log損失函數(shù)實(shí)際上是等價(jià)的。

各類損失函數(shù)圖像

對(duì)hinge loss,又可以細(xì)分出hinge loss(或簡(jiǎn)稱L1 loss)和squared hinge loss(或簡(jiǎn)稱L2 loss),這是因?yàn)槠湔齽t項(xiàng)的不同,正則項(xiàng)可分為L(zhǎng)1正則項(xiàng)和L2正則項(xiàng),簡(jiǎn)單來講,添加正則項(xiàng)的意義在于防止過擬合(訓(xùn)練樣本表現(xiàn)極好,而測(cè)試樣本表現(xiàn)很差)。參數(shù)越多,模型越復(fù)雜,而越復(fù)雜的模型越容易過擬合。防止過擬合的方法在下一篇深度學(xué)習(xí)的topic里面會(huì)詳細(xì)講(包括L1、L2分別是什么以及除了添加正則項(xiàng)還有什么方法可以防止過擬合)。

AdaBoost元算法

一句話概要,AdaBoost(adaptive boosting)是元算法,通過組合多個(gè)弱分類器來構(gòu)建一個(gè)強(qiáng)分類器。我們?yōu)橛?xùn)練數(shù)據(jù)中的每一個(gè)樣本都賦予其一個(gè)權(quán)重,這些權(quán)重構(gòu)成了向量D,一開始,這些權(quán)重都初始化成相等值,然后每次添加一個(gè)弱分類器對(duì)樣本進(jìn)行分類,從第二次分類開始,將上一次分錯(cuò)的樣本的權(quán)重提高,分對(duì)的樣本權(quán)重降低,持續(xù)迭代。此外,對(duì)于每個(gè)弱分類器而言,每個(gè)分類器也有自己的權(quán)重,取決于它分類的加權(quán)錯(cuò)誤率,加權(quán)錯(cuò)誤率越低,則這個(gè)分類器的權(quán)重值α越高,最后綜合多個(gè)弱分類器的分類結(jié)果和其對(duì)應(yīng)的權(quán)重α得到預(yù)測(cè)結(jié)果,AdaBoost是最好的監(jiān)督學(xué)習(xí)分類方法之一。

前面已經(jīng)介紹了五種不同的分類算法,它們各有優(yōu)缺點(diǎn),我們可以將其組合起來,元算法(meta-algorithm)或者叫集成方法(ensemble method)可以集成不同算法,也可以是同一算法在不同設(shè)置下的集成,還可以是被數(shù)據(jù)集不同部分訓(xùn)練過的相同或不同的分類器的集成。

boosting和bagging都是集成學(xué)習(xí)(ensemble learning)領(lǐng)域的基本算法,boosting和bagging使用的多個(gè)分類器的類型是一致的。

bagging也叫自舉匯聚法(bootstrap aggregating),比如原數(shù)據(jù)集中有N個(gè)樣本,我們每次從原數(shù)據(jù)集中有放回的抽取,抽取N次,就得到了一個(gè)新的有N個(gè)樣本的數(shù)據(jù)集,然后我們抽取S個(gè)N次,就得到了S個(gè)有N個(gè)樣本的新數(shù)據(jù)集,然后拿這S個(gè)數(shù)據(jù)集去訓(xùn)練S個(gè)分類器,之后應(yīng)用這S個(gè)分類器進(jìn)行分類,選擇分類器投票最多的類別作為最后的分類結(jié)果。

boosting與bagging的區(qū)別在于:

  • bagging通過有放回的抽取得到了S個(gè)數(shù)據(jù)集,而boosting用的始終是原數(shù)據(jù)集,但是樣本的權(quán)重會(huì)發(fā)生改變。
  • boosting對(duì)分類器的訓(xùn)練是串行的,每個(gè)新分類器的訓(xùn)練都會(huì)受到上一個(gè)分類器分類結(jié)果的影響。
  • bagging里面各個(gè)分類器的權(quán)重是相等的,但是boosting不是,每個(gè)分類器的權(quán)重代表的是其對(duì)應(yīng)分類器在上一輪分類中的成功度。

AdaBoost是boosting方法中最流行的版本。

起始狀態(tài),所有樣本的權(quán)重都是相同的,我們采用第一個(gè)弱分類器(我們對(duì)弱分類器的要求是只要二分類正確率高于50%就可以了,比瞎猜準(zhǔn)一點(diǎn)就可以)對(duì)其進(jìn)行分類,然后計(jì)算其分類加權(quán)錯(cuò)誤率:


加權(quán)錯(cuò)誤率

之后為第一個(gè)弱分類器賦予權(quán)重:


分類器權(quán)重計(jì)算

計(jì)算出α之后,要對(duì)樣本權(quán)重D進(jìn)行更新,如果該樣本被正確分類,那我們降低其權(quán)重:

如果該樣本被錯(cuò)誤分類,那么我們提高其權(quán)重:


計(jì)算出新的權(quán)重之后,AdaBoost又開始進(jìn)入下一輪迭代,不斷重復(fù)迭代,直到訓(xùn)練的錯(cuò)誤率為零或迭代次數(shù)達(dá)到用戶的設(shè)置,當(dāng)有新樣本時(shí),我們將所有分類器的分類結(jié)果與權(quán)重相乘后全部加和,如果結(jié)果大于0則是類別1,小于0則是類別-1(AdaBoost的類別標(biāo)簽為1和-1)。

如果要理解AdaBoost是怎么工作的,那看到這就夠了,下面會(huì)講一些深一點(diǎn)的內(nèi)容,比如上面給定了分類器的權(quán)重計(jì)算公式,那這個(gè)權(quán)重公式是怎么推導(dǎo)出來的?還有AdaBoost的目標(biāo)函數(shù)是什么?

這里我引用我自己總結(jié)的一個(gè)思考方法,對(duì)于一個(gè)機(jī)器學(xué)習(xí)算法:

  • 它的優(yōu)化目標(biāo)是什么
  • 它的目標(biāo)函數(shù)/損失函數(shù)是什么
  • 它用什么方法去優(yōu)化目標(biāo)函數(shù)的函數(shù)值
  • 它是怎么對(duì)數(shù)據(jù)進(jìn)行分類的

前面只是講了『它用什么方法去優(yōu)化目標(biāo)函數(shù)的函數(shù)值』以及『它是怎么對(duì)數(shù)據(jù)進(jìn)行分類的』,我們還不知道它的優(yōu)化目標(biāo)和AdaBoost的目標(biāo)函數(shù),我查閱了Wikipedia找到了AdaBoost的推導(dǎo)過程:

AdaBoost的優(yōu)化目標(biāo),是使整個(gè)模型的加權(quán)錯(cuò)誤率最小。

我們首先看一下這個(gè)式子:


AdaBoost遞推公式

雖然這里的字母并沒有全在前面出現(xiàn)過,但根據(jù)意思很容易理解,C是AdaBoost總分類器,m是迭代次數(shù),x是樣本、α是分類器權(quán)重、km是第m次迭代時(shí)所增加的那個(gè)分類器。

依照AdaBoost的優(yōu)化目標(biāo),我們定義E為AdaBoost的指數(shù)損失函數(shù):

AdaBoost損失函數(shù)

將我們提前定好的樣本權(quán)重的更新規(guī)則代入(也即前面D的更新公式)(這里用w表示權(quán)重):

第一次迭代所有樣本權(quán)重均為1

第二次迭代之后,正例權(quán)重降低,反例權(quán)重升高

化簡(jiǎn)得到:


化簡(jiǎn)后的損失函數(shù)

然后我們就得到了AdaBoost的損失函數(shù),然后我們希望對(duì)其優(yōu)化,最小化其函數(shù)值,這里我們讓E對(duì)α求偏導(dǎo):

讓其為零,則得到:


此時(shí)我們發(fā)現(xiàn),如果我們代入之前對(duì)權(quán)重錯(cuò)誤率ε的定義:


加權(quán)錯(cuò)誤率

就得到了:


分類器權(quán)重計(jì)算

之后就按照前面講過的流程,迭代更新樣本權(quán)重以及確定新分類器的權(quán)重,優(yōu)化模型,指導(dǎo)到達(dá)指定的迭代次數(shù)或錯(cuò)誤率下降到零。然后根據(jù)模型輸出是否大于零對(duì)樣本進(jìn)行分類。

AdaBoost是這篇文章里面講的最后一個(gè)分類算法,在開始講監(jiān)督學(xué)習(xí)中的回歸算法之前,還有一個(gè)問題需要討論,就是非均衡分類問題。在前面的分類算法中,我們都假設(shè)所有類別的分類代價(jià)是一樣的,但實(shí)際上并不是這樣,就拿樸素貝葉斯算法的垃圾郵件過濾做例子,將垃圾郵件錯(cuò)分為正常郵件和將正常郵件錯(cuò)分為垃圾郵件的代價(jià)是不一樣的。

這里我們介紹度量分類性能的相關(guān)知識(shí):

首先是真陽(yáng)(TP)、真陰(TN)、假陽(yáng)(FP)、假陰(FN)。如果正例被判定為正例、反例被判定為反例則為真陽(yáng)(TP)、真陰(TN);如果正例被判定為反例則為假陰(FN);如果反例被判定為正例則為假陽(yáng)(FP)。

然后介紹正確率的概念,它等于TP/(TP+FP),就是在所有被判定正例的樣本里面,真正的正例有多少;召回率等于TP/(TP+FN),就是在所有的正例里面,有多少被判定為正例了。

更形象一點(diǎn)講:


上帝的模型

中間那條線是最理想的模型,100%正確的劃分出了所有的正例和反例,左側(cè)正例,右側(cè)反例,但是這條線只有上帝知道,我們建出來的模型只能是這樣的:


人類的模型

那條紅線是我們建出來的模型,我們認(rèn)為紅線左側(cè)是正例,右側(cè)是反例,那怎么評(píng)價(jià)我們建模的好壞呢,用A/A+C就是正確率,用A/A+B就是召回率。在上帝模型里B和C都是不存在的,正確率與召回率都是100%。

同一個(gè)算法模型可以理解為一條斜率相同的線,我們可以上下移動(dòng)它,往上移,召回率提高,正確率降低;往下移正確率提高,召回率降低。同一模型下一般不能同時(shí)提高正確率和召回率,但是可以根據(jù)實(shí)際情況調(diào)整到底是要更高的正確率還是更高的召回率。

另一個(gè)度量分類中的非均衡性的工具是ROC曲線:


ROC曲線示例

圖中提到的真陽(yáng)率與前面講到的召回率相同,真陽(yáng)/真陽(yáng)+假陰,A/A+B。假陽(yáng)率是FP/(FP+TN),就是假陽(yáng)/假陽(yáng)+真陰,就是前面的圖上C/C+空白部分。

再回到上面的圖,看實(shí)線,同一個(gè)模型,如果假陽(yáng)率為0,也就是前面圖中C不存在,那么真陽(yáng)率也很低,也就相當(dāng)于前面圖中的紅線下移直到C不存在,B變得很大;如果真陽(yáng)率為1,則相當(dāng)于前面圖中的紅線上移直到B不存在,C變得很大,那么假陽(yáng)率就很高,同時(shí),正確率也就很低。

用來衡量不同模型好壞的一個(gè)指標(biāo)是AUC,也就是ROC曲線右下部分的面積,一個(gè)完美分類器的AUC是1,真陽(yáng)率1,沒有B,假陽(yáng)率0,沒有C,100%正確分類;而瞎猜,也就是虛線,AUC為0.5。

還有一個(gè)是我們可以在機(jī)器學(xué)習(xí)中引入代價(jià)的概念,比如分出真陽(yáng)和真陰的代價(jià)是0,甚至可以是負(fù)數(shù),分出假陽(yáng)和假陰的代價(jià)為正數(shù),在實(shí)際應(yīng)用中分錯(cuò)的代價(jià)越大,那它對(duì)應(yīng)的正數(shù)值也就越大,將代價(jià)引入目標(biāo)函數(shù)中一并優(yōu)化,最后的目標(biāo)是總代價(jià)最小。

另一點(diǎn)是欠抽樣和過抽樣,如果正例和反例的數(shù)量差距過于懸殊,我們傾向于對(duì)數(shù)量過多的類別進(jìn)行欠抽樣,只取其中一部分;而對(duì)數(shù)量過少的類別進(jìn)行過抽樣,比如復(fù)制樣例或加入與樣例相似的點(diǎn)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容