zz從Word Embedding到Bert模型—天然語言處理中的預訓練技術發展史

從Word Embedding到Bert模型—天然語言處理中的預訓練技術發展史

Bert最近很火,應該是最近最火爆的AI進展,網上的評價很高,那麼Bert值得這麼高的評價嗎?我我的判斷是值得。那爲何會有這麼高的評價呢?是由於它有重大的理論或者模型創新嗎?其實並無,從模型創新角度看通常,創新不算大。可是架不住效果太好了,基本刷新了不少NLP的任務的最好性能,有些任務還被刷爆了,這個纔是關鍵。另一點是Bert具有普遍的通用性,就是說絕大部分NLP任務均可以採用相似的兩階段模式直接去提高效果,這個第二關鍵。客觀的說,把Bert當作最近兩年NLP重大進展的集大成者更符合事實。html

本文的主題是天然語言處理中的預訓練過程,會大體說下NLP中的預訓練技術是一步一步如何發展到Bert模型的,從中能夠很天然地看到Bert的思路是如何逐漸造成的,Bert的歷史沿革是什麼,繼承了什麼,創新了什麼,爲何效果那麼好,主要緣由是什麼,以及爲什麼說模型創新不算太大,爲什麼說Bert是近年來NLP重大進展的集大成者。咱們一步一步來說,而串起來這個故事的脈絡就是天然語言的預訓練過程,可是落腳點仍是在Bert身上。要講天然語言的預訓練,得先從圖像領域的預訓練提及。git

 

圖像領域的預訓練

自從深度學習火起來後,預訓練過程就是作圖像或者視頻領域的一種比較常規的作法,有比較長的歷史了,並且這種作法頗有效,能明顯促進應用的效果。github

 

 

 

那麼圖像領域怎麼作預訓練呢,上圖展現了這個過程,咱們設計好網絡結構之後,對於圖像來講通常是CNN的多層疊加網絡結構,能夠先用某個訓練集合好比訓練集合A或者訓練集合B對這個網絡進行預先訓練,在A任務上或者B任務上學會網絡參數,而後存起來以備後用。假設咱們面臨第三個任務C,網絡結構採起相同的網絡結構,在比較淺的幾層CNN結構,網絡參數初始化的時候能夠加載A任務或者B任務學習好的參數,其它CNN高層參數仍然隨機初始化。以後咱們用C任務的訓練數據來訓練網絡,此時有兩種作法,一種是淺層加載的參數在訓練C任務過程當中不動,這種方法被稱爲「Frozen」;另一種是底層網絡參數儘管被初始化了,在C任務訓練過程當中仍然隨着訓練的進程不斷改變,這種通常叫「Fine-Tuning」,顧名思義,就是更好地把參數進行調整使得更適應當前的C任務。通常圖像或者視頻領域要作預訓練通常都這麼作。網絡

這麼作有幾個好處,首先,若是手頭任務C的訓練集合數據量較少的話,現階段的好用的CNN好比Resnet/Densenet/Inception等網絡結構層數很深,幾百萬上千萬參數量算起步價,上億參數的也很常見,訓練數據少很難很好地訓練這麼複雜的網絡,可是若是其中大量參數經過大的訓練集合好比ImageNet預先訓練好直接拿來初始化大部分網絡結構參數,而後再用C任務手頭比較可憐的數據量上Fine-tuning過程去調整參數讓它們更適合解決C任務,那事情就好辦多了。這樣原先訓練不了的任務就能解決了,即便手頭任務訓練數據也很多,加個預訓練過程也能極大加快任務訓練的收斂速度,因此這種預訓練方式是老小皆宜的解決方案,另外療效又好,因此在作圖像處理領域很快就流行開來。框架

那麼新的問題來了,爲何這種預訓練的思路是可行的?函數

 

目前咱們已經知道,對於層級的CNN結構來講,不一樣層級的神經元學習到了不一樣類型的圖像特徵,由底向上特徵造成層級結構,如上圖所示,若是咱們手頭是我的臉識別任務,訓練好網絡後,把每層神經元學習到的特徵可視化肉眼看一看每層學到了啥特徵,你會看到最底層的神經元學到的是線段等特徵,圖示的第二個隱層學到的是人臉五官的輪廓,第三層學到的是人臉的輪廓,經過三步造成了特徵的層級結構,越是底層的特徵越是全部不論什麼領域的圖像都會具有的好比邊角線弧線等底層基礎特徵,越往上抽取出的特徵越與手頭任務相關。正由於此,因此預訓練好的網絡參數,尤爲是底層的網絡參數抽取出特徵跟具體任務越無關,越具有任務的通用性,因此這是爲什麼通常用底層預訓練好的參數初始化新任務網絡參數的緣由。而高層特徵跟任務關聯較大,實際能夠不用使用,或者採用Fine-tuning用新數據集合清洗掉高層無關的特徵抽取器。工具

底層特徵可複用性性能

高層特徵任務相關性學習

通常咱們喜歡用ImageNet來作網絡的預訓練,主要有兩點,一方面ImageNet是圖像領域裏有超多事先標註好訓練數據的數據集合,份量足是個很大的優點,量越大訓練出的參數越靠譜;另一方面由於ImageNet有1000類,類別多,算是通用的圖像數據,跟領域沒太大關係,因此通用性好,預訓練完後哪哪都能用,是個萬金油。份量足的萬金油固然老小通吃,人人喜好。編碼

