【NLP CS224N筆記】Lecture 13 - Contextual Word Representations and Pretraining

本次梳理基於Datawhale 第12期組隊學習 -CS224n-預訓練模塊
詳細課程內容參考(2019)斯坦福CS224n深度學習自然語言處理課程

1. 寫在前面

自然語言處理( NLP )是信息時代最重要的技術之一,也是人工智能的重要組成部分。NLP的應用無處不在,因爲人們幾乎用語言交流一切:網絡搜索、廣告、電子郵件、客戶服務、語言翻譯、醫療報告等。近年來,深度學習方法在許多不同的NLP任務中獲得了非常高的性能,使用了不需要傳統的、任務特定的特徵工程的單個端到端神經模型。 而【NLP CS224N】是入門NLP的經典課程, 所以這次藉着Datawhale組織的NLP學習的機會學習這門課程, 並從細節層面重新梳理NLP的知識。

今天是組隊學習的第四篇文章, 主要內容是基於上下文的詞向量表示及一些預訓練的模型, 這次會整理2018年以後的一些新的模型, 比如ELMO,Transformer, GPT, BERT等, 這些模型在NLP領域是非常重要的, 雖然NLP領域的模型迭代更新速度很快,但是通過這四篇文章,已經基本上能把模型發展的這個脈絡梳理清楚, 這篇文章會主要介紹ELMO, Transformer, GPT, BERT這四個模型的原理, 但是在這之前, 還是想結合前面的三篇文章再做一個梳理,這樣就能把知識串起來, 也能看清楚這些模型爲什麼會出現? 究竟要解決什麼樣的問題?

因爲這塊我也是剛接觸, 加上這兩天有些事情, 所以也沒有花太多時間去仔細研究每個模型,所以這裏只能先整理個大概, 後期隨着對模型的使用再進行補充哈.

大綱如下

  • 開始之前,我們先簡單梳理
  • ELMO模型
  • Transformer
  • GPT
  • BERT

Ok, let’s go!

2. 開始之前,先簡單梳理

到目前爲止我們已經學習了一些模型, 也見過了一些很常見的名詞, 像什麼One-Hot, Word2Vec, Skip-gram, CBOW, Hierarchical softmax,Negative Sample, Count-Based Model, SVD,Glove, Character-level Model, Subwords Model(BPE), Hybrid Mode, FastText。

什麼? 有點上頭? 好吧, 爲了能愉快的學習今天的內容, 下面簡單的梳理一下上面的邏輯, 學習語言處理嘛, 自然開始的時候我們就是想讓計算機更好的理解單詞或者是句子, 這樣才能幫助我們去分析, 那麼如何才能讓計算機更好的理解單詞或者句子呢? 於是我們開始就需要對單詞進行表示, 最開始的時候用的就是One-Hot編碼, 一個1其餘全是0, 1表示的是某個單詞在詞典裏面的位置, 但是這種編碼方式顯然看不出詞與詞之間的相關性鴨, 於是乎就有了詞向量的一些模型, 把單詞表示成固定的詞向量。 三大詞向量表徵技術就是Word2Vec, Glove, FastText。 Word2Vec是一種求單詞詞向量的技術之一, 思想是通過中心詞和上下文詞的關係去求取詞向量, 這樣的話尋思着就能表示詞與詞之間的關係了嘛。 於是乎基於Word2vec, 出現了兩種能夠實現的這種技術的方式, 也就是Skip-gramCBOW, 前者是通過中心詞去預測上下文, 後者是通過上下文去預測中心詞。 但是這兩個算法存在計算量很大的問題,因爲在做一個Softmax多分類的問題, 而類別竟然是詞庫的大小,這就不行了, 所以基於這倆模型後面又提出了兩種高級的訓練方式,那就是Hierarchical softmaxNegative Sample, 前者是引入了哈夫曼樹去學習隱藏層到輸出的映射關係,把計算量降下來, 而後者是把中心詞和上下文詞進行配對把多分類轉換成K個二分類問題,從而減少計算量,這樣Word2Vec這裏的關係就是這些了。

既然是學習詞向量, 肯定不止是Word2Vec這一種方式, 還有一種方式是直接基於統計, 認爲一般越相關的單詞在一次出現的頻率就會越高, 那麼就數數唄, 統計一下每個單詞之間的共現頻率, 用這個作爲詞向量, 於是乎就出現了Count-Based模型, 而SVD模型就是這裏面的代表, 這個是利用了共現矩陣和SVD降維技術去得到詞向量, 但是這種方法的一個弊端就是無法學習到詞語背後的含義, 好處是利用了統計信息, Word2Vec是學習到詞語背後的含義, 但是統計信息, 那麼把它倆的思想結合一下會怎樣? 這就是Glove了,在word-word co-occurrence count的基礎上學習到詞語背後的含義。 到這裏, 就把基於詞學習詞向量的方法梳理了一下。

