1
本文作者: 楊曉凡 | 2019-08-14 22:13 | 專題:IJCAI 2019 |
雷鋒網(wǎng) AI 科技評論按:8 月 10 日至 16 日,IJCAI 2019 在中國澳門隆重召開。14 日下午,南京大學(xué)周志華教授進行特邀大會演講,演講主題是《Deep Learning: Why deep and is it only doable for neural networks?》。在演講中,周志華教授從自己的角度解讀了深度神經(jīng)網(wǎng)絡(luò)之所以獲得成功的本質(zhì)因素,以及如何在兼顧這些因素的同時,找到神經(jīng)網(wǎng)絡(luò)之外的其它的深度模型。
雷鋒網(wǎng) AI 科技評論把演講全文整理如下。
深度學(xué)習(xí)今天已經(jīng)有各種各樣的應(yīng)用,到處都是它,不管圖像也好,視頻也好,聲音自然語言處理等等。那么我們問一個問題,什么是深度學(xué)習(xí)?
我想大多數(shù)人的答案,就是深度學(xué)習(xí)差不多就等于深度神經(jīng)網(wǎng)絡(luò)。有一個非常著名的學(xué)會叫 SIAM,是國際工業(yè)與應(yīng)用數(shù)學(xué)學(xué)會,他們有一個旗艦的報紙叫 SIAM news。在去年的 6 月份,這個報紙的頭版上就有這么一篇文章,直接就說了這么一句話,說深度學(xué)習(xí)是機器學(xué)習(xí)中使用深度神經(jīng)網(wǎng)絡(luò)的的子領(lǐng)域。所以如果我們要談深度學(xué)習(xí)的話,是繞不開深度神經(jīng)網(wǎng)絡(luò)的。
首先我們必須從神經(jīng)網(wǎng)絡(luò)說起。神經(jīng)網(wǎng)絡(luò)其實并不是一個新生事物,神經(jīng)網(wǎng)絡(luò)可以說在人工智能領(lǐng)域已經(jīng)研究了超過半個世紀(jì)。但是以往的話,一般我們用的是很淺的神經(jīng)網(wǎng)絡(luò),就是中間只有一個隱層,或者有兩個隱層。在這樣的神經(jīng)網(wǎng)絡(luò)里面,它的每一個連續(xù)的單元都是非常簡單、有條件的,這樣才能起作用。我們收到一些簡單的神經(jīng)行為輸入,這些輸入通過一些計算得到輸出,成為后續(xù)的神經(jīng)元的輸入。它就是這么一個非常簡單的公式。所謂的神經(jīng)網(wǎng)絡(luò),是很多這樣的公式經(jīng)過嵌套迭代得到的一個系統(tǒng),這叫做 M-P 模型。如今我們使用的神經(jīng)網(wǎng)絡(luò)里的神經(jīng)元就是這樣的,即便它是半個世紀(jì)前的產(chǎn)物。
那么今天當(dāng)我們說用深度神經(jīng)網(wǎng)絡(luò)的時候,它和以前的神經(jīng)網(wǎng)絡(luò)的區(qū)別是什么?簡單來說,就是我們用的層數(shù)會很深很深,網(wǎng)絡(luò)有很多個隱層。在 2012 年深度學(xué)習(xí)、卷積神經(jīng)網(wǎng)絡(luò)剛剛開始受到大家重視的時候,那時候 ImageNet 競賽的冠軍是用了 8 層的神經(jīng)網(wǎng)絡(luò)。那么到了 2015 年是用了 152 層,到了 2016 年是 1207 層。如今,數(shù)千層深的網(wǎng)絡(luò)非常常見。這是個非常龐大非常巨大的系統(tǒng),把這么一個系統(tǒng)訓(xùn)練出來,難度是非常大的。
有一點非常好的消息,我們現(xiàn)在有很強大的計算設(shè)施。但是說到最基礎(chǔ)的層面,很幸運的是,神經(jīng)網(wǎng)絡(luò)里面的計算單元,最重要的激活函數(shù)是連續(xù)的、可微的。比如說我們在以往常用這樣的 sigmoid 函數(shù),它是連續(xù)可微的,現(xiàn)在大家常用的 ReLu 函數(shù)或者它的變體,也是這樣。這使得我們可以容易地進行梯度計算,這樣就可以很容易用著名的 BP(backpropagation,反向傳播)算法來訓(xùn)練。通過這樣的算法,我們的神經(jīng)網(wǎng)絡(luò)已經(jīng)取得了非常多的勝利。
不過它的前提是依賴梯度。如果一個問題是不可微分的、不可計算梯度的,我們就無法為它訓(xùn)練一個神經(jīng)網(wǎng)絡(luò)。這非常重要。而且在 2006 年之前,也沒有人知道如何訓(xùn)練深度超過 5 層的神經(jīng)網(wǎng)絡(luò),不是因為計算設(shè)施不夠強大,而是我們無法解決梯度消失的問題。Geoffery Hinton 等人做出了巨大的貢獻,他們表明通過逐層訓(xùn)練(layer-by-layer precision)和預(yù)訓(xùn)練(pre-training)我們可以克服梯度消失的問題。介紹這些都是為了說明神經(jīng)網(wǎng)絡(luò)需要可微的函數(shù)、需要能夠計算梯度,這是最根本最重要的。雖然如今有一些研究不可微的函數(shù)的,但還是需要轉(zhuǎn)換成某種可微的。
但是實際上在學(xué)術(shù)界大家一直沒有想清楚一件事情,就是我們?yōu)槭裁匆眠@么深的模型,或者說為什么深的模型要比淺的模型表現(xiàn)好那么多?到今天為止,學(xué)術(shù)界都還沒有統(tǒng)一的看法。有很多的論述。我在這里面跟大家講一個我們前段時間給出的一個論述。這個論述其實主要是從模型的復(fù)雜度的角度來討論。
我們知道一個機器學(xué)習(xí)模型,它的復(fù)雜度實際上和它的容量有關(guān),而容量又跟它的學(xué)習(xí)能力有關(guān)。所以就是說學(xué)習(xí)能力和復(fù)雜度是有關(guān)的。機器學(xué)習(xí)界早就知道,如果我們能夠增強一個學(xué)習(xí)模型的復(fù)雜度,那么它的學(xué)習(xí)能力能夠提升。
那怎么樣去提高復(fù)雜度,對神經(jīng)網(wǎng)絡(luò)這樣的模型來說,有兩條很明顯的途徑。一條是我們把模型變深,一條是把它變寬。如果從提升復(fù)雜度的角度,那么變深是會更有效的。當(dāng)你變寬的時候,你只不過是增加了一些計算單元,增加了函數(shù)的個數(shù),在變深的時候不僅增加了個數(shù),其實還增加了它的嵌入的程度。所以從這個角度來說,我們應(yīng)該嘗試去把它變深。
那大家可能就會問了,既然你們早就知道要建立更深的模型了?那么現(xiàn)在才開始做?這就涉及到另外一個問題,我們把機器學(xué)習(xí)的學(xué)習(xí)能力變強了,這其實未必是一件好事。因為機器學(xué)習(xí)一直在斗爭的一個問題,就是經(jīng)常會碰到過擬合(overfit)。這是一種什么樣的現(xiàn)象?你給我一個數(shù)據(jù)集,我做機器學(xué)習(xí)要把數(shù)據(jù)集里面的東西學(xué)出來,學(xué)出來之后,我希望學(xué)到的是一般規(guī)律,能夠用來預(yù)測未來的事情。但是有時候我可能把這個數(shù)據(jù)本身的一些獨特特性學(xué)出來了,而不是一般規(guī)律。錯誤地把它當(dāng)成一般規(guī)律來用的時候,會犯巨大的錯誤。這種現(xiàn)象就是所謂的過擬合,就是因為模型的學(xué)習(xí)能力太強了。所以我們以往通常不太愿意用太復(fù)雜的模型。
那現(xiàn)在我們?yōu)槭裁纯梢杂煤軓?fù)雜的模型?其實我們設(shè)計了許多方法來對付過擬合,比如神經(jīng)網(wǎng)絡(luò)有 dropout、early-stop 等。但有一個因素非常簡單、非常有效,那就是用很大的數(shù)據(jù)。比如說我手上如果只有 3000 個數(shù)據(jù),那我學(xué)出來的特性一般不太可能是一般規(guī)律,但是如果有 3000 萬、30 億的數(shù)據(jù),那這個數(shù)據(jù)里面的特性可能本身就已經(jīng)是一般規(guī)律。所以使用大的數(shù)據(jù)是緩解過擬合的一個關(guān)鍵的途徑。第二,今天我們有了很多很強大的計算設(shè)備,這使得我們能夠使用大規(guī)模數(shù)據(jù)訓(xùn)練模型。第三,通過我們這個領(lǐng)域很多學(xué)者的努力,有了大量的訓(xùn)練這樣復(fù)雜模型的技巧、算法,這使得我們使用復(fù)雜模型成為可能。總結(jié)一下就是:第一我們有了更大的數(shù)據(jù);第二我們有強力的計算設(shè)備;第三我們有很多有效的訓(xùn)練技巧。這導(dǎo)致我們可以用高復(fù)雜度的模型,而深度神經(jīng)網(wǎng)絡(luò)恰恰就是一種很便于實現(xiàn)的高復(fù)雜度模型。
所以用這么一套理論,好像是能夠解釋我們現(xiàn)在為什么能夠用深度神經(jīng)網(wǎng)絡(luò),為什么深度神經(jīng)網(wǎng)絡(luò)能成功?就是因為復(fù)雜度大。在一年多之前,我們把這個解釋說出來的時候,其實國內(nèi)外很多同行也還很贊同,覺得還蠻有道理的。但是其實我自己一直對這個解釋不是特別的滿意,因為一個潛在的問題我們一直沒有回答。
如果從復(fù)雜度這個角度去解釋的話,我們就沒法說清楚為什么扁平的(flat),或者寬的網(wǎng)絡(luò)做不到深度神經(jīng)網(wǎng)絡(luò)的性能?實際上我們把網(wǎng)絡(luò)變寬,雖然它的效率不是那么高,但是它同樣也能起到增加復(fù)雜度的能力。
實際上只要有一個隱層,加無限多的神經(jīng)元進去,它的復(fù)雜度也會變得很大。但是這樣的模型在應(yīng)用里面怎么試,我們都發(fā)現(xiàn)它不如深度神經(jīng)網(wǎng)絡(luò)好。所以從復(fù)雜度的角度可能很難回答這個問題,我們需要一點更深入的思考。所以我們要問這么一個問題:深度神經(jīng)網(wǎng)絡(luò)里面最本質(zhì)的東西到底是什么?
今天我們的回答是,本質(zhì)是表征學(xué)習(xí)的能力。這已經(jīng)成為了學(xué)術(shù)界的新的共識,甚至有了專門的會議 ICLR。以往我們用機器學(xué)習(xí)解決一個問題的時候,首先我們拿到一個數(shù)據(jù),比如說這個數(shù)據(jù)對象是個圖像,然后我們就用很多特征把它描述出來,比如說顏色、紋理等等。這些特征都是我們?nèi)祟悓<彝ㄟ^手工來設(shè)計的,表達出來之后我們再去進行學(xué)習(xí)。而今天我們有了深度學(xué)習(xí)之后,現(xiàn)在不再需要手工去設(shè)計特征了。你把數(shù)據(jù)從一端扔進去,結(jié)果從另外一端就出來了,中間所有的特征完全可以通過學(xué)習(xí)自己來解決。所以這就是我們所謂的特征學(xué)習(xí),或者說表征學(xué)習(xí)。我們都認可這和以往的機器學(xué)習(xí)技術(shù)相比可以說是一個很大的進步,這一點非常重要。我們不再需要依賴人類專家去設(shè)計特征了。
這個過程中的關(guān)鍵點是什么呢?是逐層計算,layer-by-layer processing。
我引述最近非常流行的一本書——《深度學(xué)習(xí)》里面的一個圖:當(dāng)我們拿到一個圖像的時候,我們?nèi)绻焉窠?jīng)網(wǎng)絡(luò)看作很多層,首先它在最底層,好像我們看到的是一些像素這樣的東西。當(dāng)我們一層一層往上的時候,慢慢的可能有邊緣,再網(wǎng)上可能有輪廓,甚至對象的部件等等。當(dāng)然這實際上只是個示意圖,在真正的神經(jīng)網(wǎng)絡(luò)模型里面不見得會有這么清楚的分層。但是總體上當(dāng)我們逐漸往上的時候,它確實是不斷在對對象進行抽象。我們現(xiàn)在認為這好像是深度學(xué)習(xí)為什么成功的關(guān)鍵因素之一。因為扁平神經(jīng)網(wǎng)絡(luò)能做很多深層神經(jīng)網(wǎng)絡(luò)能做的事,但是有一點它是做不到的。當(dāng)它是扁平的時候,它就沒有進行這樣的一個深度的加工。所以深度的逐層抽象這件事情,可能是很淺層神經(jīng)網(wǎng)絡(luò)和深層神經(jīng)網(wǎng)絡(luò)之間的關(guān)鍵區(qū)別。
當(dāng)然了,這也是一種猜測,我們目前還無法從數(shù)學(xué)上證明。
「逐層計算」在機器學(xué)習(xí)里面也不是新東西。比如說決策樹就是一種逐層處理,這是非常典型的。決策樹模型已經(jīng)有五六十年的歷史了,但是它為什么做不到深度神經(jīng)網(wǎng)絡(luò)這么好呢?我想答案很簡單。首先它的復(fù)雜度不夠,決策樹的深度,如果我們只考慮離散特征的話,它最深的深度不會超過特征的個數(shù),所以它的模型復(fù)雜度是有限的;而在神經(jīng)網(wǎng)絡(luò)中,當(dāng)我們想要增加模型復(fù)雜度的時候,我們增加任意數(shù)目的層,沒有任何的限制。第二,也是更重要的,在整個決策樹的學(xué)習(xí)過程中,它內(nèi)部沒有進行特征的變換,從第一層到最后一層始終是在同一個原始特征空間里面進行的,這非常重要。我們相信這兩點對于深度神經(jīng)網(wǎng)絡(luò)是非常重要的。
而當(dāng)我們考慮到這兩件事情的時候,我們就會發(fā)現(xiàn),其實深度模型是一個非常自然的選擇。有了這樣的模型,我們很容易就可以做上面兩件事。但是當(dāng)我們選擇用這么一個深度模型的時候,我們就會有很多問題,它容易 overfit,所以我們要用大數(shù)據(jù);它很難訓(xùn)練,我們要有很多訓(xùn)練的 trick;這個系統(tǒng)的計算開銷非常大,所以我們要有非常強有力的計算的設(shè)備,比如 GPU 等等。
實際上所有這些東西是因為我們選用了深度模型之后產(chǎn)生的一個結(jié)果,它們不是我們用深度學(xué)習(xí)的原因。所以這和以往的思考不太一樣,以往我們認為有了這些東西,導(dǎo)致我們用深度模型。其實現(xiàn)在我們覺得這個因果關(guān)系恰恰是反過來,因為我們要用它,所以我們才會考慮上面這些東西。這曾經(jīng)是使用淺網(wǎng)絡(luò)的原因,如今也可以是使用很深的網(wǎng)絡(luò)的原因。
另外還有一點我們要注意的,當(dāng)我們有很大的訓(xùn)練數(shù)據(jù)的時候,這就要求我們必須要有很復(fù)雜的模型。否則假設(shè)我們用一個線性模型的話,給你 2000 萬樣本還是 2 億的樣本,其實對它沒有太大區(qū)別。它已經(jīng)學(xué)不進去了。而我們有了充分的復(fù)雜度,恰恰它又給我們使用深度模型加了一分。所以正是因為這幾個原因,我們才覺得這是深度模型里面最關(guān)鍵的事情。
這是我們現(xiàn)在的一個認識:第一,我們要有逐層的處理;第二,我們要有特征的內(nèi)部變換;第三,我們要有足夠的模型復(fù)雜度。這三件事情是我們認為深度神經(jīng)網(wǎng)絡(luò)為什么能夠成功的比較關(guān)鍵的原因?;蛘哒f,這是我們給出的一個猜測。
那如果滿足這幾個條件,我們其實馬上就可以想到,那我不一定要用神經(jīng)網(wǎng)絡(luò)。神經(jīng)網(wǎng)絡(luò)可能只是我可以選擇的很多方案之一,我只要能夠同時做到這三件事,那我可能用別的模型做也可以,并不是一定只能是用深度神經(jīng)網(wǎng)絡(luò)。
第一,凡是用過深度神經(jīng)網(wǎng)絡(luò)的人都會知道,你要花大量的精力來調(diào)它的參數(shù),因為這是個巨大的系統(tǒng)。那這會帶來很多問題。首先我們調(diào)參數(shù)的經(jīng)驗其實是很難共享的。有的朋友可能說,你看我在第一個圖像數(shù)據(jù)集上調(diào)參數(shù)的經(jīng)驗,當(dāng)我用第二個圖像數(shù)據(jù)集的時候,這個經(jīng)驗肯定是可以重用一部分。但是我們有沒有想過,比如說我們在圖像上面做了一個很大的深度神經(jīng)網(wǎng)絡(luò),這時候如果要去做語音的時候,其實在圖像上面調(diào)參數(shù)的經(jīng)驗,在語音問題上基本上不太有借鑒作用。所以當(dāng)我們跨任務(wù)的時候,這些經(jīng)驗可能就很難共享。
第二個問題,今天大家都非常關(guān)注我們做出來的結(jié)果的可重復(fù)性,不管是科學(xué)研究也好,技術(shù)發(fā)展也好,都希望這個結(jié)果可重復(fù)。而在整個機器學(xué)習(xí)領(lǐng)域,可以說深度學(xué)習(xí)的可重復(fù)性是最弱的。我們經(jīng)常會碰到這樣的情況,有一組研究人員發(fā)文章說報告了一個結(jié)果,而這個結(jié)果其他的研究人員很難重復(fù)。因為哪怕你用同樣的數(shù)據(jù),同樣的方法,只要超參數(shù)的設(shè)置不一樣,你的結(jié)果就不一樣。
還有很多問題,比如說我們在用深度神經(jīng)網(wǎng)絡(luò)的時候,模型復(fù)雜度必須是事先指定的。因為我們在訓(xùn)練這個模型之前,我們這個神經(jīng)網(wǎng)絡(luò)是什么樣就必須定了,然后我們才能用 BP 算法等等去訓(xùn)練它。其實這會帶來很大的問題,因為我們在沒有解決這個任務(wù)之前,我們怎么知道這個復(fù)雜度應(yīng)該有多大呢?所以實際上大家做的通常都是設(shè)更大的復(fù)雜度。
如果大家關(guān)注過去 3、4 年深度學(xué)習(xí)這個領(lǐng)域的進展,你可以看到很多最前沿的工作在做的都是在有效的縮減網(wǎng)絡(luò)的復(fù)雜度。比如說 RestNet 這個網(wǎng)絡(luò)通過加了 shortcuts,有效地使得復(fù)雜度變小。還有最近大家經(jīng)常用的一些模型壓縮,甚至權(quán)重的二值化,其實都是在把復(fù)雜度變小。實際上它是先用了一個過大的復(fù)雜度,然后我們再把它降下來。那么我們有沒有可能在一開始就讓這個模型的復(fù)雜度隨著數(shù)據(jù)而變化,這點對神經(jīng)網(wǎng)絡(luò)可能很困難,但是對別的模型是有可能的。還有很多別的問題,比如說理論分析很困難,需要非常大的數(shù)據(jù),黑箱模型等等。
那么從另外一個方面,有人可能說你是做學(xué)術(shù)研究,你們要考慮這些事,我是做應(yīng)用的,什么模型我都不管,你只要能給我解決問題就好了。其實就算從這個角度來想,我們研究神經(jīng)網(wǎng)絡(luò)之外的模型也是很需要的。
雖然在今天深度神經(jīng)網(wǎng)絡(luò)已經(jīng)這么的流行,這么的成功,但是其實我們可以看到在很多的任務(wù)上,性能最好的不見得完全是深度神經(jīng)網(wǎng)絡(luò)。比如說 Kaggle 上面的很多競賽有各種各樣的真實問題,有買機票的,有訂旅館的,有做各種的商品推薦等等,還有一些來自企業(yè)的真實的工業(yè)問題,他們只考慮模型的表現(xiàn),我們就可以看到在很多任務(wù)上的勝利者并不是神經(jīng)網(wǎng)絡(luò),它往往是像隨機森林,像 xgboost 等等這樣的模型。深度神經(jīng)網(wǎng)絡(luò)獲勝的任務(wù),往往就是在圖像、視頻、聲音這幾類典型任務(wù)上,都是連續(xù)的數(shù)值建模問題。而在別的凡是涉及到混合建模、離散建模、符號建模這樣的任務(wù)上,其實深度神經(jīng)網(wǎng)絡(luò)的性能可能比其他模型還要差一些。這也就是我們說的「沒有免費的午餐定理」,已經(jīng)有數(shù)學(xué)證明,一個模型不可能在所有任務(wù)中都得到最好的表現(xiàn)。所以我們有必要探索神經(jīng)網(wǎng)絡(luò)之外的深度模型。
那么,有沒有可能做出合適的深度模型,在這些任務(wù)上得到更好的性能呢?
我們從學(xué)術(shù)的觀點來總結(jié)一下,今天我們談到的深度模型基本上都是深度神經(jīng)網(wǎng)絡(luò)。如果用術(shù)語來說的話,它是多層、可參數(shù)化的、可微分的非線性模塊所組成的模型,而這個模型可以用 BP 算法來訓(xùn)練。
那么這里面有兩個問題。第一,我們現(xiàn)實世界遇到的各種各樣的問題的性質(zhì),并不是絕對都是可微的,或者用可微的模型能夠做最佳建模的。第二,過去幾十年里面,我們的機器學(xué)習(xí)界做了很多模型出來,這些都可以作為我們構(gòu)建一個系統(tǒng)的基石,而中間有相當(dāng)一部分模塊是不可微的。
現(xiàn)在我們遇到了這樣一個大挑戰(zhàn),可不可以用不可微的模塊構(gòu)建深度模型?這不光是學(xué)術(shù)上的,也是技術(shù)上的一個挑戰(zhàn),就是我們能不能用不可微的模塊來構(gòu)建深度模型?
這個問題一旦得到了回答,我們同時就可以得到很多其他問題的答案。比如說深度模型是不是就是深度神經(jīng)網(wǎng)絡(luò)?我們能不能用不可微的模型把它做深,這個時候我們不能用 BP 算法來訓(xùn)練,那么同時我們能不能讓深度模型在更多的任務(wù)上獲勝?
我們小組近期做出了一些成果,提出了一種新的模型結(jié)構(gòu) gcForest。這是一個基于決策樹森林的方法,是基于集成模型的深度模型;它也可以在除了大規(guī)模圖像數(shù)據(jù)之外的任務(wù)中獲得和深度神經(jīng)網(wǎng)絡(luò)相似的表現(xiàn)。在大規(guī)模圖像數(shù)據(jù)任務(wù)中不能取勝,其中原因是我們目前沒有適當(dāng)?shù)挠布?xùn)練足夠大的模型。
從名字可以看出,這個模型有兩個關(guān)鍵性質(zhì):級聯(lián)樹結(jié)構(gòu),以及多粒度。我今天主要介紹第一部分的一些要點,這也是這個方法的關(guān)鍵所在。
這是它的級聯(lián)樹結(jié)構(gòu)。圖中我用紅色標(biāo)出了原始的輸入特征向量?;谳斎氲奶卣飨蛄?,我們可以訓(xùn)練出一些森林,每個森林都是多個決策樹的集成模型。假設(shè)我們有三個分類需要預(yù)測,每個分類用一個 bit 來表示,那么每個森林的輸出就有 3 個 bit 長。在第一個標(biāo)簽訓(xùn)練完成后,我們把這 3bit 輸出和原始的輸入特征向量串聯(lián)起來,也就是說我們用更多的特征擴增了原始的輸入向量;接著,我們用擴增后的向量,訓(xùn)練模型的下一層。這個過程可以不斷地重復(fù),直到最后一個標(biāo)簽,就可以對所有預(yù)測值取平均,得到最終的預(yù)測結(jié)果。模型的最終層數(shù)可以由各種指標(biāo)決定,比如當(dāng)你發(fā)現(xiàn)增加更多的層之后模型的表現(xiàn)并沒有提升,這時候你就可以停下來了。這樣,你就不需要在開始訓(xùn)練前就設(shè)定好模型有多少層。另外,在工業(yè)應(yīng)用中,當(dāng)你的數(shù)據(jù)非常大的時候,你也可以用訓(xùn)練誤差(training error)來控制這個過程什么時候停止:當(dāng)訓(xùn)練誤差不再繼續(xù)下降的時候,就可以停止。就這么簡單。
在這里,當(dāng)你把輸出從第一層傳遞到第二層的時候,對集成方法比較熟悉的人能看出來這和層疊(stacking)有點像:這是一種 kaggle 比賽中常見的方法,先訓(xùn)練一個模型,然后把輸入和第一個模型的預(yù)測結(jié)果一起輸入第二個模型,形成一個兩層的模型。但是,如果我們只是這樣簡單地做層疊的話,想要訓(xùn)練一個超過 3 層的模型是非常困難的,原因是會發(fā)生非常嚴(yán)重的過擬合;即便是模型的第二層就會出現(xiàn)過擬合。
但我們做出了非常深的模型。這是不同模型表現(xiàn)隨層數(shù)變化的曲線,和 CNN、MLP 等其它模型做對比。隨著層數(shù)變多,模型的表現(xiàn)越來越好。當(dāng)我們使用 cross-validation 的時候,模型的表現(xiàn)會停在這里。但如果我們可以有更好的辦法決定停止時機,也許我們可以停在更靠右的位置,模型的表現(xiàn)可以更好。但這并不重要,我們只需要知道模型可以有非常多層就夠了。
我們要如何做出有很多層的模型?關(guān)鍵是要有多樣性(diversity),決定整個模型表現(xiàn)的就是多樣性。有更好的多樣性,我們就可以有一個更深的模型。這也是來自集成學(xué)習(xí)的一個啟發(fā),集成學(xué)習(xí)中我們就希望不同的學(xué)習(xí)者各自既準(zhǔn)確又多種多樣。
在 gcForest 中,我們也設(shè)計了很多機制來提高多樣性。我舉一個例子說明,在這個模型的第一層中我們使用了兩種不同的森林,用兩種顏色表示。紅色的是隨機森林,是隨機樹的集成模型。我們都知道,對于決策樹,首先給定一系列特征,然后選擇最佳的特征用于分叉:比如你有 100 個不同的特征,在分叉時需要從其中選擇最好的那一個。在這個樹中,我們首先從 100 個特征里隨機挑選 10 個,然后從這 10 個特征中選擇最好的那個特征。通過這種方式,我們?yōu)槟P鸵肓艘恍╇S機性,可以鼓勵模型增加多樣性。藍色的就更有趣了,它是完全隨機的樹的集成,就是說完全隨機地選擇特征并用它們分叉??梢钥吹?,我們構(gòu)建這些樹和森林的過程中甚至都不需要用到任何的標(biāo)注數(shù)據(jù),只需要隨機選擇特征、隨機分配特征。
為什么我們要在模型的同一層使用這兩種不同的森林呢?如果把整個一層看作一個模型的話,這就是幾個集成模型組成的集成模型,其中的每個集成模型都有所不同,這就可以增加模型的多樣性。那么一個很自然的后續(xù)問題是,為什么不使用更多的模型、更多不同類型的樹?這當(dāng)然是可以嘗試的,我們目前只是演示了一種輕微的改進,而它已經(jīng)可以帶來一些好處??梢云诖?,當(dāng)你使用更多種不同的模型、有了更好的多樣性,就可以得到更好的最終結(jié)果。我們還使用了其它的一些技巧,由于時間限制我就不展開介紹了。
這是模型的總體架構(gòu)。給定數(shù)據(jù)以后,我們首先會做一些掃描,用窗口掃描一些樣本以后得到特征,并得到數(shù)據(jù)的表征。我們使用不同大小的窗口,也就是不同的粒度(grain);對于每一種粒度,都有許多集成模型。所以全局來看,這就是一群級聯(lián)模型的級聯(lián)模型;每個級聯(lián)模型里有多種不同的粒度,每個粒度里含有集成模型的集成模型。模型的結(jié)構(gòu)也許復(fù)雜,但是它可以做得很深。
這種模型也會涉及到一些超參數(shù)問題,比如,每個森林里有多少樹、樹生長到什么深度或者什么時間、掃描數(shù)據(jù)的時候要使用多少個不同的窗口,但總的來說涉及到的超參數(shù)的數(shù)量還是比神經(jīng)網(wǎng)絡(luò)少。
我們也在許多種不同的任務(wù)上運行了實驗,除了大規(guī)模圖像數(shù)據(jù)之外,在其中的大多數(shù)任務(wù)上 gcForest 都可以獲得和深度神經(jīng)網(wǎng)絡(luò)類似的表現(xiàn)。它的重要意義在于,這是首個不依賴梯度、不依賴反向傳播的深度模型。對于可微分的機器學(xué)習(xí)問題,我們可以把神經(jīng)網(wǎng)絡(luò)的那一系列技巧都利用起來;基于決策樹的模型雖然無法轉(zhuǎn)換成神經(jīng)網(wǎng)絡(luò)模型,但是可以解決不可微、無法計算梯度的問題。
Keras 作者 Fran?ois Chollet 曾說,可微分的層是當(dāng)前的模型的基礎(chǔ)弱點;gcForest 不使用任何可微分的層。深度學(xué)習(xí)之父 Geoffery Hinton 說,他想把反向傳播扔掉、從頭再來;gcForest 就不使用反向傳播,連梯度都不使用。所以,從學(xué)術(shù)研究的角度講,研究 gcForest 這樣的不依賴梯度的深度模型將會是機器學(xué)習(xí)的重要分支。
有一些來自工業(yè)界的人可能會說,這當(dāng)然是很好的學(xué)術(shù)新成果,但是它對實踐能起到什么幫助嗎?那么我來給大家匯報一個工業(yè)應(yīng)用的成果,這是關(guān)于非法套現(xiàn)檢測的。中國的電子支付非常發(fā)達、交易量非常大,即便其中只有一小部分是非法的,也會造成很大的影響。和我們合作的這家公司有很強的技術(shù)功底,他們設(shè)計了大規(guī)模分布式的 gcForest,并且用在了他們的分布式機器學(xué)習(xí)系統(tǒng)中。下面我展示一個測試結(jié)果,這可能是非法套現(xiàn)檢測的最大規(guī)模的真實數(shù)據(jù)集,訓(xùn)練數(shù)據(jù)超過 1.3 億條交易數(shù)據(jù),測試數(shù)據(jù)也超過 5200 萬條;每條交易數(shù)據(jù)由超過 5000 個特征描述。
他們自己也有邏輯回歸、深度神經(jīng)網(wǎng)絡(luò)和自研的模型,可以看到不論對于學(xué)術(shù)評價指標(biāo)還是工業(yè)界指標(biāo),大規(guī)模分布式的 gcForest 都得到了最好的表現(xiàn)。這也印證了我們的猜測:gcForest 可以在某些任務(wù)中發(fā)揮很好的作用,尤其是在帶有離散信息、符號信息的任務(wù)中。在這里,用戶信息中的很多內(nèi)容就是符號化的。
雖然 gcForest 有一些成功的應(yīng)用,但我還是要提醒大家,不要立刻就對 gcForest 抱有過高的期待。實際上我們已經(jīng)開源了適用于小規(guī)模、中等規(guī)模數(shù)據(jù)的代碼,但如果你希望下載代碼以后就直接應(yīng)用,希望得到不錯的結(jié)果的話,那你的期待太高了。對于每種新技術(shù),都要經(jīng)歷很長的研發(fā)之路。如果你在筆記本上直接運行的話,你的內(nèi)存很快就會用完。想要完全發(fā)揮這種技術(shù)的優(yōu)點的途徑有兩種,一種是剛才這樣的大規(guī)模分布式部署,另一種是借助現(xiàn)代計算硬件。
相比于 CNN 已經(jīng)經(jīng)歷了 30 年的發(fā)展,gcForest 還在自己的幼年時期。下面我簡單介紹一些值得研究的挑戰(zhàn)、開放性問題。
剛才我介紹了 gcForest 代表了集成模型,其中的多樣性非常重要,實際上 gcForest 使用到了集成模型研究領(lǐng)域內(nèi)的各種增加多樣性的方法。如果大家對集成模型感興趣的話,歡迎閱讀我的這本關(guān)于專著《Ensemble Methods: Foundations and Algorithms》,里面有一整章的內(nèi)容是介紹如何增加多樣性的。
我們發(fā)現(xiàn) gcForest 和神經(jīng)網(wǎng)絡(luò)有一些相似性。在神經(jīng)網(wǎng)絡(luò)的訓(xùn)練中,我們希望避免梯度消失,而在 gcForest 中,我們希望避免多樣性消失。如果多樣性消失了,我們最多只能做出三層、四層的網(wǎng)絡(luò)。如何設(shè)計更多的機制給模型增加更多的多樣性,這將是 gcForest 研究的關(guān)鍵,就像研究如何避免梯度消失是神經(jīng)網(wǎng)絡(luò)研究的關(guān)鍵一樣。
下一點是特征擴增。剛才我提到,如果要預(yù)測三個類、每個類用一個 bit 表示,那么每個森林只能在原來的特征向量的基礎(chǔ)上增加 3 個 bit。這是一個非常小的數(shù)字,比如當(dāng)你有 1000 維的數(shù)據(jù)特征時,只增加 3 個 bit 太少了,很容易淹沒在原有的特征中。所以對于高維數(shù)據(jù),我們需要設(shè)計新的機制,提取更多的特征來擴增原有的特征向量。
這一點非常重要,但在動手之前,我們也需要提出這個問題:森林是否能夠提取出足夠的信息,用來重構(gòu)出有用的擴增特征。如果森林的提取能力不強,那么也許 3 個 bit 就夠用了。
我們也針對這個問題做了一些研究。我們發(fā)現(xiàn),一個經(jīng)過訓(xùn)練的森林甚至可以被用作一個自動編碼器(AutoEncoder)。此前人們都認為「可以用作自動編碼器」是神經(jīng)網(wǎng)絡(luò)模型專屬的一種特性,如今我們也可以用森林做到這一點。在給定數(shù)據(jù)上訓(xùn)練完成一個森林模型以后,再拿一些新數(shù)據(jù)做預(yù)測,你可以找到新數(shù)據(jù)可以歸屬在下面的葉子節(jié)點。那么,對于葉子信息,你就可以幾乎完美地回溯、重建出原始數(shù)據(jù)。這就意味著,如果你有一個數(shù)據(jù)集、基于數(shù)據(jù)集構(gòu)建了森林,你甚至可以丟棄整個數(shù)據(jù)集,它的信息都已經(jīng)編碼在了森林模型里。它的重現(xiàn)表現(xiàn)很好,比如在圖像數(shù)據(jù)集上有很好的重建結(jié)果,在文本數(shù)據(jù)集上也比神經(jīng)網(wǎng)絡(luò)更好,因為神經(jīng)網(wǎng)絡(luò)處理符號信息之前需要先通過 word2vec 之類的方法把它轉(zhuǎn)換為數(shù)值信息,這就會帶來額外的偏倚。但樹模型就可以直接處理符號化信息,不需要任何轉(zhuǎn)換。所以,基于森林方法設(shè)計更好的特征增強方法其實有非常多的可能性等待我們探索。
除此之外,我們還發(fā)現(xiàn)一些以往人們認為神經(jīng)網(wǎng)絡(luò)獨有的能力也可以在森林中實現(xiàn)。比如在這篇 NerIPS2018 論文中,我們表明了森林可以做層次化分布式表征學(xué)習(xí)。曾經(jīng)這也被認為是神經(jīng)網(wǎng)絡(luò)獨有的性質(zhì)。這都意味著,許多我們以前認為的特殊性質(zhì),其實并不需要僅僅局限于神經(jīng)網(wǎng)絡(luò)。未來也許我們還能找到更多可以實現(xiàn)這些能力的模型。
另一件事,對于提高模型的運行速度來說非常重要的,就是改進使用的硬件。這是來自我們實驗的圖表,可以看到,如果增加粒度數(shù)目,模型的表現(xiàn)總體是提升的;增加森林的數(shù)量、增加每個森林中的樹的數(shù)量,模型的表現(xiàn)都可以提升。就是說,更大的模型總的來說可以帶來更好的表現(xiàn)。不幸的是,我們沒法把模型做得更深,因為我們沒有適當(dāng)?shù)挠嬎阍O(shè)備,就類似于做深度神經(jīng)網(wǎng)絡(luò)需要有 GPU。
實際上,如果我們考慮訓(xùn)練時的計算開銷的話,深度森林的開銷比深度神經(jīng)網(wǎng)絡(luò)要小,然而深度神經(jīng)網(wǎng)絡(luò)可以用 GPU 加速,因為其中的計算都可以轉(zhuǎn)換為矩陣運算;在深度森林中,大多數(shù)的樹生長過程是基于切換的,很難用 GPU 加速。所以,如果考慮到 GPU 的加速效果的話,深度神經(jīng)網(wǎng)絡(luò)的效率要更高。
既然不能用 GPU 加速深度森林,那么我們就要問了,我們能用什么來加速深度森林呢?能不能設(shè)計適當(dāng)?shù)挠布砑铀偎兀课覀儾聹y英特爾的多核 KNL 芯片有一定的潛力,但我們還不確定它加速深度森林的效果是否能和 GPU 加速深度神經(jīng)網(wǎng)絡(luò)的效果相同。最近英特爾也和我們(南京大學(xué))聯(lián)合設(shè)立了一個人工智能研究中心,目標(biāo)就是共同探索是否有可能設(shè)計新的人工智能芯片為深度森林提供加速。
另一個問題是算法本身。我們都知道深度神經(jīng)網(wǎng)絡(luò)的研究已經(jīng)進行了大約三十年了,有許多學(xué)者、研究員、從業(yè)者為深度神經(jīng)網(wǎng)絡(luò)的發(fā)展做出了貢獻。深度森林還在自己的幼兒期,還有很多的研究工作需要做。
理論研究也不能忽視。我們都知道深度學(xué)習(xí)有一個很大的不便之處就是缺少理論基礎(chǔ),所以深度神經(jīng)網(wǎng)絡(luò)很難分析,尤其是從學(xué)習(xí)理論的角度;從這個角度來說,決策樹要好一些。但是對決策樹、對森林、集成模型做分析還是很難的,最近我們提出了一個新的方法,mdDF,它是深度森林的一種變體,我們也已經(jīng)得到了一些初步的理論結(jié)果,這篇論文近期就會發(fā)表。不過,這件事仍然不簡單,還需要許多后續(xù)的深入研究。
需要克服的問題還有很多,不過所有這些付出都是值得的。因為,「沒有免費的午餐」,沒有哪個學(xué)習(xí)模型永遠都是最好的,盡管深度神經(jīng)網(wǎng)絡(luò)很成功,我們還是要繼續(xù)探索其他類型的模型。我們猜測深度神經(jīng)網(wǎng)絡(luò)確實是適用于數(shù)值建模問題的,但是當(dāng)你面對的是符號化、離散、表格數(shù)據(jù)的時候,深度森林可以做得更好。
由于目前我們不知道深度森林可以發(fā)展到什么程度,因為我們還構(gòu)建不出非常深的模型,但即便未來我們構(gòu)建出很深的模型了、而且發(fā)現(xiàn)它的表現(xiàn)沒有我們預(yù)想的那么好,我們的研究也仍然是有價值的。因為深度森林的構(gòu)建過程為我們的這幾個猜測提供了證據(jù):當(dāng)你用一個模型就可以做到逐層信號處理、特征變換、足夠的模型復(fù)雜度的時候,你就可以享受到深度模型的好處。這也就是深度森林比之前的各種森林都有更好的表現(xiàn)的原因。它也帶給我們新的啟示:我們是否有可能設(shè)計出同時兼顧到這幾點的新的模型?
最后總結(jié)一下,曾經(jīng)我們認為深度學(xué)習(xí)是一個「小黑屋」,里面只有深度神經(jīng)網(wǎng)絡(luò)?,F(xiàn)在我們打開門,發(fā)現(xiàn)了里面有深度森林,也許未來還能發(fā)現(xiàn)更多別的東西。
謝謝大家!
(完)
雷鋒網(wǎng)聲明:本文未經(jīng)周志華教授本人審閱,內(nèi)容為根據(jù)周教授演講聽寫翻譯而成,僅供大家參考。
更多 IJCAI 2019 會議內(nèi)容,更期待更多后續(xù)雷鋒網(wǎng) AI 科技評論報道。議程直播及回放請訪問研習(xí)社社區(qū)。
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。