如何給非專業(yè)人士講解什么是深度學(xué)習(xí)?
去年開始,工作中需要做許多有關(guān) AI 科普的事情。很長時間里一直在想,該如何給一個沒有 CS 背景的人講解什么是深度學(xué)習(xí),以便讓一個非技術(shù)的投資人、企業(yè)管理者、行業(yè)專家、媒體記者乃至普通大眾明白深度學(xué)習(xí)為什么會特別有效,理解 AI 是如何幫助人們解決具體問題的。中間經(jīng)由 Quora 一篇簡短回答的啟發(fā),大致形成了用水流脈絡(luò)來比擬神經(jīng)網(wǎng)絡(luò)的想法。曾經(jīng)在面向銀行界、教育界、投資界人士的演講中,嘗試過基于這個比喻的講解方法,效果很不錯。慢慢就形成了這樣一篇文章,最近也被收進(jìn)了李開復(fù)和我合著的科普書《人工智能》中。
【注】特別需要說明的是,本文對深度學(xué)習(xí)的概念闡述刻意避免了數(shù)學(xué)公式和數(shù)學(xué)論證,這種用水管網(wǎng)絡(luò)來普及深度學(xué)習(xí)的方法只適合一般公眾。對于懂?dāng)?shù)學(xué)、懂計算機(jī)科學(xué)的專業(yè)人士來說,這樣的描述相當(dāng)不完備也不精確。流量調(diào)節(jié)閥的比喻與深度神經(jīng)網(wǎng)絡(luò)中每個神經(jīng)元相關(guān)的權(quán)重調(diào)整,在數(shù)學(xué)上并非完全等價。對水管網(wǎng)絡(luò)的整體描述也有意忽略了深度學(xué)習(xí)算法中的代價函數(shù)、梯度下降、反向傳播等重要概念。專業(yè)人士要學(xué)習(xí)深度學(xué)習(xí),還是要從專業(yè)教程看起。
從根本上說,深度學(xué)習(xí)和所有機(jī)器學(xué)習(xí)方法一樣,是一種用數(shù)學(xué)模型對真實世界中的特定問題進(jìn)行建模,以解決該領(lǐng)域內(nèi)相似問題的過程。
首先,深度學(xué)習(xí)是一種機(jī)器學(xué)習(xí)。既然名為“學(xué)習(xí)”,那自然與我們?nèi)祟惖膶W(xué)習(xí)過程有某種程度的相似?;叵胍幌拢粋€人類小朋友是如何學(xué)習(xí)的?
人類小朋友是如何學(xué)習(xí)的?機(jī)器又是如何學(xué)習(xí)的?
比如,很多小朋友都用識字卡片來認(rèn)字。從古時候人們用的“上大人、孔乙己”之類的描紅本,到今天在手機(jī)、平板電腦上教小朋友認(rèn)字的識字卡片APP,最基本的思路就是按照從簡單到復(fù)雜的順序,讓小朋友反復(fù)看每個漢字的各種寫法(大一點的小朋友甚至要學(xué)著認(rèn)識不同的書法字體),看得多了,自然就記住了。下次再見到同一個字,就很容易能認(rèn)出來。
這個有趣的識字過程看似簡單,實則奧妙無窮。認(rèn)字時,一定是小朋友的大腦在接受許多遍相似圖像的刺激后,為每個漢字總結(jié)出了某種規(guī)律性的東西,下次大腦再看到符合這種規(guī)律的圖案,就知道是什么字了。
其實,要教計算機(jī)認(rèn)字,差不多也是同樣的道理。計算機(jī)也要先把每一個字的圖案反復(fù)看很多很多遍,然后,在計算機(jī)的大腦(處理器加上存儲器)里,總結(jié)出一個規(guī)律來,以后計算機(jī)再看到類似的圖案,只要符合之前總結(jié)的規(guī)律,計算機(jī)就能知道這圖案到底是什么字。
用專業(yè)的術(shù)語來說,計算機(jī)用來學(xué)習(xí)的、反復(fù)看的圖片叫“訓(xùn)練數(shù)據(jù)集”;“訓(xùn)練數(shù)據(jù)集”中,一類數(shù)據(jù)區(qū)別于另一類數(shù)據(jù)的不同方面的屬性或特質(zhì),叫做“特征”;計算機(jī)在“大腦”中總結(jié)規(guī)律的過程,叫“建模”;計算機(jī)在“大腦”中總結(jié)出的規(guī)律,就是我們常說的“模型”;而計算機(jī)通過反復(fù)看圖,總結(jié)出規(guī)律,然后學(xué)會認(rèn)字的過程,就叫“機(jī)器學(xué)習(xí)”。
到底計算機(jī)是怎么學(xué)習(xí)的?計算機(jī)總結(jié)出的規(guī)律又是什么樣的呢?這取決于我們使用什么樣的機(jī)器學(xué)習(xí)算法。
有一種算法非常簡單,模仿的是小朋友學(xué)識字的思路。家長和老師們可能都有這樣的經(jīng)驗:小朋友開始學(xué)識字,比如先教小朋友分辨“一”、“二”、“三”時,我們會告訴小朋友說,一筆寫成的字是“一”,兩筆寫成的字是“二”,三筆寫成的字是“三”。這個規(guī)律好記又好用。但是,開始學(xué)新字時,這個規(guī)律就未必奏效了。比如,“口”也是三筆,可它卻不是“三”。我們通常會告訴小朋友,圍成個方框兒的是“口”,排成橫排的是“三”。這規(guī)律又豐富了一層,但仍然禁不住識字?jǐn)?shù)量的增長。很快,小朋友就發(fā)現(xiàn),“田”也是個方框兒,可它不是“口”。我們這時會告訴小朋友,方框里有個“十”的是“田”。再往后,我們多半就要告訴小朋友,“田”上面出頭是“由”,下面出頭是“甲”,上下都出頭是“申”。很多小朋友就是在這樣一步一步豐富起來的特征規(guī)律的指引下,慢慢學(xué)會自己總結(jié)規(guī)律,自己記住新的漢字,并進(jìn)而學(xué)會幾千個漢字的。
有一種名叫決策樹的機(jī)器學(xué)習(xí)方法,就和上面根據(jù)特征規(guī)律來識字的過程非常相似。當(dāng)計算機(jī)只需要認(rèn)識“一”、“二”、“三”這三個字時,計算機(jī)只要數(shù)一下要識別的漢字的筆畫數(shù)量,就可以分辨出來了。當(dāng)我們?yōu)榇R別漢字集(訓(xùn)練數(shù)據(jù)集)增加“口”和“田”時,計算機(jī)之前的判定方法失敗,就必須引入其他判定條件。由此一步步推進(jìn),計算機(jī)就能認(rèn)識越來越多的字。




