【導讀】BERT提出的這一年,也是NLP領域迅速發展的一年。學界不斷提出新的預訓練模型,刷新各項任務指標,業界也不斷嘗試在工程問題中引用BERT、XLNet等預訓練模型,那BERT為什麼能有這麼好的效果,深入其原理本身,又究竟好在哪裡?在AI ProCon 2019大會上,新浪微博機器學習團隊AI Lab負責人張俊林為大家深入分享了《BERT和Transformer到底學到了什麼?》。

張俊林:BERT和Transformer兩者間是什麼關係?BERT 提出後,我一直在思考一個問題:BERT效果這麼好,為什麼?

Transformer是特徵抽取器,和CNNRNN並列用於特徵抽取的一種深層級網絡結構,而BERT可視為一種兩階段的處理流程,這個流程使用的框架便是Transformer,再簡單解釋,你可以理解為BERT利用Transformer學會如何編碼、存儲信息知識。這是兩者的關係。

在Transformer和BERT 之前,大家最常用的是CNN、RNN、EncoderDecoder三大技術,覆蓋了NLP領域80%的技術與應用,Transformer和BERT比它們好在哪裡?每層網絡學到了什麼?多學了哪些知識?這些問題都是我一直在思考的,想在今天和大家分享一下目前的一些研究結論。

今天分享的第一部分是關於BERT和Transformer的簡介。從基本原理、流程、優缺點以及改進點講起,帶領大家對它們有更直觀的了解。

第二部分,介紹下打開Transformer和Bert模型結構黑盒的探尋方法。多層的Transformer 學習了哪類知識、以什麼形式編碼、編碼哪一類的特徵、每一層擅長解決什麼問題,要想了解這些,需要有些方便的手段理解這個黑盒子,本部分介紹目前有哪些常用的技術手段來探尋這些問題,介紹主流的探尋方法。

第三部分,也是大家最關心的內容,通過上述介紹的探尋方法來研究BERT的參數,看看它包含的奧秘,我們可以得到一些結論:BERT到底學到了什麼?有預訓練模型比無預訓練模型到底多學習了什麼?這部分介紹目前的一些結論。

最後,再和大家分享一些現有的結論與經驗。雖然在Bert在工程應用中還存在一些問題,比如模型太大導致的在線推理延時高等問題,但是我想只要算法效果好,工程應用不是阻礙,總能夠有辦法克服。

第一部分:BERT和Transformer

大家都知道,BERT是2018年10月提出來的,提出後無論是在工業界還是學術圈都產生了很大的影響,根本原因就是模型效果太好了,讓人不得不服,隨後各種應用也取得了一些突破性的結果。之前我寫過一篇文章《Bert時代的創新:Bert在NLP各領域的應用進展 》,介紹了一些應用情況,總體而言,BERT在各應用方向中都取得了很好的效果,但不同領域中也存在一些不同的情況。如果把BERT視為NLP領域中一項里程碑式工作,相信大家對此不會質疑。

BERT取得了這麼好的效果,讓大家不禁想:將BERT嘗試應用於自己的業務中,是否可以帶來好的業務效果提升?BERT模型本身又有哪些問題值得我們進一步探索與思考呢?

我整理歸納了看過的文獻數據,BERT在NLP各個領域中的應用基本都有效果提升,但是不同領域的提升效果有所不同,同一領域中任務不同、數據集不同使提升效果也有所不同。下面簡單概述一下某些領域的應用效果情況(截止2019 年 5 月):QA領域中大多都嘗試使用了BERT模型,性能提升了30%到70%; 閱讀理解領域應用BERT後性能有30%到50%的提升;信息檢索領域,短文檔檢索性能提升比長文檔性能提升更明顯,短文檔提升了25%到106%,長文檔提升了20%到30%;在對話機器人領域中,目前BERT可以使性能提升5%到40%;(這跟具體應用、子任務有關係,有些子方向比較適合用BERT,有些可能不太適合。)文本摘要領域提升也不明顯,大約有10%左右,貌似BERT的潛力還未發揮出來;其他應用諸如中文分詞、文本分類、文本生成都嘗試在工作中使用BERT,但是提升效果不太明顯。

到這裡,我覺得有一個問題大家需要思考:看到這些結果和結論,問自己一下為什麼會這樣子?為什麼BERT對於不同的NLP應用領域促進效果相差這麼大,背後的原因是什麼?這是一個好問題。剛剛講到的都是BERT在應用方面帶來的改進效果,從BERT出現到今天,BERT之前的Transformer到現在也已經有兩年多的時間,而無論是BERT還是Transformer,大家對它們複雜的內在機理了解並不多,但這是值得探索的,有助於大家加深對BERT和Transformer的了解。

