算算時(shí)間,從開始到現(xiàn)在,做機(jī)器學(xué)習(xí)算法也將近八個(gè)月了。雖然還沒有達(dá)到融會(huì)貫通的地步,但至少在熟悉了算法的流程后,我在算法的選擇和創(chuàng)造能 力上有了不小的提升。實(shí)話說,機(jī)器學(xué)習(xí)很難,非常難,要做到完全了解算法的流程、特點(diǎn)、實(shí)現(xiàn)方法,并在正確的數(shù)據(jù)面前選擇正確的方法再進(jìn)行優(yōu)化得到最優(yōu)效 果,我覺得沒有個(gè)八年十年的刻苦鉆研是不可能的事情。其實(shí)整個(gè)人工智能范疇都屬于科研難題,包括模式識(shí)別、機(jī)器學(xué)習(xí)、搜索、規(guī)劃等問題,都是可以作為獨(dú)立 科目存在的。我不認(rèn)為有誰可以把人工智能的各個(gè)方面都做到極致,但如果能掌握其中的任一方向,至少在目前的類人尖端領(lǐng)域,都是不小的成就。 這篇日志,作為我2014年的學(xué)業(yè)總結(jié),詳細(xì)闡述目前我對(duì)機(jī)器學(xué)習(xí)的理解,希望各位看官批評(píng)指正,多多交流! 機(jī)器學(xué)習(xí)(MachineLearning),在我看來就是讓機(jī)器學(xué)習(xí)人思維的過程。機(jī)器學(xué)習(xí)的宗旨就是讓機(jī)器學(xué)會(huì)“人識(shí)別事物的方法”,我們希望人從事物中了解到的東西和機(jī)器從事物中了解到的東西一樣,這就是機(jī)器學(xué)習(xí)的過程。在機(jī)器學(xué)習(xí)中有一個(gè)很經(jīng)典的問題: “假設(shè)有一張色彩豐富的油畫,畫中畫了一片茂密的森林,在森林遠(yuǎn)處的一棵歪脖樹上,有一只猴子坐在樹上吃東西。如果我們讓一個(gè)人找出猴子的位置,正常情況下不到一秒鐘就可以指出猴子,甚至有的人第一眼就能看到那只猴子。” 那么問題就來了,為什么人能在上千種顏色混合而成的圖像中一下就能識(shí)別出猴子呢?在我們的生活中,各種事物隨處可見,我們是如何識(shí)別出各種不同 的內(nèi)容呢?也許你可能想到了——經(jīng)驗(yàn)。沒錯(cuò),就是經(jīng)驗(yàn)。經(jīng)驗(yàn)理論告訴我們認(rèn)識(shí)的所有東西都是通過學(xué)習(xí)得到的。比如,提起猴子,我們腦海里立刻就會(huì)浮現(xiàn)出我 們見過的各種猴子,只要畫中的猴子的特征與我們意識(shí)中的猴子雷同,我們就可能會(huì)認(rèn)定畫中畫的是猴子。極端情況下,當(dāng)畫中猴子的特征與我們所認(rèn)識(shí)某一類猴子 的特征完全相同,我們就會(huì)認(rèn)定畫中的猴子是哪一類。 另一種情況是我們認(rèn)錯(cuò)的時(shí)候。其實(shí)人識(shí)別事物的錯(cuò)誤率有的時(shí)候也是很高的。比如,當(dāng)我們遇見不認(rèn)識(shí)的字的時(shí)候會(huì)潛意識(shí)的念字中我們認(rèn)識(shí)的部分。 比如,“如火如荼”這個(gè)詞,是不是有朋友也跟我一樣曾經(jīng)念過“如火如茶(chá)”?我們之所以犯錯(cuò),就是因?yàn)樵谖覀儧]有見過這個(gè)字的前提下,我們會(huì)潛意 識(shí)的使用經(jīng)驗(yàn)來解釋未知。 目前科技如此發(fā)達(dá),就有牛人考慮可不可以讓機(jī)器模仿人的這種識(shí)別方法來達(dá)到機(jī)器識(shí)別的效果,機(jī)器學(xué)習(xí)也就應(yīng)運(yùn)而生了。 從根本上說,識(shí)別,是一個(gè)分類的結(jié)果。看到四條腿的生物,我們可能會(huì)立即把該生物歸為動(dòng)物一類,因?yàn)槲覀兂3R姷降乃臈l腿的、活的東西,九成以 上是動(dòng)物。這里,就牽扯出了概率的問題。我們對(duì)身邊的事物往往識(shí)別率很高,是因?yàn)槿说臐撘庾R(shí)幾乎記錄了肉眼看到的事物的所有特征。比如,我們進(jìn)入一個(gè)新的 集體,剛開始大家都不認(rèn)識(shí),有的時(shí)候人和名字都對(duì)不上號(hào),主要原因就是我們對(duì)事物的特征把握不夠,還不能通過現(xiàn)有特征對(duì)身邊的人進(jìn)行分類。這個(gè)時(shí)候,我們 常常會(huì)有這種意識(shí):哎,你好像叫張三來著?哦,不對(duì),你好像是李四。這就是分類中的概率問題,有可能是A結(jié)果,有可能是B結(jié)果,甚至是更多結(jié)果,主要原因 就是我們的大腦收集的特征不夠多,還無法進(jìn)行準(zhǔn)確分類。當(dāng)大家都彼此熟悉了之后,一眼就能識(shí)別出誰是誰來,甚至極端情況下,只聽聲音不見人都能進(jìn)行識(shí)別, 這說明我們已經(jīng)對(duì)該事物的特征把握相當(dāng)精確。 所以,我認(rèn)為,人識(shí)別事物有四個(gè)基本步驟:學(xué)習(xí)、提取特征、識(shí)別、分類。 那么機(jī)器可不可以模仿這個(gè)過程來實(shí)現(xiàn)識(shí)別呢?答案是肯定的,但是沒有那么容易。難題有三:第一,人的大腦有無數(shù)神經(jīng)元進(jìn)行數(shù)據(jù)交換和處理,在目 前的機(jī)器中還達(dá)不到同等的處理?xiàng)l件;第二,人對(duì)事物特征的提取是潛意識(shí)的,提取無意識(shí)情況下的信息,誤差很大;第三,也是最重要的一點(diǎn),人的經(jīng)驗(yàn)來自于人 每時(shí)每刻的生活中,也就是人無時(shí)無刻都處在學(xué)習(xí)中,如何讓機(jī)器進(jìn)行各個(gè)方面的自主學(xué)習(xí)?因此,目前在人工智能領(lǐng)域始終還沒達(dá)到類人的水平,我認(rèn)為主要原因 就是機(jī)器沒有潛意識(shí)。人的潛意識(shí)其實(shí)并不完全受人的意識(shí)支配,但卻可以提高人類識(shí)別事物的概率。我們無法給機(jī)器加載潛意識(shí),因?yàn)橹鲃?dòng)加載的意識(shí)就是主觀意 識(shí),在機(jī)器里無法完成人類潛意識(shí)的功能。所以,以目前的發(fā)展情況來看,要達(dá)到完全類人,還有不短的時(shí)間。但即便如此,與人的思維差別很大的機(jī)器依然可以為 我們的生活帶來幫助。比如,我們常用的在線翻譯、搜索系統(tǒng)、專家系統(tǒng)等,都是機(jī)器學(xué)習(xí)的產(chǎn)物。 那么,如何實(shí)現(xiàn)機(jī)器學(xué)習(xí)呢? 整體上看,機(jī)器學(xué)習(xí)就是模仿人識(shí)別事物的過程,即:學(xué)習(xí)、提取特征、識(shí)別、分類。由于機(jī)器不能跟人類思維一樣根據(jù)事物特征自然而然的選擇分類方 法,所以機(jī)器學(xué)習(xí)方法的選擇依然還需要人工選擇。目前,機(jī)器學(xué)習(xí)的方法主要有三種:監(jiān)督學(xué)習(xí)、半監(jiān)督學(xué)習(xí)和無監(jiān)督學(xué)習(xí)。監(jiān)督學(xué)習(xí)是利用一組已知類別的樣本 調(diào)整分類器的參數(shù),使其達(dá)到所要求性能的過程。白話一點(diǎn),就是根據(jù)已知的,推斷未知的。代表方法有:Nave Bayes、SVM、決策樹、KNN、神經(jīng)網(wǎng)絡(luò)以及Logistic分析等;半監(jiān)督方法主要考慮如何利用少量的標(biāo)注樣本和大量的未標(biāo)注樣本進(jìn)行訓(xùn)練和分類 的問題,也就是根據(jù)少量已知的和大量未知的內(nèi)容進(jìn)行分類。代表方法有:最大期望、生成模型和圖算法等。無監(jiān)督學(xué)習(xí)是利用一組已知類別的樣本調(diào)整分類器的參 數(shù),使其達(dá)到所要求性能的過程。也就是及其自個(gè)兒學(xué)。代表方法有:Apriori、FP樹、K-means以及目前比較火的Deep Learning。從這三方面看,無監(jiān)督學(xué)習(xí)是最智能的,有能實(shí)現(xiàn)機(jī)器主動(dòng)意識(shí)的潛質(zhì),但發(fā)展還比較緩慢;監(jiān)督學(xué)習(xí)是不太靠譜的,從已知的推斷未知的,就 必須要把事物所有可能性全都學(xué)到,這在現(xiàn)實(shí)中是不可能的,人也做不到;半監(jiān)督學(xué)習(xí)是“沒辦法中的辦法”,既然無監(jiān)督學(xué)習(xí)很難,監(jiān)督學(xué)習(xí)不靠譜,就取個(gè)折 中,各取所長。目前的發(fā)展是,監(jiān)督學(xué)習(xí)技術(shù)已然成熟,無監(jiān)督學(xué)習(xí)還在起步,所以對(duì)監(jiān)督學(xué)習(xí)方法進(jìn)行修改實(shí)現(xiàn)半監(jiān)督學(xué)習(xí)是目前的主流。但這些方法基本只能提 取信息,還不能進(jìn)行有效的預(yù)測(cè)(人們就想,既然沒法得到更多,就先看看手里有什么,于是數(shù)據(jù)挖掘出現(xiàn)了)。 機(jī)器學(xué)習(xí)方法非常多,也很成熟。下面我挑幾個(gè)說。 首先是SVM。因?yàn)槲易龅奈谋咎幚肀容^多,所以比較熟悉SVM。SVM也叫支持向量機(jī),其把數(shù)據(jù)映射到多維空間中以點(diǎn)的形式存在,然后找到能夠 分類的最優(yōu)超平面,最后根據(jù)這個(gè)平面來分類。SVM能對(duì)訓(xùn)練集之外的數(shù)據(jù)做很好的預(yù)測(cè)、泛化錯(cuò)誤率低、計(jì)算開銷小、結(jié)果易解釋,但其對(duì)參數(shù)調(diào)節(jié)和核函數(shù)的 參數(shù)過于敏感。個(gè)人感覺SVM是二分類的最好的方法,但也僅限于二分類。如果要使用SVM進(jìn)行多分類,也是在向量空間中實(shí)現(xiàn)多次二分類。 SVM有一個(gè)核心函數(shù)SMO,也就是序列最小最優(yōu)化算法。SMO基本是最快的二次規(guī)劃優(yōu)化算法,其核心就是找到最優(yōu)參數(shù)α,計(jì)算超平面后進(jìn)行分類。SMO方法可以將大優(yōu)化問題分解為多個(gè)小優(yōu)化問題求解,大大簡(jiǎn)化求解過程。 SVM還有一個(gè)重要函數(shù)是核函數(shù)。核函數(shù)的主要作用是將數(shù)據(jù)從低位空間映射到高維空間。詳細(xì)的內(nèi)容我就不說了,因?yàn)閮?nèi)容實(shí)在太多了。總之,核函數(shù)可以很好的解決數(shù)據(jù)的非線性問題,而無需考慮映射過程。 第二個(gè)是KNN。KNN將測(cè)試集的數(shù)據(jù)特征與訓(xùn)練集的數(shù)據(jù)進(jìn)行特征比較,然后算法提取樣本集中特征最近鄰數(shù)據(jù)的分類標(biāo)簽,即KNN算法采用測(cè)量 不同特征值之間的距離的方法進(jìn)行分類。KNN的思路很簡(jiǎn)單,就是計(jì)算測(cè)試數(shù)據(jù)與類別中心的距離。KNN具有精度高、對(duì)異常值不敏感、無數(shù)據(jù)輸入假定、簡(jiǎn)單 有效的特點(diǎn),但其缺點(diǎn)也很明顯,計(jì)算復(fù)雜度太高。要分類一個(gè)數(shù)據(jù),卻要計(jì)算所有數(shù)據(jù),這在大數(shù)據(jù)的環(huán)境下是很可怕的事情。而且,當(dāng)類別存在范圍重疊 時(shí),KNN分類的精度也不太高。所以,KNN比較適合小量數(shù)據(jù)且精度要求不高的數(shù)據(jù)。 KNN 有兩個(gè)影響分類結(jié)果較大的函數(shù),一個(gè)是數(shù)據(jù)歸一化,一個(gè)是距離計(jì)算。如果數(shù)據(jù)不進(jìn)行歸一化,當(dāng)多個(gè)特征的值域差別很大的時(shí)候,最終結(jié)果就會(huì)受到較大影響; 第二個(gè)是距離計(jì)算。這應(yīng)該算是KNN的核心了。目前用的最多的距離計(jì)算公式是歐幾里得距離,也就是我們常用的向量距離計(jì)算方法。 個(gè)人感覺,KNN最大的作用是可以隨時(shí)間序列計(jì)算,即樣本不能一次性獲取只能隨著時(shí)間一個(gè)一個(gè)得到的時(shí)候,KNN能發(fā)揮它的價(jià)值。至于其他的特點(diǎn),它能做的,很多方法都能做;其他能做的它卻做不了。 第三個(gè)就是Naive Bayes了。Naive Bayes簡(jiǎn)稱NB(牛X),為啥它牛X呢,因?yàn)樗腔贐ayes概率的一種分類方法。貝葉斯方法可以追溯到幾百年前,具有深厚的概率學(xué)基礎(chǔ),可信度非 常高。Naive Baye中文名叫樸素貝葉斯,為啥叫“樸素”呢?因?yàn)槠浠谝粋€(gè)給定假設(shè):給定目標(biāo)值時(shí)屬性之間相互條件獨(dú)立。比如我說“我喜歡你”,該假設(shè)就會(huì)假定 “我”、“喜歡”、“你”三者之間毫無關(guān)聯(lián)。仔細(xì)想想,這幾乎是不可能的。馬克思告訴我們:事物之間是有聯(lián)系的。同一個(gè)事物的屬性之間就更有聯(lián)系了。所 以,單純的使用NB算法效率并不高,大都是對(duì)該方法進(jìn)行了一定的改進(jìn),以便適應(yīng)數(shù)據(jù)的需求。 NB 算法在文本分類中用的非常多,因?yàn)槲谋绢悇e主要取決于關(guān)鍵詞,基于詞頻的文本分類正中NB的下懷。但由于前面提到的假設(shè),該方法對(duì)中文的分類效果不好,因 為中文顧左右而言他的情況太多,但對(duì)直來直去的老美的語言,效果良好。至于核心算法嘛,主要思想全在貝葉斯里面了,沒啥可說的。 第四個(gè)是回歸。回歸有很多,Logistic回歸啊、嶺回歸啊什么的,根據(jù)不同的需求可以分出很多種。這里我主要說說Logistic回歸。為 啥呢?因?yàn)?Logistic回歸主要是用來分類的,而非預(yù)測(cè)。回歸就是將一些數(shù)據(jù)點(diǎn)用一條直線對(duì)這些點(diǎn)進(jìn)行擬合。而Logistic回歸是指根據(jù)現(xiàn)有數(shù)據(jù)對(duì)分類邊界 線建立回歸公式,以此進(jìn)行分類。該方法計(jì)算代價(jià)不高,易于理解和實(shí)現(xiàn),而且大部分時(shí)間用于訓(xùn)練,訓(xùn)練完成后分類很快;但它容易欠擬合,分類精度也不高。主 要原因就是Logistic主要是線性擬合,但現(xiàn)實(shí)中很多事物都不滿足線性的。即便有二次擬合、三次擬合等曲線擬合,也只能滿足小部分?jǐn)?shù)據(jù),而無法適應(yīng)絕 大多數(shù)數(shù)據(jù),所以回歸方法本身就具有局限性。但為什么還要在這里提出來呢?因?yàn)榛貧w方法雖然大多數(shù)都不合適,但一旦合適,效果就非常好。 Logistic 回歸其實(shí)是基于一種曲線的,“線”這種連續(xù)的表示方法有一個(gè)很大的問題,就是在表示跳變數(shù)據(jù)時(shí)會(huì)產(chǎn)生“階躍”的現(xiàn)象,說白了就是很難表示數(shù)據(jù)的突然轉(zhuǎn)折。 所以用Logistic回歸必須使用一個(gè)稱為“海維塞德階躍函數(shù)”的Sigmoid函數(shù)來表示跳變。通過Sigmoid就可以得到分類的結(jié)果。 為了優(yōu)化Logistic回歸參數(shù),需要使用一種“梯度上升法”的優(yōu)化方法。該方法的核心是,只要沿著函數(shù)的梯度方向搜尋,就可以找到函數(shù)的最 佳參數(shù)。但該方法在每次更新回歸系數(shù)時(shí)都需要遍歷整個(gè)數(shù)據(jù)集,對(duì)于大數(shù)據(jù)效果還不理想。所以還需要一個(gè)“隨機(jī)梯度上升算法”對(duì)其進(jìn)行改進(jìn)。該方法一次僅用 一個(gè)樣本點(diǎn)來更新回歸系數(shù),所以效率要高得多。 第五個(gè)是決策樹。據(jù)我了解,決策樹是最簡(jiǎn)單,也是曾經(jīng)最常用的分類方法了。決策樹基于樹理論實(shí)現(xiàn)數(shù)據(jù)分類,個(gè)人感覺就是數(shù)據(jù)結(jié)構(gòu)中的B+樹。決 策樹是一個(gè)預(yù)測(cè)模型,他代表的是對(duì)象屬性與對(duì)象值之間的一種映射關(guān)系。決策樹計(jì)算復(fù)雜度不高、輸出結(jié)果易于理解、對(duì)中間值缺失不敏感、可以處理不相關(guān)特征 數(shù)據(jù)。其比 KNN好的是可以了解數(shù)據(jù)的內(nèi)在含義。但其缺點(diǎn)是容易產(chǎn)生過度匹配的問題,且構(gòu)建很耗時(shí)。決策樹還有一個(gè)問題就是,如果不繪制樹結(jié)構(gòu),分類細(xì)節(jié)很難明白。 所以,生成決策樹,然后再繪制決策樹,最后再分類,才能更好的了解數(shù)據(jù)的分類過程。 決策樹的核心樹的分裂。到底該選擇什么來決定樹的分叉是決策樹構(gòu)建的基礎(chǔ)。最好的方法是利用信息熵實(shí)現(xiàn)。熵這個(gè)概念很頭疼,很容易讓人迷糊,簡(jiǎn)單來說就是信息的復(fù)雜程度。信息越多,熵越高。所以決策樹的核心是通過計(jì)算信息熵劃分?jǐn)?shù)據(jù)集。 我還得說一個(gè)比較特殊的分類方法:AdaBoost。AdaBoost是boosting算法的代表分類器。boosting基于元算法(集成 算法)。即考慮其他方法的結(jié)果作為參考意見,也就是對(duì)其他算法進(jìn)行組合的一種方式。說白了,就是在一個(gè)數(shù)據(jù)集上的隨機(jī)數(shù)據(jù)使用一個(gè)分類訓(xùn)練多次,每次對(duì)分 類正確的數(shù)據(jù)賦權(quán)值較小,同時(shí)增大分類錯(cuò)誤的數(shù)據(jù)的權(quán)重,如此反復(fù)迭代,直到達(dá)到所需的要求。AdaBoost泛化錯(cuò)誤率低、易編碼、可以應(yīng)用在大部分分 類器上、無參數(shù)調(diào)整,但對(duì)離群點(diǎn)敏感。該方法其實(shí)并不是一個(gè)獨(dú)立的方法,而是必須基于元方法進(jìn)行效率提升。個(gè)人認(rèn)為,所謂的“AdaBoost是最好的分 類方法”這句話是錯(cuò)誤的,應(yīng)該是“AdaBoost是比較好的優(yōu)化方法”才對(duì)。 好了,說了這么多了,我有點(diǎn)暈了,還有一些方法過幾天再寫。總的來說,機(jī)器學(xué)習(xí)方法是利用現(xiàn)有數(shù)據(jù)作為經(jīng)驗(yàn)讓機(jī)器學(xué)習(xí),以便指導(dǎo)以后再次碰到的 決策。目前來說,對(duì)于大數(shù)據(jù)分類,還是要借助分布式處理技術(shù)和云技術(shù)才有可能完成,但一旦訓(xùn)練成功,分類的效率還是很可觀的,這就好比人年齡越大看待問題 越精準(zhǔn)的道理是一樣的。這八個(gè)月里,從最初的理解到一步步實(shí)現(xiàn);從需求的邏輯推斷到實(shí)現(xiàn)的方法選擇,每天都是辛苦的,但每天也都是緊張刺激的。我每天都在 想學(xué)了這個(gè)以后可以實(shí)現(xiàn)什么樣的分類,其實(shí)想想都是讓人興奮的。當(dāng)初,我逃避做程序員,主要原因就是我不喜歡做已經(jīng)知道結(jié)果的事情,因?yàn)槟菢拥墓ぷ鳑]有什 么期盼感;而現(xiàn)在,我可以利用數(shù)據(jù)分析得到我想象不到的事情,這不僅滿足了我的好奇感,也讓我能在工作中樂在其中。也許,我距離社會(huì)的技術(shù)需求還有很遠(yuǎn)的 距離,但我對(duì)自己充滿信心,因?yàn)椋也桓械娇菰铮桓械结葆澹m然有些力不從心,但態(tài)度堅(jiān)定。
最后,希望各位能人、牛人、同道中人給予點(diǎn)評(píng),多多交流,一個(gè)人做算法是吃力的,希望各位踴躍評(píng)價(jià),共同進(jìn)步
|