【深度】機器學習進化史:從線性模型到神經網絡


Reza Zadeh是斯坦福大學工程計算和數學研究所顧問教授,也是Databricks公司技術顧問,他主要專注於機器學習理論和應用,分佈式計算,以及離散應用數學。近日,他接受了oreilly網站的採訪,嘗試談論了人工智能的各方面。

  • 神經網絡已捲土重來,並且作為一種新方法,在機器學習中發揮着越來越重要的角色
  • 通過利用已有算法的監督學習解決方案,最偉大成就已經實現
  • Spark是一種特別適合分佈式機器學習的環境

説説你在斯坦福的工作吧在斯坦福大學,我設計並教授分佈式算法和優化,此外我還教授一門離散數學和算法的課程。在離散數學課程裏,我是完全從理論角度來教算法的,這意味着我所教授的算法完全不依賴於任何編程語言或框架,我們會直接把許多理論和證明寫在白板上。

但是如果想要更實際些的話,那就得來我的分佈式算法課了,我們會在Spark編程環境下工作,而我幾乎會花一半時間在Spark上面。在這個平台上,我所教授的,設計分佈式算法和機器學習的理論都可以執行,而且非常具體。

2006年我來到Google負責MapReduce編程模型,實際上之前Hadoop已經廣為人知,也非常流行了,但在Google,MapReduce已經十分成熟。當時我只有18歲,也非常看好這個項目。於是,我花了很多時間在MapReduce上構建、思考算法,甚至在離開Google之後的很長一段時間依然持續這麼做。後來有了Spark計算框架,它是開源的,大家都可以瞭解其核心,為其做貢獻。我感覺Spark的時代已經到來了,因為對絕大多數分佈式計算來説,彈性分佈式數據集是非常抽象的。

機器學習的進化



從你在Google工作,到現在Spark計算框架上工作,應該有機會看到機器學習的進化吧,因為它們和分佈式計算的聯繫都非常緊密,你會如何描述這種進化呢?從上世紀90年代開始,機器學習已經過了一些過渡時期。從1995年到2005年,很多人專注在自然語言,搜索,以及信息檢索領域。機器學習工具比如今我們使用的要更加簡單,他們包括邏輯迴歸分析,SVMs(支持向量機),支持向量機內核,網頁排名等。利用這些技術,Google獲得了巨大成功,比如Google News就非常成功,還有Gmai垃圾郵件分類器,它利用易分佈式算法進行排名和文本分類。到了上世紀90年代中期,這些技術已經變得十分成熟了。

大約在2005年左右,神經網絡又開始捲土重來。神經網絡其實算是上世紀80年代的技術,一些人甚至認為它起源於上世紀60年代,得益於計算機視覺的技術的最新進展,讓(卷積)神經網絡的使用顯得卓有成效。事實上,神經網絡已經開始在其他應用上“大展宏圖”,包括自然語言處理和機器翻譯等領域。

但是有一個問題:在所有提及的機器學習分佈式模型中,神經網絡可能是最具挑戰性的。那些早期模型都已經訓練成功被分佈。我們不需要太過麻煩,就能使用100台機器,並訓練一個邏輯迴歸或支持向量機,但是開發一個分佈式神經網絡學習設置卻難的多。

那麼,猜猜看現在神經網絡這塊誰做的最成功?到目前為止,唯一的公司就是Google。他們是這一領域裏的先驅。現在就像是回到了2005年,當時Google發佈了MapReduce,每個人都爭相建立同樣的基礎設施。Google實現了分佈神經網絡,也得到了更多回報,如今,每個人都希望他們也能像Google一樣獲得成功,但是好事兒不會發生兩次。

為什麼一個支持向量機或邏輯迴歸比神經網絡更容易實現分佈?首先,評估一個支持向量機要簡單得多。當你學習了一個支持向量機模型或邏輯迴歸模型(或者任何一個線性模型)之後,實際評估就會非常快。比如説你構建一個垃圾郵件分類器,一個新電子郵件過來後,把它歸到垃圾郵件還是非垃圾郵件只需要花很短時間就能完成,因為它只是一個點積(線性代數術語)。

但是當涉及神經網絡,你的計算量將會大大增加,即便你已經學習了相關模型,但仍然要搞明白該模型的輸出。而且,這還不是最大的問題,通常一個支持向量機應對一百萬個參數還遊刃有餘,但是我所見過一個成功的最小神經網絡,涉及的參數就多達600萬個,而且這還是最小的。另一個問題是訓練算法並沒有從最優化理論中獲得太多好處。我們所使用的絕大多數線性模型基本上都有數學理論支持,並且可以確定何時完成訓練。這種模式可以確保你能發現最好的模型,但是神經網絡現有的最優化算法無法支持這樣的保證。在你訓練了一個神經網絡之後,其實無法判斷出它是否是最好的模型。一旦這樣,你就會不自覺的去想是否還會有更好的模型,因此就會不斷訓練下去。