聽完上述話,若是你是具有研究素質的人,也就是說具有好奇心,你必定會問下面這個問題:」既然圖像領域預訓練這麼好用,那幹嗎天然語言處理不作這個事情呢?是否是搞NLP的人比搞CV的傻啊?就算你傻,你看見人家這麼作,有樣學樣不就好了嗎?這不就是創新嗎,也許能成,萬一成了,你看,你的成功來得就是這麼忽然!」

嗯,好問題,其實搞NLP的人一點都不比你傻,早就有人嘗試過了,不過整體而言不太成功而已。據說過word embedding嗎?2003年出品,陳年技術,馥郁芳香。word embedding其實就是NLP裏的早期預訓練技術。固然也不能說word embedding不成功,通常加到下游任務裏,都能有1到2個點的性能提高,只是沒有那麼耀眼的成功而已。

沒聽過?那下面就把這段陳年老帳講給你聽聽。 

 

Word Embedding考古史

這塊大體講講Word Embedding的故事,很粗略,由於網上關於這個技術講的文章太多了,汗牛衝動,我不屬牛,此刻更沒有流汗,因此其實絲毫沒有想講Word Embedding的衝動和激情,可是要說預訓練又得從這開始,那就粗略地講講,主要是引出後面更精彩的部分。在說Word Embedding以前,先更粗略地說下語言模型,由於通常NLP裏面作預訓練通常的選擇是用語言模型任務來作。

 

 

什麼是語言模型?其實看上面這張PPT上扣下來的圖就明白了,爲了可以量化地衡量哪一個句子更像一句人話,能夠設計如上圖所示函數,核心函數P的思想是根據句子裏面前面的一系列前導單詞預測後面跟哪一個單詞的機率大小(理論上除了上文以外,也能夠引入單詞的下文聯合起來預測單詞出現機率)。句子裏面每一個單詞都有個根據上文預測本身的過程,把全部這些單詞的產生機率乘起來,數值越大表明這越像一句人話。語言模型壓下暫且不表,我隱約預感到我這麼講你可能仍是不太會明白,可是大概這個意思,不懂的能夠去網上找,資料多得同樣地汗牛衝動。

假設如今讓你設計一個神經網絡結構,去作這個語言模型的任務,就是說給你不少語料作這個事情,訓練好一個神經網絡,訓練好以後,之後輸入一句話的前面幾個單詞,要求這個網絡輸出後面緊跟的單詞應該是哪一個,你會怎麼作?

 

 

你能夠像上圖這麼設計這個網絡結構,這其實就是大名鼎鼎的中文人稱「神經網絡語言模型」,英文小名NNLM的網絡結構,用來作語言模型。這個工做有年頭了,是個陳年老工做,是Bengio 在2003年發表在JMLR上的論文。它生於2003,火於2013,之後是否會不朽暫且不知,可是不幸的是出生後應該沒有引發太大反響,沉寂十年終於時來運轉沉冤得雪,在2013年又被NLP考古工做者從海底溼淋淋地撈出來了祭入神殿。爲何會發生這種技術奇遇記?你要想一想2013年是什麼年頭,是深度學習開始滲透NLP領域的光輝時刻,萬里長征第一步,而NNLM能夠算是南昌起義第一槍。在深度學習火起來以前,極少有人用神經網絡作NLP問題,若是你10年前堅持用神經網絡作NLP,估計別人會認爲你這人神經有問題。所謂紅塵滾滾,誰也擋不住歷史發展趨勢的車輪,這就是個很好的例子。

上面是閒話,閒言碎語不要講,咱們回來說一講NNLM的思路。先說訓練過程,如今看其實很簡單,見過RNN、LSTM、CNN後的大家回頭再看這個網絡甚至顯得有些簡陋。學習任務是輸入某個句中單詞 [公式]前面句子的t-1個單詞,要求網絡正確預測單詞Bert,即最大化:

[公式]

前面任意單詞 [公式] 用Onehot編碼(好比:0001000)做爲原始單詞輸入,以後乘以矩陣Q後得到向量 [公式],每一個單詞的 [公式]拼接,上接隱層,而後接softmax去預測後面應該後續接哪一個單詞。這個 [公式]是什麼?這其實就是單詞對應的Word Embedding值,那個矩陣Q包含V行,V表明詞典大小,每一行內容表明對應單詞的Word embedding值。只不過Q的內容也是網絡參數,須要學習得到,訓練剛開始用隨機值初始化矩陣Q,當這個網絡訓練好以後,矩陣Q的內容被正確賦值,每一行表明一個單詞對應的Word embedding值。因此你看,經過這個網絡學習語言模型任務,這個網絡不只本身可以根據上文預測後接單詞是什麼,同時得到一個副產品,就是那個矩陣Q,這就是單詞的Word Embedding是被如何學會的。

2013年最火的用語言模型作Word Embedding的工具是Word2Vec,後來又出了Glove,Word2Vec是怎麼工做的呢?看下圖。

 

 

