9
本文作者: 天諾 | 2015-05-05 16:54 |
Reza Zadeh是斯坦福大學(xué)工程計(jì)算和數(shù)學(xué)研究所顧問教授,也是Databricks公司技術(shù)顧問,他主要專注于機(jī)器學(xué)習(xí)理論和應(yīng)用,分布式計(jì)算,以及離散應(yīng)用數(shù)學(xué)。近日,他接受了oreilly網(wǎng)站的采訪,嘗試談?wù)摿巳斯ぶ悄艿母鞣矫妗?/span>
神經(jīng)網(wǎng)絡(luò)已卷土重來,并且作為一種新方法,在機(jī)器學(xué)習(xí)中發(fā)揮著越來越重要的角色
通過利用已有算法的監(jiān)督學(xué)習(xí)解決方案,最偉大成就已經(jīng)實(shí)現(xiàn)
Spark是一種特別適合分布式機(jī)器學(xué)習(xí)的環(huán)境
在斯坦福大學(xué),我設(shè)計(jì)并教授分布式算法和優(yōu)化,此外我還教授一門離散數(shù)學(xué)和算法的課程。在離散數(shù)學(xué)課程里,我是完全從理論角度來教算法的,這意味著我所教授的算法完全不依賴于任何編程語言或框架,我們會(huì)直接把許多理論和證明寫在白板上。
但是如果想要更實(shí)際些的話,那就得來我的分布式算法課了,我們會(huì)在Spark編程環(huán)境下工作,而我?guī)缀鯐?huì)花一半時(shí)間在Spark上面。在這個(gè)平臺(tái)上,我所教授的,設(shè)計(jì)分布式算法和機(jī)器學(xué)習(xí)的理論都可以執(zhí)行,而且非常具體。
2006年我來到Google負(fù)責(zé)MapReduce編程模型,實(shí)際上之前Hadoop已經(jīng)廣為人知,也非常流行了,但在Google,MapReduce已經(jīng)十分成熟。當(dāng)時(shí)我只有18歲,也非??春眠@個(gè)項(xiàng)目。于是,我花了很多時(shí)間在MapReduce上構(gòu)建、思考算法,甚至在離開Google之后的很長一段時(shí)間依然持續(xù)這么做。后來有了Spark計(jì)算框架,它是開源的,大家都可以了解其核心,為其做貢獻(xiàn)。我感覺Spark的時(shí)代已經(jīng)到來了,因?yàn)閷?duì)絕大多數(shù)分布式計(jì)算來說,彈性分布式數(shù)據(jù)集是非常抽象的。
從上世紀(jì)90年代開始,機(jī)器學(xué)習(xí)已經(jīng)過了一些過渡時(shí)期。從1995年到2005年,很多人專注在自然語言,搜索,以及信息檢索領(lǐng)域。機(jī)器學(xué)習(xí)工具比如今我們使用的要更加簡(jiǎn)單,他們包括邏輯回歸分析,SVMs(支持向量機(jī)),支持向量機(jī)內(nèi)核,網(wǎng)頁排名等。利用這些技術(shù),Google獲得了巨大成功,比如Google News就非常成功,還有Gmai垃圾郵件分類器,它利用易分布式算法進(jìn)行排名和文本分類。到了上世紀(jì)90年代中期,這些技術(shù)已經(jīng)變得十分成熟了。
大約在2005年左右,神經(jīng)網(wǎng)絡(luò)又開始卷土重來。神經(jīng)網(wǎng)絡(luò)其實(shí)算是上世紀(jì)80年代的技術(shù),一些人甚至認(rèn)為它起源于上世紀(jì)60年代,得益于計(jì)算機(jī)視覺的技術(shù)的最新進(jìn)展,讓(卷積)神經(jīng)網(wǎng)絡(luò)的使用顯得卓有成效。事實(shí)上,神經(jīng)網(wǎng)絡(luò)已經(jīng)開始在其他應(yīng)用上“大展宏圖”,包括自然語言處理和機(jī)器翻譯等領(lǐng)域。
但是有一個(gè)問題:在所有提及的機(jī)器學(xué)習(xí)分布式模型中,神經(jīng)網(wǎng)絡(luò)可能是最具挑戰(zhàn)性的。那些早期模型都已經(jīng)訓(xùn)練成功被分布。我們不需要太過麻煩,就能使用100臺(tái)機(jī)器,并訓(xùn)練一個(gè)邏輯回歸或支持向量機(jī),但是開發(fā)一個(gè)分布式神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)設(shè)置卻難的多。
那么,猜猜看現(xiàn)在神經(jīng)網(wǎng)絡(luò)這塊誰做的最成功?到目前為止,唯一的公司就是Google。他們是這一領(lǐng)域里的先驅(qū)。現(xiàn)在就像是回到了2005年,當(dāng)時(shí)Google發(fā)布了MapReduce,每個(gè)人都爭(zhēng)相建立同樣的基礎(chǔ)設(shè)施。Google實(shí)現(xiàn)了分布神經(jīng)網(wǎng)絡(luò),也得到了更多回報(bào),如今,每個(gè)人都希望他們也能像Google一樣獲得成功,但是好事兒不會(huì)發(fā)生兩次。
首先,評(píng)估一個(gè)支持向量機(jī)要簡(jiǎn)單得多。當(dāng)你學(xué)習(xí)了一個(gè)支持向量機(jī)模型或邏輯回歸模型(或者任何一個(gè)線性模型)之后,實(shí)際評(píng)估就會(huì)非???。比如說你構(gòu)建一個(gè)垃圾郵件分類器,一個(gè)新電子郵件過來后,把它歸到垃圾郵件還是非垃圾郵件只需要花很短時(shí)間就能完成,因?yàn)樗皇且粋€(gè)點(diǎn)積(線性代數(shù)術(shù)語)。
但是當(dāng)涉及神經(jīng)網(wǎng)絡(luò),你的計(jì)算量將會(huì)大大增加,即便你已經(jīng)學(xué)習(xí)了相關(guān)模型,但仍然要搞明白該模型的輸出。而且,這還不是最大的問題,通常一個(gè)支持向量機(jī)應(yīng)對(duì)一百萬個(gè)參數(shù)還游刃有余,但是我所見過一個(gè)成功的最小神經(jīng)網(wǎng)絡(luò),涉及的參數(shù)就多達(dá)600萬個(gè),而且這還是最小的。另一個(gè)問題是訓(xùn)練算法并沒有從最優(yōu)化理論中獲得太多好處。我們所使用的絕大多數(shù)線性模型基本上都有數(shù)學(xué)理論支持,并且可以確定何時(shí)完成訓(xùn)練。這種模式可以確保你能發(fā)現(xiàn)最好的模型,但是神經(jīng)網(wǎng)絡(luò)現(xiàn)有的最優(yōu)化算法無法支持這樣的保證。在你訓(xùn)練了一個(gè)神經(jīng)網(wǎng)絡(luò)之后,其實(shí)無法判斷出它是否是最好的模型。一旦這樣,你就會(huì)不自覺的去想是否還會(huì)有更好的模型,因此就會(huì)不斷訓(xùn)練下去。
是的,我是這樣認(rèn)為的。事實(shí)上,這種狀況現(xiàn)在就正在發(fā)生。總有一些線性模型問題,僅能靠線性來辨別。為了讓非線性參與,你不得不增加或改變一些功能,因此就會(huì)涉及到大量工作。舉個(gè)例子,計(jì)算機(jī)視覺科學(xué)家花了十年時(shí)間開發(fā)、調(diào)試一種名為SIFT的功能,可以支持圖像分類和其他使用線性方法的視覺任務(wù)。但之后,神經(jīng)網(wǎng)絡(luò)出現(xiàn)了,篩選功能變得不再必要,作為訓(xùn)練的一部分,神經(jīng)網(wǎng)絡(luò)的解決方法是讓這些功能自動(dòng)化。
但是我認(rèn)為,現(xiàn)在說神經(jīng)網(wǎng)絡(luò)可以去到所有功能建設(shè)技術(shù)似乎還為時(shí)過早。而且,我也不認(rèn)為會(huì)發(fā)生這種情況,線性模型和優(yōu)秀的人為驅(qū)動(dòng)功能引擎總會(huì)有它的一席之地。就像這次參加神經(jīng)信息處理系統(tǒng)進(jìn)展大會(huì)的研究人員,他們絕大多數(shù)已經(jīng)開始評(píng)估自己應(yīng)用程序的神經(jīng)網(wǎng)絡(luò)。大家都在測(cè)試他們的應(yīng)用程序是否能夠從神經(jīng)網(wǎng)絡(luò)的非線性模式中獲益。
這絕不是說我們之前就沒有過非線性模式,實(shí)際上,我們有許多非線性模式。但問題是,神經(jīng)網(wǎng)絡(luò)碰巧出現(xiàn),而且異常強(qiáng)大,在一些應(yīng)用程序上,它更奏效,因此才會(huì)值得嘗試。這也是很多人正在做的事情。目前為止,在語音識(shí)別,計(jì)算機(jī)視覺,以及機(jī)器翻譯上神經(jīng)網(wǎng)絡(luò)的應(yīng)用都非常成功。它還可以應(yīng)用在許多難度更大的任務(wù)上,因此未來還是十分令人興奮的。
當(dāng)你有一個(gè)線性模型,每一個(gè)功能要么對(duì)你有幫助,要么對(duì)你有傷害,這種假設(shè)是線性模型中固有的。因此線性模型要么功能異常強(qiáng)大,用類1表示;要么則毫無用處,用類2表示。所有的解決方案,要么導(dǎo)致該功能獲得巨大的價(jià)值;要么價(jià)值變得微不足道。你永遠(yuǎn)不會(huì)有這么一個(gè)狀態(tài)說,在這個(gè)區(qū)間,該功能就是代表類1;但是在另一個(gè)區(qū)間,它代表類2。
線性和非線性方法局限性很大。也就是說,如果你分析圖片,舉個(gè)例子,尋找狗狗的照片,它很可能會(huì)進(jìn)入到一個(gè)特定的子集里面,比如只顯示有一只狗的照片,或是顯示某一像素和其他類型的圖片。在線性模式里面,你無法確定復(fù)雜的關(guān)系集。相比于線性模型,非線性模型可能會(huì)顯得更強(qiáng)大一些,但是這種模式同樣難以訓(xùn)練。我們會(huì)再一次進(jìn)入到所謂最優(yōu)化理論的問題之中,這也是我們?cè)诤荛L一段時(shí)間里認(rèn)為神經(jīng)網(wǎng)絡(luò)還不是足夠好的原因之一,因?yàn)樗麄儠?huì)“過擬合”,通俗的說,就是太過強(qiáng)大。我們無法做預(yù)測(cè),也無法確保最優(yōu)化方案?;蛟S,這可能就是為什么神經(jīng)網(wǎng)絡(luò)從當(dāng)下暫時(shí)消失的原因吧。
到目前為止,最成功的方法是監(jiān)督學(xué)習(xí)方法,它使用了一個(gè)比較老的算法,稱為反向傳播,構(gòu)建了一個(gè)擁有許多不同輸出的神經(jīng)網(wǎng)絡(luò)。
讓我們看下一個(gè)神經(jīng)網(wǎng)絡(luò)構(gòu)建,這個(gè)網(wǎng)絡(luò)已經(jīng)非常流行了,叫做卷積神經(jīng)網(wǎng)絡(luò)。這個(gè)理念是機(jī)器學(xué)習(xí)研究人員構(gòu)建了一個(gè)多層架構(gòu)的模型,每一層都可以用不同的方法處理之前一層的連接。
在第一層,你有一個(gè)窗口,上面會(huì)給圖像分配權(quán)值,它也變成了該層的輸入。由于權(quán)值“卷積”,該層也被稱為卷積層,它會(huì)自我重疊。接著后面會(huì)有若干個(gè)不同類型的層,每層都有不同的屬性,絕大多數(shù)都是非線性的。
最后一層會(huì)有1萬個(gè)潛在神經(jīng)元輸入,那些激活的神經(jīng)輸出,每一個(gè)都對(duì)應(yīng)了一個(gè)特殊的標(biāo)簽,可以用來識(shí)別圖像。第一類可能是一只貓,第二類可能是一輛車,以此推到所有一萬個(gè)類,這樣一張“圖像網(wǎng)”就出來了。如果第一個(gè)神經(jīng)元(一只貓)與1萬個(gè)神經(jīng)元中絕大多數(shù)都匹配,那么這張圖像就能被識(shí)別出來,是一張貓的圖像。
這種監(jiān)督學(xué)習(xí)方法的缺點(diǎn)是,在訓(xùn)練的時(shí)候,你必須要在圖像上應(yīng)用標(biāo)簽,這是一輛車,這是一個(gè)動(dòng)物園等。
無監(jiān)督學(xué)習(xí)方法還不是那么受歡迎,它涉及到“自編碼器”。這種神經(jīng)網(wǎng)絡(luò)不會(huì)用來分類圖像,但是可以壓縮圖像。同我剛才提及的方法來讀取圖像,識(shí)別一個(gè)權(quán)值,并在一個(gè)卷積層內(nèi)用像素填滿。其他若干層也這樣,包括相比于其它層小的多的中間層。這樣做的話,相關(guān)的神經(jīng)元會(huì)變得很少,基本上,你讀取圖像時(shí)會(huì)進(jìn)入到一個(gè)瓶頸,之后從另一邊走出來,并嘗試重新構(gòu)建該圖像。
在無監(jiān)督學(xué)習(xí)訓(xùn)練下,不需要打標(biāo)簽,因?yàn)槟闼龅木褪前褕D像放入到神經(jīng)網(wǎng)絡(luò)的兩端,然后訓(xùn)練網(wǎng)絡(luò)適應(yīng)圖像,特別是訓(xùn)練中間層。一旦你這么做了,那么就擁有了一個(gè)知道如何壓縮圖像的神經(jīng)網(wǎng)絡(luò)。無監(jiān)督學(xué)習(xí)方法可以給你提供能應(yīng)用在其他分類器的功能,因此如果你有哪怕一點(diǎn)點(diǎn)標(biāo)簽訓(xùn)練數(shù)據(jù),沒問題,它一樣可以為你提供大量圖像。你可以把這些圖像看做是無標(biāo)簽訓(xùn)練數(shù)據(jù),并使用這些圖像構(gòu)建一個(gè)“自編輯器”,然后從這個(gè)自編輯器中導(dǎo)出一些功能,這些功能適合使用一些訓(xùn)練數(shù)據(jù),以此找到對(duì)特殊模型敏感的自動(dòng)編碼神經(jīng)網(wǎng)絡(luò)中的神經(jīng)元。
之前我就認(rèn)識(shí)Spark的創(chuàng)造者M(jìn)atei Zaharia,我們都是滑鐵盧大學(xué)的校友。實(shí)際上,我們還是Google的同屆實(shí)習(xí)生,他當(dāng)時(shí)負(fù)責(zé)開發(fā)者生產(chǎn)力工具,與大數(shù)據(jù)一點(diǎn)兒關(guān)系都沒有。Matei Zaharia在Google工作期間根本沒有接觸過MapReduce,那是我專注的領(lǐng)域,但最后由他負(fù)責(zé)收尾的確讓人覺得有趣。
之后Matei跳槽去了Facebook,在那里他負(fù)責(zé)Hadoop,并獲得了成功。在那段時(shí)間里,我不斷思考分布式機(jī)器學(xué)習(xí),但什么計(jì)算框架都沒有想出來,包括Hadoop在內(nèi),而此時(shí)Spark計(jì)算框架映入了我的眼簾,我感到非常興奮。
Spark是一種集群計(jì)算環(huán)境,可以為你提供分布式矢量,這種矢量與我們?cè)讵?dú)立機(jī)器上編程所使用的矢量非常相似。在常規(guī)矢量下,有很多事情是做不到的,舉個(gè)例子,僅通過目錄,你無法做到隨機(jī)訪問,但是如果有兩個(gè)矢量交集就能做到這一點(diǎn),你可以并集,也可以分類,還可以做很多常規(guī)矢量無法做到的事情。
Spark讓機(jī)器學(xué)習(xí)變得簡(jiǎn)單,其中一個(gè)原因是它可以盡可能多的在內(nèi)存中保存數(shù)據(jù)的重要部分,而且無需寫入磁盤。在一個(gè)分布式環(huán)境下,獲取故障恢復(fù)的常規(guī)方法是進(jìn)行磁盤寫入,在網(wǎng)絡(luò)中使用分布式文件系統(tǒng)對(duì)一個(gè)磁盤復(fù)制三次。
Spark之所以非常適合機(jī)器學(xué)習(xí),是因?yàn)閿?shù)據(jù)進(jìn)入到內(nèi)存之后,就可以保存其中。如果它不適合內(nèi)存,也沒關(guān)系,有需要時(shí)它就會(huì)離開磁盤。但關(guān)鍵是,它能夠適應(yīng)內(nèi)存,對(duì)于任何一個(gè)需要處理多次數(shù)據(jù)的進(jìn)程來說,比如機(jī)器學(xué)習(xí),都非常棒。幾乎每個(gè)機(jī)器學(xué)習(xí)算法都需要處理海量數(shù)據(jù),而且是十倍,百倍的數(shù)據(jù)。
我必須要明確表達(dá)一下,在很長一段時(shí)間里,Hadoop都是作為一個(gè)生態(tài)系統(tǒng)在茁壯成長。我不認(rèn)為Hadoop生態(tài)系統(tǒng)的MapReduce組件也會(huì)這樣。
如果要回答你的問題的話,我的答案是不,我不認(rèn)為他們能夠處理不同的工作負(fù)荷或職責(zé)。老實(shí)說,我認(rèn)為如果你啟動(dòng)一項(xiàng)新工作,除非你已經(jīng)有了需要維護(hù)的代碼群,否則使用MapReduce一點(diǎn)兒意義都沒有。如果現(xiàn)在還用MapReduce的話,似乎顯得有點(diǎn)二了,換而言之,如果你能寫C++代碼,寫集合代碼是毫無意義的。
RZ:目前來說,Spark本身是非常穩(wěn)定的。目前,或許也是未來幾年可能會(huì)發(fā)生的最大變化,或者說最大提升吧,就是Spark的代碼庫。機(jī)器學(xué)習(xí)代碼庫,圖像處理代碼庫,SQL代碼庫,以及流媒體代碼庫,所有這些都在快速發(fā)展,至少在未來兩年內(nèi),它每一個(gè)變化都令人興奮。Spark所有的功能都是我想要的,而且很高興看到它執(zhí)行起來也非常便捷。同時(shí),對(duì)于社區(qū)驅(qū)動(dòng)的貢獻(xiàn)我也感到由衷的高興,如今在網(wǎng)站上開發(fā)者社區(qū)對(duì)Spark進(jìn)行支持,這樣對(duì)長尾用戶來說是非常有幫助的。
隨著時(shí)間的溝渠,我認(rèn)為Spark會(huì)成為一個(gè)真正的分布式引擎,幫助我們大規(guī)模構(gòu)建機(jī)器學(xué)習(xí)算法。
via radar
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。