附圖顯示了計算機(jī)學(xué)習(xí)“由”、“甲”、“申”這三個新漢字前后,計算機(jī)內(nèi)部的決策樹的不同。這說明,當(dāng)我們給計算機(jī)“看”了三個新漢字及其特征后,計算機(jī)就像小朋友那樣,總結(jié)并記住了新的規(guī)律,“認(rèn)識”了更多的漢字。這個過程,就是一種最基本的機(jī)器學(xué)習(xí)了。
當(dāng)然,這種基于決策樹的學(xué)習(xí)方法太簡單了,很難擴(kuò)展,也很難適應(yīng)現(xiàn)實世界的不同情況。于是,科學(xué)家和工程師們陸續(xù)發(fā)明出了許許多多不同的機(jī)器學(xué)習(xí)方法。
例如,我們可以把漢字“由”、“甲”、“申”的特征,包括有沒有出頭,筆畫間的位置關(guān)系等,映射到某個特定空間里的一個點(我知道,這里又出現(xiàn)數(shù)學(xué)術(shù)語了。不過這不重要,是否理解“映射”的真實含義,完全不影響后續(xù)閱讀)。也就是說,訓(xùn)練數(shù)據(jù)集中,這三個字的大量不同寫法,在計算機(jī)看來就變成了空間中的一大堆點。只要我們對每個字的特征提取得足夠好,空間中的一大堆點就會大致分布在三個不同的范圍里。
這時,讓計算機(jī)觀察這些點的規(guī)律,看能不能用一種簡明的分割方法(比如在空間中畫直線),把空間分割成幾個相互獨立的區(qū)域,盡量使得訓(xùn)練數(shù)據(jù)集中每個字對應(yīng)的點都位于同一個區(qū)域內(nèi)。如果這種分割是可行的,就說明計算機(jī)“學(xué)”到了這些字在空間中的分布規(guī)律,為這些字建立了模型。


