1. 程式人生 > >乾貨丨機器學習知識點(人工智慧篇)

乾貨丨機器學習知識點(人工智慧篇)

640?wx_fmt=gif&wxfrom=5&wx_lazy=1

轉載請標明出處: http://blog.csdn.net/djy1992/article/details/75257551
本文出自:【奧特曼超人的部落格】

機器學習簡史:拍拍貸AI中心資料研發負責人:王春平

一、機器學習簡介

謝謝!首先今天特別榮幸能夠到興業這邊來跟大家一起做這樣一個簡單的分享。之前聽興業的朋友講,在機器學習這個話題方面我們應該是第一次做相關的分享。所以我會從相對廣一點的角度去和大家探討這個主題,並融入我個人在這個領域裡工作和學習的一些體會。後續的“無界”論壇再推出系列專題。如果各位在某一個方面感覺特別有興趣或者是覺得我這裡漏掉了什麼東西,會後我們可以進一步交流。

這是今天要講的整體框架:首先是一個簡單的介紹,然後把一些相對經典的模型串到一起,試圖從中間找一些共通的地方,接下來介紹機器學習應用過程中一些比較常見的套路,還有就是講講我個人對人工智慧未來發展趨勢的看法。

640?wx_fmt=png&wxfrom=5&wx_lazy=1

在簡介這塊,我其實是想做這樣一件事情:把機器學習這樣一個名詞放到一個相對比較大一點的背景來看,它在用資料來驅動業務、在金融方面的資料探勘或者選股等等這樣一些事情中間,是處於一種什麼樣的位置?我們所說的用資料來驅動業務,其實這個業務可以是任何東西,比如說今天大家關注的可能是金融業務,我所在的拍拍貸是網際網路金融業務。從咱們在前兩年就開始興起的一個很熱的概念——大資料,到現在熱的一個概念——人工智慧,然後到我們真正關注的業務,這三者之間其實有很強烈的關係,也可以說大資料和人工智慧先後成為熱點也是有一定內在聯絡的。

640?wx_fmt=png

640?wx_fmt=png

我們認為首先你需要在業務過程中去積累大量的資料,因為當你的資料量足夠大,我們才可以用它去做一些事情。現在人工智慧其實可以更多的看作是工具類的東西,利用大資料這樣一個原料,迴歸到我們所關注的這個業務問題,解決一些實際的問題。這個人工智慧領域呢,它是一個相對比較寬的概念,最近這一兩年人工智慧再次火爆可能是因為AlphaGo引起了熱潮。AlphaGo更多的是和深度學習有關係,但其實人工智慧相對來說是一個比較廣義的概念,任何可以用機器來代替人做事情我們都可以把它認為是人工智慧。它可以包括你寫的一些簡單的規則引擎,做一些預警和監控等等,也包括今天我們要關注的機器學習這樣一個話題。在機器學習裡邊的一個類別就是現在很熱的深度學習。

從我個人理解,機器學習跟廣義的人工智慧的區別在於它是需要從大量的資料裡面去學出來一些東西,然後再去運用,而不僅僅是應用一些專家的經驗。這是它在整個業務和人工智慧中的一個定位,然後我們可以再看一下在整個流程裡面它是什麼樣的狀態。當我們想用資料驅動的方式去解決一個業務問題的時候,一般會要走過這樣幾個大的步驟:首先我們需要關注這個問題本身是什麼,比如我現在看一個金融上的問題,我需要去預測一個股票它在明天是漲還是跌,這是一個比較明確的問題。但是很多時候這個問題沒有那麼清晰明確,所以你可能先要去看這個問題種類。要預測的是什麼,關注的人群或者樣本集是什麼。然後最終希望這個問題帶來的輸出是什麼,等等。這個其實是商業和技術的一個結合,需要兩撥人去共同探討的事情,中間會經過若干個比較偏科研的步驟。你真的需要知道要解決什麼問題以後,然後要建模,學出來一些我們可以應用到業務上的一些規律或者模型。最終會涉及到一個比較偏電子工程的事情是要把學出來這些東西真正部署到線上的系統。假如說我這個系統是一個高頻交易系統,那我學出來的這個交易的邏輯,我就要把它應用過去。假如說是拍拍貸,我學出來的是一個評價借款人信用狀況的模型,那我需要把它應用到整個借款流程,比如說我們APP裡面有一個環節裡需要做的打分這件事情。

640?wx_fmt=jpeg

