Contextualized Word Embedding
同樣的單詞有不同的意思,比如下面的幾個句子,同樣有 “bank” ,卻有着不同的意思。但是用訓練出來的 Word2Vec 得到 “bank” 的向量會是一樣的。向量一樣說明 “word” 的意思是一樣的,事實上並不是如此。這是 Word2Vec 的缺陷。
下面的句子中,同樣是“bank”,確是不同的 token,只是有同樣的 type
我們期望每一個 word token 都有一個 embedding。每個 word token 的 embedding 依賴於它的上下文。這種方法叫做 Contextualized Word Embedding。
EMLO
EMLO 是 Embeddings from Language Model 的縮寫,它是一個 RNN-based 的模型,只需要有大量句子就可以訓練。
我們可以把訓練的 RNN 隱藏層的權重拿出來,把詞匯經過隱藏層后輸出的向量當做這個單詞的 embedding,因為 RNN 是考慮上下文的,所以同一個單詞在不同的上下文中它會得到不同的向量。上面是一個正向里的 RNN,如果覺得考慮到的信息不夠,可以訓練雙向 RNN ,同樣將隱藏層的輸出作為 embedding。
如果我們的 RNN 有很多層,我們要拿那一隱藏層的輸出作為 embedding?
在 ELMO 中,它取出每一層得到的向量,經過運算得到我們每一個單詞的 embedding
比如上圖,假設我們有2層,所以每個單詞都會得到 2 個向量,最簡單的方法就是把兩個向量加起來作為這個單詞的embedding。
EMLO中會把兩個向量取出來,然后乘以不同的權重 $\alpha $,再將得到的我們得到的 embedding 做下游任務。
$\alpha $ 也是模型學習得到的,它會根據我們的下游任務一起訓練得到,所以不同的任務用到的 $\alpha $ 是不一樣的
比如我們的 embedding 可以有3個來源,如上圖所示。分別是
- 原來沒有經過 contextualized 的 embedding,就是上面的 Token
- Token 經過第一層抽出第一個 embedding
- Token 經過第二層抽出第二個 embedding
顏色的深淺代表了權重的大小,可以看到不同的任務(SRL、Coref 等)有着不同的權重。
BERT
BERT 是 Bidirectional Encoder Representations from Transformers 的縮寫,BERT 是 Transformer 中的 Encoder。它由許多個 Encoder 堆疊而成
在 BERT 里面,我們的文本是不需要標簽的,只有收集到一堆句子就可以訓練了。
BERT 是 Encoder,所以可以看成輸入一個句子,輸出 embedding,每個 embedding 對應一個 word
上圖的例子我們是以 “詞” 為單位,有時候我們以 “字” 為單位會更好。比如中文的 “詞” 是很多的,但是常用的 “字” 是有限的。
在 BERT 中,有兩種訓練方法,一種是 Masked LM。另一種是 Next Sentence Prediction。但一般同時使用,會取得更好的效果。下圖是 BERT 的大體架構。可以看到 Pre-training 階段和 Fine-Tuning 階段中 BERT 模型,只有輸出層不同,其他部分是完全一樣的。
Masked LM
在 Masked LM 中,我們會把輸入的句子中隨機將15%的詞匯置換為一個特殊的 token ,叫做 [MASK]
其實並不是所有被選中的詞匯都會被替換為 [MASK] ,在 BERT 論文的 3.1 Pre-training BERT 中談到了 3 種方式。
(1)80% 被替換為 [MASK]
(2)10% 被替換為隨機 token
(3)10% 不替換
BERT 的任務就是猜出這些被置換掉的詞匯的什么。
就像是一個填詞游戲,挖去一句話中的某個單詞,讓你自己填上合適的單詞
經過 BERT 后我們得到一個 embedding,再把置換為 [MASK] 的那個位置輸出的 embedding 通過一個線性分類器,預測這個單詞是什么
因為這個分類器是 Linear 的,所以它的能力非常非常弱,所以 BERT 要輸出一個非常好的 embedding,才能預測出被置換掉的單詞是什么
如果兩個不同的詞可以填在同一個句子,他們會有相似的embedding,因為他們語義相近
Next Sentence Prediction
在 Next Sentence Prediction 中,我們給 BERT 兩個句子,讓 BERT 預測這兩個句子是不是接在一起的
[SEP]:特殊的toekn,代表兩個句子的交界處
[CLS]:特殊的token,代表要做分類
我們再把 [CLS] 輸出的向量通過一個線性分類器,讓分類器判斷這兩個句子應不應該接在一起。
BERT 是 Transformer 的 Encoder,它用到了 self-attention 機制,可以讀到句子的全部信息,所以 [CLS] 可以放在開頭
BERT 論文中談到輸入的句子對中,以 A-B 描述這樣的句子對。B 有50%的概率不變,就是真正的下一句(IsNext)。也有 50% 的概率會變成其他句子(NotNext)。
我們也可以直接把這個向量輸入一個分類器中,判斷文本的類別,比如下面判斷垃圾郵件的實例
BERT的輸入
如上圖所處,BERT 的輸入 embedding 是 token embeddings、segment embeddings 和 position embedding 的和
token embedding:詞向量
segment embedding:表示句子是第一句還是第二句
position embedding:表示詞匯在句子中的位置
ERNIE
ERNIE 是 Enhance Representation through Knowledge Integration 的縮寫
ERNIE是專門為中文准備的,BERT的輸入以中文的字為單位,隨機蓋掉一些字后其實是很容易被猜出來的,如上圖所示。所以蓋掉一個詞匯比較合適。
GPT
GPT 是 Generative Pre-Training 的縮寫,它的參數量特別大,如下圖所示,它的參數量是 BERT 的4.5倍左右
BERT 是 Transformer 的 Encoder,GPT則是 Transformer 的 Decoder。GPT 輸入一些詞匯,預測接下來的詞匯。其計算過程如下圖所示。
我們輸入單詞 “潮水”,經過許多層的 self-attention 后得到輸出 “退了”。再把 “退了” 作為輸入,預測下一個輸出。
GPT可以做閱讀理解、句子或段落生成和翻譯等NLP任務
下面的網址可以體驗訓練好的 GPT
比如讓它自己寫代碼
也可以讓它寫文章、寫劇本什么的,網址就在上面,可以自己去體驗
參考資料
http://jalammar.github.io/illustrated-bert/
李宏毅深度學習