接下來,看見一個新的漢字圖像時,計算機(jī)就簡單把圖像換算成空間里的一個點,然后判斷這個點落在了哪個字的區(qū)域里,這下,不就能知道這個圖像是什么字了嗎?
很多人可能已經(jīng)看出來了,使用畫直線的方法來分割一個平面空間(如附圖所示),很難適應(yīng)幾千個漢字以及總計至少數(shù)萬種不同的寫法。如果想把每個漢字的不同變形都對應(yīng)為空間中的點,那就極難找到一種數(shù)學(xué)上比較直截了當(dāng)?shù)姆椒?,來將每個漢字對應(yīng)的點都分割包圍在不同區(qū)域里。
很多年里,數(shù)學(xué)家和計算機(jī)科學(xué)家就是被類似的問題所困擾。人們不斷改進(jìn)機(jī)器學(xué)習(xí)方法。比如,用復(fù)雜的高階函數(shù)來畫出變化多端的曲線,以便將空間里相互交錯的點分開來,或者,干脆想辦法把二維空間變成三維空間、四維空間甚至幾百維、幾千維、幾萬維的高維空間。在深度學(xué)習(xí)實用化之前,人們發(fā)明了許多種傳統(tǒng)的、非深度的機(jī)器學(xué)習(xí)方法。這些方法雖然在特定領(lǐng)域取得了一定成就,但這個世界實在是復(fù)雜多樣、變化萬千,無論人們?yōu)橛嬎銠C(jī)選擇了多么優(yōu)雅的建模方法,都很難真正模擬世界萬物的特征規(guī)律。這就像一個試圖用有限幾種顏色畫出世界真實面貌的畫家,即便畫藝再高明,他也很難做到“寫實”二字。
那么,如何大幅擴(kuò)展計算機(jī)在描述世界規(guī)律時的基本手段呢?有沒有可能為計算機(jī)設(shè)計一種靈活度極高的表達(dá)方式,然后讓計算機(jī)在大規(guī)模的學(xué)習(xí)過程里不斷嘗試和尋找,自己去總結(jié)規(guī)律,直到最終找到符合真實世界特征的一種表示方法呢?
現(xiàn)在,我們終于要談到深度學(xué)習(xí)了!
深度學(xué)習(xí)就是這樣一種在表達(dá)能力上靈活多變,同時又允許計算機(jī)不斷嘗試,直到最終逼近目標(biāo)的一種機(jī)器學(xué)習(xí)方法。從數(shù)學(xué)本質(zhì)上說,深度學(xué)習(xí)與前面談到的傳統(tǒng)機(jī)器學(xué)習(xí)方法并沒有實質(zhì)性差別,都是希望在高維空間中,根據(jù)對象特征,將不同類別的對象區(qū)分開來。但深度學(xué)習(xí)的表達(dá)能力,與傳統(tǒng)機(jī)器學(xué)習(xí)相比,卻有著天壤之別。
簡單地說,深度學(xué)習(xí)就是把計算機(jī)要學(xué)習(xí)的東西看成一大堆數(shù)據(jù),把這些數(shù)據(jù)丟進(jìn)一個復(fù)雜的、包含多個層級的數(shù)據(jù)處理網(wǎng)絡(luò)(深度神經(jīng)網(wǎng)絡(luò)),然后檢查經(jīng)過這個網(wǎng)絡(luò)處理得到的結(jié)果數(shù)據(jù)是不是符合要求——如果符合,就保留這個網(wǎng)絡(luò)作為目標(biāo)模型,如果不符合,就一次次地、鍥而不舍地調(diào)整網(wǎng)絡(luò)的參數(shù)設(shè)置,直到輸出滿足要求為止。
這么說還是太抽象,太難懂。我們換一種更直觀的講法。
假設(shè)深度學(xué)習(xí)要處理的數(shù)據(jù)是信息的“水流”,而處理數(shù)據(jù)的深度學(xué)習(xí)網(wǎng)絡(luò)是一個由管道和閥門組成的巨大的水管網(wǎng)絡(luò)。網(wǎng)絡(luò)的入口是若干管道開口,網(wǎng)絡(luò)的出口也是若干管道開口。這個水管網(wǎng)絡(luò)有許多層,每一層有許多個可以控制水流流向與流量的調(diào)節(jié)閥。根據(jù)不同任務(wù)的需要,水管網(wǎng)絡(luò)的層數(shù)、每層的調(diào)節(jié)閥數(shù)量可以有不同的變化組合。對復(fù)雜任務(wù)來說,調(diào)節(jié)閥的總數(shù)可以成千上萬甚至更多。水管網(wǎng)絡(luò)中,每一層的每個調(diào)節(jié)閥都通過水管與下一層的所有調(diào)節(jié)閥連接起來,組成一個從前到后,逐層完全連通的水流系統(tǒng)(這里說的是一種比較基本的情況,不同的深度學(xué)習(xí)模型,在水管的安裝和連接方式上,是有差別的)。


