阿里妹導讀:自然語言處理領域的殿堂標誌 BERT 並非橫空出世,背後有它的發展原理。今天,螞蟻金服財富對話演算法團隊整理對比了深度學習模型在自然語言處理領域的發展歷程。從簡易的神經元到當前最複雜的BERT模型,深入淺出地介紹了深度學習在 NLP 領域進展,並結合工業界給出了未來的 NLP 的應用方向,相信讀完這篇文章,你對深度學習的整體脈絡會有更加深刻認識。
一個神經網路結構通常包含輸入層、隱藏層、輸出層。輸入層是我們的 features (特徵),輸出層是我們的預測 (prediction)。神經網路的目的是擬合一個函式 f*:features -> prediction。在訓練期間,通過減小 prediction 和實際 label 的差異的這種方式,來更改網路引數,使當前的網路能逼近於理想的函式 f*。
神經元(Neural Cell)
神經網路層的基本組成成員為神經元,神經元包含兩部分,一部分是上一層網路輸出和當前網路層引數的一個線性乘積,另外一部分是線性乘積的非線性轉換。(如果缺少非線性轉換,則多層線性乘積可以轉化為一層的線性乘積)
圖一
淺層神經網路( Neural Network )
只有一層隱藏層的,我們稱為淺層網路。
圖二
深度學習網路(Multilayer Perceptron)
相對於淺層網路結構,有兩層、三層及以上隱藏層的我們就可以稱為深度網路。
圖三
在通常的理解中,一個足夠寬的網路,是能夠擬合任何函式的。而一個深層網路,則能夠用更少的引數來擬合該函式,因為深層的神經元可以獲取比淺層神經元更復雜的特徵表示。
在圖二及三所示網路,我們稱為全連線網路,也就是隱藏層的神經元會和上一層所有的神經元輸出相關。和全連線網路相對應的,是隻和上一層部分神經元輸出連線的網路,如下文介紹的卷積網路。
卷積網路(CNN)
卷積網路神經元只和上一層的部分神經元輸出是連線的。(在直覺上,是因為人的視覺神經元觸突只對區域性資訊敏感,而不是全域性所有資訊都對同一個觸突產生等價作用)
同一個卷積核從左到右,從上到下和輸入做乘積,得到了不同強度的輸出。從直覺上來理解,卷積核對原始資料的不同資料分佈的敏感度是不一樣的。如果把卷積核理解為是某種 pattern,那麼符合這種 pattern 的資料分佈會得到比較強的輸出,而不符合這種 pattern 的輸出則得到弱的,甚至是不輸出。
一個卷積核是一個 pattern 提取器, 多個卷積核就是多個 pattern 提取器。通過多個特徵提取器對原始資料做特徵提取轉換,就構成了一層卷積。
Alex Net, 因為 GPU 記憶體的原因,Alex 使用了兩塊 GPU 對模型做了切割,本質上的卷積層是用於特徵提取, 最大池化層用於提取強特徵及減少引數,全連線層則是所有高階特徵參與到最後分類決策中去。
迴圈神經網路(RNN)
CNN是對空間上特徵的提取, RNN則是對時序上特徵的提取。
在RNN中,x1 , x2, x3, xt 是在時序上不一樣的輸入,而 V, U, W 三個矩陣則是共享。同時 RNN 網路中儲存了自己的狀態 S。 S 隨著輸入而改變,不同的輸入/不同時刻的輸入或多或少影響 RNN 網路的狀態 S。而 RNN 網路的狀態 S 則決定最後的輸出。
在直覺上,我們理解 RNN 網路是一個可模擬任何函式的一個神經網路( action ),加上同時有一份自己的歷史儲存( memory ),action+memory 兩者讓 RNN 成為了一個圖靈機器。
長短期記憶網路( LSTM )
RNN 的問題是非線性操作 σ 的存在且每一步間通過連乘操作傳遞,會導致長序列歷史資訊不能很好的傳遞到最後,而有了 LSTM 網路。
在 lstmcell 中, 包含了通常意義上的遺忘門(點乘,決定什麼要從狀態中去除),輸入更新門(按位相加,決定什麼要新增到狀態中去),輸出門(點乘,決定狀態的輸出是什麼?)雖然看起來很複雜,本質上是矩陣的運算。
為了簡化運算,後面有 lstm 的變種 GRU, 如下圖:
文字卷積網路 (TextCNN)
CNN 在計算機識別領域中應用廣泛,其捕捉區域性特徵的能力非常強,為分析和利用影象資料的研究者提供了極大的幫助。TextCNN 是2014年 Kim 在 EMNLP 上提出將 CNN 應用於 NLP 的文字分類任務中。
從直觀上理解,TextCNN 通過一維卷積來獲取句子中 n-gram 的特徵表示。TextCNN 對文字淺層特徵的抽取能力很強,在短文字領域如搜尋、對話領域專注於意圖分類時效果很好,應用廣泛,且速度快,一般是首選;對長文字領域,TextCNN 主要靠 filter 視窗抽取特徵,在長距離建模方面能力受限,且對語序不敏感。
卷積核( filter )→ n-gram 特徵
文字卷積與影象卷積的不同之處在於只在文字序列的一個方向做卷積。對句子單詞每個可能的視窗做卷積操作得到特徵圖( feature map )。
其中,。對 feature map 做最大池化( max-pooling )操作,取中最大值max{c} 作為 filter 提取出的 feature。通過選擇每個 feature map 的最大值,可捕獲其最重要的特徵。
每個 filter 卷積核產生一個 feature ,一個 TextCNN 網路包括很多不同視窗大小的卷積核,如常用的 filter size ∈{3,4,5} 每個 filter 的 featuremaps=100。
增強序列推理模型(ESIM)
ESIM (Enhanced Sequential Inference Model) 為短文字匹配任務中常用且有力的模型。它對於 LSTM 的加強主要在於:將輸入的兩個 LSTM 層( Encoding Layer) 通過序列推理互動模型輸出成新的表徵。
圖片來源:paper《Enhanced LSTM for Natural LanguageInference》
如圖所示,ESIM 為圖的左邊部分。整體網路結構其實比較明確,整條通路大致包括三個步驟。
步驟一:編碼層。該步驟每個 token 將預訓練的編碼通過 Bi-LSTM 層,從而獲取了“新的編碼”,其目的是通過 LSTM 學習每個 token 的上下文資訊。
步驟二:區域性推理層。步驟二本質是一個句間注意力( intra-sentence attention )的計算過程。通過將兩句在步驟一中獲取的結果做 intra-sentence attention 操作,我們在這裡可以獲取到一個新的向量表徵。接下來對向量的前後變化進行了計算,該做法的目的是進一步抽取區域性推理資訊在 attention 操作的前後變化,並捕捉其中的一些推理關係,如前後關係等。
步驟三:組合推理&預測層。再次將抽取後的結果通過 Bi-LSTM,並使用Avarage&Maxpooling 進行池化(其具體操作就是分別進行 average 和 max pooling 並進行 concat),最後加上全連線層進行 Softmax 預測其概率。
ELMo
直觀上來講,ELMo(Embedding from Language Model) 解決了一詞多義的問題,例如詢問“蘋果”的詞向量是什麼,ELMo 會考慮是什麼語境下的“蘋果”,我們應該去詢問“蘋果股價”裡的“蘋果”詞向量是什麼。ELMo 通過提供詞級別、攜帶上下文資訊的動態表示,能有效的捕捉語境資訊。ELMo 的提出對後面的的 GPT 和 BRET有一個很好的引導和啟發的作用。一個好的詞向量,應滿足兩個特點:
能夠反映出語義和語法的複雜特徵。
能夠準確對不同上下文產生合適語義。
傳統的 word2vec 對每個 word 只有一個固定的 embedding 表達,不能產生攜帶上下文資訊的 embedding,對多義詞無法結合語境判斷。ELMo 中的每個單詞都要先結合語境通過多層 LSTM 網路才得到最後的表達,LSTM 是為捕獲上下文資訊而生,因而 ELMo 能結合更多的上下文語境,在一詞多意上的效果比 word2vec 要好。
ELMo 預訓練時的網路結構圖與傳統語言模型有點類似,直觀理解為將中間的非線性層換成了 LSTM,利用 LSTM 網路更好的提取每個單詞在當前語境中的上下文資訊,同時增加了前向和後向上下文資訊。.
預訓練
給定包含 N 個詞的序列,前向語言模型通過前 k-1個詞預測第 k 個詞。在第 k 個位置,每個 LSTM 層輸出上下文依賴的向量表達 , j=1,2,…,L。頂層 LSTM 層的輸出 利用交叉熵損失預測下一個位置。
後向語言模型對序列做反序,利用下文的資訊去預測上文的詞。與前向類似,給定經過 L 層的後向深層 LSTM 網路預測得到第 j 層的隱層輸出。
雙向語言模型拼接前向語言模型和後向語言模型,構建前向和後向聯合最大對數似然。
其中,為序列詞向量層引數,為交叉熵層引數,在訓練過程中這兩部分引數共享。
嵌入式語言模型組合利用多層 LSTM 層的內部資訊,對中心詞,一個 L 層的雙向語言模型計算得到 2L+1 個表達集合。
Fine-tune
在下游任務中,ELMo 將多層的輸出整合成一個向量,將所有 LSTM 層的輸出加上normalized 的 softmax 學習到的權重 s=Softmax(w),使用方法如下所示:
直觀上來講,biLMs 的較高層次的 LSTM 向量抓住的是詞彙的語義資訊, biLMs 的較低層次的 LSTM 向量抓住的是詞彙的語法資訊。這種深度模型所帶來的分層效果使得將一套詞向量應用於不同任務有了可能性,因為每個任務所需要的資訊量是不同的。另外 LSTM 的層數不宜過多,多層 LSTM 網路不是很容易 train 好,存在過擬合問題。如下圖是一個多層 LSTM 用在文字分類問題的實驗結果,隨著 LSTM 層數增多,模型效果先增加後下降。
Transformer
曾經有人說,想要提升 LSTM 效果只要加一個 attention 就可以。但是現在attention is all you need。Transformer 解決了 NLP 領域深層網路的訓練問題。
Attention 此前就被用於眾多 NLP 的任務,用於定位關鍵 token 或者特徵,比如在文字分類的最後加一層 Attention 來提高效能。Transformer 起源自注意力機制(Attention),完全拋棄了傳統的 RNN,整個網路結構完全是由 Attention 機制組成。Transformer 可以通過堆疊 Transformer Layer 進行搭建,作者的實驗是通過搭建編碼器和解碼器各6層,總共12層的 Encoder-Decoder,並在機器翻譯中取得了 BLEU 值的新高。
整個流程的視覺化如圖:以N=2示例,實際Transformer的N=6。
Encoder 階段:輸入“Thinking Machines”,對應詞向量,疊加位置向量 Positional Encoding,對每個位置做 Self-Attention 得到;Add&Norm 分兩步,residual connection即,layer Normalization 得到新的,對每個位置分別做 feed forward 全連線和 Add&Norm,得到一個 Encoder Layer 的輸出,重複堆疊2次,最後將 Encoder Layer 輸出到 Decoder 的 Encoder-Decoder Layer 層。
Decoder 階段:先是對 Decoder 的輸入做 Masked Self-Attention Layer,然後將Encoder 階段的輸出與 Decoder 第一級的輸出做 Encoder-Decoder Attention,最後接 FFN 全連線,堆疊2個 Decoder,最後接全連線+Softmax 輸出當前位置概率最大的的詞。
Transformer 的結構上比較好理解,主要是裡邊的細節比較多,如 Mult-HeadAttention, Feed Forward, Layer Norm, Positional Encoding等。
Transformer的優點:
平行計算,提高訓練速度。這是相比 LSTM 很大的突破,LSTM 在訓練的時候 ,當前步的計算要依賴於上一步的隱狀態,這是一個連續過程,每次計算都需要等之前的計算完成才能展開,限制模型並行能力。而 Transformer 不用LSTM結構,Attention 機制的每一步計算只是依賴上一層的輸出,並不依賴上一詞的資訊,因而詞與詞之間是可以並行的,從而訓練時可以平行計算, 提高訓練速度。
一步到位的全域性聯絡捕捉。順序計算的過程中資訊會丟失,儘管 LSTM 等門機制的結構一定程度上緩解了長期依賴的問題,但是對於特別長期的依賴現象,LSTM 依舊無能為力。Transformer 使用了 Attention 機制,從而將序列中的任意兩個位置之間的距離是縮小為1,這對解決 NLP 中棘手的長期依賴問題是非常有效的。
總結對比CNN、RNN和Self-Attention:
CNN:只能看到區域性領域,適合影象,因為在影象上抽象更高層資訊僅僅需要下一層特徵的區域性區域,文字的話強在抽取區域性特徵,因而更適合短文字。
RNN:理論上能看到所有歷史,適合文字,但是存在梯度消失問題。
Self-Attention:相比 RNN 不存在梯度消失問題。對比 CNN 更加適合長文字,因為能夠看到更遠距離的資訊,CNN 疊高多層之後可以看到很遠的地方,但是 CNN本來需要很多層才能完成的抽象,Self-Attention 在很底層就可以做到,這無疑是非常巨大的優勢。
BERT
BERT (Bidirectional Encoder Representations from Transformers) 本質來講是NLP 領域最底層的語言模型,通過海量語料預訓練,得到序列當前最全面的區域性和全域性特徵表示。
\BERT 網路結構如下所示,BERT 與 Transformer 的 Encoder 網路結構完全相同。假設 Embedding 向量的維度是,輸入序列包含 n 個token,則 BERT 模型一個layer 的輸入是一個的矩陣,而它的輸出也同樣是一個的矩陣,所以這樣 N 層 BERT layer 就可以很方便的首尾串聯起來。BERT 的 large model 使用了 N=24 層這樣的Transformer block。
目標函式
★ 1. Masked Language Model, MLM
MLM 是為了訓練深度雙向語言表示向量,BERT 用了一個非常直接的方式,遮住句子裡某些單詞,讓編碼器預測這個單詞是什麼。具體操作流程如下圖示例:先按一個較小概率 mask 掉一些字,再對這些字利用語言模型由上下文做預測。
BERT 具體訓練方法為:隨機遮住15%的單詞作為訓練樣本。
其中80%用 masked token 來代替。
10%用隨機的一個詞來替換。
10%保持這個詞不變。
直觀上來說,只有15%的詞被遮蓋的原因是效能開銷,雙向編碼器比單向編碼器訓練要慢;選80% mask,20%具體單詞的原因是在 pretrain 的時候做了 mask,在特定任務微調如分類任務的時候,並不對輸入序列做 mask,會產生 gap,任務不一致;10%用隨機的一個詞來替換,10%保持這個詞不變的原因是讓編碼器不知道哪些詞需要預測的,哪些詞是錯誤的,因此被迫需要學習每一個 token 的表示向量,做了一個折中。
★ 2. Next Sentence Prediction
預訓練一個二分類的模型,來學習句子之間的關係。預測下一個句子的方法對學習句子之間關係很有幫助。
訓練方法:正樣本和負樣本比例是1:1,50%的句子是正樣本,即給定句子A和B,B是A的實際語境下一句;負樣本:在語料庫中隨機選擇的句子作為B。通過兩個特定的 token[CLS]和[SEP]來串接兩個句子,該任務在[CLS]位置輸出預測。
輸入表示
Input:每個輸入序列的第一個 token [CLS]專門用來分類,直接利用此位置的最後輸出作為分類任務的輸入 embedding。
從直觀上來說,在預訓練時,[CLS]不參與 mask,因而該位置面向整個序列的所有position 做 attention,[CLS]位置的輸出足夠表達整個句子的資訊,類似於一個global feature;而單詞 token 對應的 embedding 更關注該 token 的語義語法及上下文資訊表達,類似於一個 local feature。
Position Embeddings: transformer 的 PositionEncoding 是通過 sin,cos 直接構造出來的,PositionEmbeddings 是通過模型學習到的 embedding 向量,最高支援512維。
Segment Embeddings:在預訓練的句對預測任務及問答、相似匹配等任務中,需要對前後句子做區分,將句對輸入同一序列,以特殊標記 [SEP] 分割,同時對第一個句子的每個 token 新增 Sentence A Embedding, 第二個句子新增 Sentence BEmbedding,實驗中讓EA =1, EB =0。
Fine-tune
針對不同任務,BERT 採用不同部分的輸出做預測,分類任務利用[CLS]位置的embedding,NER 任務利用每個 token 的輸出 embedding。
BERT的主要貢獻有以下幾個方面:
預訓練的有效性:這方面來說 BERT 改變了遊戲規則,是因為相比設計複雜巧妙的網路結構,在海量無監督資料上預訓練得到的BERT語言表示+少量訓練資料微調的簡單網路模型的實驗結果取得了很大的優勢。
網路深度:基於 DNN 語言模型 (NNLM,CBOW等) 獲取詞向量的表示已經在 NLP領域獲得很大成功,而 BERT 預訓練網路基於 Transformer 的 Encoder,可以做的很深。
雙向語言模型:在 BERT 之前,ELMo 和 GPT 的主要侷限在於標準語言模型是單向的,GPT 使用 Transformer 的 Decoder 結構,只考慮了上文的資訊。ELMo 從左往右的語言模型和從右往左的語言模型其實是獨立開來訓練的,共享 embedding,將兩個方向的 LSTM 拼接並不能真正表示上下文,其本質仍是單向的,且多層 LSTM難訓練。
目標函式:對比語言模型任務只做預測下一個位置的單詞,想要訓練包含更多資訊的語言模型,就需要讓語言模型完成更復雜的任務,BERT 主要完成完形填空和句對預測的任務,即兩個 loss:一個是 Masked Language Model,另一個是 Next Sentence Prediction。
總結
我們在做 NLU 意圖分類任務中實踐了以上主流模型,包括 Xgboost、TextCNN、LSTM、BERT 及 ERNIE 等,下邊是在前期模型調研階段,在選型測試資料上的對比實驗,BERT 模型表現出極大的優勢。
同時在我們部署上線的過程中,對 BERT 時耗做了測試,在壓測實驗資料上的測試結果供參考。針對我們的問答query:
(1 ) BERT layer 的層數與時耗基本成線性關係,多頭數目增加對時耗增加不明顯;
(2) 針對短文字 query 的意圖理解,更多依賴淺層語法語義特徵,因而 BERT 層數對模型準召影響較小;
(3) attention 多頭決定了可以從多少個角度理解 query,在我們的實驗裡降低多頭數比降低層數對準召的影響略大,而時耗無明顯降低。
影象領域,Alexnet 開啟了深度學習的大門,Resnet是影象領域深度學習的殿堂標誌。
隨著Transformer, Bert 興起,網路也在往12層,24層發展,得到了 SOTA. Bert 證明了在nlp領域,深層網路的效果要優於淺層網路。
自然語言領域,Transformer 開啟了深層網路的大門,BERT 也成為了自然語言處理領域的殿堂標誌。
關於我們
我們是螞蟻金服財富對話演算法團隊,致力於用最新的演算法,做最好的模型,造就更智慧的對話系統,摘取AI皇冠上的明珠,歡迎討論、轉發。團隊最近正在大力招聘NLP、推薦、使用者畫像方面的演算法專家(P6-P9),歡迎聯絡:
shiming.xsm@antfin.com。
參考:
Kim Y. Convolutional neural networks for sentence classification[J]. arXivpreprint arXiv:1408.5882, 2014.
Hochreiter S, Schmidhuber J. LSTM can solve hard long time lagproblems[C]//Advances in neural information processing systems. 1997: 473-479.
Vaswani A, Shazeer N, Parmar N, et al. Attention is all youneed[C]//Advances in neural information processing systems. 2017: 5998-6008.
Chen Q, Zhu X, Ling Z, et al. Enhanced lstm for natural languageinference[J]. arXiv preprint arXiv:1609.06038, 2016.
Peters M E, Neumann M, Iyyer M, et al. Deep contextualized wordrepresentations[J]. arXiv preprint arXiv:1802.05365, 2018.
Devlin J, Chang M W, Lee K, et al. Bert: Pre-training of deep bidirectionaltransformers for language understanding[J]. arXiv preprint arXiv:1810.04805,2018.