放棄幻想,全面擁抱Transformer:NLP三大特徵抽取器(CNN/RNN/TF)比較

今日有幸閱讀了一篇非常有意思的乾貨,僅此存留。

作者 | 張俊林,中國中文信息學會理事,目前在新浪微博 AI Lab 擔任資深算法專家。在此之前,張俊林曾經在阿里巴巴任資深技術專家,以及在百度和用友擔任技術經理及技術總監等職務。同時他是技術書籍《這就是搜索引擎:核心技術詳解》(該書榮獲全國第十二屆輸出版優秀圖書獎)、《大數據日知錄:架構與算法》的作者。
在辭舊迎新的時刻,大家都在忙着回顧過去一年的成績(或者在竈臺前含淚數鍋),並對2019做着規劃,當然也有不少朋友執行力和工作效率比較高,直接把2018年初制定的計劃拷貝一下,就能在3秒鐘內完成2019年計劃的制定,在此表示祝賀。
2018年從經濟角度講,對於所有人可能都是比較難過的一年,而對於自然語言處理領域來說,2018年無疑是個收穫頗豐的年頭,而諸多技術進展如果只能選擇一項來講的話,那麼當之無愧的應該就是Bert模型了。
在上一篇介紹Bert的文章“從Word Embedding到Bert模型—自然語言處理中的預訓練技術發展史”裏,我曾大言不慚地宣稱如下兩個個人判斷:一個是Bert這種兩階段的模式(預訓練+Finetuning)必將成爲NLP領域研究和工業應用的流行方法;第二個是從NLP領域的特徵抽取器角度來說,Transformer會逐步取代RNN成爲最主流的的特徵抽取器。
關於特徵抽取器方面的判斷,上面文章限於篇幅,只是給了一個結論,並未給出具備誘惑力的說明,看過我文章的人都知道我不是一個隨便下結論的人(那位正在補充下一句:“你隨便起來不是……”的同學請住口,請不要泄露國家機密,你可以繼續睡覺,吵到其它同學也沒有關係,哈哈),但是爲什麼當時我會下這個結論呢?本文可以看做是上文的一個外傳,會給出比較詳實的證據來支撐之前給出的結論。
如果對目前NLP裏的三大特徵抽取器的未來走向趨勢做個宏觀判斷的話,我的判斷是這樣的:RNN人老珠黃,已經基本完成它的歷史使命,將來會逐步退出歷史舞臺;CNN如果改造得當,將來還是有希望有自己在NLP領域的一席之地,如果改造成功程度超出期望,那麼還有一絲可能作爲割據一方的軍閥,繼續生存壯大,當然我認爲這個希望不大,可能跟宋小寶打籃球把姚明打哭的概率相當;而新歡Transformer明顯會很快成爲NLP裏擔當大任的最主流的特徵抽取器。
至於將來是否會出現新的特徵抽取器,一槍將Tranformer挑落馬下,繼而取而代之成爲新的特徵抽取山大王?這種擔憂其實是挺有必要的,畢竟李商隱在一千年前就告誡過我們說:“君恩如水向東流,得寵憂移失寵愁。 莫向樽前奏花落,涼風只在殿西頭。”當然這首詩看樣子目前送給RNN是比較貼切的,至於未來Transformer是否會失寵?這個問題的答案基本可以是肯定的,無非這個時刻的來臨是3年之後,還是1年之後出現而已。

當然,我希望如果是在讀這篇文章的你,或者是我,在未來的某一天,從街頭拉來一位長相普通的淑女,送到韓國整容,一不小心偏離流水線整容工業的美女模板,整出一位天香國色的絕色,來把Transformer打入冷宮,那是最好不過。但是在目前的狀態下,即使是打着望遠鏡,貌似還沒有看到有這種資質的候選人出現在我們的視野之內。

我知道如果是一位嚴謹的研發人員,不應該在目前局勢還沒那麼明朗的時候做出如上看似有些武斷的明確結論,所以這種說法可能會引起爭議。但是這確實就是我目前的真實想法,至於根據什麼得出的上述判斷?這種判斷是否有依據?依據是否充分?相信你在看完這篇文章可以有個屬於自己的結論。

可能談到這裏,有些平常吃虧吃的少所以喜歡挑刺的同學會質疑說:你憑什麼說NLP的典型特徵抽取器就這三種呢?你置其它知名的特徵抽取器比如Recursive NN於何地?嗯,是,很多介紹NLP重要進展的文章裏甚至把Recursive NN當做一項NLP裏的重大進展,除了它,還有其它的比如Memory Network也享受這種部局級尊貴待遇。但是我一直都不太看好這兩個技術,而且不看好很多年了,目前情形更堅定了這個看法。而且我免費奉勸你一句,沒必要在這兩個技術上浪費時間,至於爲什麼,因爲跟本文主題無關,以後有機會再詳細說。
上面是結論,下面,我們正式進入舉證階段。

戰場偵查:NLP任務的特點及任務類型

在這裏插入圖片描述
NLP任務的特點和圖像有極大的不同,上圖展示了一個例子,NLP的輸入往往是一句話或者一篇文章,所以它有幾個特點:首先,輸入是個一維線性序列,這個好理解;其次,輸入是不定長的,有的長有的短,而這點其實對於模型處理起來也會增加一些小麻煩;再者,單詞或者子句的相對位置關係很重要,兩個單詞位置互換可能導致完全不同的意思。如果你聽到我對你說:“你欠我那一千萬不用還了”和“我欠你那一千萬不用還了”,你聽到後分別是什麼心情?兩者區別瞭解一下。另外,句子中的長距離特徵對於理解語義也非常關鍵,例子參考上圖標紅的單詞,特徵抽取器能否具備長距離特徵捕獲能力這一點對於解決NLP任務來說也是很關鍵的。

上面這幾個特點請記清,一個特徵抽取器是否適配問題領域的特點,有時候決定了它的成敗,而很多模型改進的方向,其實就是改造得使得它更匹配領域問題的特性。這也是爲何我在介紹RNN、CNN、Transformer等特徵抽取器之前,先說明這些內容的原因。

NLP是個很寬泛的領域,包含了幾十個子領域,理論上只要跟語言處理相關,都可以納入這個範圍。但是如果我們對大量NLP任務進行抽象的話,會發現絕大多數NLP任務可以歸結爲幾大類任務。兩個看似差異很大的任務,在解決任務的模型角度,可能完全是一樣的。

(1)序列標註:分詞、實體識別、語義標註……
(2)分類任務:文本分類、情感計算……
(3)句子關係判斷:entailment、QA、自然語言推理
(4)生成式任務:機器翻譯、文本摘

通常而言,絕大部分NLP問題可以歸入上圖所示的四類任務中:一類是序列標註,這是最典型的NLP任務,比如中文分詞,詞性標註,命名實體識別,語義角色標註等都可以歸入這一類問題,它的特點是句子中每個單詞要求模型根據上下文都要給出一個分類類別。第二類是分類任務,比如我們常見的文本分類,情感計算等都可以歸入這一類。它的特點是不管文章有多長,總體給出一個分類類別即可。第三類任務是句子關係判斷,比如Entailment,QA,語義改寫,自然語言推理等任務都是這個模式,它的特點是給定兩個句子,模型判斷出兩個句子是否具備某種語義關係;第四類是生成式任務,比如機器翻譯,文本摘要,寫詩造句,看圖說話等都屬於這一類。它的特點是輸入文本內容後,需要自主生成另外一段文字。

解決這些不同的任務,從模型角度來講什麼最重要?是特徵抽取器的能力。尤其是深度學習流行開來後,這一點更凸顯出來。因爲深度學習最大的優點是“端到端(end to end)”,當然這裏不是指的從客戶端到雲端,意思是以前研發人員得考慮設計抽取哪些特徵,而端到端時代後,這些你完全不用管,把原始輸入扔給好的特徵抽取器,它自己會把有用的特徵抽取出來。