我們今天主要探討的更多的是科研這一塊,也就是和模型的構建比較相關的話題。在整個機器學習概念裡面,按照學習的時候有沒有老師來教,可以把它分成三個大的類別。一個是就像我在課堂上聽講一樣,老師會教我這個是蘋果,那個是iPhone,那個是桔子等等,對出現的每個樣本都有一個明確的標籤,這個叫做監督學習(Supervised Learning)。假如說有一些問題是完全沒有老師,要靠自己去探索的,叫非監督式學習(Unsupervised Learning)。然後還有一種在一般做資料分析的時候用的不是很多,但是在比如說機器人或者是AlphaGo裡面會涉及的比較多的是增強學習(Reinforcement Learning)。這其實是跟小孩子學東西的過程比較相近,它是一開始沒有老師告訴你任何措施,讓你在實踐中做對的事情得到獎勵,做錯的事情去得到懲罰。通過環境對它的反饋讓它來不斷增強自己對環境的認識。

這三類問題之下,我們最常用,大家用起來感覺最得心應手的應該是第一個:監督學習。監督學習的好處是它對一般問題定義是比較清楚的,然後你有一個明確的要預測的一個目標。比如說它是一個分類問題:你要知道這個人是一個未來預期的使用者,或者是一個會有良好信用的使用者。或者你要知道這些股票明天是會跌或者漲。這些都是有明確的標籤,這種叫分類問題(Classification)。如果是有明確的預測目標,但是這個目標是一個連續的數,比如說你想預測的是股票的價格,那它可以是一個迴歸問題(Regression)。

像後面提及的非監督學習,它之所以叫非監督,一是這個資料本身的理解不是那麼清楚,還有就是有些情況下它的標籤獲取很困難就。就這種問題本身沒有那麼的明確,所以它是一個非監督的。我可能拿到這個資料以後先做一些分析來看一看它是什麼樣的,它裡頭其實是比較包羅永珍的,不像監督學習,有比較清晰的一個方向。所以非監督學習可以根據學習的目的分成幾類。比如說如果我只是想知道現在的這個人群大概是分成幾個群體,但是其實我也不知道應該分成幾個群體,不知道什麼是對的,這個就是分群(clustering)。分段(segmentation)有點像是切分成幾個集合。然後還有一個很重要的也是做降維(dimensional regression),因為現在是一個數據爆炸時代,對於很多人來說,其實資料不是太少而是太多,有可能有成千上萬甚至10萬級這樣的資料維度,特別是在影象資料、自然語音資料這樣一些比較複雜的資料型別或者是網路的一些訪問日誌等等這樣的資料,維度相當高。如果讓它直接做一些前面的監督的話其實是需要特別含量的資料才有可能去決出一個可以用的模型。所以降維這件事情是機器學習方面的一個蠻大的工作。然後下面這個是文字方面的主題模型(topic modeling):一篇文章你可以把它降低到一些主題或者是一些主題的混合。然後還可以做的事情是:有一堆的照片或者視訊,但是我不知道這些照片中會發生什麼比較異常的行為,但是我想知道哪些是異常的,如果全部靠人看的話這就太不經濟了,所以異常發現(abnormal detection)也是一個很大的一個類別,而且在安保這些方面使用的是比較多。

640?wx_fmt=jpeg

這些具體的方法我們就不會再仔細的講了,如果有興趣的話我們可以在以後的分享裡面再討論。稍微回顧一下,簡單概括一下剛才的各種紛繁複雜的方法或者分支。首先我們考慮,它是監督學習還是非監督的。下面是一個簡單的展示圖,左邊是表示一個用來測試一個分類的問題,然後右邊是我有一堆的資料,但是完全不知道應該分幾類,只是稍微去分一下,看一下每一類是不是有相對比較特別一點。這就是監督學習和非監督學習的區別和直觀體驗。

640?wx_fmt=jpeg

這裡還有一個簡單的,和前面有點不一樣的分類方式,前面始終在說問題是怎麼分類的,這是在定義要解決的問題的時候就已經決定了,而不是我們一定要選擇的。但是判別模型(Discriminative model)和生成模型(generative model)這兩個分類更多的指選擇怎麼建模型。這是對於有監督的情況下,可以從這兩方面去考慮。當你有一個學習目標的時候,假如說我只想了解一個條件概率的話,也就是給出自變數X,我想知道Y是什麼樣的情況,這個就是叫判別模型。有些時候我同時也關心X自己的分佈情況,所以我們可能關心的是X和Y的聯合分佈,這時用的是生成模型。一般來說判別模型直接做條件概率效果會比較好,特別是當訓練集和預測集比較一致的情況下。但是對一些比較特殊情況,比如說X裡面有一些變數缺失,如果你有一個聯合分佈,對X本身的分佈有方法可以學出來的話,就可以生成一個新資料集,做真實值指補充等等,這算一些好處。當然生成模型還有一些別的比較好的特性,如果大家有興趣的話,我們以後可以展開。現在先預熱一下,簡單介紹一下機器學習大概的情況。