Word2Vec的網絡結構其實和NNLM是基本相似的,只是這個圖長得清晰度差了點,看上去不像,其實它們是親兄弟。不過這裏須要指出:儘管網絡結構相近,並且也是作語言模型任務,可是其訓練方法不太同樣。Word2Vec有兩種訓練方法,一種叫CBOW,核心思想是從一個句子裏面把一個詞摳掉,用這個詞的上文和下文去預測被摳掉的這個詞;第二種叫作Skip-gram,和CBOW正好反過來,輸入某個單詞,要求網絡預測它的上下文單詞。而你回頭看看,NNLM是怎麼訓練的?是輸入一個單詞的上文,去預測這個單詞。這是有顯著差別的。爲何Word2Vec這麼處理?緣由很簡單,由於Word2Vec和NNLM不同,NNLM的主要任務是要學習一個解決語言模型任務的網絡結構,語言模型就是要看到上文預測下文,而word embedding只是無意插柳的一個副產品。可是Word2Vec目標不同,它單純就是要word embedding的,這是主產品,因此它徹底能夠隨性地這麼去訓練網絡。

爲何要講Word2Vec呢?這裏主要是要引出CBOW的訓練方法,BERT其實跟它有關係,後面會講它們之間是如何的關係,固然它們的關係BERT做者沒說,是我猜的,至於我猜的對不對,後面你看後本身判斷。

 

使用Word2Vec或者Glove,經過作語言模型任務,就能夠得到每一個單詞的Word Embedding,那麼這種方法的效果如何呢?上圖給了網上找的幾個例子,能夠看出有些例子效果仍是很不錯的,一個單詞表達成Word Embedding後,很容易找出語義相近的其它詞彙。

咱們的主題是預訓練,那麼問題是Word Embedding這種作法能算是預訓練嗎?這其實就是標準的預訓練過程。要理解這一點要看看學會Word Embedding後下遊任務是怎麼用它的。

 

假設如上圖所示,咱們有個NLP的下游任務,好比QA,就是問答問題,所謂問答問題,指的是給定一個問題X,給定另一個句子Y,要判斷句子Y是不是問題X的正確答案。問答問題假設設計的網絡結構如上圖所示,這裏不展開講了,懂得天然懂,不懂的也不要緊,由於這點對於本文主旨來講不關鍵,關鍵是網絡如何使用訓練好的Word Embedding的。它的使用方法其實和前面講的NNLM是同樣的,句子中每一個單詞以Onehot形式做爲輸入,而後乘以學好的Word Embedding矩陣Q,就直接取出單詞對應的Word Embedding了。這乍看上去好像是個查表操做,不像是預訓練的作法是吧?其實否則,那個Word Embedding矩陣Q其實就是網絡Onehot層到embedding層映射的網絡參數矩陣。因此你看到了,使用Word Embedding等價於什麼?等價於把Onehot層到embedding層的網絡用預訓練好的參數矩陣Q初始化了。這跟前面講的圖像領域的低層預訓練過程實際上是同樣的,區別無非Word Embedding只能初始化第一層網絡參數,再高層的參數就無能爲力了。下游NLP任務在使用Word Embedding的時候也相似圖像有兩種作法,一種是Frozen,就是Word Embedding那層網絡參數固定不動;另一種是Fine-Tuning,就是Word Embedding這層參數使用新的訓練集合訓練也須要跟着訓練過程更新掉。

上面這種作法就是18年以前NLP領域裏面採用預訓練的典型作法,以前說過,Word Embedding其實對於不少下游NLP任務是有幫助的,只是幫助沒有大到閃瞎忘記戴墨鏡的圍觀羣衆的雙眼而已。那麼新問題來了,爲何這樣訓練及使用Word Embedding的效果沒有期待中那麼好呢?答案很簡單,由於Word Embedding有問題唄。這貌似是個比較弱智的答案,關鍵是Word Embedding存在什麼問題?這實際上是個好問題。

 

 

這片在Word Embedding頭上籠罩了好幾年的烏雲是什麼?是多義詞問題。咱們知道,多義詞是天然語言中常常出現的現象,也是語言靈活性和高效性的一種體現。多義詞對Word Embedding來講有什麼負面影響?如上圖所示,好比多義詞Bank,有兩個經常使用含義,可是Word Embedding在對bank這個單詞進行編碼的時候,是區分不開這兩個含義的,由於它們儘管上下文環境中出現的單詞不一樣,可是在用語言模型訓練的時候,不論什麼上下文的句子通過word2vec,都是預測相同的單詞bank,而同一個單詞佔的是同一行的參數空間,這致使兩種不一樣的上下文信息都會編碼到相同的word embedding空間裏去。因此word embedding沒法區分多義詞的不一樣語義,這就是它的一個比較嚴重的問題。

你可能以爲本身很聰明,說這能夠解決啊,確實也有不少研究人員提出不少方法試圖解決這個問題,可是從今天往回看,這些方法看上去都成本過高或者太繁瑣了,有沒有簡單優美的解決方案呢?

ELMO提供了一種簡潔優雅的解決方案。

 

從Word Embedding到ELMO