身爲資深Bug製造者和算法工程師,你現在需要做的事情就是:選擇一個好的特徵抽取器,選擇一個好的特徵抽取器,選擇一個好的特徵抽取器,餵給它大量的訓練數據,設定好優化目標(loss function),告訴它你想讓它幹嘛………然後你覺得你啥也不用幹等結果就行了是吧?那你是我見過的整個宇宙中最樂觀的人…….你大量時間其實是用在調參上…….。

從這個過程可以看出,如果我們有個強大的特徵抽取器,那麼中初級算法工程師淪爲調參俠也就是個必然了,在AutoML(自動那啥)流行的年代,也許以後你想當調參俠而不得,李斯說的“吾欲與若復牽黃犬,俱出上蔡東門逐狡兔,豈可得乎!”請了解一下。所以請珍惜你半夜兩點還在調整超參的日子吧,因爲對於你來說有一個好消息一個壞消息,好消息是:對於你來說可能這樣辛苦的日子不多了!壞消息是:對於你來說可能這樣辛苦的日子不多了!!!那麼怎麼才能成爲算法高手?你去設計一個更強大的特徵抽取器呀。

下面開始分敘三大特徵抽取器。

沙場老將RNN:廉頗老矣,尚能飯否

在這裏插入圖片描述
RNN模型我估計大家都熟悉,就不詳細介紹了,模型結構參考上圖,核心是每個輸入對應隱層節點,而隱層節點之間形成了線性序列,信息由前向後在隱層之間逐步向後傳遞。我們下面直接進入我想講的內容。

爲何RNN能夠成爲解決NLP問題的主流特徵抽取器?

我們知道,RNN自從引入NLP界後,很快就成爲吸引眼球的明星模型,在NLP各種任務中被廣泛使用。但是原始的RNN也存在問題,它採取線性序列結構不斷從前往後收集輸入信息,但這種線性序列結構在反向傳播的時候存在優化困難問題,因爲反向傳播路徑太長,容易導致嚴重的梯度消失或梯度爆炸問題。爲了解決這個問題,後來引入了LSTM和GRU模型,通過增加中間狀態信息直接向後傳播,以此緩解梯度消失問題,獲得了很好的效果,於是很快LSTM和GRU成爲RNN的標準模型。

其實圖像領域最早由HighwayNet/Resnet等導致模型革命的skip connection的原始思路就是從LSTM的隱層傳遞機制借鑑來的。經過不斷優化,後來NLP又從圖像領域借鑑並引入了attention機制(從這兩個過程可以看到不同領域的相互技術借鑑與促進作用),疊加網絡把層深作深,以及引入Encoder-Decoder框架,這些技術進展極大拓展了RNN的能力以及應用效果。下圖展示的模型就是非常典型的使用RNN來解決NLP任務的通用框架技術大禮包,在更新的技術出現前,你可以在NLP各種領域見到這個技術大禮包的身影。

在這裏插入圖片描述

上述內容簡單介紹了RNN在NLP領域的大致技術演進過程。那麼爲什麼RNN能夠這麼快在NLP流行並且佔據了主導地位呢?主要原因還是因爲RNN的結構天然適配解決NLP的問題,NLP的輸入往往是個不定長的線性序列句子,而RNN本身結構就是個可以接納不定長輸入的由前向後進行信息線性傳導的網絡結構,而在LSTM引入三個門後,對於捕獲長距離特徵也是非常有效的。所以RNN特別適合NLP這種線形序列應用場景,這是RNN爲何在NLP界如此流行的根本原因。

RNN在新時代面臨的兩個嚴重問題

RNN在NLP界一直紅了很多年(2014-2018?),在2018年之前,大部分各個子領域的State of Art的結果都是RNN獲得的。但是最近一年來,眼看着RNN的領袖羣倫的地位正在被動搖,所謂各領風騷3-5年,看來網紅模型也不例外。

那這又是因爲什麼呢?主要有兩個原因。

第一個原因在於一些後起之秀新模型的崛起,比如經過特殊改造的CNN模型,以及最近特別流行的Transformer,這些後起之秀尤其是Transformer的應用效果相比RNN來說,目前看具有明顯的優勢。這是個主要原因,老人如果幹不過新人,又沒有脫胎換骨自我革命的能力,自然要自覺或不自願地退出歷史舞臺,這是自然規律。至於RNN能力偏弱的具體證據,本文後面會專門談,這裏不展開講。當然,技術人員裏的RNN保皇派們,這個羣體規模應該還是相當大的,他們不會輕易放棄曾經這麼熱門過的流量明星的,所以也想了或者正在想一些改進方法,試圖給RNN延年益壽。至於這些方法是什麼,有沒有作用,後面也陸續會談。

另外一個嚴重阻礙RNN將來繼續走紅的問題是:RNN本身的序列依賴結構對於大規模並行計算來說相當之不友好。通俗點說,就是RNN很難具備高效的並行計算能力,這個乍一看好像不是太大的問題,其實問題很嚴重。如果你僅僅滿足於通過改RNN發一篇論文,那麼這確實不是大問題,但是如果工業界進行技術選型的時候,在有快得多的模型可用的前提下,是不太可能選擇那麼慢的模型的。一個沒有實際落地應用支撐其存在價值的模型,其前景如何這個問題,估計用小腦思考也能得出答案。

那問題來了:爲什麼RNN並行計算能力比較差?是什麼原因造成的?

在這裏插入圖片描述

我們知道,RNN之所以是RNN,能將其和其它模型區分開的最典型標誌是:T時刻隱層狀態的計算,依賴兩個輸入,一個是T時刻的句子輸入單詞Xt,這個不算特點,所有模型都要接收這個原始輸入;關鍵的是另外一個輸入,T時刻的隱層狀態St還依賴T-1時刻的隱層狀態S(t-1)的輸出,這是最能體現RNN本質特徵的一點,RNN的歷史信息是通過這個信息傳輸渠道往後傳輸的,示意參考上圖。

那麼爲什麼RNN的並行計算能力不行呢?問題就出在這裏。因爲T時刻的計算依賴T-1時刻的隱層計算結果,而T-1時刻的計算依賴T-2時刻的隱層計算結果………這樣就形成了所謂的序列依賴關係。就是說只能先把第1時間步的算完,才能算第2時間步的結果,這就造成了RNN在這個角度上是無法並行計算的,只能老老實實地按着時間步一個單詞一個單詞往後走。

而CNN和Transformer就不存在這種序列依賴問題,所以對於這兩者來說並行計算能力就不是問題,每個時間步的操作可以並行一起計算。

那麼能否針對性地對RNN改造一下,提升它的並行計算能力呢?如果可以的話,效果如何呢?下面我們討論一下這個問題。

如何改造RNN使其具備並行計算能力?

上面說過,RNN不能並行計算的癥結所在,在於T時刻對T-1時刻計算結果的依賴,而這體現在隱層之間的全連接網絡上。既然癥結在這裏,那麼要想解決問題,也得在這個環節下手才行。在這個環節多做點什麼事情能夠增加RNN的並行計算能力呢?你可以想一想。

其實留給你的選項並不多,你可以有兩個大的思路來改進:一種是仍然保留任意連續時間步(T-1到T時刻)之間的隱層連接;而另外一種是部分地打斷連續時間步(T-1到T時刻)之間的隱層連接 。

我們先來看第一種方法,現在我們的問題轉化成了:我們仍然要保留任意連續時間步(T-1到T時刻)之間的隱層連接,但是在這個前提下,我們還要能夠做到並行計算,這怎麼處理呢?因爲只要保留連續兩個時間步的隱層連接,則意味着要計算T時刻的隱層結果,就需要T-1時刻隱層結果先算完,這不又落入了序列依賴的陷阱裏了嗎?嗯,確實是這樣,但是爲什麼一定要在不同時間步的輸入之間並行呢?沒有人說RNN的並行計算一定發生在不同時間步上啊,你想想,隱層是不是也是包含很多神經元?那麼在隱層神經元之間並行計算行嗎?如果你要是還沒理解這是什麼意思,那請看下圖。

在這裏插入圖片描述