640?wx_fmt=jpeg

二、機器學習經典模型

下面我們就來講一下模型框架以及經典的機器學習模型

模型框架不是從大家在實際用的時候呼叫程式包的場景來講,而是說如果我真的要去理解這個模型的話,我們從什麼方面考慮會有利於比較不同模型。所以先來講機器學習模型會包括什麼東西。

首先我們需要對這個模型做一些假設:要把模型假定成一個概率問題呢,還是優化問題呢?即模型假設(Model Assumption)。

當你已經假設好這個模型的條件以後,接下來的工作就是該怎麼樣去解出來這中間的一些引數或者是這個結果,利用已知的資料去推演必需的東西,這裡就會涉及到比較多的大家經常聽見的名詞,比如說EM演算法、貝葉斯推斷、Gibbs取樣等等,我們稱之為模型推演(Model Inference)。

如果已經學出來這個模型,下一步就是模型應用層面(Model Application)。因為我們做所有的機器學習的目的都是為了把它用到新的樣本上面去,所以如何把它應用到新的樣本集以及在新的樣本上的適應能力就是大家特別關注的問題,這裡就涉及到這個模型本身是歸納的(inductive)還是傳導的(transductive)。歸納是指可以從已知的這些資料裡面去推出來一個函式表示式,然後帶入相關資料,那就可以算出最新的資料。在選模型或者是做模型的設定的時候,這是一個需要考慮的點,大概會是三大步驟。

640?wx_fmt=jpeg

接下來呢我們可以來看一些很簡單的演算法,但其實也是很經典的。比如說你要做非監督模型,你要做一下聚類,那肯定Kmeans是一個逃不掉東西。它的基本思想很簡單,就是說我有一堆資料想要分堆,假設我是要分成三個堆,那我就先隨機的設三個點,然後通過迭代來實現每個點到它的中心的距離平方和是最小的,就是相當於找到這三個最有代表性的中心點。它是一個很典型的非監督學習,它沒有對資料的分佈做任何的假設,沒有認為它是某種的分佈,或者說,不管是什麼樣的分佈,我都去做這件事情。優化的目標就是要使得它的這三個點是最有代表性的,所以他是把這個問題最終變成了一個做優化求解。當你要有新的資料加進來的時候,也是可以帶入距離的公式,去找到哪個點是對於這個點來說最有代表性的一箇中心點。

640?wx_fmt=jpeg

還有一個大家也是很熟悉的,就是線性迴歸(linear regression)問題,它是監督學習,是有明確的目標的。假如說是一個比較一般的迴歸的話, Y就是X的一個很一般的函式,f(x)就會變成一個簡單的線性加和的關係,這就是我們的模型假設。其實這裡頭你還可以有不同的假設,比如說我現在是假設它有個函式,是有噪聲的,然後我可以進一步假設這個噪聲的分佈,比如說是高斯,接下來的話我要怎麼去解這個問題就是我們剛才講的第二步,要去做這個模型的迭代升級的工作。一般來說,對線性迴歸最常見的一個求解的方式就是把它的目標函式寫成誤差的平方和。這樣做的好處是可以得到一個閉式解,可以最終寫出來,並不需要用迭代的方式去求。後面當我們講到一些套路的時候,其實就比如說對於這個線性迴歸,我也可以通過一些方式在後面在做一些小小的變種,使它具有一些更好的性質。

640?wx_fmt=jpeg

還有一個比較經典的就是用來做分類的邏輯迴歸(logistic regression)。它也是一個監督學習方法,這個模型的假設是基於一個概率。所以它跟線性迴歸其實是不太一樣的,輸出也是一個概率值,我們在用它的時候也是得到的這個概率。比如說我們這裡關心的一個問題是這個借款人他最終會不會按時還款,然後這個模型打分出來的結果就是這個人按時還款的概率值是多少。有了這樣的一個模型的函式以後,接下來就是要解決我該怎麼樣去求解,因為這裡存在一個待定係數:β。對於一個概率問題,一般最常用的一個方式是求log後的likelihood,最終其實也是把這樣一個概率形式的模型轉化成一個優化損失函式(cost function)問題。那其實大家會發現所有的套路基本上都是這樣子:假如說你是要做一個點估計,就是說想估計出來這個引數的一個最優的值的話,基本上套路都是會先假定這個函式形式,找到它的損失函式,去把它變成一個優化問題來解。