當神經網絡變得越來越強大,你會不會看到他們越來越多地被歸入到過去曾是線性的工作方法類別之中呢?是的,我是這樣認為的。事實上,這種狀況現在就正在發生。總有一些線性模型問題,僅能靠線性來辨別。為了讓非線性參與,你不得不增加或改變一些功能,因此就會涉及到大量工作。舉個例子,計算機視覺科學家花了十年時間開發、調試一種名為SIFT的功能,可以支持圖像分類和其他使用線性方法的視覺任務。但之後,神經網絡出現了,篩選功能變得不再必要,作為訓練的一部分,神經網絡的解決方法是讓這些功能自動化。

但是我認為,現在説神經網絡可以去到所有功能建設技術似乎還為時過早。而且,我也不認為會發生這種情況,線性模型和優秀的人為驅動功能引擎總會有它的一席之地。就像這次參加神經信息處理系統進展大會的研究人員,他們絕大多數已經開始評估自己應用程序的神經網絡。大家都在測試他們的應用程序是否能夠從神經網絡的非線性模式中獲益。

這絕不是説我們之前就沒有過非線性模式,實際上,我們有許多非線性模式。但問題是,神經網絡碰巧出現,而且異常強大,在一些應用程序上,它更奏效,因此才會值得嘗試。這也是很多人正在做的事情。目前為止,在語音識別,計算機視覺,以及機器翻譯上神經網絡的應用都非常成功。它還可以應用在許多難度更大的任務上,因此未來還是十分令人興奮的。


神經網絡的關鍵是什麼?



相對於傳統的線性和非線性方法,為什麼神經網絡會如此強大?當你有一個線性模型,每一個功能要麼對你有幫助,要麼對你有傷害,這種假設是線性模型中固有的。因此線性模型要麼功能異常強大,用類1表示;要麼則毫無用處,用類2表示。所有的解決方案,要麼導致該功能獲得巨大的價值;要麼價值變得微不足道。你永遠不會有這麼一個狀態説,在這個區間,該功能就是代表類1;但是在另一個區間,它代表類2。

線性和非線性方法侷限性很大。也就是説,如果你分析圖片,舉個例子,尋找狗狗的照片,它很可能會進入到一個特定的子集裏面,比如只顯示有一隻狗的照片,或是顯示某一像素和其他類型的圖片。在線性模式裏面,你無法確定複雜的關係集。相比於線性模型,非線性模型可能會顯得更強大一些,但是這種模式同樣難以訓練。我們會再一次進入到所謂最優化理論的問題之中,這也是我們在很長一段時間裏認為神經網絡還不是足夠好的原因之一,因為他們會“過擬合”,通俗的説,就是太過強大。我們無法做預測,也無法確保最優化方案。或許,這可能就是為什麼神經網絡從當下暫時消失的原因吧。

在神經網絡理論中,機器學習有很多分支和方法,你能總結一些關鍵方法嗎?到目前為止,最成功的方法是監督學習方法,它使用了一個比較老的算法,稱為反向傳播,構建了一個擁有許多不同輸出的神經網絡。

讓我們看下一個神經網絡構建,這個網絡已經非常流行了,叫做卷積神經網絡。這個理念是機器學習研究人員構建了一個多層架構的模型,每一層都可以用不同的方法處理之前一層的連接。

在第一層,你有一個窗口,上面會給圖像分配權值,它也變成了該層的輸入。由於權值“卷積”,該層也被稱為卷積層,它會自我重疊。接着後面會有若干個不同類型的層,每層都有不同的屬性,絕大多數都是非線性的。

最後一層會有1萬個潛在神經元輸入,那些激活的神經輸出,每一個都對應了一個特殊的標籤,可以用來識別圖像。第一類可能是一隻貓,第二類可能是一輛車,以此推到所有一萬個類,這樣一張“圖像網”就出來了。如果第一個神經元(一隻貓)與1萬個神經元中絕大多數都匹配,那麼這張圖像就能被識別出來,是一張貓的圖像。

這種監督學習方法的缺點是,在訓練的時候,你必須要在圖像上應用標籤,這是一輛車,這是一個動物園等。