上面的圖只顯示了各個時間步的隱層節點,每個時間步的隱層包含3個神經元,這是個俯視圖,是從上往下看RNN的隱層節點的。另外,連續兩個時間步的隱層神經元之間仍然有連接,上圖沒有畫出來是爲了看着簡潔一些。這下應該明白了吧,假設隱層神經元有3個,那麼我們可以形成3路並行計算(紅色箭頭分隔開成了三路),而每一路因爲仍然存在序列依賴問題,所以每一路內仍然是串行的。大思路應該明白了是吧?

但是瞭解RNN結構的同學會發現這樣還遺留一個問題:隱層神經元之間的連接是全連接,就是說T時刻某個隱層神經元與T-1時刻所有隱層神經元都有連接,如果是這樣,是無法做到在神經元之間並行計算的,你可以想想爲什麼,這個簡單,我假設你有能力想明白。那麼怎麼辦呢?很簡單,T時刻和T-1時刻的隱層神經元之間的連接關係需要改造,從之前的全連接,改造成對應位置的神經元(就是上圖被紅箭頭分隔到同一行的神經元之間)有連接,和其它神經元沒有連接。這樣就可以解決這個問題,在不同路的隱層神經元之間可以並行計算了。

第一種改造RNN並行計算能力的方法思路大致如上所述,這種方法的代表就是論文“Simple Recurrent Units for Highly Parallelizable Recurrence”中提出的SRU方法,它最本質的改進是把隱層之間的神經元依賴由全連接改成了哈達馬乘積,這樣T時刻隱層單元本來對T-1時刻所有隱層單元的依賴,改成了只是對T-1時刻對應單元的依賴,於是可以在隱層單元之間進行並行計算,但是收集信息仍然是按照時間序列來進行的。所以其並行性是在隱層單元之間發生的,而不是在不同時間步之間發生的。

這其實是比較巧妙的一種方法,但是它的問題在於其並行程度上限是有限的,並行程度取決於隱層神經元個數,而一般這個數值往往不會太大,再增加並行性已經不太可能。另外每一路並行線路仍然需要序列計算,這也會拖慢整體速度。SRU的測試速度爲:在文本分類上和原始CNN(Kim 2014)的速度相當,論文沒有說CNN是否採取了並行訓練方法。 其它在複雜任務閱讀理解及MT任務上只做了效果評估,沒有和CNN進行速度比較,我估計這是有原因的,因爲複雜任務往往需要深層網絡,其它的就不妄作猜測了。

在這裏插入圖片描述

第二種改進典型的思路是:爲了能夠在不同時間步輸入之間進行並行計算,那麼只有一種做法,那就是打斷隱層之間的連接,但是又不能全打斷,因爲這樣基本就無法捕獲組合特徵了,所以唯一能選的策略就是部分打斷,比如每隔2個時間步打斷一次,但是距離稍微遠點的特徵如何捕獲呢?只能加深層深,通過層深來建立遠距離特徵之間的聯繫。代表性模型比如上圖展示的Sliced RNN。

我當初看到這個模型的時候,心裏忍不住發出槓鈴般的笑聲,情不自禁地走上前跟他打了個招呼:你好呀,CNN模型,想不到你這個糙漢子有一天也會穿上粉色裙裝,裝扮成RNN的樣子出現在我面前啊,哈哈。瞭解CNN模型的同學看到我上面這句話估計會莞爾會心一笑:這不就是簡化版本的CNN嗎?不瞭解CNN的同學建議看完後面CNN部分再回頭來看看是不是這個意思。

那經過這種改造的RNN速度改進如何呢?論文給出了速度對比實驗,歸納起來,SRNN速度比GRU模型快5到15倍,嗯,效果不錯,但是跟對比模型DC-CNN模型速度比較起來,比CNN模型仍然平均慢了大約3倍。這很正常但是又有點說不太過去,說正常是因爲本來這就是把RNN改頭換面成類似CNN的結構,而片段裏仍然採取RNN序列模型,所以必然會拉慢速度,比CNN慢再正常不過了。

說“說不過去”是指的是:既然本質上是CNN,速度又比CNN慢,那麼這麼改的意義在哪裏?爲什麼不直接用CNN呢?是不是?前面那位因爲吃虧吃的少所以愛擡槓的同學又會說了:也許人家效果特別好呢。嗯,從這個結構的作用機制上看,可能性不太大。你說論文實驗部分證明了這一點呀,我認爲實驗部分對比試驗做的不充分,需要補充除了DC-CNN外的其他CNN模型進行對比。當然這點純屬個人意見,別當真,因爲我講起話來的時候經常搖頭晃腦,此時一般會有人驚奇地跟我反饋說:爲什麼你一講話我就聽到了水聲?

上面列舉了兩種大的改進RNN並行計算能力的思路,我個人對於RNN的並行計算能力持悲觀態度,主要因爲RNN本質特性決定了我們能做的選擇太少。無非就是選擇打斷還是不打斷隱層連接的問題。如果選擇打斷,就會面臨上面的問題,你會發現它可能已經不是RNN模型了,爲了讓它看上去還像是RNN,所以在打斷片段裏仍然採取RNN結構,這樣無疑會拉慢速度,所以這是個兩難的選擇,與其這樣不如直接換成其它模型;如果我們選擇不打斷,貌似只能在隱層神經元之間進行並行,而這樣做的缺點是:一方面並行能力上限很低;另外一方面裏面依然存在的序列依賴估計仍然是個問題。這是爲何悲觀的原因,主要是看不到大的希望。

偏師之將CNN:刺激戰場絕地求生

在一年多前,CNN是自然語言處理中除了RNN外最常見的深度學習模型,這裏介紹下CNN特徵抽取器,會比RNN說得詳細些,主要考慮到大家對它的熟悉程度可能沒有RNN那麼高。

NLP中早期的懷舊版CNN模型

在這裏插入圖片描述

最早將CNN引入NLP的是Kim在2014年做的工作,論文和網絡結構參考上圖。一般而言,輸入的字或者詞用Word Embedding的方式表達,這樣本來一維的文本信息輸入就轉換成了二維的輸入結構,假設輸入X包含n個字符,而每個字符的Word Embedding的長度爲d,那麼輸入就是d*n的二維向量。
卷積層本質上是個特徵抽取層,可以設定超參數F來指定卷積層包含多少個卷積核(Filter)。

對於某個Filter來說,可以想象有一個d*k大小的移動窗口從輸入矩陣的第一個字開始不斷往後移動,其中k是Filter指定的窗口大小,d是Word Embedding長度。對於某個時刻的窗口,通過神經網絡的非線性變換,將這個窗口內的輸入值轉換爲某個特徵值,隨着窗口不斷往後移動,這個Filter對應的特徵值不斷產生,形成這個Filter的特徵向量。這就是卷積核抽取特徵的過程。卷積層內每個Filter都如此操作,就形成了不同的特徵序列。Pooling 層則對Filter的特徵進行降維操作,形成最終的特徵。一般在Pooling層之後連接全聯接層神經網絡,形成最後的分類過程。

這就是最早應用在NLP領域CNN模型的工作機制,用來解決NLP中的句子分類任務,看起來還是很簡潔的,之後陸續出現了在此基礎上的改進模型。這些懷舊版CNN模型在一些任務上也能和當時懷舊版本的RNN模型效果相當,所以在NLP若干領域也能野蠻生長,但是在更多的NLP領域,還是處於被RNN模型壓制到抑鬱症早期的尷尬局面。

那爲什麼在圖像領域打遍天下無敵手的CNN,一旦跑到NLP的地盤,就被RNN這個地頭蛇壓制得無顏見圖像領域江東父老呢?這說明這個版本的CNN還是有很多問題的,其實最根本的癥結所在還是老革命遇到了新問題,主要是到了新環境沒有針對新環境的特性做出針對性的改變,所以面臨水土不服的問題。

CNN能在RNN縱橫的各種NLP任務環境下生存下來嗎?謎底即將揭曉。

CNN的進化:物競天擇的模型鬥獸場