ELMO是「Embedding from Language Models」的簡稱,其實這個名字並無反應它的本質思想,提出ELMO的論文題目:「Deep contextualized word representation」更能體現其精髓,而精髓在哪裏?在deep contextualized這個短語,一個是deep,一個是context,其中context更關鍵。在此以前的Word Embedding本質上是個靜態的方式,所謂靜態指的是訓練好以後每一個單詞的表達就固定住了,之後使用的時候,不論新句子上下文單詞是什麼,這個單詞的Word Embedding不會跟着上下文場景的變化而改變,因此對於好比Bank這個詞,它事先學好的Word Embedding中混合了幾種語義 ,在應用中來了個新句子,即便從上下文中(好比句子包含money等詞)明顯能夠看出它表明的是「銀行」的含義,可是對應的Word Embedding內容也不會變,它仍是混合了多種語義。這是爲什麼說它是靜態的,這也是問題所在。ELMO的本質思想是:我事先用語言模型學好一個單詞的Word Embedding,此時多義詞沒法區分,不過這不要緊。在我實際使用Word Embedding的時候,單詞已經具有了特定的上下文了,這個時候我能夠根據上下文單詞的語義去調整單詞的Word Embedding表示,這樣通過調整後的Word Embedding更能表達在這個上下文中的具體含義,天然也就解決了多義詞的問題了。因此ELMO自己是個根據當前上下文對Word Embedding動態調整的思路。

ELMO採用了典型的兩階段過程,第一個階段是利用語言模型進行預訓練;第二個階段是在作下游任務時,從預訓練網絡中提取對應單詞的網絡各層的Word Embedding做爲新特徵補充到下游任務中。上圖展現的是其預訓練過程,它的網絡結構採用了雙層雙向LSTM,目前語言模型訓練的任務目標是根據單詞 [公式] 的上下文去正確預測單詞 [公式] , [公式] 以前的單詞序列Context-before稱爲上文,以後的單詞序列Context-after稱爲下文。圖中左端的前向雙層LSTM表明正方向編碼器,輸入的是從左到右順序的除了預測單詞外 [公式] 的上文Context-before;右端的逆向雙層LSTM表明反方向編碼器,輸入的是從右到左的逆序的句子下文Context-after;每一個編碼器的深度都是兩層LSTM疊加。這個網絡結構其實在NLP中是很經常使用的。使用這個網絡結構利用大量語料作語言模型任務就能預先訓練好這個網絡,若是訓練好這個網絡後,輸入一個新句子 [公式],句子中每一個單詞都能獲得對應的三個Embedding:最底層是單詞的Word Embedding,往上走是第一層雙向LSTM中對應單詞位置的Embedding,這層編碼單詞的句法信息更多一些;再往上走是第二層LSTM中對應單詞位置的Embedding,這層編碼單詞的語義信息更多一些。也就是說,ELMO的預訓練過程不只僅學會單詞的Word Embedding,還學會了一個雙層雙向的LSTM網絡結構,而這二者後面都有用。 

 

 

上面介紹的是ELMO的第一階段:預訓練階段。那麼預訓練好網絡結構後,如何給下游任務使用呢?上圖展現了下游任務的使用過程,好比咱們的下游任務仍然是QA問題,此時對於問句X,咱們能夠先將句子X做爲預訓練好的ELMO網絡的輸入,這樣句子X中每一個單詞在ELMO網絡中都能得到對應的三個Embedding以後給予這三個Embedding中的每個Embedding一個權重a,這個權重能夠學習得來,根據各自權重累加求和,將三個Embedding整合成一個。而後將整合後的這個Embedding做爲X句在本身任務的那個網絡結構中對應單詞的輸入,以此做爲補充的新特徵給下游任務使用。對於上圖所示下游任務QA中的回答句子Y來講也是如此處理。由於ELMO給下游提供的是每一個單詞的特徵形式,因此這一類預訓練的方法被稱爲「Feature-based Pre-Training。至於爲什麼這麼作可以達到區分多義詞的效果,你能夠想想,其實比較容易想明白緣由。

 

三層 embedding:單詞特徵 ->  句法特徵 -> 語義特徵??

 

 

上面這個圖是TagLM採用相似ELMO的思路作命名實體識別任務的過程,其步驟基本如上述ELMO的思路,因此此處不展開說了。TagLM的論文發表在2017年的ACL會議上,做者就是AllenAI裏作ELMO的那些人,因此能夠將TagLM看作ELMO的一個前導工做。前幾天這個PPT發出去後有人質疑說FastAI的在18年4月提出的ULMFiT纔是拋棄傳統Word Embedding引入新模式的開山之做,我深不覺得然。首先TagLM出現的更早並且模式基本就是ELMO的思路;另外ULMFiT使用的是三階段模式,在通用語言模型訓練以後,加入了一個領域語言模型預訓練過程,並且論文重點工做在這塊,方法還相對比較繁雜,這並非一個特別好的主意,由於領域語言模型的限制是它的規模每每不可能特別大,精力放在這裏不太合適,放在通用語言模型上感受更合理;再者,儘管ULFMiT實驗作了6個任務,可是都集中在分類問題相對比較窄,不如ELMO驗證的問題領域廣,我以爲這就是由於第二步那個領域語言模型帶來的限制。因此綜合看,儘管ULFMiT也是個不錯的工做,可是重要性跟ELMO比至少仍是要差一檔,固然這是我我的見解。每一個人的學術審美口味不一樣,我我的一直比較讚揚要麼簡潔有效體現問題本質要麼思想特別遊離現有框架腦洞開得異常大的工做,因此ULFMiT我看論文的時候就感受看着有點難受,以爲這工做沒抓住重點並且特別麻煩,可是看ELMO論文感受就賞心悅目,以爲思路特別清晰順暢,看完暗暗點贊,內心說這樣的文章得到NAACL2018最佳論文當之無愧,比ACL不少最佳論文也好得不是一點半點,這就是好工做帶給一個有經驗人士的一種在讀論文時候就能產生的本能的感受,也就是所謂的這道菜對上了食客的審美口味。

 

 

 

 