那么,計算機(jī)該如何使用這個龐大的水管網(wǎng)絡(luò),來學(xué)習(xí)識字呢?
比如,當(dāng)計算機(jī)看到一張寫有“田”字的圖片時,就簡單將組成這張圖片的所有數(shù)字(在計算機(jī)里,圖片的每個顏色點都是用“0”和“1”組成的數(shù)字來表示的)全都變成信息的水流,從入口灌進(jìn)水管網(wǎng)絡(luò)。
我們預(yù)先在水管網(wǎng)絡(luò)的每個出口都插一塊字牌,對應(yīng)于每一個我們想讓計算機(jī)認(rèn)識的漢字。這時,因為輸入的是“田”這個漢字,等水流流過整個水管網(wǎng)絡(luò),計算機(jī)就會跑到管道出口位置去看一看,是不是標(biāo)記有“田”字的管道出口流出來的水流最多。如果是這樣,就說明這個管道網(wǎng)絡(luò)符合要求。如果不是這樣,我們就給計算機(jī)下達(dá)命令:調(diào)節(jié)水管網(wǎng)絡(luò)里的每一個流量調(diào)節(jié)閥,讓“田”字出口“流出”的數(shù)字水流最多。
這下,計算機(jī)可要忙一陣子了,要調(diào)節(jié)那么多閥門呢!好在計算機(jī)計算速度快,暴力計算外加算法優(yōu)化(其實,主要是精妙的數(shù)學(xué)方法了,不過我們這里不講數(shù)學(xué)公式,大家只要想象計算機(jī)拼命計算的樣子就可以了),總是可以很快給出一個解決方案,調(diào)好所有閥門,讓出口處的流量符合要求。
下一步,學(xué)習(xí)“申”字時,我們就用類似的方法,把每一張寫有“申”字的圖片變成一大堆數(shù)字組成的水流,灌進(jìn)水管網(wǎng)絡(luò),看一看,是不是寫有“申”字的那個管道出口流出來的水最多,如果不是,我們還得再次調(diào)整所有的調(diào)節(jié)閥。這一次,要既保證剛才學(xué)過的“田”字不受影響,也要保證新的“申”字可以被正確處理。
如此反復(fù)進(jìn)行,直到所有漢字對應(yīng)的水流都可以按照期望的方式流過整個水管網(wǎng)絡(luò)。這時,我們就說,這個水管網(wǎng)絡(luò)已經(jīng)是一個訓(xùn)練好的深度學(xué)習(xí)模型了。
例如,附圖顯示了“田”字的信息水流被灌入水管網(wǎng)絡(luò)的過程。為了讓水流更多地從標(biāo)記有“田”字的出口流出,計算機(jī)需要用特定方式近乎瘋狂地調(diào)節(jié)所有流量調(diào)節(jié)閥,不斷實驗、摸索,直到水流符合要求為止。
當(dāng)大量識字卡片被這個管道網(wǎng)絡(luò)處理,所有閥門都調(diào)節(jié)到位后,整套水管網(wǎng)絡(luò)就可以用來識別漢字了。這時,我們可以把調(diào)節(jié)好的所有閥門都“焊死”,靜候新的水流到來。
與訓(xùn)練時做的事情類似,未知的圖片會被計算機(jī)轉(zhuǎn)變成數(shù)據(jù)的水流,灌入訓(xùn)練好的水管網(wǎng)絡(luò)。這時,計算機(jī)只要觀察一下,哪個出口流出來的水流最多,這張圖片寫的就是哪個字。
簡單嗎?神奇嗎?難道深度學(xué)習(xí)竟然就是這樣的一個靠瘋狂調(diào)節(jié)閥門來“湊”出最佳模型的學(xué)習(xí)方法?整個水管網(wǎng)絡(luò)內(nèi)部,每個閥門為什么要如此調(diào)節(jié),為什么要調(diào)節(jié)到如此程度,難道完全由最終每個出口的水流量來決定?這里面,真的沒有什么深奧的道理可言?
深度學(xué)習(xí)大致就是這么一個用人類的數(shù)學(xué)知識與計算機(jī)算法構(gòu)建起整體架構(gòu),再結(jié)合盡可能多的訓(xùn)練數(shù)據(jù),以及計算機(jī)的大規(guī)模運(yùn)算能力去調(diào)節(jié)內(nèi)部參數(shù),盡可能逼近問題目標(biāo)的半理論、半經(jīng)驗的建模方式。
指導(dǎo)深度學(xué)習(xí)的基本是一種實用主義的思想。
不是要理解更復(fù)雜的世界規(guī)律嗎?那我們就不斷增加整個水管網(wǎng)絡(luò)里可調(diào)節(jié)的閥門的個數(shù)(增加層數(shù)或增加每層的調(diào)節(jié)閥數(shù)量)。不是有大量訓(xùn)練數(shù)據(jù)和大規(guī)模計算能力嗎?那我們就讓許多CPU和許多GPU(圖形處理器,俗稱顯卡芯片,原本是專用于作圖和玩游戲的,碰巧也特別適合深度學(xué)習(xí)計算)組成龐大計算陣列,讓計算機(jī)在拼命調(diào)節(jié)無數(shù)個閥門的過程中,學(xué)到訓(xùn)練數(shù)據(jù)中的隱藏的規(guī)律。也許正是因為這種實用主義的思想,深度學(xué)習(xí)的感知能力(建模能力)遠(yuǎn)強(qiáng)于傳統(tǒng)的機(jī)器學(xué)習(xí)方法。
實用主義意味著不求甚解。即便一個深度學(xué)習(xí)模型已經(jīng)被訓(xùn)練得非常“聰明”,可以非常好地解決問題,但很多情況下,連設(shè)計整個水管網(wǎng)絡(luò)的人也未必能說清楚,為什么管道中每一個閥門要調(diào)節(jié)成這個樣子。也就是說,人們通常只知道深度學(xué)習(xí)模型是否工作,卻很難說出,模型中某個參數(shù)的取值與最終模型的感知能力之間,到底有怎樣的因果關(guān)系。
這真是一件特別有意思的事。有史以來最有效的機(jī)器學(xué)習(xí)方法,在許多人看來,竟然是一個只可意會、不可言傳的“黑盒子”。
由此引發(fā)的一個哲學(xué)思辨是,如果人們只知道計算機(jī)學(xué)會了做什么,卻說不清計算機(jī)在學(xué)習(xí)過程中掌握的是一種什么樣的規(guī)律,那這種學(xué)習(xí)本身會不會失控?
比如,很多人由此擔(dān)心,按照這樣的路子發(fā)展下去,計算機(jī)會不會悄悄學(xué)到什么我們不希望它學(xué)會的知識?另外,從原理上說,如果無限增加深度學(xué)習(xí)模型的層數(shù),那計算機(jī)的建模能力是不是就可以與真實世界的終極復(fù)雜度有一比呢?如果這個答案是肯定的,那只要有足夠的數(shù)據(jù),計算機(jī)就能學(xué)會宇宙中所有可能的知識——接下來會發(fā)生什么?大家是不是對計算機(jī)的智慧超越人類有了些許的憂慮?還好,關(guān)于深度學(xué)習(xí)到底是否有能力表達(dá)宇宙級別的復(fù)雜知識,專家們尚未有一致看法。人類至少在可見的未來還是相對安全的。
補(bǔ)充一點:目前,已經(jīng)出現(xiàn)了一些可視化的工具,能夠幫助我們“看見”深度學(xué)習(xí)在進(jìn)行大規(guī)模運(yùn)算時的“樣子”。比如說,谷歌著名的深度學(xué)習(xí)框架TensorFlow就提供了一個網(wǎng)頁版的小工具( Tensorflow — Neural Network Playground ),用人們易于理解的圖示,畫出了正在進(jìn)行深度學(xué)習(xí)運(yùn)算的整個網(wǎng)絡(luò)的實時特征。