下面我們先看看懷舊版CNN存在哪些問題,然後看看我們的NLP專家們是如何改造CNN,一直改到目前看上去還算效果不錯的現代版本CNN的。

首先,我們先要明確一點:CNN捕獲到的是什麼特徵呢?從上述懷舊版本CNN卷積層的運作機制你大概看出來了,關鍵在於卷積核覆蓋的那個滑動窗口,CNN能捕獲到的特徵基本都體現在這個滑動窗口裏了。大小爲k的滑動窗口輕輕的穿過句子的一個個單詞,蕩起陣陣漣漪,那麼它捕獲了什麼?其實它捕獲到的是單詞的k-gram片段信息,這些k-gram片段就是CNN捕獲到的特徵,k的大小決定了能捕獲多遠距離的特徵。

在這裏插入圖片描述

說完這個,我們來看Kim版CNN的第一個問題:它只有一個卷積層。表面看上去好像是深度不夠的問題是吧?我會反問你說:爲什麼要把CNN作深呢?其實把深度做起來是手段,不是目的。只有一個卷積層帶來的問題是:對於遠距離特徵,單層CNN是無法捕獲到的,如果滑動窗口k最大爲2,而如果有個遠距離特徵距離是5,那麼無論上多少個卷積核,都無法覆蓋到長度爲5的距離的輸入,所以它是無法捕獲長距離特徵的。

在這裏插入圖片描述

那麼怎樣才能捕獲到長距離的特徵呢?有兩種典型的改進方法:一種是假設我們仍然用單個卷積層,滑動窗口大小k假設爲3,就是隻接收三個輸入單詞,但是我們想捕獲距離爲5的特徵,怎麼做才行?顯然,如果卷積核窗口仍然覆蓋連續區域,這肯定是完不成任務的。提示一下:你玩過跳一跳是吧?能採取類似策略嗎?對,你可以跳着覆蓋呀,是吧?這就是Dilated 卷積的基本思想,確實也是一種解決方法。
在這裏插入圖片描述
第二種方法是把深度做起來。第一層卷積層,假設滑動窗口大小k是3,如果再往上疊一層卷積層,假設滑動窗口大小也是3,但是第二層窗口覆蓋的是第一層窗口的輸出特徵,所以它其實能覆蓋輸入的距離達到了5。如果繼續往上疊加捲積層,可以繼續增大卷積核覆蓋輸入的長度。

上面是兩種典型的解決CNN遠距離特徵捕獲能力的方案,Dilated CNN偏技巧一些,而且疊加捲積層時超參如何設置有些學問,因爲連續跳接可能會錯過一些特徵組合,所以需要精心調節參數搭配,保證所有可能組合都被覆蓋到。相對而言,把CNN作深是主流發展方向。

上面這個道理好理解,其實自從CNN一出現,人們就想各種辦法試圖把CNN的深度做起來,但是現實往往是無情的,發現怎麼折騰,CNN做NLP問題就是做不深,做到2到3層卷積層就做不上去了,網絡更深對任務效果沒什麼幫助(請不要拿CharCNN來做反例,後來研究表明使用單詞的2層CNN效果超過CharCNN)。目前看來,還是深層網絡參數優化手段不足導致的這個問題,而不是層深沒有用。後來Resnet等圖像領域的新技術出現後,很自然地,人們會考慮把Skip Connection及各種Norm等參數優化技術引入,這才能慢慢把CNN的網絡深度做起來。

上面說的是Kim版本CNN的第一個問題,無法捕獲遠距離特徵的問題,以及後面科研人員提出的主要解決方案。回頭看Kim版本CNN還有一個問題,就是那個Max Pooling層,這塊其實與CNN能否保持輸入句子中單詞的位置信息有關係。首先我想問個問題:RNN因爲是線性序列結構,所以很自然它天然就會把位置信息編碼進去;那麼,CNN是否能夠保留原始輸入的相對位置信息呢?我們前面說過對於NLP問題來說,位置信息是很有用的。

其實CNN的卷積核是能保留特徵之間的相對位置的,道理很簡單,滑動窗口從左到右滑動,捕獲到的特徵也是如此順序排列,所以它在結構上已經記錄了相對位置信息了。但是如果卷積層後面立即接上Pooling層的話,Max Pooling的操作邏輯是:從一個卷積核獲得的特徵向量裏只選中並保留最強的那一個特徵,所以到了Pooling層,位置信息就被扔掉了,這在NLP裏其實是有信息損失的。所以在NLP領域裏,目前CNN的一個發展趨勢是拋棄Pooling層,靠全卷積層來疊加網絡深度,這背後是有原因的(當然圖像領域也是這個趨勢)。

在這裏插入圖片描述

上圖展示了在NLP領域能夠施展身手的摩登CNN的主體結構,通常由1-D卷積層來疊加深度,使用Skip Connection來輔助優化,也可以引入Dilated CNN等手段。比如ConvS2S主體就是上圖所示結構,Encoder包含 15個卷積層,卷積核kernel size=3,覆蓋輸入長度爲25。當然對於ConvS2S來說,卷積核裏引入GLU門控非線性函數也有重要幫助,限於篇幅,這裏不展開說了,GLU貌似是NLP裏CNN模型必備的構件,值得掌握。

再比如TCN(論文:An Empirical Evaluation of Generic Convolutional and Recurrent Networks for Sequence Modeling),集成了幾項技術:利用Dilated CNN拓展單層卷積層的輸入覆蓋長度,利用全卷積層堆疊層深,使用Skip Connection輔助優化,引入Casual CNN讓網絡結構看不到T時間步後的數據。

不過TCN的實驗做得有兩個明顯問題:一個問題是任務除了語言模型外都不是典型的NLP任務,而是合成數據任務,所以論文結論很難直接說就適合NLP領域;另外一點,它用來進行效果比較的對比方法,沒有用當時效果很好的模型來對比,比較基準低。所以TCN的模型效果說服力不太夠。其實它該引入的元素也基本引入了,實驗說服力不夠,我覺得可能是它命中缺GLU吧。

除此外,簡單談一下CNN的位置編碼問題和並行計算能力問題。上面說了,CNN的卷積層其實是保留了相對位置信息的,只要你在設計模型的時候別手賤,中間層不要隨手瞎插入Pooling層,問題就不大,不專門在輸入部分對position進行編碼也行。但是也可以類似ConvS2S那樣,專門在輸入部分給每個單詞增加一個position embedding,將單詞的position embedding和詞向量embedding疊加起來形成單詞輸入,這樣也可以,也是常規做法。

至於CNN的並行計算能力,那是非常強的,這其實很好理解。我們考慮單層卷積層,首先對於某個卷積核來說,每個滑動窗口位置之間沒有依賴關係,所以完全可以並行計算;另外,不同的卷積核之間也沒什麼相互影響,所以也可以並行計算。CNN的並行度是非常自由也非常高的,這是CNN的一個非常好的優點。

以上內容介紹了懷舊版CNN是如何在NLP修羅場一步步通過自我進化生存到今天的。CNN的進化方向,如果千言萬語一句話歸納的話,那就是:想方設法把CNN的深度做起來,隨着深度的增加,很多看似無關的問題就隨之解決了。就跟我們國家最近40年的主旋律是發展經濟一樣,經濟發展好了,很多問題就不是問題了。最近幾年之所以大家感到各方面很困難,癥結就在於經濟不行了,所以很多問題無法通過經濟帶動來解決,於是看似各種花樣的困難就冒出來,這是一個道理。

那麼介紹了這麼多,摩登版CNN效果如何呢?與RNN及Transforme比起來怎樣?彆着急,後面會專門談這個問題。

白衣騎士Transformer:蓋世英雄站上舞臺

在這裏插入圖片描述
Transformer是谷歌在17年做機器翻譯任務的“Attention is all you need”的論文中提出的,引起了相當大的反響。 每一位從事NLP研發的同仁都應該透徹搞明白Transformer,它的重要性毫無疑問,尤其是你在看完我這篇文章之後,我相信你的緊迫感會更迫切,我就是這麼一位善於製造焦慮的能手。

