0
雷鋒網(wǎng) AI 科技評論按:本文的作者是張俊林老師,他是中國中文信息學會理事,中科院軟件所博士,目前在新浪微博 AI Lab 擔任資深算法專家。在此之前,張俊林老師曾在阿里巴巴任資深技術(shù)專家并負責新技術(shù)團隊,也曾在百度和用友擔任技術(shù)經(jīng)理及技術(shù)總監(jiān)等職務(wù)。同時他是技術(shù)書籍《這就是搜索引擎:核心技術(shù)詳解》(該書榮獲全國第十二屆優(yōu)秀圖書獎)、《大數(shù)據(jù)日知錄:架構(gòu)與算法》的作者。本文首發(fā)于知乎,經(jīng)作者許可,雷鋒網(wǎng) AI 科技評論進行轉(zhuǎn)載。
在辭舊迎新的時刻,大家都在忙著回顧過去一年的成績(或者在灶臺前含淚數(shù)鍋),并對 2019 做著規(guī)劃,當然也有不少朋友執(zhí)行力和工作效率比較高,直接把 2018 年初制定的計劃拷貝一下,就能在 3 秒鐘內(nèi)完成 2019 年計劃的制定,在此表示祝賀。2018 年從經(jīng)濟角度講,對于所有人可能都是比較難過的一年,而對于自然語言處理領(lǐng)域來說,2018 年無疑是個收獲頗豐的年頭,而諸多技術(shù)進展如果只能選擇一項來講的話,那么當之無愧的應(yīng)該就是 Bert 模型了。在上一篇介紹 Bert 的文章「從 Word Embedding 到 Bert 模型—自然語言處理中的預(yù)訓練技術(shù)發(fā)展史」里,我曾大言不慚地宣稱如下兩個個人判斷:一個是 Bert 這種兩階段的模式(預(yù)訓練+Finetuning)必將成為 NLP 領(lǐng)域研究和工業(yè)應(yīng)用的流行方法;第二個是從 NLP 領(lǐng)域的特征抽取器角度來說,Transformer 會逐步取代 RNN 成為最主流的的特征抽取器。關(guān)于特征抽取器方面的判斷,上面文章限于篇幅,只是給了一個結(jié)論,并未給出具備誘惑力的說明,看過我文章的人都知道我不是一個隨便下結(jié)論的人(那位正在補充下一句:「你隨便起來不是……」的同學請住口,請不要泄露國家機密,你可以繼續(xù)睡覺,吵到其它同學也沒有關(guān)系,哈哈),但是為什么當時我會下這個結(jié)論呢?本文可以看做是上文的一個外傳,會給出比較詳實的證據(jù)來支撐之前給出的結(jié)論。
如果對目前 NLP 里的三大特征抽取器的未來走向趨勢做個宏觀判斷的話,我的判斷是這樣的:RNN 人老珠黃,已經(jīng)基本完成它的歷史使命,將來會逐步退出歷史舞臺;CNN 如果改造得當,將來還是有希望有自己在 NLP 領(lǐng)域的一席之地,如果改造成功程度超出期望,那么還有一絲可能作為割據(jù)一方的軍閥,繼續(xù)生存壯大,當然我認為這個希望不大,可能跟宋小寶打籃球把姚明打哭的概率相當;而新歡 Transformer 明顯會很快成為 NLP 里擔當大任的最主流的特征抽取器。至于將來是否會出現(xiàn)新的特征抽取器,一槍將 Tranformer 挑落馬下,繼而取而代之成為新的特征抽取山大王?這種擔憂其實是挺有必要的,畢竟李商隱在一千年前就告誡過我們說:「君恩如水向東流,得寵憂移失寵愁。莫向樽前奏花落,涼風只在殿西頭?!巩斎贿@首詩看樣子目前送給 RNN 是比較貼切的,至于未來 Transformer 是否會失寵?這個問題的答案基本可以是肯定的,無非這個時刻的來臨是 3 年之后,還是 1 年之后出現(xiàn)而已。當然,我希望如果是在讀這篇文章的你,或者是我,在未來的某一天,從街頭拉來一位長相普通的淑女,送到韓國整容,一不小心偏離流水線整容工業(yè)的美女模板,整出一位天香國色的絕色,來把 Transformer 打入冷宮,那是最好不過。但是在目前的狀態(tài)下,即使是打著望遠鏡,貌似還沒有看到有這種資質(zhì)的候選人出現(xiàn)在我們的視野之內(nèi)。
我知道如果是一位嚴謹?shù)难邪l(fā)人員,不應(yīng)該在目前局勢還沒那么明朗的時候做出如上看似有些武斷的明確結(jié)論,所以這種說法可能會引起爭議。但是這確實就是我目前的真實想法,至于根據(jù)什么得出的上述判斷?這種判斷是否有依據(jù)?依據(jù)是否充分?相信你在看完這篇文章可以有個屬于自己的結(jié)論。
可能談到這里,有些平常吃虧吃的少所以喜歡挑刺的同學會質(zhì)疑說:你憑什么說 NLP 的典型特征抽取器就這三種呢?你置其它知名的特征抽取器比如 Recursive NN 于何地? 嗯,是,很多介紹 NLP 重要進展的文章里甚至把 Recursive NN 當做一項 NLP 里的重大進展,除了它,還有其它的比如 Memory Network 也享受這種部局級尊貴待遇。但是我一直都不太看好這兩個技術(shù),而且不看好很多年了,目前情形更堅定了這個看法。而且我免費奉勸你一句,沒必要在這兩個技術(shù)上浪費時間,至于為什么,因為跟本文主題無關(guān),以后有機會再詳細說。
上面是結(jié)論,下面,我們正式進入舉證階段。
NLP 任務(wù)的特點和圖像有極大的不同,上圖展示了一個例子,NLP 的輸入往往是一句話或者一篇文章,所以它有幾個特點:首先,輸入是個一維線性序列,這個好理解;其次,輸入是不定長的,有的長有的短,而這點其實對于模型處理起來也會增加一些小麻煩;再次,單詞或者子句的相對位置關(guān)系很重要,兩個單詞位置互換可能導致完全不同的意思。如果你聽到我對你說:「你欠我那一千萬不用還了」和「我欠你那一千萬不用還了」,你聽到后分別是什么心情?兩者區(qū)別了解一下;另外,句子中的長距離特征對于理解語義也非常關(guān)鍵,例子參考上圖標紅的單詞,特征抽取器能否具備長距離特征捕獲能力這一點對于解決 NLP 任務(wù)來說也是很關(guān)鍵的。
上面這幾個特點請記清,一個特征抽取器是否適配問題領(lǐng)域的特點,有時候決定了它的成敗,而很多模型改進的方向,其實就是改造得使得它更匹配領(lǐng)域問題的特性。這也是為何我在介紹 RNN、CNN、Transformer 等特征抽取器之前,先說明這些內(nèi)容的原因。
NLP 是個很寬泛的領(lǐng)域,包含了幾十個子領(lǐng)域,理論上只要跟語言處理相關(guān),都可以納入這個范圍。但是如果我們對大量 NLP 任務(wù)進行抽象的話,會發(fā)現(xiàn)絕大多數(shù) NLP 任務(wù)可以歸結(jié)為幾大類任務(wù)。兩個看似差異很大的任務(wù),在解決任務(wù)的模型角度,可能完全是一樣的。
通常而言,絕大部分 NLP 問題可以歸入上圖所示的四類任務(wù)中:一類是序列標注,這是最典型的 NLP 任務(wù),比如中文分詞,詞性標注,命名實體識別,語義角色標注等都可以歸入這一類問題,它的特點是句子中每個單詞要求模型根據(jù)上下文都要給出一個分類類別。第二類是分類任務(wù),比如我們常見的文本分類,情感計算等都可以歸入這一類。它的特點是不管文章有多長,總體給出一個分類類別即可。第三類任務(wù)是句子關(guān)系判斷,比如 Entailment,QA,語義改寫,自然語言推理等任務(wù)都是這個模式,它的特點是給定兩個句子,模型判斷出兩個句子是否具備某種語義關(guān)系;第四類是生成式任務(wù),比如機器翻譯,文本摘要,寫詩造句,看圖說話等都屬于這一類。它的特點是輸入文本內(nèi)容后,需要自主生成另外一段文字。
解決這些不同的任務(wù),從模型角度來講什么最重要?是特征抽取器的能力。尤其是深度學習流行開來后,這一點更凸顯出來。因為深度學習最大的優(yōu)點是「端到端(end to end)」,當然這里不是指的從客戶端到云端,意思是以前研發(fā)人員得考慮設(shè)計抽取哪些特征,而端到端時代后,這些你完全不用管,把原始輸入扔給好的特征抽取器,它自己會把有用的特征抽取出來。
身為資深 Bug 制造者和算法工程師,你現(xiàn)在需要做的事情就是:選擇一個好的特征抽取器,選擇一個好的特征抽取器,選擇一個好的特征抽取器,喂給它大量的訓練數(shù)據(jù),設(shè)定好優(yōu)化目標(loss function),告訴它你想讓它干嘛…….. 然后你覺得你啥也不用干等結(jié)果就行了是吧?那你是我見過的整個宇宙中最樂觀的人……. 你大量時間其實是用在調(diào)參上…….。從這個過程可以看出,如果我們有個強大的特征抽取器,那么中初級算法工程師淪為調(diào)參俠也就是個必然了,在 AutoML(自動那啥)流行的年代,也許以后你想當調(diào)參俠而不得,李斯說的「吾欲與若復牽黃犬,俱出上蔡東門逐狡兔,豈可得乎!」請了解一下。所以請珍惜你半夜兩點還在調(diào)整超參的日子吧,因為對于你來說有一個好消息一個壞消息,好消息是:對于你來說可能這樣辛苦的日子不多了!壞消息是:對于你來說可能這樣辛苦的日子不多了?。?!那么怎么才能成為算法高手?你去設(shè)計一個更強大的特征抽取器呀。
下面開始分敘三大特征抽取器。
RNN 模型我估計大家都熟悉,就不詳細介紹了,模型結(jié)構(gòu)參考上圖,核心是每個輸入對應(yīng)隱層節(jié)點,而隱層節(jié)點之間形成了線性序列,信息由前向后在隱層之間逐步向后傳遞。我們下面直接進入我想講的內(nèi)容。
為何 RNN 能夠成為解決 NLP 問題的主流特征抽取器
我們知道,RNN 自從引入 NLP 界后,很快就成為吸引眼球的明星模型,在 NLP 各種任務(wù)中被廣泛使用。但是原始的 RNN 也存在問題,它采取線性序列結(jié)構(gòu)不斷從前往后收集輸入信息,但這種線性序列結(jié)構(gòu)在反向傳播的時候存在優(yōu)化困難問題,因為反向傳播路徑太長,容易導致嚴重的梯度消失或梯度爆炸問題。為了解決這個問題,后來引入了 LSTM 和 GRU 模型,通過增加中間狀態(tài)信息直接向后傳播,以此緩解梯度消失問題,獲得了很好的效果,于是很快 LSTM 和 GRU 成為 RNN 的標準模型。其實圖像領(lǐng)域最早由 HighwayNet/Resnet 等導致模型革命的 skip connection 的原始思路就是從 LSTM 的隱層傳遞機制借鑒來的。經(jīng)過不斷優(yōu)化,后來 NLP 又從圖像領(lǐng)域借鑒并引入了 attention 機制(從這兩個過程可以看到不同領(lǐng)域的相互技術(shù)借鑒與促進作用),疊加網(wǎng)絡(luò)把層深作深,以及引入 Encoder-Decoder 框架,這些技術(shù)進展極大拓展了 RNN 的能力以及應(yīng)用效果。下圖展示的模型就是非常典型的使用 RNN 來解決 NLP 任務(wù)的通用框架技術(shù)大禮包,在更新的技術(shù)出現(xiàn)前,你可以在 NLP 各種領(lǐng)域見到這個技術(shù)大禮包的身影。
上述內(nèi)容簡單介紹了 RNN 在 NLP 領(lǐng)域的大致技術(shù)演進過程。那么為什么 RNN 能夠這么快在 NLP 流行并且占據(jù)了主導地位呢?主要原因還是因為 RNN 的結(jié)構(gòu)天然適配解決 NLP 的問題,NLP 的輸入往往是個不定長的線性序列句子,而 RNN 本身結(jié)構(gòu)就是個可以接納不定長輸入的由前向后進行信息線性傳導的網(wǎng)絡(luò)結(jié)構(gòu),而在 LSTM 引入三個門后,對于捕獲長距離特征也是非常有效的。所以 RNN 特別適合 NLP 這種線形序列應(yīng)用場景,這是 RNN 為何在 NLP 界如此流行的根本原因。
RNN 在新時代面臨的兩個嚴重問題
RNN 在 NLP 界一直紅了很多年(2014-2018?),在 2018 年之前,大部分各個子領(lǐng)域的 State of Art 的結(jié)果都是 RNN 獲得的。但是最近一年來,眼看著 RNN 的領(lǐng)袖群倫的地位正在被動搖,所謂各領(lǐng)風騷 3-5 年,看來網(wǎng)紅模型也不例外。
那這又是因為什么呢?主要有兩個原因。
第一個原因在于一些后起之秀新模型的崛起,比如經(jīng)過特殊改造的 CNN 模型,以及最近特別流行的 Transformer,這些后起之秀尤其是 Transformer 的應(yīng)用效果相比 RNN 來說,目前看具有明顯的優(yōu)勢。這是個主要原因,老人如果干不過新人,又沒有脫胎換骨自我革命的能力,自然要自覺或不自愿地退出歷史舞臺,這是自然規(guī)律。至于 RNN 能力偏弱的具體證據(jù),本文后面會專門談,這里不展開講。當然,技術(shù)人員里的 RNN 保皇派們,這個群體規(guī)模應(yīng)該還是相當大的,他們不會輕易放棄曾經(jīng)這么熱門過的流量明星的,所以也想了或者正在想一些改進方法,試圖給 RNN 延年益壽。至于這些方法是什么,有沒有作用,后面也陸續(xù)會談。
另外一個嚴重阻礙 RNN 將來繼續(xù)走紅的問題是:RNN 本身的序列依賴結(jié)構(gòu)對于大規(guī)模并行計算來說相當之不友好。通俗點說,就是 RNN 很難具備高效的并行計算能力,這個乍一看好像不是太大的問題,其實問題很嚴重。如果你僅僅滿足于通過改 RNN 發(fā)一篇論文,那么這確實不是大問題,但是如果工業(yè)界進行技術(shù)選型的時候,在有快得多的模型可用的前提下,是不太可能選擇那么慢的模型的。一個沒有實際落地應(yīng)用支撐其存在價值的模型,其前景如何這個問題,估計用小腦思考也能得出答案。
那問題來了:為什么 RNN 并行計算能力比較差?是什么原因造成的?
我們知道,RNN 之所以是 RNN,能將其和其它模型區(qū)分開的最典型標志是:T 時刻隱層狀態(tài)的計算,依賴兩個輸入,一個是 T 時刻的句子輸入單詞 Xt,這個不算特點,所有模型都要接收這個原始輸入;關(guān)鍵的是另外一個輸入,T 時刻的隱層狀態(tài) St 還依賴 T-1 時刻的隱層狀態(tài) S(t-1) 的輸出,這是最能體現(xiàn) RNN 本質(zhì)特征的一點,RNN 的歷史信息是通過這個信息傳輸渠道往后傳輸?shù)?,示意參考上圖。那么為什么 RNN 的并行計算能力不行呢?問題就出在這里。因為 T 時刻的計算依賴 T-1 時刻的隱層計算結(jié)果,而 T-1 時刻的計算依賴 T-2 時刻的隱層計算結(jié)果…….. 這樣就形成了所謂的序列依賴關(guān)系。就是說只能先把第 1 時間步的算完,才能算第 2 時間步的結(jié)果,這就造成了 RNN 在這個角度上是無法并行計算的,只能老老實實地按著時間步一個單詞一個單詞往后走。
而 CNN 和 Transformer 就不存在這種序列依賴問題,所以對于這兩者來說并行計算能力就不是問題,每個時間步的操作可以并行一起計算。
那么能否針對性地對 RNN 改造一下,提升它的并行計算能力呢?如果可以的話,效果如何呢?下面我們討論一下這個問題。
如何改造 RNN 使其具備并行計算能力?
上面說過,RNN 不能并行計算的癥結(jié)所在,在于 T 時刻對 T-1 時刻計算結(jié)果的依賴,而這體現(xiàn)在隱層之間的全連接網(wǎng)絡(luò)上。既然癥結(jié)在這里,那么要想解決問題,也得在這個環(huán)節(jié)下手才行。在這個環(huán)節(jié)多做點什么事情能夠增加 RNN 的并行計算能力呢?你可以想一想。
其實留給你的選項并不多,你可以有兩個大的思路來改進:一種是仍然保留任意連續(xù)時間步(T-1 到 T 時刻)之間的隱層連接;而另外一種是部分地打斷連續(xù)時間步(T-1 到 T 時刻)之間的隱層連接。
我們先來看第一種方法,現(xiàn)在我們的問題轉(zhuǎn)化成了:我們?nèi)匀灰A羧我膺B續(xù)時間步(T-1 到 T 時刻)之間的隱層連接,但是在這個前提下,我們還要能夠做到并行計算,這怎么處理呢?因為只要保留連續(xù)兩個時間步的隱層連接,則意味著要計算 T 時刻的隱層結(jié)果,就需要 T-1 時刻隱層結(jié)果先算完,這不又落入了序列依賴的陷阱里了嗎?嗯,確實是這樣,但是為什么一定要在不同時間步的輸入之間并行呢?沒有人說 RNN 的并行計算一定發(fā)生在不同時間步上啊,你想想,隱層是不是也是包含很多神經(jīng)元?那么在隱層神經(jīng)元之間并行計算行嗎?如果你要是還沒理解這是什么意思,那請看下圖。
上面的圖只顯示了各個時間步的隱層節(jié)點,每個時間步的隱層包含 3 個神經(jīng)元,這是個俯視圖,是從上往下看 RNN 的隱層節(jié)點的。另外,連續(xù)兩個時間步的隱層神經(jīng)元之間仍然有連接,上圖沒有畫出來是為了看著簡潔一些。這下應(yīng)該明白了吧,假設(shè)隱層神經(jīng)元有 3 個,那么我們可以形成 3 路并行計算(紅色箭頭分隔開成了三路),而每一路因為仍然存在序列依賴問題,所以每一路內(nèi)仍然是串行的。大思路應(yīng)該明白了是吧?但是了解 RNN 結(jié)構(gòu)的同學會發(fā)現(xiàn)這樣還遺留一個問題:隱層神經(jīng)元之間的連接是全連接,就是說 T 時刻某個隱層神經(jīng)元與 T-1 時刻所有隱層神經(jīng)元都有連接,如果是這樣,是無法做到在神經(jīng)元之間并行計算的,你可以想想為什么,這個簡單,我假設(shè)你有能力想明白。那么怎么辦呢?很簡單,T 時刻和 T-1 時刻的隱層神經(jīng)元之間的連接關(guān)系需要改造,從之前的全連接,改造成對應(yīng)位置的神經(jīng)元(就是上圖被紅箭頭分隔到同一行的神經(jīng)元之間)有連接,和其它神經(jīng)元沒有連接。這樣就可以解決這個問題,在不同路的隱層神經(jīng)元之間可以并行計算了。
第一種改造 RNN 并行計算能力的方法思路大致如上所述,這種方法的代表就是論文「Simple Recurrent Units for Highly Parallelizable Recurrence」中提出的 SRU 方法,它最本質(zhì)的改進是把隱層之間的神經(jīng)元依賴由全連接改成了哈達馬乘積,這樣 T 時刻隱層單元本來對 T-1 時刻所有隱層單元的依賴,改成了只是對 T-1 時刻對應(yīng)單元的依賴,于是可以在隱層單元之間進行并行計算,但是收集信息仍然是按照時間序列來進行的。所以其并行性是在隱層單元之間發(fā)生的,而不是在不同時間步之間發(fā)生的。
這其實是比較巧妙的一種方法,但是它的問題在于其并行程度上限是有限的,并行程度取決于隱層神經(jīng)元個數(shù),而一般這個數(shù)值往往不會太大,再增加并行性已經(jīng)不太可能。另外每一路并行線路仍然需要序列計算,這也會拖慢整體速度。SRU 的測試速度為:在文本分類上和原始 CNN(Kim 2014)的速度相當,論文沒有說 CNN 是否采取了并行訓練方法。其它在復雜任務(wù)閱讀理解及 MT 任務(wù)上只做了效果評估,沒有和 CNN 進行速度比較,我估計這是有原因的,因為復雜任務(wù)往往需要深層網(wǎng)絡(luò),其它的就不妄作猜測了。
第二種改進典型的思路是:為了能夠在不同時間步輸入之間進行并行計算,那么只有一種做法,那就是打斷隱層之間的連接,但是又不能全打斷,因為這樣基本就無法捕獲組合特征了,所以唯一能選的策略就是部分打斷,比如每隔 2 個時間步打斷一次,但是距離稍微遠點的特征如何捕獲呢?只能加深層深,通過層深來建立遠距離特征之間的聯(lián)系。代表性模型比如上圖展示的 Sliced RNN。我當初看到這個模型的時候,心里忍不住發(fā)出杠鈴般的笑聲,情不自禁地走上前跟他打了個招呼:你好呀,CNN 模型,想不到你這個糙漢子有一天也會穿上粉色裙裝,裝扮成 RNN 的樣子出現(xiàn)在我面前啊,哈哈。了解 CNN 模型的同學看到我上面這句話估計會莞爾會心一笑:這不就是簡化版本的 CNN 嗎?不了解 CNN 的同學建議看完后面 CNN 部分再回頭來看看是不是這個意思。
那經(jīng)過這種改造的 RNN 速度改進如何呢?論文給出了速度對比實驗,歸納起來,SRNN 速度比 GRU 模型快 5 到 15 倍,嗯,效果不錯,但是跟對比模型 DC-CNN 模型速度比較起來,比 CNN 模型仍然平均慢了大約 3 倍。這很正常但是又有點說不太過去,說正常是因為本來這就是把 RNN 改頭換面成類似 CNN 的結(jié)構(gòu),而片段里仍然采取 RNN 序列模型,所以必然會拉慢速度,比 CNN 慢再正常不過了。說「說不過去」是指的是:既然本質(zhì)上是 CNN,速度又比 CNN 慢,那么這么改的意義在哪里?為什么不直接用 CNN 呢?是不是?前面那位因為吃虧吃的少所以愛抬杠的同學又會說了:也許人家效果特別好呢。嗯,從這個結(jié)構(gòu)的作用機制上看,可能性不太大。你說論文實驗部分證明了這一點呀,我認為實驗部分對比試驗做的不充分,需要補充除了 DC-CNN 外的其他 CNN 模型進行對比。當然這點純屬個人意見,別當真,因為我講起話來的時候經(jīng)常搖頭晃腦,此時一般會有人驚奇地跟我反饋說:為什么你一講話我就聽到了水聲?
上面列舉了兩種大的改進 RNN 并行計算能力的思路,我個人對于 RNN 的并行計算能力持悲觀態(tài)度,主要因為 RNN 本質(zhì)特性決定了我們能做的選擇太少。無非就是選擇打斷還是不打斷隱層連接的問題。如果選擇打斷,就會面臨上面的問題,你會發(fā)現(xiàn)它可能已經(jīng)不是 RNN 模型了,為了讓它看上去還像是 RNN,所以在打斷片段里仍然采取 RNN 結(jié)構(gòu),這樣無疑會拉慢速度,所以這是個兩難的選擇,與其這樣不如直接換成其它模型;如果我們選擇不打斷,貌似只能在隱層神經(jīng)元之間進行并行,而這樣做的缺點是:一方面并行能力上限很低;另外一方面里面依然存在的序列依賴估計仍然是個問題。這是為何悲觀的原因,主要是看不到大的希望。
在一年多前,CNN 是自然語言處理中除了 RNN 外最常見的深度學習模型,這里介紹下 CNN 特征抽取器,會比 RNN 說得詳細些,主要考慮到大家對它的熟悉程度可能沒有 RNN 那么高。
NLP 中早期的懷舊版 CNN 模型
最早將 CNN 引入 NLP 的是 Kim 在 2014 年做的工作,論文和網(wǎng)絡(luò)結(jié)構(gòu)參考上圖。一般而言,輸入的字或者詞用 Word Embedding 的方式表達,這樣本來一維的文本信息輸入就轉(zhuǎn)換成了二維的輸入結(jié)構(gòu),假設(shè)輸入 X 包含 n 個字符,而每個字符的 Word Embedding 的長度為 d,那么輸入就是 d*n 的二維向量。
卷積層本質(zhì)上是個特征抽取層,可以設(shè)定超參數(shù) F 來指定卷積層包含多少個卷積核(Filter)。對于某個 Filter 來說,可以想象有一個 d*k 大小的移動窗口從輸入矩陣的第一個字開始不斷往后移動,其中 k 是 Filter 指定的窗口大小,d 是 Word Embedding 長度。對于某個時刻的窗口,通過神經(jīng)網(wǎng)絡(luò)的非線性變換,將這個窗口內(nèi)的輸入值轉(zhuǎn)換為某個特征值,隨著窗口不斷往后移動,這個 Filter 對應(yīng)的特征值不斷產(chǎn)生,形成這個 Filter 的特征向量。這就是卷積核抽取特征的過程。卷積層內(nèi)每個 Filter 都如此操作,就形成了不同的特征序列。Pooling 層則對 Filter 的特征進行降維操作,形成最終的特征。一般在 Pooling 層之后連接全聯(lián)接層神經(jīng)網(wǎng)絡(luò),形成最后的分類過程。
這就是最早應(yīng)用在 NLP 領(lǐng)域 CNN 模型的工作機制,用來解決 NLP 中的句子分類任務(wù),看起來還是很簡潔的,之后陸續(xù)出現(xiàn)了在此基礎(chǔ)上的改進模型。這些懷舊版 CNN 模型在一些任務(wù)上也能和當時懷舊版本的 RNN 模型效果相當,所以在 NLP 若干領(lǐng)域也能野蠻生長,但是在更多的 NLP 領(lǐng)域,還是處于被 RNN 模型壓制到抑郁癥早期的尷尬局面。那為什么在圖像領(lǐng)域打遍天下無敵手的 CNN,一旦跑到 NLP 的地盤,就被 RNN 這個地頭蛇壓制得無顏見圖像領(lǐng)域江東父老呢?這說明這個版本的 CNN 還是有很多問題的,其實最根本的癥結(jié)所在還是老革命遇到了新問題,主要是到了新環(huán)境沒有針對新環(huán)境的特性做出針對性的改變,所以面臨水土不服的問題。
CNN 能在 RNN 縱橫的各種 NLP 任務(wù)環(huán)境下生存下來嗎?謎底即將揭曉。
CNN 的進化:物競天擇的模型斗獸場
下面我們先看看懷舊版 CNN 存在哪些問題,然后看看我們的 NLP 專家們是如何改造 CNN,一直改到目前看上去還算效果不錯的現(xiàn)代版本 CNN 的。
首先,我們先要明確一點:CNN 捕獲到的是什么特征呢?從上述懷舊版本 CNN 卷積層的運作機制你大概看出來了,關(guān)鍵在于卷積核覆蓋的那個滑動窗口,CNN 能捕獲到的特征基本都體現(xiàn)在這個滑動窗口里了。大小為 k 的滑動窗口輕輕的穿過句子的一個個單詞,蕩起陣陣漣漪,那么它捕獲了什么? 其實它捕獲到的是單詞的 k-gram 片段信息,這些 k-gram 片段就是 CNN 捕獲到的特征,k 的大小決定了能捕獲多遠距離的特征。
說完這個,我們來看 Kim 版 CNN 的第一個問題:它只有一個卷積層。表面看上去好像是深度不夠的問題是吧?我會反問你說:為什么要把 CNN 作深呢?其實把深度做起來是手段,不是目的。只有一個卷積層帶來的問題是:對于遠距離特征,單層 CNN 是無法捕獲到的,如果滑動窗口 k 最大為 2,而如果有個遠距離特征距離是 5,那么無論上多少個卷積核,都無法覆蓋到長度為 5 的距離的輸入,所以它是無法捕獲長距離特征的。
那么怎樣才能捕獲到長距離的特征呢?有兩種典型的改進方法:一種是假設(shè)我們?nèi)匀挥脝蝹€卷積層,滑動窗口大小 k 假設(shè)為 3,就是只接收三個輸入單詞,但是我們想捕獲距離為 5 的特征,怎么做才行?顯然,如果卷積核窗口仍然覆蓋連續(xù)區(qū)域,這肯定是完不成任務(wù)的。提示一下:你玩過跳一跳是吧?能采取類似策略嗎?對,你可以跳著覆蓋呀,是吧?這就是 Dilated 卷積的基本思想,確實也是一種解決方法。
第二種方法是把深度做起來。第一層卷積層,假設(shè)滑動窗口大小 k 是 3,如果再往上疊一層卷積層,假設(shè)滑動窗口大小也是 3,但是第二層窗口覆蓋的是第一層窗口的輸出特征,所以它其實能覆蓋輸入的距離達到了 5。如果繼續(xù)往上疊加卷積層,可以繼續(xù)增大卷積核覆蓋輸入的長度。
上面是兩種典型的解決 CNN 遠距離特征捕獲能力的方案,Dilated CNN 偏技巧一些,而且疊加卷積層時超參如何設(shè)置有些學問,因為連續(xù)跳接可能會錯過一些特征組合,所以需要精心調(diào)節(jié)參數(shù)搭配,保證所有可能組合都被覆蓋到。相對而言,把 CNN 作深是主流發(fā)展方向。上面這個道理好理解,其實自從 CNN 一出現(xiàn),人們就想各種辦法試圖把 CNN 的深度做起來,但是現(xiàn)實往往是無情的,發(fā)現(xiàn)怎么折騰,CNN 做 NLP 問題就是做不深,做到 2 到 3 層卷積層就做不上去了,網(wǎng)絡(luò)更深對任務(wù)效果沒什么幫助(請不要拿 CharCNN 來做反例,后來研究表明使用單詞的 2 層 CNN 效果超過 CharCNN)。目前看來,還是深層網(wǎng)絡(luò)參數(shù)優(yōu)化手段不足導致的這個問題,而不是層深沒有用。后來 Resnet 等圖像領(lǐng)域的新技術(shù)出現(xiàn)后,很自然地,人們會考慮把 Skip Connection 及各種 Norm 等參數(shù)優(yōu)化技術(shù)引入,這才能慢慢把 CNN 的網(wǎng)絡(luò)深度做起來。
上面說的是 Kim 版本 CNN 的第一個問題,無法捕獲遠距離特征的問題,以及后面科研人員提出的主要解決方案?;仡^看 Kim 版本 CNN 還有一個問題,就是那個 Max Pooling 層,這塊其實與 CNN 能否保持輸入句子中單詞的位置信息有關(guān)系。首先我想問個問題:RNN 因為是線性序列結(jié)構(gòu),所以很自然它天然就會把位置信息編碼進去;那么,CNN 是否能夠保留原始輸入的相對位置信息呢?我們前面說過對于 NLP 問題來說,位置信息是很有用的。其實 CNN 的卷積核是能保留特征之間的相對位置的,道理很簡單,滑動窗口從左到右滑動,捕獲到的特征也是如此順序排列,所以它在結(jié)構(gòu)上已經(jīng)記錄了相對位置信息了。但是如果卷積層后面立即接上 Pooling 層的話,Max Pooling 的操作邏輯是:從一個卷積核獲得的特征向量里只選中并保留最強的那一個特征,所以到了 Pooling 層,位置信息就被扔掉了,這在 NLP 里其實是有信息損失的。所以在 NLP 領(lǐng)域里,目前 CNN 的一個發(fā)展趨勢是拋棄 Pooling 層,靠全卷積層來疊加網(wǎng)絡(luò)深度,這背后是有原因的(當然圖像領(lǐng)域也是這個趨勢)。
上圖展示了在 NLP 領(lǐng)域能夠施展身手的摩登 CNN 的主體結(jié)構(gòu),通常由 1-D 卷積層來疊加深度,使用 Skip Connection 來輔助優(yōu)化,也可以引入 Dilated CNN 等手段。比如 ConvS2S 主體就是上圖所示結(jié)構(gòu),Encoder 包含 15 個卷積層,卷積核 kernel size=3,覆蓋輸入長度為 25。當然對于 ConvS2S 來說,卷積核里引入 GLU 門控非線性函數(shù)也有重要幫助,限于篇幅,這里不展開說了,GLU 貌似是 NLP 里 CNN 模型必備的構(gòu)件,值得掌握。再比如 TCN(論文:An Empirical Evaluation of Generic Convolutional and Recurrent Networks for Sequence Modeling),集成了幾項技術(shù):利用 Dilated CNN 拓展單層卷積層的輸入覆蓋長度,利用全卷積層堆疊層深,使用 Skip Connection 輔助優(yōu)化,引入 Casual CNN 讓網(wǎng)絡(luò)結(jié)構(gòu)看不到 T 時間步后的數(shù)據(jù)。不過 TCN 的實驗做得有兩個明顯問題:一個問題是任務(wù)除了語言模型外都不是典型的 NLP 任務(wù),而是合成數(shù)據(jù)任務(wù),所以論文結(jié)論很難直接說就適合 NLP 領(lǐng)域;另外一點,它用來進行效果比較的對比方法,沒有用當時效果很好的模型來對比,比較基準低。所以 TCN 的模型效果說服力不太夠。其實它該引入的元素也基本引入了,實驗說服力不夠,我覺得可能是它命中缺 GLU 吧。
除此外,簡單談一下 CNN 的位置編碼問題和并行計算能力問題。上面說了,CNN 的卷積層其實是保留了相對位置信息的,只要你在設(shè)計模型的時候別手賤,中間層不要隨手瞎插入 Pooling 層,問題就不大,不專門在輸入部分對 position 進行編碼也行。但是也可以類似 ConvS2S 那樣,專門在輸入部分給每個單詞增加一個 position embedding,將單詞的 position embedding 和詞向量 embedding 疊加起來形成單詞輸入,這樣也可以,也是常規(guī)做法。
至于 CNN 的并行計算能力,那是非常強的,這其實很好理解。我們考慮單層卷積層,首先對于某個卷積核來說,每個滑動窗口位置之間沒有依賴關(guān)系,所以完全可以并行計算;另外,不同的卷積核之間也沒什么相互影響,所以也可以并行計算。CNN 的并行度是非常自由也非常高的,這是 CNN 的一個非常好的優(yōu)點。
以上內(nèi)容介紹了懷舊版 CNN 是如何在 NLP 修羅場一步步通過自我進化生存到今天的。CNN 的進化方向,如果千言萬語一句話歸納的話,那就是:想方設(shè)法把 CNN 的深度做起來,隨著深度的增加,很多看似無關(guān)的問題就隨之解決了。就跟我們國家最近 40 年的主旋律是發(fā)展經(jīng)濟一樣,經(jīng)濟發(fā)展好了,很多問題就不是問題了。最近幾年之所以大家感到各方面很困難,癥結(jié)就在于經(jīng)濟不行了,所以很多問題無法通過經(jīng)濟帶動來解決,于是看似各種花樣的困難就冒出來,這是一個道理。
那么介紹了這么多,摩登版 CNN 效果如何呢?與 RNN 及 Transforme 比起來怎樣?別著急,后面會專門談這個問題。
Transformer 是谷歌在 17 年做機器翻譯任務(wù)的「Attention is all you need」的論文中提出的,引起了相當大的反響。每一位從事 NLP 研發(fā)的同仁都應(yīng)該透徹搞明白 Transformer,它的重要性毫無疑問,尤其是你在看完我這篇文章之后,我相信你的緊迫感會更迫切,我就是這么一位善于制造焦慮的能手。不過這里沒打算重點介紹它,想要入門 Transformer 的可以參考以下三篇文章:一個是 Jay Alammar 可視化地介紹 Transformer 的博客文章 The Illustrated Transformer,非常容易理解整個機制,建議先從這篇看起,這是中文翻譯版本;第二篇是 Calvo 的博客:Dissecting BERT Part 1: The Encoder,盡管說是解析 Bert,但是因為 Bert 的 Encoder 就是 Transformer,所以其實它是在解析 Transformer,里面舉的例子很好;再然后可以進階一下,參考哈佛大學 NLP 研究組寫的「The Annotated Transformer.」,代碼原理雙管齊下,講得也很清楚。
下面只說跟本文主題有關(guān)的內(nèi)容。
這里要澄清一下,本文所說的 Transformer 特征抽取器并非原始論文所指。我們知道,「Attention is all you need」論文中說的的 Transformer 指的是完整的 Encoder-Decoder 框架,而我這里是從特征提取器角度來說的,你可以簡單理解為論文中的 Encoder 部分。因為 Encoder 部分目的比較單純,就是從原始句子中提取特征,而 Decoder 部分則功能相對比較多,除了特征提取功能外,還包含語言模型功能,以及用 attention 機制表達的翻譯模型功能。所以這里請注意,避免后續(xù)理解概念產(chǎn)生混淆。
Transformer 的 Encoder 部分(不是上圖一個一個的標為 encoder 的模塊,而是紅框內(nèi)的整體,上圖來自 The Illustrated Transformer,Jay Alammar 把每個 Block 稱為 Encoder 不太符合常規(guī)叫法)是由若干個相同的 Transformer Block 堆疊成的。這個 Transformer Block 其實才是 Transformer 最關(guān)鍵的地方,核心配方就在這里。那么它長什么樣子呢?
它的照片見上圖,看上去是不是很可愛,有點像安卓機器人是吧?這里需要強調(diào)一下,盡管 Transformer 原始論文一直重點在說 Self Attention,但是目前來看,能讓 Transformer 效果好的,不僅僅是 Self attention,這個 Block 里所有元素,包括 Multi-head self attention,Skip connection,LayerNorm,F(xiàn)F 一起在發(fā)揮作用。為什么這么說?你看到后面會體會到這一點。
我們針對 NLP 任務(wù)的特點來說下 Transformer 的對應(yīng)解決方案。首先,自然語言一般是個不定長的句子,那么這個不定長問題怎么解決呢?Transformer 做法跟 CNN 是類似的,一般設(shè)定輸入的最大長度,如果句子沒那么長,則用 Padding 填充,這樣整個模型輸入起碼看起來是定長的了。另外,NLP 句子中單詞之間的相對位置是包含很多信息的,上面提過,RNN 因為結(jié)構(gòu)就是線性序列的,所以天然會將位置信息編碼進模型;而 CNN 的卷積層其實也是保留了位置相對信息的,所以什么也不做問題也不大。但是對于 Transformer 來說,為了能夠保留輸入句子單詞之間的相對位置信息,必須要做點什么。為啥它必須要做點什么呢?因為輸入的第一層網(wǎng)絡(luò)是 Muli-head self attention 層,我們知道,Self attention 會讓當前輸入單詞和句子中任意單詞發(fā)生關(guān)系,然后集成到一個 embedding 向量里,但是當所有信息到了 embedding 后,位置信息并沒有被編碼進去。所以,Transformer 不像 RNN 或 CNN,必須明確的在輸入端將 Positon 信息編碼,Transformer 是用位置函數(shù)來進行位置編碼的,而 Bert 等模型則給每個單詞一個 Position embedding,將單詞 embedding 和單詞對應(yīng)的 position embedding 加起來形成單詞的輸入 embedding,類似上文講的 ConvS2S 的做法。而關(guān)于 NLP 句子中長距離依賴特征的問題,Self attention 天然就能解決這個問題,因為在集成信息的時候,當前單詞和句子中任意單詞都發(fā)生了聯(lián)系,所以一步到位就把這個事情做掉了。不像 RNN 需要通過隱層節(jié)點序列往后傳,也不像 CNN 需要通過增加網(wǎng)絡(luò)深度來捕獲遠距離特征,Transformer 在這點上明顯方案是相對簡單直觀的。說這些是為了單獨介紹下 Transformer 是怎樣解決 NLP 任務(wù)幾個關(guān)鍵點的。
Transformer 有兩個版本:Transformer base 和 Transformer Big。兩者結(jié)構(gòu)其實是一樣的,主要區(qū)別是包含的 Transformer Block 數(shù)量不同,Transformer base 包含 12 個 Block 疊加,而 Transformer Big 則擴張一倍,包含 24 個 Block。無疑 Transformer Big 在網(wǎng)絡(luò)深度,參數(shù)量以及計算量相對 Transformer base 翻倍,所以是相對重的一個模型,但是效果也最好。
(上篇)
雷鋒網(wǎng) AI 科技評論經(jīng)作者許可轉(zhuǎn)載。
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。