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

達觀資料發表於2018-12-10

張俊林:中國中文資訊學會理事,目前在新浪微博 AI Lab 擔任資深演算法專家。在此之前,張俊林曾經在阿里巴巴任資深技術專家,以及在百度和用友擔任技術經理及技術總監等職務。同時他是技術書籍《這就是搜尋引擎:核心技術詳解》(該書榮獲全國第十二屆輸出版優秀圖書獎)、《大資料日知錄:架構與演算法》的作者。

Bert 最近很火,應該是最近最火爆的 AI 進展,網上的評價很高,那麼 Bert 值得這麼高的評價嗎?我個人判斷是值得。那為什麼會有這麼高的評價呢?是因為它有重大的理論或者模型創新嗎?其實並沒有,從模型創新角度看一般,創新不算大。但是架不住效果太好了,基本重新整理了很多 NLP 的任務的最好效能,有些任務還被刷爆了,這個才是關鍵。另外一點是 Bert 具備廣泛的通用性,就是說絕大部分 NLP 任務都可以採用類似的兩階段模式直接去提升效果,這個第二關鍵。客觀的說,把 Bert 當做最近兩年 NLP 重大進展的集大成者更符合事實。

本文的主題是自然語言處理中的預訓練過程,會大致說下 NLP 中的預訓練技術是一步一步如何發展到 Bert 模型的,從中可以很自然地看到 Bert 的思路是如何逐漸形成的,Bert 的歷史沿革是什麼,繼承了什麼,創新了什麼,為什麼效果那麼好,主要原因是什麼,以及為何說模型創新不算太大,為何說 Bert 是近年來 NLP 重大進展的集大成者。

我們一步一步來講,而串起來這個故事的脈絡就是自然語言的預訓練過程,但是落腳點還是在 Bert 身上。要講自然語言的預訓練,得先從影象領域的預訓練說起。

影象領域的預訓練

自從深度學習火起來後,預訓練過程就是做影象或者視訊領域的一種比較常規的做法,有比較長的歷史了,而且這種做法很有效,能明顯促進應用的效果。

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

那麼影象領域怎麼做預訓練呢,上圖展示了這個過程,我們設計好網路結構以後,對於影象來說一般是 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 任務,那事情就好辦多了。

這樣原先訓練不了的任務就能解決了,即使手頭任務訓練資料也不少,加個預訓練過程也能極大加快任務訓練的收斂速度,所以這種預訓練方式是老少皆宜的解決方案,另外療效又好,所以在做影象處理領域很快就流行開來。

那麼新的問題來了,為什麼這種預訓練的思路是可行的?

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

目前我們已經知道,對於層級的 CNN 結構來說,不同層級的神經元學習到了不同型別的影象特徵,由底向上特徵形成層級結構,如上圖所示,如果我們手頭是個人臉識別任務,訓練好網路後,把每層神經元學習到的特徵視覺化肉眼看一看每層學到了啥特徵,你會看到最底層的神經元學到的是線段等特徵,圖示的第二個隱層學到的是人臉五官的輪廓,第三層學到的是人臉的輪廓,通過三步形成了特徵的層級結構,越是底層的特徵越是所有不論什麼領域的影象都會具備的比如邊角線弧線等底層基礎特徵,越往上抽取出的特徵越與手頭任務相關。

正因為此,所以預訓練好的網路引數,尤其是底層的網路引數抽取出特徵跟具體任務越無關,越具備任務的通用性,所以這是為何一般用底層預訓練好的引數初始化新任務網路引數的原因。而高層特徵跟任務關聯較大,實際可以不用使用,或者採用 Fine-tuning 用新資料集合清洗掉高層無關的特徵抽取器。

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

般我們喜歡用 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 裡面做預訓練一般的選擇是用語言模型任務來做。

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

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

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

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

你可以像上圖這麼設計這個網路結構,這其實就是大名鼎鼎的中文人稱“神經網路語言模型”,英文小名 NNLM 的網路結構,用來做語言模型。這個工作有年頭了,是個陳年老工作,是 Bengio 在 2003 年發表在 JMLR 上的論文。它生於 2003,火於 2013,以後是否會不朽暫且不知,但是不幸的是出生後應該沒有引起太大反響,沉寂十年終於時來運轉沉冤得雪,在 2013 年又被 NLP 考古工作者從海底溼淋淋地撈出來了祭入神殿。