不過這裏沒打算重點介紹它,想要入門Transformer的可以參考以下三篇文章:一個是Jay Alammar可視化地介紹Transformer的博客文章The Illustrated Transformer ,非常容易理解整個機制,建議先從這篇看起, 這是中文翻譯版本;第二篇是 Calvo的博客:Dissecting BERT Part 1: The Encoder ,儘管說是解析Bert,但是因爲Bert的Encoder就是Transformer,所以其實它是在解析Transformer,裏面舉的例子很好;再然後可以進階一下,參考哈佛大學NLP研究組寫的“The Annotated Transformer. ”,代碼原理雙管齊下,講得也很清楚。

下面只說跟本文主題有關的內容。

在這裏插入圖片描述

這裏要澄清一下,本文所說的Transformer特徵抽取器並非原始論文所指。我們知道,“Attention is all you need”論文中說的的Transformer指的是完整的Encoder-Decoder框架,而我這裏是從特徵提取器角度來說的,你可以簡單理解爲論文中的Encoder部分。因爲Encoder部分目的比較單純,就是從原始句子中提取特徵,而Decoder部分則功能相對比較多,除了特徵提取功能外,還包含語言模型功能,以及用attention機制表達的翻譯模型功能。所以這裏請注意,避免後續理解概念產生混淆。

Transformer的Encoder部分(不是上圖一個一個的標爲encoder的模塊,而是紅框內的整體,上圖來自The Illustrated Transformer,Jay Alammar把每個Block稱爲Encoder不太符合常規叫法)是由若干個相同的Transformer Block堆疊成的。 這個Transformer Block其實才是Transformer最關鍵的地方,核心配方就在這裏。那麼它長什麼樣子呢?

在這裏插入圖片描述

它的照片見上圖,看上去是不是很可愛,有點像安卓機器人是吧?這裏需要強調一下,儘管Transformer原始論文一直重點在說Self Attention,但是目前來看,能讓Transformer效果好的,不僅僅是Self attention,這個Block裏所有元素,包括Multi-head self attention,Skip connection,LayerNorm,FF一起在發揮作用。爲什麼這麼說?你看到後面會體會到這一點。

我們針對NLP任務的特點來說下Transformer的對應解決方案。首先,自然語言一般是個不定長的句子,那麼這個不定長問題怎麼解決呢?Transformer做法跟CNN是類似的,一般設定輸入的最大長度,如果句子沒那麼長,則用Padding填充,這樣整個模型輸入起碼看起來是定長的了。

另外,NLP句子中單詞之間的相對位置是包含很多信息的,上面提過,RNN因爲結構就是線性序列的,所以天然會將位置信息編碼進模型;而CNN的卷積層其實也是保留了位置相對信息的,所以什麼也不做問題也不大。但是對於Transformer來說,爲了能夠保留輸入句子單詞之間的相對位置信息,必須要做點什麼。

爲啥它必須要做點什麼呢?因爲輸入的第一層網絡是Muli-head self attention層,我們知道,Self attention會讓當前輸入單詞和句子中任意單詞發生關係,然後集成到一個embedding向量裏,但是當所有信息到了embedding後,位置信息並沒有被編碼進去。

所以,Transformer不像RNN或CNN,必須明確的在輸入端將Positon信息編碼,Transformer是用位置函數來進行位置編碼的,而Bert等模型則給每個單詞一個Position embedding,將單詞embedding和單詞對應的position embedding加起來形成單詞的輸入embedding,類似上文講的ConvS2S的做法。

而關於NLP句子中長距離依賴特徵的問題,Self attention天然就能解決這個問題,因爲在集成信息的時候,當前單詞和句子中任意單詞都發生了聯繫,所以一步到位就把這個事情做掉了。不像RNN需要通過隱層節點序列往後傳,也不像CNN需要通過增加網絡深度來捕獲遠距離特徵,Transformer在這點上明顯方案是相對簡單直觀的。說這些是爲了單獨介紹下Transformer是怎樣解決NLP任務幾個關鍵點的。

Transformer有兩個版本:Transformer base和Transformer Big。兩者結構其實是一樣的,主要區別是包含的Transformer Block數量不同,Transformer base包含12個Block疊加,而Transformer Big則擴張一倍,包含24個Block。無疑Transformer Big在網絡深度,參數量以及計算量相對Transformer base翻倍,所以是相對重的一個模型,但是效果也最好。

華山論劍:三大特徵抽取器比較

結合NLP領域自身的特點,上面幾個部分分別介紹了RNN/CNN/Transformer各自的特性。從上面的介紹,看上去好像三大特徵抽取器在NLP領域裏各有所長,推想起來要是把它們拉到NLP任務競技場角鬥,一定是互有勝負,各擅勝場吧?

事實究竟如何呢?是三個特徵抽取器三花齊放還是某一個一枝獨秀呢?我們通過一些實驗來說明這個問題。

爲了更細緻和公平地做對三者進行比較,我準備從幾個不同的角度來分別進行對比,我原先打算從以下幾個維度來進行分析判斷:句法特徵提取能力;語義特徵提取能力;長距離特徵捕獲能力;任務綜合特徵抽取能力。上面四個角度是從NLP的特徵抽取器能力強弱角度來評判的,另外再加入並行計算能力及運行效率,這是從是否方便大規模實用化的角度來看的。

因爲目前關於特徵抽取器句法特徵抽取能力方面進行比較的文獻很少,好像只看到一篇文章,結論是CNN在句法特徵提取能力要強於RNN,但是因爲是比較早的文章,而且沒有對比transformer在句法特徵抽取方面的能力,所以這塊很難單獨比較,於是我就簡化爲對以下幾項能力的對比:

  1. 語義特徵提取能力;
  2. 長距離特徵捕獲能力;
  3. 任務綜合特徵抽取能力;
  4. 並行計算能力及運行效率

三者在這些維度各自表現如何呢?下面我們分頭進行說明。

語義特徵提取能力

在這裏插入圖片描述
從語義特徵提取能力來說,目前實驗支持如下結論:Transformer在這方面的能力非常顯著地超過RNN和CNN(在考察語義類能力的任務WSD中,Transformer超過RNN和CNN大約4-8個絕對百分點),RNN和CNN兩者能力差不太多。

長距離特徵捕獲能力

在這裏插入圖片描述

在長距離特徵捕獲能力方面,目前在特定的長距離特徵捕獲能力測試任務中(主語-謂語一致性檢測,比如we………are…),實驗支持如下結論:原生CNN特徵抽取器在這方面極爲顯著地弱於RNN和Transformer,Transformer微弱優於RNN模型(尤其在主語謂語距離小於13時),能力由強到弱排序爲Transformer>RNN>>CNN; 但在比較遠的距離上(主語謂語距離大於13),RNN微弱優於Transformer,所以綜合看,可以認爲Transformer和RNN在這方面能力差不太多,而CNN則顯著弱於前兩者。

那麼爲什麼CNN在捕獲長距離特徵方面這麼弱呢?這個我們在前文講述CNN的時候就說過,CNN解決這個問題是靠堆積深度來獲得覆蓋更長的輸入長度的,所以CNN在這方面的表現與卷積核能夠覆蓋的輸入距離最大長度有關係。如果通過增大卷積核的kernel size,同時加深網絡深度,以此來增加輸入的長度覆蓋。實驗證明這能夠明顯提升CNN的long-range特徵捕獲能力。

但是儘管如此,CNN在這方面仍然顯著弱於RNN和Transformer。這個問題背後的原因是什麼呢(因爲上述主語-謂語一致性任務中,CNN的深度肯定可以覆蓋13-25這個長度了,但是表現還是很弱)?其實這是一個很好的值得探索的點。

對於Transformer來說,Multi-head attention的head數量嚴重影響NLP任務中Long-range特徵捕獲能力:結論是head越多越有利於捕獲long-range特徵。在上頁PPT裏寫明的論文出來之前,有個工作(論文:Tran. The Importance of Being Recurrent for Modeling Hierarchical Structure)的結論和上述結論不一致:它的結論是在”主語-謂語一致性”任務上,Transformer表現是弱於LSTM的。