上面討論的表徵詞的這些算法和模型都是基於單詞作爲基本單位的, 也就是我們會先事先計算出每個單詞的詞向量表示, 但是這種以單詞爲單位的模型不能很好的解決out-of-vocabulary(不在詞庫)的單詞。且對於單詞的一些詞法上的修飾處理的也不是很好。 所以後面的想法就是能夠利用比word更細粒度爲單位來建立模型,以更好的解決這些問題。一種思路就是字符作爲基本的單位, 建立Character-level model, 後來又感覺這個太細了,於是就有了從字符和單詞之間找一個折中, 就是subwords Model, 而後來的混合模型是詞級模型和字符級模型的一個組合, 這個採用的思路是大多數情況下還是採用word level模型,而只在遇到OOV的情況才採用character level模型, 後來就出現了FastText,這個和CBOW相似,只不過綜合了上面的一些好思路, 訓練的時候既有詞也有子詞。

上面就是我們之前的詞向量表徵技術, 具體的可以參考前面的幾篇筆記。這些技術是靜態訓練詞向量的方法, 也就是在數據集上訓練好一個語言模型之後,每一個詞的詞向量就固定下來了。後續使用詞向量時,無論輸入的句子是什麼,詞向量都是一樣的 。 但是, 這樣有什麼問題呢? 就是無法表示一詞多義的問題, 我們知道一個單詞可能有多個含義,比如“apple”, 有蘋果的意思, 有公司的意思, 那麼我們前面訓練的詞向量中apple會只有一個含義,這樣就不能很好的表示一詞多義,因爲這種單詞具體什麼意義應該具體看上下文才能知道。 於是乎, 後面就出現了動態訓練詞向量的方法, 這種方法是在訓練語言模型, 而單詞的詞向量是在輸入句子實時獲得的,因此詞向量與上下文信息密切相關,可以較好地區分歧義。比較典型的ELMO, GPT, BERT。下面就是看看這幾個模型了。

3. ELMO模型

ELMO是“Embedding from Language Models"簡稱。本質思想是:事先用一個語言模型去學習單詞的word embedding, 當我在使用時,單詞已經具備了特定的上下文,這時候可以根據上下文的語義去調整單詞的word embedding, 這樣經過調整的word embedding更能表達這個上下文中具體的含義,也就解決了一詞多義問題,故ELMO本質就是根據當前上下文對Word Embedding進行動態調整的過程。
在這裏插入圖片描述
Elmo採用典型的兩階段過程:第一階段使用預訓練語言模型進行訓練,第二階段當做具體的下游任務時,從預訓練的網絡中提取對應的詞的Word Embedding作爲特徵補充到下游任務中。

  • 第一階段,預訓練:採用雙層雙向LSTM對上下文進行編碼,上下文使用靜態的word embedding, 對每層LSTM,將上文向量與下文向量進行拼接作爲當前向量,利用大量的預料訓練這個網絡。對於一個新的句子,可以有三種表示,最底層的word embedding, 第一層的雙向LSTM層的輸出,這一層能學習到更多句法特徵,第二層的雙向LSTM的輸出,這一層能學習到更多詞義特徵。經過elmo訓練,不僅能夠得到word embedding, 又能學習到一個雙層雙向的神經網絡。

  • 第二階段,下游任務使用:將一個新的句子作爲elmo預訓練網絡的輸入,這樣該句子在elmo網絡中能獲得三個embedding, 可以將三個embedding加權作爲word embedding, 並將此作爲下游任務的輸入,這被稱爲“Feature-based Pre-Training"。

上面就是ELMO模型的宏觀工作原理, 下面開始微觀解釋, 要想弄明白ELMO, 需要需要RNNLSTM的基礎, 這個我已經準備好了, 點擊鏈接就能走進RNN的世界。下面再說點前向lstm語言模型基礎, 給定一串長度爲N的詞條(t1,t2,,tN)(t_1,t_2,…,t_N),前向語言模型通過對給定歷史(t1,tk1)(t_1,…t_{k−1})預測tkt_k進行建模:
p(t1,t2,...tN)=k=1Np(tkt1,t2,...tk1)p(t_1, t_2, ...t_N) = \prod_{k=1}^{N} p(t_k|t_1, t_2, ...t_{k-1})

下面舉個栗子看看前向傳播的微觀細節:
在這裏插入圖片描述
以“the cat sat on the mat”這句話爲例。在某一個時刻kk時,輸入爲the,輸出cat的概率。過程是這裏麪包含了幾步

  1. 將the轉換成word embedding。也就是n1n*1維的列向量,
  2. 將上一時刻的輸出hk1h_{k−1}及第一步中的word embedding一併送入lstm,並得到輸出當前隱狀態hkh_k。這是一個m1m*1維的列向量。mm是LSTM隱藏單元的個數。這個hkh_k與後面的elmo向量有着直接的關係
  3. 將lstm的輸出hkh_k,與上下文矩陣WW'相乘,即WhkW'*h_k得到一個列向量,再將該列向量經過softmax歸一化。其中,假定數據集有VV個單詞,WW'Vm|V|*m的矩陣,hkh_km1m*1的列向量,於是最終結果是V1|V|*1的歸一化後向量,即從輸入單詞得到的針對每個單詞的概率。我們是想讓它輸出cat的概率最大, 所以就會有損失, 然後就可以更新參數。 差不多。