640?wx_fmt=jpeg

接下來是支援向量機(support Vector Machine),它也是一個分類問題,但是它跟邏輯迴歸不太一樣的是它沒有做任何概率上的假設,它本身就上來就是一個優化問題:要在這個平面上面要去找一條線,能夠把我這兩個類別給它分開,使得它的邊緣(margin)最大,邊緣就是這個離的最近的這個點到這條線之間的距離。這個是一個完全可以分開成兩類的案例,實際中應用過程之中,它可能過擬合。它也是一個優化問題,優化的目標是最大化這個邊緣。

640?wx_fmt=jpeg

神經網路是一個監督學習,可以用來做迴歸或分類問題。它的思想就是我的一個輸入有很多,然後輸出只有一個。這是我的自變數X和因變數Y(見圖),但是我認為中間有很多的隱藏層,這裡是一層,如果它有很多層的話就是現在比較流行的深度學習(deep learning)架構。每一層其實都是下面一層的一個線性表達函式,這樣一層一層壘起來最終要去優化的就是因變數Y和實際上我們觀察到Y的誤差,也是最小化這個誤差,就可以把它的損失函式寫出來,轉化成優化問題。為什麼大家都那麼喜歡把它轉成優化問題?因為如果它是一個凸問題的話,是已經有很好的解決方案的,相信在座的各位可能都知道,就基本上相當於是把前期的比較麻煩的東西轉化到套路上面。

640?wx_fmt=jpeg

還有一類套路不太一樣的模型——貝葉斯思想,前面我們講的基本上都是點估計。就是我要認為我有一個未知的引數,那我就去估計它的最好值。然後貝葉斯其實是有點不太一樣,是我開始有一個想法,比如說現在想估計的是某一個係數,我一開始什麼都不知道,它可能是等於0.1,可能等於0.9且中間的概率都差不多。但是當我看見了一些資料以後,我的看法就會越來越集中在某一個值上。當我看了一百萬個數據以後基本上就確定它是在我這點上面,但是它其實還是一個很窄的分佈。貝葉斯認為沒有什麼東西是確定的,所有能確定的就是它有一個概率,然後有一個分佈,但是你看了更多的資料以後,你對這個東西的認識就會變得越來越清晰。大概是這樣一個想法,所以貝葉斯的學習的框架就不再是一個點估計了,它會認為我再怎麼學我學出來的使用還是關於這個變數的一個分佈,所以它的最終輸出都會是一個分佈。

640?wx_fmt=jpeg

640?wx_fmt=jpeg

三、機器學習的一些常見討論

接下來給大家簡單介紹一下機器學習的一些常見的套路,這些套路對於大多數的模型都是可以用到的,而且是很可能會碰到的一些問題。一個最常見的問題就是過擬合(overfitting)。所謂過擬合是說我過度信任了看見的這些資料,認為看見的資料就是我所有的真實,而且我可能用一個特別複雜的模型去擬合它。當模型足夠複雜的時候,資料量如果相對較少,你可以找到一個函式特別好,可以完美地把它組合出來,但是這個對於後面再用新的資料就完全沒有用,因為他把噪聲給完美的學下來了。

640?wx_fmt=jpeg

如果這個噪聲是一個隨機項,也沒什麼意義,所以對付這個過擬合的話有一個比較常見的套路,就是給他加這個正則約束項。比如說像剛才提到的那個線性迴歸,假如說我們不加任何調整項的話,它可以直接是一個閉式的解,很簡單。但是同時也會出現一個問題,就是有可能係數會特別大。所以一般來說的話,會希望去加一些懲罰項,使得這些係數不會是一些太大的數,因為太大的數有很多問題,它們可能正負抵消。要去“懲罰”它,可以有很多不同的方式,現在比較流行的比如說加一個L1範數或者是在一個L2範數或者是兩個結合起來,等等。這些懲罰項的選取是對於有不同特點的資料,或者真正的需求不一樣的模型會有所不同。

640?wx_fmt=jpeg

還有一個很常見的方法就是交叉驗證(cross validation)。因為我們很多的模型裡面都會有一些引數需要選擇,其實選引數的時候如果自己手動拍進去不是特別有道理。現在也有一些可能比較好的選參方法,但是絕對可行的,而且比較萬能的,就是這個交叉驗證。把所有的訓練集分成很多組,然後每次把每一個組用來做驗證集,其他組做訓練集。比如說一共有五個的話就有五個測試集,有五組結果,去不停地調引數。比如說這個案例裡面它就是把這個叫做M的變數調來調去的,就會發現在訓練集上誤差是越來越小,在測試集上誤差有可能先小後大。在這個測試集的跳變點附近,一般來說就是比較優化的選擇。