如果綜合這兩篇論文,我們看似得到了相互矛盾的結論,那麼到底誰是正確的呢?Why Self-attention的論文對此進行了探索,它的結論是:這個差異是由於兩個論文中的實驗中Transformer的超參設置不同導致的,其中尤其是multi-head的數量,對結果影響嚴重,而如果正確設置一些超參,那麼之前Trans的論文結論是不成立的。也就是說,我們目前仍然可以維持下面結論:在遠距離特徵捕獲能力方面,Transformer和RNN能力相近,而CNN在這方面則顯著弱於前兩者。

任務綜合特徵抽取能力

上面兩項對比是從特徵抽取的兩個比較重要的單項能力角度來評估的,其實更重要的是在具體任務中引入不同特徵抽取器,然後比較效果差異,以此來綜合評定三者的綜合能力。那麼這樣就引出一個問題:NLP中的任務很多,哪些任務是最具有代表性的呢?答案是機器翻譯。

你會看到很多NLP的重要的創新模型都是在機器翻譯任務上提出來的,這背後是有道理的,因爲機器翻譯基本上是對NLP各項處理能力綜合要求最高的任務之一,要想獲得高質量的翻譯結果,對於兩種語言的詞法,句法,語義,上下文處理能力,長距離特徵捕獲等等更方面都需要考慮進來才行。這是爲何看到很多比較工作是在機器翻譯上作出的,這裏給個背後原因的解釋,以避免被質疑任務單一,沒有說服力的問題。當然,我預料到那位“因爲吃虧少….愛挑刺”的同學會這麼質問我,沒關係,即使你對此提出質疑,我依然能夠拿出證據,爲什麼這麼講,請往後看。

那麼在以機器翻譯爲代表的綜合特徵抽取能力方面,三個特徵抽取器哪個更好些呢?

在這裏插入圖片描述

先給出一個機器翻譯任務方面的證據,仍然是why Self attention論文的結論,對比實驗結果數據參考上圖。在兩個機器翻譯任務中,可以看到,翻譯質量指標BLEU證明了如下結論:Transformer綜合能力要明顯強於RNN和CNN(你要知道,技術發展到現在階段,BLEU絕對值提升1個點是很難的事情),而RNN和CNN看上去表現基本相當,貌似CNN表現略好一些。

你可能覺得一個論文的結論不太能說明問題,那麼我再給出一個證據,不過這個證據只對比了Transformer和RNN,沒帶CNN玩,不過關於說服力我相信你不會質疑,實驗對比數據如下:

在這裏插入圖片描述

上面是GPT論文的實驗結論,在8個不同的NLP任務上,在其它條件相同的情況下,只是把特徵抽取器從Transformer換成LSTM,平均下來8個任務得分掉了5個點以上。這具備足夠說服力嗎?

其實還有其它機器翻譯方面的實驗數據,篇幅原因,不一一列舉了。如果你是個較真的人,實在還想看,那請看下一節,裏面有另外一個例子的數據讓來你服氣。如果歸納一下的話,現在能得出的結論是這樣的:從綜合特徵抽取能力角度衡量,Transformer顯著強於RNN和CNN,而RNN和CNN的表現差不太多,如果一定要在這兩者之間比較的話,通常CNN的表現要稍微好於RNN的效果。

當然,需要強調一點,本部分所說的RNN和CNN指的是原生的RNN和CNN模型,就是說你可以在經典的結構上增加attention,堆疊層次等各種改進,但是不包含對本身結構特別大的變動,就是說支持整容,但是不支持變性。這裏說的原生版本指的是整容版本,我知道你肯定很關心有沒有變性版本的RNN和CNN,我負責任地跟你說,有。你想知道它變性之後是啥樣子?等會你就看到了,有它們的照片給你。

並行計算能力及運算效率

關於三個特徵抽取器的並行計算能力,其實我們在前文分述三個模型的時候都大致提過,在此僅做個歸納,結論如下:

RNN在並行計算方面有嚴重缺陷,這是它本身的序列依賴特性導致的,所謂成也蕭何敗也蕭何,它的這個線形序列依賴性非常符合解決NLP任務,這也是爲何RNN一引入到NLP就很快流行起來的原因,但是也正是這個線形序列依賴特性,導致它在並行計算方面要想獲得質的飛躍,看起來困難重重,近乎是不太可能完成的任務。

而對於CNN和Transformer來說,因爲它們不存在網絡中間狀態不同時間步輸入的依賴關係,所以可以非常方便及自由地做並行計算改造,這個也好理解。

所以歸納一下的話,可以認爲並行計算能力由高到低排序如下:Transformer和CNN差不多,都遠遠遠遠強於RNN。

我們從另外一個角度來看,先拋開並行計算能力的問題,單純地比較一下三個模型的計算效率。可能大家的直觀印象是Transformer比較重,比較複雜,計算效率比較低,事實是這樣的嗎?

在這裏插入圖片描述

上圖列出了單層的Self attention/RNN/CNN的計算效率,首先要注意:上面列的是Self attention, 不是Transformer的Block,因爲Transformer Block裏其實包含了好幾層,而不是單層。我們先說self attention,等會說Transformer Block的計算量。

從上圖可以看出,如果是self attention/CNN/RNN單層比較計算量的話,三者都包含一個平方項,區別主要是:self attention的平方項是句子長度,因爲每一個單詞都需要和任意一個單詞發生關係來計算attention,所以包含一個n的平方項。而RNN和CNN的平方項則是embedding size。那麼既然都包含平方項,怎麼比較三個模型單層的計算量呢?首先容易看出CNN計算量是大於RNN的,那麼self attention如何與其它兩者比較呢。

可以這麼考慮:如果句子平均長度n大於embedding size,那麼意味着Self attention的計算量要大於RNN和CNN;而如果反過來,就是說如果embedding size大於句子平均長度,那麼明顯RNN和CNN的計算量要大於self attention操作。而事實上是怎樣?我們可以想一想,一般正常的句子長度,平均起來也就幾十個單詞吧。而當前常用的embedding size從128到512都常見,所以在大多數任務裏面其實self attention計算效率是要高於RNN和CNN的。

但是,那位因爲吃虧吃的少所以喜歡挑刺的同學會繼續質問我:“哥,我想知道的是Transformer和RNN及CNN的計算效率對比,不是self attention。另外,你能降低你腦袋裏發出的水聲音量嗎?”。嗯,這個質問很合理,我來粗略估算一下,因爲Transformer包含多層,其中的skip connection後的Add操作及LayerNorm操作不太耗費計算量,我先把它忽略掉,後面的FFN操作相對比較耗時,它的時間複雜度應該是n乘以d的平方。

所以如果把Transformer Block多層當作一個整體和RNN及CNN單層對比的話,Transformer Block計算量肯定是要多於RNN和CNN的,因爲它本身也包含一個n乘以d的平方,上面列出的self attention的時間複雜度就是多出來的計算量。這麼說起來,單個Transformer Block計算量大於單層RNN和CNN,沒毛病。

上面考慮的是三者單層的計算量,可以看出結論是:Transformer Block >CNN >RNN。如果是考慮不同的具體模型,會與模型的網絡層深有很大關係,另外還有常見的attention操作,所以問題會比較複雜,這裏不具體討論了。

說完非並行情況的三者單層計算量,再說回並行計算的問題。很明顯,對於Transformer和CNN來說,那個句子長度n是可以通過並行計算消掉的,而RNN因爲序列依賴的問題,那個n就消不掉,所以很明顯,把並行計算能力考慮進來,RNN消不掉的那個n就很要命。這只是理論分析,實際中三者計算效率到底如何呢?我們給出一些三者計算效率對比的實驗結論。