附圖顯示了一個包含4層中間層級(隱含層)的深度神經(jīng)網(wǎng)絡(luò)針對某訓(xùn)練數(shù)據(jù)集進(jìn)行學(xué)習(xí)時的“樣子”。圖中,我們可以直觀地看到,網(wǎng)絡(luò)的每個層級與下一個層級之間,數(shù)據(jù)“水流”的方向與大小。我們還可以隨時在這個網(wǎng)頁上改變深度學(xué)習(xí)框架的基本設(shè)定,從不同角度觀察深度學(xué)習(xí)算法。這對我們學(xué)習(xí)和理解深度學(xué)習(xí)大有幫助。

附圖顯示了一個包含4層中間層級(隱含層)的深度神經(jīng)網(wǎng)絡(luò)針對某訓(xùn)練數(shù)據(jù)集進(jìn)行學(xué)習(xí)時的“樣子”。圖中,我們可以直觀地看到,網(wǎng)絡(luò)的每個層級與下一個層級之間,數(shù)據(jù)“水流”的方向與大小。我們還可以隨時在這個網(wǎng)頁上改變深度學(xué)習(xí)框架的基本設(shè)定,從不同角度觀察深度學(xué)習(xí)算法。這對我們學(xué)習(xí)和理解深度學(xué)習(xí)大有幫助。
注:本文摘自李開復(fù)、王詠剛 《人工智能》 一書