為什麼會發生這種技術奇遇記?你要想想 2013 年是什麼年頭,是深度學習開始滲透 NLP 領域的光輝時刻,萬里長征第一步,而 NNLM 可以算是南昌起義第一槍。在深度學習火起來之前,極少有人用神經網路做 NLP 問題,如果你 10 年前堅持用神經網路做 NLP,估計別人會認為你這人神經有問題。所謂紅塵滾滾,誰也擋不住歷史發展趨勢的車輪,這就是個很好的例子。

上面是閒話,閒言碎語不要講,我們回來講一講 NNLM 的思路。先說訓練過程,現在看其實很簡單,見過 RNN、LSTM、CNN 後的你們回頭再看這個網路甚至顯得有些簡陋。學習任務是輸入某個句中從Word Embedding到Bert模型——自然語言處理預訓練技術發展史單詞前面句子的 t-1 個單詞,要求網路正確預測單詞 Bert,即最大化:

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

前面任意單詞從Word Embedding到Bert模型——自然語言處理預訓練技術發展史用Onehot編碼(比如:0001000)作為原始單詞輸入,之後乘以矩陣 Q 後獲得向量從Word Embedding到Bert模型——自然語言處理預訓練技術發展史,每個單詞的從Word Embedding到Bert模型——自然語言處理預訓練技術發展史拼接,上接隱層,然後接 softmax 去預測後面應該後續接哪個單詞。這個從Word Embedding到Bert模型——自然語言處理預訓練技術發展史是什麼?這其實就是單詞對應的 Word Embedding 值,那個矩陣 Q 包含 V 行,V 代表詞典大小,每一行內容代表對應單詞的 Word embedding 值。只不過 Q 的內容也是網路引數,需要學習獲得,訓練剛開始用隨機值初始化矩陣 Q,當這個網路訓練好之後,矩陣 Q 的內容被正確賦值,每一行代表一個單詞對應的 Word embedding 值。

所以你看,通過這個網路學習語言模型任務,這個網路不僅自己能夠根據上文預測後接單詞是什麼,同時獲得一個副產品,就是那個矩陣 Q,這就是單詞的 Word Embedding 是被如何學會的。

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

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

Word2Vec 的網路結構其實和 NNLM 是基本類似的,只是這個圖長得清晰度差了點,看上去不像,其實它們是親兄弟。不過這裡需要指出:儘管網路結構相近,而且也是做語言模型任務,但是其訓練方法不太一樣。Word2Vec 有兩種訓練方法,一種叫 CBOW,核心思想是從一個句子裡面把一個詞摳掉,用這個詞的上文和下文去預測被摳掉的這個詞;第二種叫做 Skip-gram,和 CBOW 正好反過來,輸入某個單詞,要求網路預測它的上下文單詞。

而你回頭看看,NNLM 是怎麼訓練的?是輸入一個單詞的上文,去預測這個單詞。這是有顯著差異的。為什麼 Word2Vec 這麼處理?原因很簡單,因為 Word2Vec 和 NNLM 不一樣,NNLM 的主要任務是要學習一個解決語言模型任務的網路結構,語言模型就是要看到上文預測下文,而 word embedding 只是無心插柳的一個副產品。但是 Word2Vec 目標不一樣,它單純就是要 word embedding 的,這是主產品,所以它完全可以隨性地這麼去訓練網路。

為什麼要講 Word2Vec 呢?這裡主要是要引出 CBOW 的訓練方法,BERT 其實跟它有關係,後面會講它們之間是如何的關係,當然它們的關係 BERT 作者沒說,是我猜的,至於我猜的對不對,後面你看後自己判斷。

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

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

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

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

假設如上圖所示,我們有個 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到Bert模型——自然語言處理預訓練技術發展史

這片在 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 動態調整的思路。

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

ELMO 採用了典型的兩階段過程,第一個階段是利用語言模型進行預訓練;第二個階段是在做下游任務時,從預訓練網路中提取對應單詞的網路各層的 Word Embedding 作為新特徵補充到下游任務中。