論文“Convolutional Sequence to Sequence Learning”比較了ConvS2S與RNN的計算效率, 證明了跟RNN相比,CNN明顯速度具有優勢,在訓練和在線推理方面,CNN比RNN快9.3倍到21倍。論文“Dissecting Contextual Word Embeddings: Architecture and Representation”提到了Transformer和CNN訓練速度比雙向LSTM快3到5倍。論文“The Best of Both Worlds: Combining Recent Advances in Neural Machine Translation”給出了RNN/CNN/Transformer速度對比實驗,結論是:Transformer Base速度最快;CNN速度次之,但是比Transformer Base比慢了將近一倍;Transformer Big速度再次,主要因爲它的參數量最大,而吊在車尾最慢的是RNN結構。

總而言之,關於三者速度對比方面,目前的主流經驗結論基本如上所述:Transformer Base最快,CNN次之,再次Transformer Big,最慢的是RNN。RNN比前兩者慢了3倍到幾十倍之間。

綜合排名情況

以上介紹內容是從幾個不同角度來對RNN/CNN/Transformer進行對比,綜合這幾個方面的實驗數據,我自己得出的結論是這樣的:單從任務綜合效果方面來說,Transformer明顯優於CNN,CNN略微優於RNN。速度方面Transformer和CNN明顯佔優,RNN在這方面劣勢非常明顯。這兩者再綜合起來,如果我給的排序結果是Transformer>CNN>RNN,估計沒有什麼問題吧?那位吃虧……愛挑刺的同學,你說呢?

從速度和效果折衷的角度看,對於工業界實用化應用,我的感覺在特徵抽取器選擇方面配置Transformer base是個較好的選擇。

三者的合流:向Transformer靠攏

上文提到了,Transformer的效果相對原生RNN和CNN來說有比較明顯的優勢,那麼是否意味着我們可以放棄RNN和CNN了呢?事實倒也並未如此。我們聰明的科研人員想到了一個巧妙的改造方法,我把它叫做“寄居蟹”策略(就是上文說的“變性”的一種帶有海洋文明氣息的文雅說法)。什麼意思呢?我們知道Transformer Block其實不是隻有一個構件,而是由multi-head attention/skip connection/Layer Norm/Feed forward network等幾個構件組成的一個小系統,如果我們把RNN或者CNN塞到Transformer Block裏會發生什麼事情呢?這就是寄居蟹策略的基本思路。

那麼怎麼把RNN和CNN塞到Transformer Block的肚子裏,讓它們背上重重的殼,從而能夠實現寄居策略呢?

在這裏插入圖片描述
在這裏插入圖片描述

其實很簡單,參考上面兩張PPT,簡而言之,大的方向就是把self attention 模塊用雙向RNN或者CNN替換掉,Transformer Block的其它構件依然健在。當然這只是說明一個大方向,具體的策略可能有些差異,但是基本思想八九不離十。

那麼如果RNN和CNN採取這種寄居策略,效果如何呢?他們還爬的動嗎?其實這種改造方法有奇效,能夠極大提升RNN和CNN的效果。而且目前來看,RNN或者CNN想要趕上Transformer的效果,可能還真只有這個辦法了。

在這裏插入圖片描述

我們看看RNN寄居到Transformer後,效果是如何的。上圖展示了對原生RNN不斷進行整容手術,逐步加入Transformer的各個構件後的效果。我們從上面的逐步變身過程可以看到,原生RNN的效果在不斷穩定提升。但是與土生土長的Transformer相比,性能仍然有差距。

在這裏插入圖片描述

類似的,上圖展示了對CNN進行不斷改造的過程以及其對應效果。同樣的,性能也有不同幅度的提升。但是也與土家Transformer性能存在一些差距。
這說明什麼?我個人意見是:這說明Transformer之所以能夠效果這麼好,不僅僅multi-head attention在發生作用,而是幾乎所有構件都在共同發揮作用,是一個小小的系統工程。

但是從上面結果看,變性版本CNN好像距離Transformer真身性能還是比不上,有些數據集合差距甚至還很大,那麼是否意味着這條路也未必走的通呢?Lightweight convolution和Dynamic convolutions給人們帶來一絲曙光,在論文“Pay Less Attention With LightweightI and Dynamic Convolutions”裏提出了上面兩種方法,效果方面基本能夠和Transformer真身相當。那它做了什麼能夠達成這一點呢?也是寄居策略。就是用Lightweight convolution和Dynamic convolutions替換掉Transformer中的Multi-head attention模塊,其它構件複用了Transformer的東西。和原生CNN的最主要區別是採用了Depth-wise separable CNN以及softmax-normalization等優化的CNN模型。

而這又說明了什麼呢?我覺得這說明了一點:RNN和CNN的大的出路在於寄生到Transformer Block裏,這個原則沒問題,看起來也是他倆的唯一出路。但是,要想效果足夠好,在塞進去的RNN和CNN上值得花些功夫,需要一些新型的RNN和CNN模型,以此來配合Transformer的其它構件,共同發揮作用。如果走這條路,那麼RNN和CNN翻身的一天也許還會到來。

儘管如此,我覺得RNN這條路仍然不好走,爲什麼呢,你要記得RNN並行計算能力差這個天生缺陷,即使把它塞到Transformer Block裏,別說現在效果還不行,就算哪天真改出了一個效果好的,但是因爲它的並行能力,會整體拖慢Transformer的運行效率。所以我綜合判斷RNN這條路將來也走不太通。

2019來自未來的消息:總結

很多年前的小學語文課本上有句話,是這麼說的:“張華考上了北京大學;李萍進了中等技術學校;我在百貨公司當售貨員:我們都有光明的前途”。我們小的時候看到這句話,對此深信不疑,但是走到2019的今天,估計已經沒有父母願意跟他們的孩子說這句話了,畢竟欺騙孩子是個挺不好的事情。如果套用這句話來說明NLP的三大特徵抽取器的前途的話,應該是這樣的:“Transformer考上了北京大學;CNN進了中等技術學校,希望有一天能夠考研考進北京大學;RNN在百貨公司當售貨員:我們都有看似光明的前途。”

我們把上文的所有證據都收集起來進行邏輯推理,可以模仿曹雪芹老師,分別給三位NLP界佳麗未來命運寫一句判詞。當然,再次聲明,這是我個人判斷。

進退維谷的RNN

爲什麼說RNN進退維谷呢?有幾個原因。

首先,如果靠原生的RNN(包括LSTM,GRU以及引入Attention以及堆疊層次等各種你能想到的改進方法,可以一起上),目前很多實驗已經證明效果比起Transformer有較大差距,現在看基本沒有迎頭趕上的可能,所以原生的RNN從效果來講是處於明顯劣勢的。

其次,原生的RNN還有一個致命的問題:並行計算能力受限制太嚴重。想要大規模實用化應用?目前看希望渺茫。我們前面說過,決定了RNN本身的根本特質是:T時刻隱層節點對前向輸入及中間計算結果的序列依賴,因爲它要線形序列收集前面的信息,這是RNN之所以是RNN的最主要特點。

正是它的這個根本特質,使得RNN的並行計算能力想要獲得根本解決基本陷入了一個兩難的境地:要麼仍然保持RNN序列依賴的根本特性,這樣不論怎麼改造,因爲這個根本還在,所以RNN依舊是RNN,所謂“我就是我,是不一樣的煙火”,但是如果這樣,那麼其並行能力基本無法有力發揮,天花板很低;當然除此外,還有另外一條路可走,就是把這種序列依賴關係打掉,如果這樣,那麼這種打掉序列依賴關係的模型雖然看上去仍然保留了部分RNN整形前的樣貌,其實它骨子裏已經是另外一個人了,這已經不是你記憶中的RNN了。

就是說,對RNN來說,要麼就認命接受慢的事實,躲進小樓成一統,管他春夏與秋冬,僅僅是學術界用來發表論文的一種載體,不考慮大規模實用化的問題。要麼就徹底改頭換面變成另外一個人,如果真走到這一步,我想問的是:你被別人稱爲高效版本的RNN,你自己好意思答應嗎?這就是RNN面臨的兩難境地。