前面咱們提到靜態Word Embedding沒法解決多義詞的問題,那麼ELMO引入上下文動態調整單詞的embedding後多義詞問題解決了嗎?解決了,並且比咱們期待的解決得還要好。上圖給了個例子,對於Glove訓練出的Word Embedding來講,多義詞好比play,根據它的embedding找出的最接近的其它單詞大多數集中在體育領域,這很明顯是由於訓練數據中包含play的句子中體育領域的數量明顯佔優致使;而使用ELMO,根據上下文動態調整後的embedding不只可以找出對應的「演出」的相同語義的句子,並且還能夠保證找出的句子中的play對應的詞性也是相同的,這是超出期待之處。之因此會這樣,是由於咱們上面提到過,第一層LSTM編碼了不少句法信息,這在這裏起到了重要做用。

 

 

ELMO通過這般操做,效果如何呢?實驗效果見上圖,6個NLP任務中性能都有幅度不一樣的提高,最高的提高達到25%左右,並且這6個任務的覆蓋範圍比較廣,包含句子語義關係判斷,分類任務,閱讀理解等多個領域,這說明其適用範圍是很是廣的,普適性強,這是一個很是好的優勢。

 

那麼站在如今這個時間節點看,ELMO有什麼值得改進的缺點呢?首先,一個很是明顯的缺點在特徵抽取器選擇方面,ELMO使用了LSTM而不是新貴Transformer,Transformer是谷歌在17年作機器翻譯任務的「Attention is all you need」的論文中提出的,引發了至關大的反響,不少研究已經證實了Transformer提取特徵的能力是要遠強於LSTM的。若是ELMO採起Transformer做爲特徵提取器,那麼估計Bert的反響遠不如如今的這種火爆場面。另一點,ELMO採起雙向拼接這種融合特徵的能力可能比Bert一體化的融合特徵方式弱,可是,這只是一種從道理推斷產生的懷疑,目前並無具體實驗說明這一點。

咱們若是把ELMO這種預訓練方法和圖像領域的預訓練方法對比,發現二者模式看上去仍是有很大差別的。除了以ELMO爲表明的這種基於特徵融合(feature-based fine tuning?)的預訓練方法外,NLP裏還有一種典型作法,這種作法和圖像領域的方式就是看上去一致的了,通常將這種方法稱爲「基於Fine-tuning的模式」,而GPT就是這一模式的典型開創者

 

從Word Embedding到GPT 

 

GPT是「Generative Pre-Training」的簡稱,從名字看其含義是指的生成式的預訓練。GPT也採用兩階段過程,第一個階段是利用語言模型進行預訓練,第二階段經過Fine-tuning的模式解決下游任務。上圖展現了GPT的預訓練過程,其實和ELMO是相似的,主要不一樣在於兩點:首先,特徵抽取器不是用的RNN,而是用的Transformer,上面提到過它的特徵抽取能力要強於RNN,這個選擇很明顯是很明智的;其次,GPT的預訓練雖然仍然是以語言模型做爲目標任務,可是採用的是單向的語言模型,所謂「單向」的含義是指:語言模型訓練的任務目標是根據 [公式] 單詞的上下文去正確預測單詞 [公式] , [公式] 以前的單詞序列Context-before稱爲上文,以後的單詞序列Context-after稱爲下文。ELMO在作語言模型預訓練的時候,預測單詞 [公式] 同時使用了上文和下文,而GPT則只採用Context-before這個單詞的上文來進行預測,而拋開了下文。這個選擇如今看不是個太好的選擇,緣由很簡單,它沒有把單詞的下文融合進來,這限制了其在更多應用場景的效果,好比閱讀理解這種任務,在作任務的時候是能夠容許同時看到上文和下文一塊兒作決策的。若是預訓練時候不把單詞的下文嵌入到Word Embedding中,是很吃虧的,白白丟掉了不少信息。

這裏強行插入一段簡單提下Transformer,儘管上面提到了,可是說的還不完整,補充兩句。首先,Transformer是個疊加的「自注意力機制(Self Attention)」構成的深度網絡,是目前NLP裏最強的特徵提取器,注意力這個機制在此被髮揚光大,從任務的配角不斷搶戲,直到Transformer一躍成爲踢開RNN和CNN傳統特徵提取器,榮升頭牌,大紅大紫。你問了:什麼是注意力機制?這裏再插個廣告,對注意力不瞭解的能夠參考鄙人16年出品17年修正的下文:「深度學習中的注意力模型」,補充下相關基礎知識,若是不瞭解注意力機制你確定會落後時代的發展。而介紹Transformer比較好的文章能夠參考如下兩篇文章:一個是Jay Alammar可視化地介紹Transformer的博客文章The Illustrated Transformer ,很是容易理解整個機制,建議先從這篇看起;而後能夠參考哈佛大學NLP研究組寫的「The Annotated Transformer. 」,代碼原理左右開弓,講得很是清楚。我相信上面兩個文章足以讓你瞭解Transformer了,因此這裏不展開介紹。