雖然BERT比較新,效果也好,但一定也存在一些缺點,它既然有缺點我們就可以找到它的缺點,改造缺點,讓模型越來越強,效果越來越好。接下來,我列舉一些BERT的可能改進方向:

第一,文本生成模型。什麼是文本生成呢?機器翻譯中把你英文句子輸入模型把它翻譯成中文,這是生成類的任務;文本摘要,也是典型的生成類任務,模型從文章中摘出三句話作為主題內容的概括。雖然使用BERT模型在生成類任務中提升了效果,但提升不多,BERT在生成類任務中的作用還沒有發揮出來,應該有更好的改造方法,這是非常重要的一個研究方向,如果這方面能做好,在很多的生成類任務比如機器翻譯、文本摘要的工作都會取得巨大的成果。

第二,結構化知識引入。把人學好的結構化的知識引入模型,如何在BERT中加入結構化知識,這也是一個有價值的改進方向,可以直接用來解決我們手頭知識相關的NLP任務。

第三,多模態融合。我們現在應用BERT大多數時候還是在文本,其實多模態的場景應用非常多,比如發一條微博,裡面包含很多的信息,有你發的文本內容、圖片、視頻,還有社交關係在裡面,要想充分理解一條微博,不僅要好好理解它的文本,還要理解圖片講了什麼、視頻講了什麼,這是不同的模態。不同模態又該怎麼做到更好的融合?把BERT融入不同的模態體系,這肯定是非常有前景的BERT的改進方向。

第四,更大、更高質量的訓練數據。怎麼把數據量及訓練方法進一步優化,是個簡單直接的優化方向。目前很多證據證明:直接增加訓練數據規模和質量,直接就會對Bert效果有明顯提升,這說明我們還沒走到預訓練模型的天花板。BERT剛開始做預訓練的時候數據量大約十幾G,假設有一家公司財大氣粗,錢不是問題,可以用無限量數據做預訓練,那麼毫無疑問Bert效果會有大幅度的提升。但是現在有人做這個事嗎?沒有,因為這太燒錢了。從現有的結果來看,假設某位同學很有錢,說我想改造一下BERT,很簡單,加大數據規模,然後數據的形態更豐富一些,數據質量更高一點,你就做這個事,把數據堆上去,有可能做出比目前能看到BERT更好的指標。通過增加數據繼續提升BERT效果,雖然這沒有什麼技術含量,但其實是一個簡單易行的解決方法。

第五,更合適的訓練目標和訓練方法。這個也是相對簡單的改進方向,但是其實是特別容易見效的,目前也有一些工作。

第六,多語言融合。現在做的BERT是單語言,不同語言之間怎麼在Bert體系裡面融合起來,這也是目前BERT值得改進的好方向之一。

當然還有其它優化方向,因為不是今天主題,所以不一一細說了,接下來,和大家分析一下BERT和BERT的層級結構。

如圖所示,這是Transformer典型的層級結構,Transformer由若干個Block堆疊而成,作為基本構件,每一個Block里是一個小生態系統,裡面又涉及很多技術,其中四個最關鍵的子部分:Layer Norm、Skip Connection、自注意力和前饋神經網絡。

BERT由兩階段構成,每個階段有自己的特點和目標。第一個階段是預訓練階段,第二個階段是Fine-Tuning階段。預訓練階段用大量無監督的文本通過自監督方式進行訓練,把文本包含的語言知識以參數形式編碼到Transformer中,Fine-Tuning一般是有監督的,數據量比較小,在模型結構上做分類任務以解決當前任務。第一階段跟第二階段怎麼連接起來的?在預訓練階段Transformer學到了很多初始化的知識,第二階段就把初始化網絡學到的語言知識拿來用,Fine-Tuning引入新的特徵解決你的問題。

所以,為什麼BERT效果這麼好?為什麼以前的模型效果沒有BERT好?因為,第一階段編碼了文本中大量的語言學知識,在Bert之前,沒有用那麼多的文本數據,而且是無監督的方式。那麼我們關心的是:BERT里的Transformer到底學到了什麼?比傳統模型多學了什麼知識?這是關鍵。

應該說,Transformer和BERT都還不十分成熟,結構又複雜,實際應用也很複雜,如果沒有對它們的深入了解、不知道它們的結構及優缺點,我們就很難能更好的改進它們,以得到更好的BERT和Transformer。怎樣能加深對它們的認識呢?這就是接下來要和大家深入探討的內容。

第二部分:探尋方法

我們說了,Bert通過預訓練,學到了語言知識,那麼這些知識在哪裡?就在Transformer的參數里。但是,我們看到的都是一堆參數,就是大量的數值,看不出裡面的含義,於是問題轉化成了:我們怎麼知道多層的Transformer的每層都學到了什麼,有什麼方法可以看出來它學到了什麼?一般把這些技術叫做探尋方法,那麼常用的探尋方法有哪些?