沒錯,那麼無監督學習方法呢?無監督學習方法還不是那麼受歡迎,它涉及到“自編碼器”。這種神經網絡不會用來分類圖像,但是可以壓縮圖像。同我剛才提及的方法來讀取圖像,識別一個權值,並在一個卷積層內用像素填滿。其他若干層也這樣,包括相比於其它層小的多的中間層。這樣做的話,相關的神經元會變得很少,基本上,你讀取圖像時會進入到一個瓶頸,之後從另一邊走出來,並嘗試重新構建該圖像。

在無監督學習訓練下,不需要打標籤,因為你所做的就是把圖像放入到神經網絡的兩端,然後訓練網絡適應圖像,特別是訓練中間層。一旦你這麼做了,那麼就擁有了一個知道如何壓縮圖像的神經網絡。無監督學習方法可以給你提供能應用在其他分類器的功能,因此如果你有哪怕一點點標籤訓練數據,沒問題,它一樣可以為你提供大量圖像。你可以把這些圖像看做是無標籤訓練數據,並使用這些圖像構建一個“自編輯器”,然後從這個自編輯器中導出一些功能,這些功能適合使用一些訓練數據,以此找到對特殊模型敏感的自動編碼神經網絡中的神經元。


是什麼讓你投身Spark?你覺得它是領先的技術集合嗎?之前我就認識Spark的創造者Matei Zaharia,我們都是滑鐵盧大學的校友。實際上,我們還是Google的同屆實習生,他當時負責開發者生產力工具,與大數據一點兒關係都沒有。Matei Zaharia在Google工作期間根本沒有接觸過MapReduce,那是我專注的領域,但最後由他負責收尾的確讓人覺得有趣。

之後Matei跳槽去了Facebook,在那裏他負責Hadoop,並獲得了成功。在那段時間裏,我不斷思考分佈式機器學習,但什麼計算框架都沒有想出來,包括Hadoop在內,而此時Spark計算框架映入了我的眼簾,我感到非常興奮。

能跟我們談談Spark究竟是什麼嗎?它是如何運作的,為什麼對分佈式機器學習來説,Spark非常有用?Spark是一種集羣計算環境,可以為你提供分佈式矢量,這種矢量與我們在獨立機器上編程所使用的矢量非常相似。在常規矢量下,有很多事情是做不到的,舉個例子,僅通過目錄,你無法做到隨機訪問,但是如果有兩個矢量交集就能做到這一點,你可以並集,也可以分類,還可以做很多常規矢量無法做到的事情。

Spark讓機器學習變得簡單,其中一個原因是它可以儘可能多的在內存中保存數據的重要部分,而且無需寫入磁盤。在一個分佈式環境下,獲取故障恢復的常規方法是進行磁盤寫入,在網絡中使用分佈式文件系統對一個磁盤複製三次。

Spark之所以非常適合機器學習,是因為數據進入到內存之後,就可以保存其中。如果它不適合內存,也沒關係,有需要時它就會離開磁盤。但關鍵是,它能夠適應內存,對於任何一個需要處理多次數據的進程來説,比如機器學習,都非常棒。幾乎每個機器學習算法都需要處理海量數據,而且是十倍,百倍的數據。

你覺得Spark和MapReduce比較呢?是否有一處可以讓它們兩者能夠處理不同的工作負荷或職責?我必須要明確表達一下,在很長一段時間裏,Hadoop都是作為一個生態系統在茁壯成長。我不認為Hadoop生態系統的MapReduce組件也會這樣。

如果要回答你的問題的話,我的答案是不,我不認為他們能夠處理不同的工作負荷或職責。老實説,我認為如果你啟動一項新工作,除非你已經有了需要維護的代碼羣,否則使用MapReduce一點兒意義都沒有。如果現在還用MapReduce的話,似乎顯得有點二了,換而言之,如果你能寫C++代碼,寫集合代碼是毫無意義的。

Spark未來會朝何處發展?RZ:目前來説,Spark本身是非常穩定的。目前,或許也是未來幾年可能會發生的最大變化,或者説最大提升吧,就是Spark的代碼庫。機器學習代碼庫,圖像處理代碼庫,SQL代碼庫,以及流媒體代碼庫,所有這些都在快速發展,至少在未來兩年內,它每一個變化都令人興奮。Spark所有的功能都是我想要的,而且很高興看到它執行起來也非常便捷。同時,對於社區驅動的貢獻我也感到由衷的高興,如今在網站上開發者社區對Spark進行支持,這樣對長尾用户來説是非常有幫助的。

隨着時間的溝渠,我認為Spark會成為一個真正的分佈式引擎,幫助我們大規模構建機器學習算法。

via radar


資料來源:雷鋒網
作者/編輯:天諾

如果喜歡我們的文章,請即分享到︰