其次,個人判斷是Transformer在將來會逐漸替代掉RNN成爲主流的NLP工具,RNN一直受困於其並行計算能力,這是由於它自己結構的序列性依賴致使的,儘管不少人在試圖經過修正RNN結構來修正這一點,可是我不看好這種模式,由於給馬車換輪胎不如把它升級到汽車,這個道理很好懂,更況且目前汽車的雛形已經出現了,幹嗎還要執着在換輪胎這個事情呢?是吧?再說CNN,CNN在NLP裏一直沒有造成主流,CNN的最大優勢是易於作並行計算,因此速度快,可是在捕獲NLP的序列關係尤爲是長距離特徵方面自然有缺陷,不是作不到而是作很差,目前也有不少改進模型,可是特別成功的很少。綜合各方面狀況,很明顯Transformer同時具有並行性好,又適合捕獲長距離特徵,沒有理由不在賽跑比賽中跑不過RNN和CNN

好了,題外話結束,咱們再回到主題,接着說GPT。上面講的是GPT如何進行第一階段的預訓練,那麼假設預訓練好了網絡模型,後面下游任務怎麼用?它有本身的個性,和ELMO的方式大有不一樣。

 

 

 

上圖展現了GPT在第二階段如何使用。首先,對於不一樣的下游任務來講,原本你能夠任意設計本身的網絡結構,如今不行了,你要向GPT的網絡結構看齊,把任務的網絡結構改形成和GPT的網絡結構是同樣的。而後,在作下游任務的時候,利用第一步預訓練好的參數初始化GPT的網絡結構,這樣經過預訓練學到的語言學知識就被引入到你手頭的任務裏來了,這是個很是好的事情。再次,你能夠用手頭的任務去訓練這個網絡,對網絡參數進行Fine-tuning,使得這個網絡更適合解決手頭的問題。就是這樣。看到了麼?這有沒有讓你想起最開始提到的圖像領域如何作預訓練的過程(請參考上圖那句很是容易暴露年齡的歌詞)?對,這跟那個模式是如出一轍的。

這裏引入了一個新問題:對於NLP各類花樣的不一樣任務,怎麼改造才能靠近GPT的網絡結構呢?

 

 

 

GPT論文給了一個改造施工圖如上,其實也很簡單:對於分類問題,不用怎麼動,加上一個起始和終結符號便可;對於句子關係判斷問題,好比Entailment,兩個句子中間再加個分隔符便可;對文本類似性判斷問題,把兩個句子順序顛倒下作出兩個輸入便可,這是爲了告訴模型句子順序不重要;對於多項選擇問題,則多路輸入,每一路把文章和答案選項拼接做爲輸入便可。從上圖可看出,這種改造仍是很方便的,不一樣任務只須要在輸入部分施工便可。

 

 

GPT的效果是很是使人驚豔的,在12個任務裏,9個達到了最好的效果,有些任務性能提高很是明顯。

 

 

 

那麼站在如今的時間節點看,GPT有什麼值得改進的地方呢?其實最主要的就是那個單向語言模型,若是改形成雙向的語言模型任務估計也沒有Bert太多事了。固然,即便如此GPT也是很是很是好的一個工做,跟Bert比,其做者炒做能力亟待提高。

 

Bert的誕生

 

 

咱們通過跋山涉水,終於到了目的地Bert模型了。

Bert採用和GPT徹底相同的兩階段模型,首先是語言模型預訓練;其次是使用Fine-Tuning模式解決下游任務。和GPT的最主要不一樣在於在預訓練階段採用了相似ELMO的雙向語言模型,固然另一點是語言模型的數據規模要比GPT大。因此這裏Bert的預訓練過程沒必要多講了。

 

 

 

第二階段,Fine-Tuning階段,這個階段的作法和GPT是同樣的。固然,它也面臨着下游任務網絡結構改造的問題,在改造任務方面Bert和GPT有些不一樣,下面簡單介紹一下。

 

 

在介紹Bert如何改造下游任務以前,先大體說下NLP的幾類問題,說這個是爲了強調Bert的普適性有多強。一般而言,絕大部分NLP問題能夠納入上圖所示的四類任務中:一類是序列標註,這是最典型的NLP任務,好比中文分詞,詞性標註,命名實體識別,語義角色標註等均可以納入這一類問題,它的特色是句子中每一個單詞要求模型根據上下文都要給出一個分類類別。第二類是分類任務,好比咱們常見的文本分類,情感計算等均可以納入這一類。它的特色是無論文章有多長,整體給出一個分類類別便可。第三類任務是句子關係判斷,好比Entailment,QA,語義改寫,天然語言推理等任務都是這個模式,它的特色是給定兩個句子,模型判斷出兩個句子是否具有某種語義關係;第四類是生成式任務,好比機器翻譯,文本摘要,寫詩造句,看圖說話等都屬於這一類。它的特色是輸入文本內容後,須要自主生成另一段文字。

 

 

 