再次,假設我們再樂觀一點,把對RNN的改造方向定位爲將RNN改造成類似Transformer的結構這種思路算進來:無非就是在Transformer的Block裏,把某些部件,當然最可行的是把Multi-head self attention部件換成RNN。

我們就算退一步講,且將這種大幅結構改造的模型也算做是RNN模型吧。即使這樣,已經把自己整形成長得很像Transformer了,RNN依然面臨上述原生RNN所面臨的同樣兩個困境:一方面即使這種連變性削骨都上的大幅度整容版本的RNN,效果雖然有明顯提升,但是仍然比不過Transformer;另外,一旦引入RNN構件,同樣會觸發Transformer結構的並行計算能力問題。所以,目前Transformer發動機看上去有點帶不動RNN這個隊友。

綜合以上幾個因素,我們可以看出,RNN目前處於進退兩難的地步,我覺得它被其它模型替換掉只是時間問題,而且好像留給它的時間不多了。當然,這是我個人意見。我說這番話的時候,你是不是又聽到了水聲?

我看到網上很多人還在推RNN說:其實還是RNN好用。我覺得這其實是一種錯覺。之所以會產生這個錯覺,原因來自兩個方面:一方面是因爲RNN發展歷史長,所以有大量經過優化的RNN框架可用,這對技術選型選擇困難症患者來說是個福音,因爲你隨手選一個知名度還可以的估計效果就不錯,包括對一些數據集的前人摸索出的超參數或者調參經驗;而Transformer因爲歷史太短,所以各種高效的語言版本的優秀框架還少,選擇不多。

另外,其實我們對Transformer爲何有效目前還不是特別清楚,包括相關的各種數據集合上的調參經驗公開的也少,所以會覺得調起來比較費勁。隨着框架越來越多,以及經驗分享越來越充分,這個不再會是問題。這是一方面。另外一方面,很多人反饋對於小數據集RNN更好用,這固然跟Transformer的參數量比較多有關係,但是也不是沒有解決辦法。

一種方式是把Block數目降低,減少參數量;第二種辦法是引入Bert兩階段訓練模型,那麼對於小數據集合來說會極大緩解效果問題。所以綜合這兩方面看,RNN貌似在某些場合還有優勢,但是這些所謂的優勢是很脆弱的,這其實反映的是我們對Transformer整體經驗不足的事實,隨着經驗越來越豐富,RNN被Transformer取代基本不會有什麼疑問。

一希尚存的CNN

CNN在14年左右在NLP界剛出道的時候,貌似跟RNN比起來表現並不算太好,算是落後生,但是用發展的眼光看,未來的處境反而看上去比RNN的狀態還要佔優一些。

之所以造成這個奇怪現象,最主要的原因有兩個:一個是因爲CNN的天生自帶的高並行計算能力,這對於延長它的生命力發揮了很大作用。這就決定了與Transformer比起來,它並不存在無法克服的困難,所以仍然有希望;第二,早期的CNN做不好NLP的一個很大原因是網絡深度做不起來,隨着不斷借鑑圖像處理的新型CNN模型的構造經驗,以及一些深度網絡的優化trick,CNN在NLP領域裏的深度逐步能做起來了。

而既然深度能做起來,那麼本來CNN做NLP天然的一個缺陷:無法有效捕獲長距離特徵的問題,就得到了極大緩解。目前看可以靠堆深度或者結合dilated CNN來一定程度上解決這個問題,雖然還不夠好,但是仍然是那句話,希望還在。

但是,上面所說只是從道理分析角度來講CNN的希望所在,話分兩頭,我們說回來,目前也有很多實驗證明了原生的CNN在很多方面仍然是比不過Transformer的,典型的還是長距離特徵捕獲能力方面,原生的CNN版本模型仍然極爲顯著地弱於RNN和Transformer,而這點在NLP界算是比較嚴重的缺陷。

好,你可以說:那我們把CNN引到Transformer結構裏,比如代替掉Self attention,這樣和Transformer還有一戰吧?嗯,是的,目前看貌似只有這條路是能走的通的,引入depth separate CNN可以達到和Transformer接近的效果。但是,我想問的是:你確認長成這樣的CNN,就是把CNN塞到Transformer Block的肚子裏,你確認它的親朋好友還能認出它嗎?

當然,我之所以寫CNN一希尚存,是因爲我覺得把CNN塞到Transformer肚子裏這種方案,對於篇章級別的NLP任務來說,跟採取self attention作爲發動機的Transformer方案對比起來,是具有極大優勢的領域,也是適合它的戰場,後面我估計會出現一些這方面的論文。爲什麼這麼講?原因下面會說。

穩操勝券的Transformer

我們在分析未來NLP的三大特徵抽取器哪個會勝出,我認爲,起碼根據目前的信息來看,其實Transformer在很多戰場已經贏了,在這些場地,它未來還會繼續贏。爲什麼呢?上面不是說了嗎,原生的RNN和CNN,總有一些方面顯著弱於Transformer(並行計算能力或者效果,或者兩者同時都比Transformer弱)。

那麼他們未來的希望,目前大家都寄託在把RNN和CNN寄生在Transformer Block裏。RNN不用說了,上面說過它的進退維艱的現狀。單說CNN吧,還是上一部分的那句話,我想問的是:你確認長成這樣的CNN,就是把CNN塞到Transformer Block的肚子裏,你確認它的親朋還能認出它嗎?

目前能夠和Transformer一戰的CNN模型,基本都已經長成Transformer的模樣了。而這又說明了什麼呢?難道這是CNN要能戰勝Transformer的跡象嗎?這是一道留給您的思考題和辯論題。當然,我不參加辯論。

Transformer作爲一個新模型,並不是完美無缺的。它也有明顯的缺點:首先,對於長輸入的任務,典型的比如篇章級別的任務(例如文本摘要),因爲任務的輸入太長,Transformer會有巨大的計算複雜度,導致速度會急劇變慢。

所以估計短期內這些領地還能是RNN或者長成Transformer模樣的CNN的天下(其實目前他倆這塊做得也不好),也是目前看兩者的希望所在,尤其是CNN模型,希望更大一些。但是是否Transformer針對長輸入就束手無策,沒有解決辦法呢?

我覺得其實並不是,比如拍腦袋一想,就能想到一些方法,雖然看上去有點醜陋。比如可以把長輸入切斷分成K份,強制把長輸入切短,再套上Transformer作爲特徵抽取器,高層可以用RNN或者另外一層Transformer來接力,形成Transformer的層級結構,這樣可以把n平方的計算量極大減少。當然,這個方案不優雅,這個我承認。但是我提示你一下:這個方向是個值得投入精力的好方向,你留意一下我這句話,也許有意想不到的收穫。(注:上面這段話是我之前早已寫好的,結果今天(1月12日)看見媒體號在炒作:“Transforme-XL,速度提升1800倍”云云。看了新聞,我找來Transformer-XL論文看了一下,發現它解決的就是輸入特別長的問題,方法呢其實大思路和上面說的內容差不太多。說這麼多的意思是:我並不想刪除上面內容,爲避免發出來後,那位“愛挑刺”同學說我拷貝別人思路沒引用。我決定還是不改上面的說法,因爲這個點子實在是太容易想到的點子,我相信你也能想到。)

除了這個缺點,Transformer整體結構確實顯得複雜了一些,如何更深刻認識它的作用機理,然後進一步簡化它,這也是一個好的探索方向,這句話也請留意。還有,上面在做語義特徵抽取能力比較時,結論是對於距離遠與13的長距離特徵,Transformer性能弱於RNN,說實話,這點是比較出乎我意料的,因爲Transformer通過Self attention使得遠距離特徵直接發生關係,按理說距離不應該成爲它的問題,但是效果竟然不如RNN,這背後的原因是什麼呢?這也是很有價值的一個探索點。

我預感到我可能又講多了,能看到最後不容易,上面幾段話算是送給有耐心的同學的禮物,其它不多講了,就此別過,請忽略你聽到的嘩嘩的水聲。

以上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章