640?wx_fmt=jpeg

還有一個現在特別熱門的方向,這個套路是假如說我有一些弱的分類器或是弱的模型,那我們把它整合(Ensemble)起來去解決一些問題,這裡麵包括Bagging、Boosting、Stacking等等各種不同的方式,即分類器整合

我們首先來講一下Bagging。這個圖看起來很複雜,但是簡單的來說就是我原來可能只有一千個資料,就很難去檢驗我這個資料,或者檢驗這個模型受不同資料的影響會比較大,因為我不是有十萬或一百萬的資料,不能做各種不同的抽樣。假如我只有一千個資料,那我每次都從這1000個數據中分出來不同的資料,來做各個子集。這些資料其實都來自同一個地方,訓練出來很多個模型,然後再把它組合起來,簡單來說是這樣。然後子集的生成都是隨機的,沒有什麼特殊的關照。我們現在比較流行的隨機森林(random forest)應該是基於這個思想。

640?wx_fmt=jpeg

然後還有一個方法是Boosting,Boosting和Bagging主要的區別是,Bagging是隨機的分很多類再結合起來,Boosting其實是從每一次都是弱分類器分好以後,原來很不好的結果權重加重,再繼續分。它也是做很多很多次,最後也是結合起來。

640?wx_fmt=jpeg

還有一個是Stacking,這個看圖的話就更要暈過啦。簡單的來講就是假如有好幾個感測器,比如說有的時候做GBBoost,隨機森林,等等各種分類器,我都把它用來在訓練集上學習,得到一個模型並且預測出來一些結果。然後根據預測出來的結果,我再在上面用對應的方法學出來的模型,相當於是在模型上面套一層模型。這個模型的輸入是上面這些模型的輸出,就是相當於是看哪個模型應該有更多的權重,而不是直接把每個模型的輸出平均起來,可能做的比較好的模型權重相對比較高,所以這個方式一般來說會大大提高表現。特別是當基模型之間的差異度比較大的時候。如果基模型都差不多,那無論怎麼樣平均結果也都差不多。這是一些簡單套路,後期還有更多套路,這幾個是比較通用的。

640?wx_fmt=jpeg

四、機器學習未來發展趨勢

最後簡單說一下我個人對機器學習發展趨勢的理解。其實我在準備PPT的時候在網上搜了一下,發現搜出來的結果可以說是五花八門的。有的人可能是學者型的,他完全講的就是學術上的趨勢。有的可能是屬於那種偏社會學的,他講的趨勢可能是更多的對未來社會方方面面的影響。我這邊是想作為一個在這個行業裡面,自己本身是在做這方面事情的人來談談這方面的體驗。

其中一個趨勢便是通用化越來越強。像以前做機器學習的人,基本上做文字的人專門做文字,做影象的專門做影象,做聲音的人專門做聲音,做結構化資料的人專門做結構化資料。然後每一種方法對應的資料來源本上都是有很特殊的提取,預測的方法。但是現在隨著深度學習不斷的變熱起來,被大家所理解。其實有很多不同資料來源,它的演算法框架上很接近,就越來越通用化。

還有一個趨勢是工具化。越來越多的開源的工具性的產品使得機器學習這件事情的成本大大降低。以前可能都需要寫程式碼,甚至是最開始可能需要自己去推導我剛才講到的那些模型的假設,根據模型的假設具體做優化。發展到後面可以寫一些程式碼來調包。現在像TPOT這種軟體,甚至是可以完全視窗化,拖拖拽拽就可以訓練模型,或者是你什麼都不幹,它自己自動用很多種模型都跑一遍,所有的引數都調一遍。所以整體上來說是有一個使用者門檻降低的趨勢。

還有一個就是隨著機器計算的成本變得越來越低,現在有點往暴力化的方向發展。以前可能更多的是專家的經驗建一些變數,調參可能也需要有一些技術。但是未來的話,感覺哪怕對於不太懂的人,假如說他有足夠的時間,足夠強的機器去算的話,也可以通過暴力的方式,做出一些比較好的模型。這些趨勢當然並不是說就不需要一些比較多的人去真正做一些模型的選擇,或者是變數的選擇。只是很多人群其實可以用到機器學習的很多的工具,去解決很多日常生活中比較基本的問題。

640?wx_fmt=jpeg

我今天大概就到這裡吧,然後如果有對於某一個話題比較感興趣的話,歡迎大家在本文下進行評論溝通,謝謝大家!

640?wx_fmt=jpeg