對於種類如此繁多並且各具特色的下游NLP任務,Bert如何改造輸入輸出部分使得大部分NLP任務均可以使用Bert預訓練好的模型參數呢?上圖給出示例,對於句子關係類任務,很簡單,和GPT相似,加上一個起始和終結符號,句子之間加個分隔符便可。對於輸出來講,把第一個起始符號對應的Transformer最後一層位置上面串接一個softmax分類層便可。對於分類問題,與GPT同樣,只須要增長起始和終結符號,輸出部分和句子關係判斷任務相似改造;對於序列標註問題,輸入部分和單句分類是同樣的,只須要輸出部分Transformer最後一層每一個單詞對應位置都進行分類便可。從這裏能夠看出,上面列出的NLP四大任務裏面,除了生成類任務外,Bert其它都覆蓋到了,並且改造起來很簡單直觀。儘管Bert論文沒有提,可是稍微動動腦子就能夠想到,其實對於機器翻譯或者文本摘要,聊天機器人這種生成式任務,一樣能夠稍做改造便可引入Bert的預訓練成果。只須要附着在S2S結構上,encoder部分是個深度Transformer結構,decoder部分也是個深度Transformer結構。根據任務選擇不一樣的預訓練數據初始化encoder和decoder便可。這是至關直觀的一種改造方法。固然,也能夠更簡單一點,好比直接在單個Transformer結構上加裝隱層產生輸出也是能夠的。不論如何,從這裏能夠看出,NLP四大類任務均可以比較方便地改形成Bert可以接受的方式。這實際上是Bert的很是大的優勢,這意味着它幾乎能夠作任何NLP的下游任務,具有普適性,這是很強的。

 

 

Bert採用這種兩階段方式解決各類NLP任務效果如何?在11個各類類型的NLP任務中達到目前最好的效果,某些任務性能有極大的提高。一個新模型好很差,效果纔是王道。

 

 

到這裏咱們能夠再梳理下幾個模型之間的演進關係。從上圖可見,Bert其實和ELMO及GPT存在千絲萬縷的關係,好比若是咱們把GPT預訓練階段換成雙向語言模型,那麼就獲得了Bert;而若是咱們把ELMO的特徵抽取器換成Transformer,那麼咱們也會獲得Bert。因此你能夠看出:Bert最關鍵兩點,一點是特徵抽取器採用Transformer;第二點是預訓練的時候採用雙向語言模型。

那麼新問題來了:對於Transformer來講,怎麼才能在這個結構上作雙向語言模型任務呢?乍一看上去好像不太好搞。我以爲吧,其實有一種很直觀的思路,怎麼辦?看看ELMO的網絡結構圖,只須要把兩個LSTM替換成兩個Transformer,一個負責正向,一個負責反向特徵提取,其實應該就能夠。固然這是我本身的改造,Bert沒這麼作。那麼Bert是怎麼作的呢?咱們前面不是提過Word2Vec嗎?我前面確定不是漫無目的地提到它,提它是爲了在這裏引出那個CBOW訓練方法,所謂寫做時候埋伏筆的「草蛇灰線,伏脈千里」,大概就是這個意思吧?前面提到了CBOW方法,它的核心思想是:在作語言模型任務的時候,我把要預測的單詞摳掉,而後根據它的上文Context-Before和下文Context-after去預測單詞。其實Bert怎麼作的?Bert就是這麼作的。從這裏能夠看到方法間的繼承關係。固然Bert做者沒提Word2Vec及CBOW方法,這是個人判斷,Bert做者說是受到完形填空任務的啓發,這也極可能,可是我以爲他們要是沒想到過CBOW估計是不太可能的。

從這裏能夠看出,在文章開始我說過Bert在模型方面其實沒有太大創新,更像一個最近幾年NLP重要技術的集大成者,緣由在於此,固然我不肯定你怎麼看,是否定同這種見解,並且我也不關心你怎麼看。其實Bert自己的效果好和普適性強纔是最大的亮點。

 

 

那麼Bert自己在模型和方法角度有什麼創新呢?就是論文中指出的Masked 語言模型和Next Sentence Prediction。而Masked語言模型上面講了,本質思想實際上是CBOW,可是細節方面有改進。

 

 

Masked雙向語言模型向上圖展現這麼作:隨機選擇語料中15%的單詞,把它摳掉,也就是用[Mask]掩碼代替原始單詞,而後要求模型去正確預測被摳掉的單詞。可是這裏有個問題:訓練過程大量看到[mask]標記,可是真正後面用的時候是不會有這個標記的,這會引導模型認爲輸出是針對[mask]這個標記的,可是實際使用又見不到這個標記,這天然會有問題。爲了不這個問題,Bert改造了一下,15%的被上天選中要執行[mask]替身這項光榮任務的單詞中,只有80%真正被替換成[mask]標記,10%被狸貓換太子隨機替換成另一個單詞,10%狀況這個單詞還待在原地不作改動。這就是Masked雙向語音模型的具體作法。

 

 