在開始講BERT的探尋方法之前,先從DNN這個著名的黑盒系統開始講起。大家都知道DNN效果好,但每個神經元學到了什麼,不知道;也看不到,不好理解,能看到就是一個神經元的響應值或大或小;神經元之間的關係也不知道,大家不理解DNN是怎麼工作的。學術界早就意識到這個問題了,自從DNN出來之後,好多人試圖尋找方法,試圖讓大家理解DNN是怎麼工作的,探尋每個神經元學了什麼。特徵可視化是典型的破解黑盒的方法,這個方法在圖像領域中很常用,但並不是通用的。今天要講的是BERT和Transformer的探尋方法。

目前有幾種典型的方法,第一是可視化(2D t-SEN),用2D圖的方式展示。如下圖所示,用Transformer的每層的特徵,各自把名詞、短語進行聚類,同一顏色代表同一類的短語,如果聚類效果好,說明這層編碼了這類知識。通過這種方法,進而知道哪一層適合解決什麼問題,編碼哪些知識,這是典型的可視化方法。

第二個方法是Attention圖。對探索Transformer所學到知識的探尋手段來說,Attention圖是非常關鍵的方法,它可以形象地觀察一個單詞和其它單詞的關係,聯繫的緊密程度。如下圖所示,看一看介詞’at’和誰的關係更密切?連接線越粗,表示聯繫越緊密,值越大邊就畫得更粗一點,發現跟’Auction’更粗,證明了BERT學到了介詞和主名詞之間的關係,更重要是通過Attention圖的方式能夠知道學到了哪些知識。

第三種方法是Probing Classifier。對於Transformer某一層某個單詞的Embedding節點,如果想知道它學到了什麼東西,怎麼做?我們把Transformer結構參數固定住,保持不變,知識已經編碼在參數中,需要找到一種探尋方法,知道每個層次學到了什麼。如下圖所示的例子很直觀,Transformer參數固定住,最高層Transformer對應的單詞有個Embedding,表示通過各層學到的知識,怎樣知道這個Embedding學到了什麼?上面加入一個小分類網絡,這個網絡結構很簡單,我們不希望它自身學習過多的知識,只希望它利用Transformer已經編碼好的知識去進行詞性標註,如果能標註正確,表明Transformer這一層已經編碼學到了詞性標註相關知識,如果標註錯誤表明沒有編碼這個知識。利用這樣一個簡單分類器來完成某個具體任務,而分類器裡面的參數很少,基本沒有什麼參數,所有的決策信息來自於Transformer本身學到的知識,如果任務能夠解決得很好,也就說明了Transformer中存儲的與這類任務相關的知識比較多。這樣就探測出了Transformer每一層到底學到了哪類知識。

還有一種改進方法叫做Edge Probing Classifier。它和Probing Classifier的區別是什麼?Probing Classifier只能判斷一個單詞對應的Embedding節點學到了什麼,但對於很多任務來說有其他的需求。比如如果我們需要知道一個短語、兩個單詞和三個單詞學到了什麼,或者句中的A單詞和B單詞是什麼關係,如何通過Edge Probing Classifier方式來獲知它學到了什麼知識呢?如下圖所示,Transformer仍然固定參數,簡單分類器的輸入變成多節點輸入,上面的Span可能覆蓋一個片段,如一個單詞,兩個單詞,然後構建一個簡單的分類器解決分類任務,進而觀測預測的精準性,根據預測準確性,來獲知到底學到了什麼知識。它和Probing Classifier的主要區別是能夠同時偵測多節點編碼的知識。

上面介紹的是一些常用的探測方法,有了這些探測方法,就能夠去看看Bert或者Transformer到底學到了什麼知識了。如果歸納一下目前的研究結論的話,大致概述一下:BERT訓練好之後,低層Transformer主要學習自然語言表層的特徵,中層學習編碼句法信息,高層編碼了NLP的語義特徵。很多實驗都已證明這一結論。

怎麼得出的這個結論?上圖的一系列任務中說明了為什麼會得出這個結論。POS、成分分析、DEPS、Entities、SRL、COREF、關係分類,從上到下,越往下這個任務越需要偏向高層語義的知識才能解決好。POS詞性標註是簡單任務,偏向表層特徵,關係分類則是純語義的任務,不理解語義便無法很好的解決任務,從上到下逐漸趨向語義任務。柱狀圖表示要解決這個任務,發揮作用的是Transformer的哪些層,得分越高,代表需要的層深越高。如關係分類任務的9.40和POS任務的3.39,意味着,關係分類任務更依賴於Transformer高層的貢獻,POS任務的信息主要從Transformer低層中獲取,從圖中可以看出,隨着層深逐步增高,任務逐步趨向語義任務。