上圖展示的是其預訓練過程,它的網路結構採用了雙層雙向 LSTM,目前語言模型訓練的任務目標是根據單詞從Word Embedding到Bert模型——自然語言處理預訓練技術發展史的上下文去正確預測單詞從Word Embedding到Bert模型——自然語言處理預訓練技術發展史從Word Embedding到Bert模型——自然語言處理預訓練技術發展史之前的單詞序列 Context-before 稱為上文,之後的單詞序列 Context-after 稱為下文。圖中左端的前向雙層LSTM代表正方向編碼器,輸入的是從左到右順序的除了預測單詞外從Word Embedding到Bert模型——自然語言處理預訓練技術發展史的上文 Context-before;右端的逆向雙層 LSTM 代表反方向編碼器,輸入的是從右到左的逆序的句子下文 Context-after;每個編碼器的深度都是兩層 LSTM 疊加。這個網路結構其實在 NLP 中是很常用的。

使用這個網路結構利用大量語料做語言模型任務就能預先訓練好這個網路,如果訓練好這個網路後,輸入一個新句子從Word Embedding到Bert模型——自然語言處理預訓練技術發展史,句子中每個單詞都能得到對應的三個Embedding:最底層是單詞的 Word Embedding,往上走是第一層雙向 LSTM中對應單詞位置的 Embedding,這層編碼單詞的句法資訊更多一些;再往上走是第二層 LSTM 中對應單詞位置的 Embedding,這層編碼單詞的語義資訊更多一些。也就是說,ELMO 的預訓練過程不僅僅學會單詞的 Word Embedding,還學會了一個雙層雙向的 LSTM 網路結構,而這兩者後面都有用。 

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

上面介紹的是 ELMO 的第一階段:預訓練階段。那麼預訓練好網路結構後,如何給下游任務使用呢?上圖展示了下游任務的使用過程,比如我們的下游任務仍然是 QA 問題,此時對於問句 X,我們可以先將句子 X 作為預訓練好的 ELMO 網路的輸入,這樣句子 X 中每個單詞在 ELMO 網路中都能獲得對應的三個 Embedding,之後給予這三個 Embedding 中的每一個 Embedding 一個權重 a,這個權重可以學習得來,根據各自權重累加求和,將三個 Embedding 整合成一個。

然後將整合後的這個 Embedding 作為 X 句在自己任務的那個網路結構中對應單詞的輸入,以此作為補充的新特徵給下游任務使用。對於上圖所示下游任務 QA 中的回答句子 Y 來說也是如此處理。

因為 ELMO給下游提供的是每個單詞的特徵形式,所以這一類預訓練的方法被稱為“Feature-based Pre-Training”。至於為何這麼做能夠達到區分多義詞的效果,你可以想一想,其實比較容易想明白原因。

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

上面這個圖是 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到Bert模型——自然語言處理預訓練技術發展史

前面我們提到靜態 Word Embedding 無法解決多義詞的問題,那麼 ELMO 引入上下文動態調整單詞的 embedding 後多義詞問題解決了嗎?解決了,而且比我們期待的解決得還要好。

上圖給了個例子,對於 Glove 訓練出的 Word Embedding 來說,多義詞比如 play,根據它的 embedding 找出的最接近的其它單詞大多數集中在體育領域,這很明顯是因為訓練資料中包含 play 的句子中體育領域的數量明顯佔優導致;而使用 ELMO,根據上下文動態調整後的 embedding 不僅能夠找出對應的「演出」的相同語義的句子,而且還可以保證找出的句子中的 play 對應的詞性也是相同的,這是超出期待之處。之所以會這樣,是因為我們上面提到過,第一層 LSTM 編碼了很多句法資訊,這在這裡起到了重要作用。

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

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

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

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

我們如果把 ELMO 這種預訓練方法和影象領域的預訓練方法對比,發現兩者模式看上去還是有很大差異的。除了以 ELMO 為代表的這種基於特徵融合的預訓練方法外,NLP 裡還有一種典型做法,這種做法和影象領域的方式就是看上去一致的了,一般將這種方法稱為“基於 Fine-tuning 的模式”,而 GPT 就是這一模式的典型開創者。

從 Word Embedding 到 GPT 

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

GPT 是“Generative Pre-Training”的簡稱,從名字看其含義是指的生成式的預訓練。GPT 也採用兩階段過程,第一個階段是利用語言模型進行預訓練,第二階段通過 Fine-tuning 的模式解決下游任務。上圖展示了 GPT 的預訓練過程,其實和 ELMO 是類似的,主要不同在於兩點:

首先,特徵抽取器不是用的 RNN,而是用的 Transformer,上面提到過它的特徵抽取能力要強於 RNN,這個選擇很明顯是很明智的;