至於說「Next Sentence Prediction」,指的是作語言模型預訓練的時候,分兩種狀況選擇兩個句子,一種是選擇語料中真正順序相連的兩個句子;另一種是第二個句子從語料庫中拋色子,隨機選擇一個拼到第一個句子後面。咱們要求模型除了作上述的Masked語言模型任務外,附帶再作個句子關係預測,判斷第二個句子是否是真的是第一個句子的後續句子。之因此這麼作,是考慮到不少NLP任務是句子關係判斷任務,單詞預測粒度的訓練到不了句子關係這個層級,增長這個任務有助於下游句子關係判斷任務。因此能夠看到,它的預訓練是個多任務過程。這也是Bert的一個創新。

 

上面這個圖給出了一個咱們此前利用微博數據和開源的Bert作預訓練時隨機抽出的一箇中文訓練實例,從中能夠體會下上面講的masked語言模型和下句預測任務。訓練數據就長這種樣子。

 

順帶講解下Bert的輸入部分,也算是有些特點。它的輸入部分是個線性序列,兩個句子經過分隔符分割,最前面和最後增長兩個標識符號。每一個單詞有三個embedding:位置信息embedding,這是由於NLP中單詞順序是很重要的特徵,須要在這裏對位置信息進行編碼;單詞embedding,這個就是咱們以前一直提到的單詞embedding;第三個是句子embedding,由於前面提到訓練數據都是由兩個句子構成的,那麼每一個句子有個句子總體的embedding項對應給每一個單詞。把單詞對應的三個embedding疊加,就造成了Bert的輸入。

 

至於Bert在預訓練的輸出部分如何組織,能夠參考上圖的註釋。

 

咱們說過Bert效果特別好,那麼究竟是什麼因素起做用呢?如上圖所示,對比試驗能夠證實,跟GPT相比,雙向語言模型起到了最主要的做用,對於那些須要看到下文的任務來講尤爲如此。而預測下個句子來講對總體性能來講影響不算太大,跟具體任務關聯度比較高。

 

最後,我講講我對Bert的評價和見解,我以爲Bert是NLP裏裏程碑式的工做,對於後面NLP的研究和工業應用會產生長久的影響,這點毫無疑問。可是從上文介紹也能夠看出,從模型或者方法角度看,Bert借鑑了ELMO,GPT及CBOW,主要提出了Masked 語言模型及Next Sentence Prediction,可是這裏Next Sentence Prediction基本不影響大局,而Masked LM明顯借鑑了CBOW的思想。因此說Bert的模型沒什麼大的創新,更像最近幾年NLP重要進展的集大成者,這點若是你看懂了上文估計也沒有太大異議,若是你有大的異議,槓精這個大帽子我隨時準備戴給你。若是概括一下這些進展就是:首先是兩階段模型,第一階段雙向語言模型預訓練,這裏注意要用雙向而不是單向,第二階段採用具體任務Fine-tuning或者作特徵集成;第二是特徵抽取要用Transformer做爲特徵提取器而不是RNN或者CNN;第三,雙向語言模型能夠採起CBOW的方法去作(固然我以爲這個是個細節問題,不算太關鍵,前兩個因素比較關鍵)。Bert最大的亮點在於效果好及普適性強,幾乎全部NLP任務均可以套用Bert這種兩階段解決思路,並且效果應該會有明顯提高。能夠預見的是,將來一段時間在NLP應用領域,Transformer將佔據主導地位,並且這種兩階段預訓練方法也會主導各類應用。

另外,咱們應該弄清楚預訓練這個過程本質上是在作什麼事情,本質上預訓練是經過設計好一個網絡結構來作語言模型任務,而後把大量甚至是無窮盡的無標註的天然語言文本利用起來,預訓練任務把大量語言學知識抽取出來編碼到網絡結構中,當手頭任務帶有標註信息的數據有限時,這些先驗的語言學特徵固然會對手頭任務有極大的特徵補充做用,由於當數據有限的時候,不少語言學現象是覆蓋不到的,泛化能力就弱,集成儘可能通用的語言學知識天然會增強模型的泛化能力。如何引入先驗的語言學知識其實一直是NLP尤爲是深度學習場景下的NLP的主要目標之一,不過一直沒有太好的解決辦法,而ELMO/GPT/Bert的這種兩階段模式看起來無疑是解決這個問題天然又簡潔的方法,這也是這些方法的主要價值所在。

對於當前NLP的發展方向,我我的以爲有兩點很是重要,一個是須要更強的特徵抽取器,目前看Transformer會逐漸擔當大任,可是確定仍是不夠強的,須要發展更強的特徵抽取器;第二個就是如何優雅地引入大量無監督數據中包含的語言學知識,注意我這裏強調地是優雅,而不是引入,此前至關多的工做試圖作各類語言學知識的嫁接或者引入,可是不少方法看着讓人牙疼,就是我說的不優雅。目前看預訓練這種兩階段方法仍是頗有效的,也很是簡潔,固然後面確定還會有更好的模型出現。

完了,這就是天然語言模型預訓練的發展史。

注:本文能夠任意轉載,轉載時請標明做者和出處。

相關文章
相關標籤/搜索