如果只把Transformer分為低、中、高層,這還是有些粗糙,我們希望再深入、更細緻地剖析每層的作用大小。如上圖所示,橫坐標表示Transformer有24層,縱坐標代表發揮作用的大小,指標高代表這一層發揮的作用越大。從圖中可以看出,解決好詞性標註任務,第一層、第二層、第三層、第四層貢獻最大,其他層貢獻不太大。用的是什麼方式?就是上面剛剛講到的Probing Classifier方式,說明Transformer低層比較適合解決表層特徵的任務,詞性信息都被編碼在這裡,也說明了低層編碼了表層和句法知識。從細分圖得出的具體結論可概括得到:句法知識具備Layer局部性,對某些層依賴性大,而語義知識,不具備Layer局部性,知識編碼在各層中。

上面得到的結論是符合預期的,而接下來的這個結論比較有意思。如下圖中標紅所示,Transformer高層傾向於編碼語義知識,低層編碼句法知識,而高層語義知識會對低層句法知識有反饋作用,經過高層語義指導修正底層的句法特徵。‘他在季後賽中抽了多倫多六支安打’,多倫多是個多義詞,可代表地名,也可以代表一個運動隊,如果我們把這句話輸入Transformer或BERT結構中,到底在某一層編碼的是‘多倫多’,還是‘多倫多隊’?這是我們希望知道的。

可以通過觀察0到12層的黃藍佔比來判斷每層的編碼知識,黃色表示判斷出‘多倫多’為(地名),藍色認為是一個(隊名),從圖中我們看出,0層、1層、2層基本上不會認為是‘多倫多隊’(隊名),判斷‘多倫多’是(地名);而高層中‘多倫多隊’佔比凸顯了,為什麼如此?因為Bert發現了句中的單詞Smoked(抽打),發現了它和單詞”多倫多”存在施動-受動關係後,就更傾向於判斷多倫多是個隊名,這種語義知識是在高層編碼的,它反過來會影響中低層的判斷,從而說明了高層語義知識反過來可以修正低層的句法知識。

下面我們說明Transformer三層(低層、中層、高層)到底具體編碼了哪些語言學知識。低層對單詞位置信息的編碼比較充分。橫坐標表示層深,可以看到第2層的結果就已經很好了,而第四層編碼的預測結果則下滑的非常嚴重,說明低層對單詞位置進行編碼,高層已經基本丟失了位置信息,無法解決位置信息任務;位置信息主要在低層來編碼學習的,高層編碼了低層單詞之間形成的結構信息,位置信息只是低層給高層使用用於構造單詞之間結構關係。

此外,低層還對短語信息進行編碼、對特殊符號進行編碼。

中層是對句法信息的編碼。句法預測任務中,橫坐標是24層的每一層,這是效果指標。哪層對句法預測效果比較好,效果好也就意味着編碼信息更多,可以看出3到8層對句法預測比較好。

高層對語義信息進行編碼。如下圖所示指帶消解任務,代詞’He‘和‘She’可以指帶什麼?BERT是否學習了?從圖中可以看出指代關係已經編碼到BERT特徵中了,因而解決效果比較好。

第三部分:BERT 的預訓練比無預訓練過程多學了什麼?

預訓練模型用上面提到的Probing Classifier方式完成探測後,再用無預訓練、不用初始化的模型直接學習的模式,兩者進行實驗對比。我們會發現:無預訓練模型在句子長度預測任務表現要好於預訓練模型BERT,說明了預訓練模型靠犧牲部分表層特徵表達能力,獲得了更多、更豐富的複雜特徵表達能力。

我們知道目前有很多不同的預訓練模型,它們之間相比,有什麼異同?Bert預訓練模型相對其它模型多學到了什麼?相對於Cove、Elmo等其它模型,Bert模型編碼了更多的句法信息,語義信息大致相當。另外,BERT比GPT多學了什麼東西?因為BERT層數更深,更有利於編碼語義特徵。最後,相對傳統模型比如RNN和CNN,ELMO多學了什麼東西?ELMO通過預訓練,比CNN學到了更多、更長的上下文特徵。

最後我們概括一下,Bert的Transformer低層學了表層特徵,中間層學了句法特徵,高層學了語義特徵,雖然目前都有相關工作在進行,但還不夠細緻,需要做更深入的探索,相信未來會有更多更好的研究出現。我今天的分享就到這裡,謝謝大家!

拓展閱讀

此前,我們也曾多次為大家分享了張俊林老師的技術文章,大家可回顧閱讀:

本文轉自公眾號AI科技大本營,原文地址