其次,GPT 的預訓練雖然仍然是以語言模型作為目標任務,但是採用的是單向的語言模型,所謂“單向”的含義是指:語言模型訓練的任務目標是根據從Word Embedding到Bert模型——自然語言處理預訓練技術發展史單詞的上下文去正確預測單詞從Word Embedding到Bert模型——自然語言處理預訓練技術發展史從Word Embedding到Bert模型——自然語言處理預訓練技術發展史之前的單詞序列 Context-before 稱為上文,之後的單詞序列 Context-after 稱為下文。ELMO 在做語言模型預訓練的時候,預測單詞從Word Embedding到Bert模型——自然語言處理預訓練技術發展史同時使用了上文和下文,而 GPT 則只採用 Context-before 這個單詞的上文來進行預測,而拋開了下文。

這個選擇現在看不是個太好的選擇,原因很簡單,它沒有把單詞的下文融合進來,這限制了其在更多應用場景的效果,比如閱讀理解這種任務,在做任務的時候是可以允許同時看到上文和下文一起做決策的。如果預訓練時候不把單詞的下文嵌入到 Word Embedding 中,是很吃虧的,白白丟掉了很多資訊。

這裡強行插入一段簡單提下 Transformer,儘管上面提到了,但是說的還不完整,補充兩句。首先,Transformer 是個疊加的“自注意力機制(Self Attention)”構成的深度網路,是目前 NLP 裡最強的特徵提取器,注意力這個機制在此被髮揚光大,從任務的配角不斷搶戲,直到 Transformer 一躍成為踢開 RNN 和 CNN 傳統特徵提取器,榮升頭牌,大紅大紫。你問了:什麼是注意力機制?這裡再插個廣告,對注意力不瞭解的可以參考鄙人 16 年出品 17 年修正的下文:“深度學習中的注意力模型”,補充下相關基礎知識,如果不瞭解注意力機制你肯定會落後時代的發展。而介紹 Transformer 比較好的文章可以參考哈佛大學 NLP 研究組寫的“The Annotated Transformer. ”,程式碼原理雙管齊下,講得非常清楚,這裡不展開介紹。

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

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

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

上圖展示了 GPT 在第二階段如何使用。首先,對於不同的下游任務來說,本來你可以任意設計自己的網路結構,現在不行了,你要向 GPT 的網路結構看齊,把任務的網路結構改造成和 GPT 的網路結構是一樣的。然後,在做下游任務的時候,利用第一步預訓練好的引數初始化 GPT 的網路結構,這樣通過預訓練學到的語言學知識就被引入到你手頭的任務裡來了,這是個非常好的事情。再次,你可以用手頭的任務去訓練這個網路,對網路引數進行 Fine-tuning,使得這個網路更適合解決手頭的問題。就是這樣。看到了麼?這有沒有讓你想起最開始提到的影象領域如何做預訓練的過程(請參考上圖那句非常容易暴露年齡的歌詞)?對,這跟那個模式是一模一樣的。

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

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

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

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

GPT 的效果是非常令人驚豔的,在 12 個任務裡,9 個達到了最好的效果,有些任務效能提升非常明顯。

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

那麼站在現在的時間節點看,GPT 有什麼值得改進的地方呢?其實最主要的就是那個單向語言模型,如果改造成雙向的語言模型任務估計也沒有 Bert 太多事了。當然,即使如此 GPT 也是非常非常好的一個工作,跟 Bert 比,其作者炒作能力亟待提升。

Bert 的誕生

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

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

Bert 採用和 GPT 完全相同的兩階段模型,首先是語言模型預訓練;其次是使用 Fine-Tuning 模式解決下游任務。和 GPT 的最主要不同在於在預訓練階段採用了類似 ELMO 的雙向語言模型,當然另外一點是語言模型的資料規模要比 GPT 大。所以這裡 Bert 的預訓練過程不必多講了。

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

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

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