這就是前向lstm語言模型的工作流程了。其實很多神經網絡語言模型都很類似。而ELMO在這個基礎上做了一點改進, 第一個改進就是用了多層的LSTM, 第二個改進是增加了後向的LSTM, 也就是每一層改成了雙向的LSTM。後向LSTM的計算公式:
p(t1,t2,...tN)=k=1Np(tktk+1,tk+2,...tN)p(t_1, t_2, ...t_N) = \prod_{k=1}^{N} p(t_k|t_{k+1}, t_{k+2}, ...t_{N})

而bidirectional LSTM就是將兩者結合起來,其目標是最大化:
在這裏插入圖片描述
前向傳播過程與上面單向的類似, 無非這個地方換成了雙向的LSTM。對於kk位置的標記,ELMO模型用2L+12L+1個向量來表示,其中1個是不依賴於上下文的表示,而是當前輸入單詞的詞向量xkLMx_k^{LM}LL層forward LSTM每層會產生一個依賴於上文的表示hkLM\vec{h}_k^{LM} ,同樣的,L層backward LSTM每層會產生一個依賴於下文的表示 hkLM\mathop{h_k^{LM}} \limits ^{\leftarrow},我們可以將他們一起簡計爲
在這裏插入圖片描述
得到每層的embedding後,對於每個下游的任務,我們可以計算其加權的表示:
在這裏插入圖片描述
這裏的sjtasks_j^{task}是每一層的softmax歸一化的權重, γtask\gamma^{task}是引入的可調控的scale parameter。最後單詞的詞向量是這個ELMO向量和單詞的詞向量的拼接[xk;ELMoktask][x_k;ELMo_k^{task}]

具體的前向傳播過程(先放張圖片, 後期再改格式):
在這裏插入圖片描述

4. GPT

GPT是Generative Pre-Training的簡稱。與ELMO相似,採用兩階段的模式:利用語言模型進行預訓練,通過fine-tuning模式應用到下游任務

說到這裏, 想先解釋一下什麼是預訓練, 所謂預訓練,就是先在某個任務(訓練集A或者B)進行預先訓練,即先在這個任務(訓練集A或者B)學習網絡參數,然後存起來以備後用。當我們在面臨第三個任務時,網絡可以採取相同的結構,在較淺的幾層,網絡參數可以直接加載訓練集A或者B訓練好的參數,其他高層仍然隨機初始化。底層參數有兩種方式:frozen,即預訓練的參數固定不變,fine-tuning,即根據現在的任務調整預訓練的參數。

與elmo不同的是,GPT使用transformer進行提取特徵,並且是單向的transformer,只是根據上文來預測某個詞
在這裏插入圖片描述
其他的計算過程, 基本上和ELMO一致了, 關鍵就是在這個Transformer。

5. Transformer

Transformer的結構長下面這樣:

這種結構呢,是完全依賴注意力機制來刻畫輸入和輸出之間的全局依賴關係,而不使用遞歸運算的RNN網絡了。這樣的好處就是第一可以有效的防止RNN存在的梯度消失的問題,第二是允許所有的字全部同時訓練(RNN的訓練是迭代的,一個接一個的來,當前這個字過完,纔可以進下一個字),即訓練並行,大大加快了計算效率。並且Transformer使用了位置嵌入來理解語言的順序,使用了多頭注意力機制和全連接層等進行計算。 關於Transformer, 這裏就不詳細說了, 同樣的準備了很詳細的文章自然語言處理之Attention大詳解(Attention is all you need).

6. BERT

BERT原理與GPT有相似之處,不過它利用了雙向的信息,因而其全稱是Bidirectional Encoder Representations from Transformers。
在這裏插入圖片描述
BERT創新: Masked語言模型和Next Sentence Prediction。

  • Masked語言模型, 即隨機選擇一部分單詞進行mask,然後預測這些單詞,其方式和CBOW類似,爲了解決fine-tuning階段不需要mask,所以bert中只選擇15%作爲mask的候選,在這15%中80%用mask處理,10%保持原來的詞,10%進行隨機替換【不太理解爲什麼成立】
  • next sentence prediction:之所以這麼做,是考慮到很多NLP任務是句子關係判斷任務,單詞預測粒度的訓練到不了句子關係這個層級,增加這個任務有助於下游句子關係判斷任務。

BERT的輸入: 輸入的部分是個線性序列,兩個句子之間使用sep進行分割,在開頭和結尾分別加一個特殊字符。對於每一個字符都是由三種embedding組成,位置信息embedding, 單詞embedding和句子embdding,三種embedding疊加便是bert的輸入。

下面是一個小總結:
在這裏插入圖片描述

7. 總結

這篇文章簡單總結一下,就是介紹了最近出現的一些模型了, 比如ELMO, GPT還有BERT, 當然這次由於時間原因, 後面幾個沒有好好的寫, 其實BERT這塊還有很多的細節, 後期會補上, BERT這塊還是應該好好整理的, 這次確實手頭有些要緊的事情, 所以還是先打卡。 後期再補吧。

參考

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