在介紹 Bert 如何改造下游任務之前,先大致說下 NLP 的幾類問題,說這個是為了強調 Bert 的普適性有多強。通常而言,絕大部分 NLP 問題可以歸入上圖所示的四類任務中:

  • 一類是序列標註,這是最典型的 NLP 任務,比如中文分詞,詞性標註,命名實體識別,語義角色標註等都可以歸入這一類問題,它的特點是句子中每個單詞要求模型根據上下文都要給出一個分類類別。

  • 第二類是分類任務,比如我們常見的文字分類,情感計算等都可以歸入這一類。它的特點是不管文章有多長,總體給出一個分類類別即可。

  • 第三類任務是句子關係判斷,比如 Entailment,QA,語義改寫,自然語言推理等任務都是這個模式,它的特點是給定兩個句子,模型判斷出兩個句子是否具備某種語義關係。

  • 第四類是生成式任務,比如機器翻譯,文字摘要,寫詩造句,看圖說話等都屬於這一類。它的特點是輸入文字內容後,需要自主生成另外一段文字。

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

對於種類如此繁多而且各具特點的下游 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 的下游任務,具備普適性,這是很強的。

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

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

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

到這裡我們可以再梳理下幾個模型之間的演進關係。從上圖可見,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 本身的效果好和普適性強才是最大的亮點。

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

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

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

Masked 雙向語言模型向上圖展示這麼做:隨機選擇語料中 15% 的單詞,把它摳掉,也就是用 [Mask] 掩碼代替原始單詞,然後要求模型去正確預測被摳掉的單詞。但是這裡有個問題:訓練過程大量看到 [mask] 標記,但是真正後面用的時候是不會有這個標記的,這會引導模型認為輸出是針對 [mask] 這個標記的,但是實際使用又見不到這個標記,這自然會有問題。

為了避免這個問題,Bert 改造了一下,15% 的被上天選中要執行 [mask] 替身這項光榮任務的單詞中,只有 80% 真正被替換成 [mask] 標記,10% 被狸貓換太子隨機替換成另外一個單詞,10% 情況這個單詞還待在原地不做改動。這就是 Masked 雙向語音模型的具體做法。

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

至於說“Next Sentence Prediction”,指的是做語言模型預訓練的時候,分兩種情況選擇兩個句子,一種是選擇語料中真正順序相連的兩個句子;另外一種是第二個句子從語料庫中拋色子,隨機選擇一個拼到第一個句子後面。我們要求模型除了做上述的 Masked 語言模型任務外,附帶再做個句子關係預測,判斷第二個句子是不是真的是第一個句子的後續句子。

之所以這麼做,是考慮到很多 NLP 任務是句子關係判斷任務,單詞預測粒度的訓練到不了句子關係這個層級,增加這個任務有助於下游句子關係判斷任務。所以可以看到,它的預訓練是個多工過程。這也是 Bert 的一個創新。

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

上面這個圖給出了一個我們此前利用微博資料和開源的 Bert 做預訓練時隨機抽出的一箇中文訓練例項,從中可以體會下上面講的 masked 語言模型和下句預測任務。訓練資料就長這種樣子。

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

順帶講解下 Bert 的輸入部分,也算是有些特色。它的輸入部分是個線性序列,兩個句子通過分隔符分割,最前面和最後增加兩個識別符號號。每個單詞有三個 embedding:

  • 位置資訊 embedding,這是因為 NLP 中單詞順序是很重要的特徵,需要在這裡對位置資訊進行編碼;

  • 單詞 embedding, 這個就是我們之前一直提到的單詞 embedding;

  • 句子 embedding,因為前面提到訓練資料都是由兩個句子構成的,那麼每個句子有個句子整體的 embedding 項對應給每個單詞。把單詞對應的三個 embedding 疊加,就形成了 Bert 的輸入。

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

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

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

我們說過 Bert 效果特別好,那麼到底是什麼因素起作用呢?如上圖所示,對比試驗可以證明,跟 GPT 相比,雙向語言模型起到了最主要的作用,對於那些需要看到下文的任務來說尤其如此。而預測下個句子來說對整體效能來說影響不算太大,跟具體任務關聯度比較高。

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

最後,我講講我對 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 會逐漸擔當大任,但是肯定還是不夠強的,需要發展更強的特徵抽取器;第二個就是如何優雅地引入大量無監督資料中包含的語言學知識,注意我這裡強調地是優雅,而不是引入,此前相當多的工作試圖做各種語言學知識的嫁接或者引入,但是很多方法看著讓人牙疼,就是我說的不優雅。目前看預訓練這種兩階段方法還是很有效的,也非常簡潔,當然後面肯定還會有更好的模型出現。

以上,這就是自然語言模型預訓練的發展史。

相關文章