導論
自然語言處理,NLP,接下來的幾篇博客將從四方面來展開:
(六)Expectation-Maximization
(七)Machine Translation
(五)Seq2seq/Attention
一、Seq2seq
二、Transformer
1.Attention機制
(1)
attention可以知道大概內容,需要更詳細內容時候,去Decoder找。
attention可以認為是一種Soft對齊。
(2)缺點
順序依賴,無法並行,速度慢;
單向信息流。編碼一個詞的時候,需要看前后。
普通attention需要外部“驅動”,來做內容提取。
2.Self-attention
(1)
Self-attention的特色:天涯若比鄰。所有單詞無論遠近都是一樣的。
①自驅動,編碼第t個詞,用當前狀態驅動。
②Self-attention和全連接網絡FNN區別
Self-attention每一個輸出需要全部輸入,而FNN不需要全部輸入,只要有a1就可以計算b1,不需要a2。
③Self-attention與普通attention對比
可以認為普通attention是Self-attention的一種特例。
普通attention中,query是decoder的隱狀態。key和value是encoder的輸出。
Self-attention中,query、key和value都是來自當前的向量,都是通過變換矩陣來學習的。
(2)self-attention layer做了什么?
(2) 寫成矩陣乘法形式
3. 變形muti-head self-attention
(1)原理
①多個Attention(Q,K,V)。
②也可能一種Attention head是給it做消解的,一種關注上下位的,一種關注首都國家對應關系的。每一種attention都可以把向量變成Q K V。
③如果有8個head,3個輸入單詞a1 a2 a3,則有8個bi1~bi8,拼成一個8維的向量,信息有冗余,需要降維。需要左乘一個8*1的矩陣,壓縮成1個數bi,最后輸出是3個數b1 b2 b3。
④下圖是2個head的示意圖。
(2)好處
①不同head關注點不一樣,每個head可以專注於自己的任務。下圖,有的attention head關注local的鄰居的資訊,有的關注的是global的長時間的資訊。
4.positional encoding
Self-attention不考慮順序/位置因素,因此需要加入位置信息。
(1)Original paper
把ei加到ai里面。ei是手動設計的。
(2)另一種解釋
每一個xi接上一個one-hot向量pi,W·xi之后,就得到ai+ei,而Wp需要手工設計。
5.Seq2Seq model中的self-attention
(1)RNN的Seq2Seq (2)Self-attention的Seq2Seq
6.Transformer
(1)
多層Encoder和Decoder,可以並行計算,因此可以訓練很深。
每一層有,Encoder,Decoder。Encoder有Self-Attention層和Feed Forward全連接層;Decoder比Encoder多一個普通的Encoder-Decoder Attention,翻譯時候用來考慮Encoder輸出做普通Attention。
(2)Transformer結構
(3)Decoder Mask
7.Universal Transformer
橫向,時間上是m個Transformer,縱向是RNN。
8.Transformer用於圖像處理
9.Transformer優缺點
RNN問題:沒有雙向信息流,不能並行計算。Transformer通過Self-attention和Positional encoding解決了RNN的問題。
缺點:數據稀疏問題仍然未解決
三、BERT
1.Contextual Word Embedding(今天主題)
數據稀疏仍是個問題。機器翻譯可以有很多語料,但是其他任務沒有語料,Transformer可以學習,但是需要監督數據來驅動,數據還是太少。
問題:Word Embedding無上下文;監督數據太少。
解決:用Contextual Word Embedding。考慮上下文的Embedding;無監督。
李宏毅:現在embedding,每一個token都有一個embedding。即Contextualized Word Embedding。上下文越接近的embedding,sense越接近。可以實現這個的技術是ELMO。
2.ELMO
(1)
Embeddings from Language Model,簡稱ELMO。2018年提出。
如果問一個普通的Word Embedding,“bank”什么意思,它會告訴你所有的意思。
如果問ELMO,它說我不知道,你得給我一個句子,然后它會根據句子上下文,給出具體答案。
(2)具體怎么考慮上下文?
先回到2003年的神經網絡語言模型NNLM(Neural Network Language Model),Bengjo在《A Neural Probabilistic Language Model》提出了神經概率語言模型NPLM,NNLM思想來源於該論文。
2018年,我們的LSTM可以是多層雙向的LSTM,不再是2003年那么簡單了。
①預訓練學習LSTM語言模型
先通過pretrain學習一個語言模型,也就是學習一個多層雙向LSTM,也就是用前面出現的所有words預測后面的一個word。
②接下來怎樣做具體任務?(eg:情感分類,文本分類)
假如是一個分類任務,來了一個句子,首先用多層雙向LSTM把每一個單詞進行編碼,這個編碼是考慮了上下文的。
每一個詞通過n層雙向LSTM,就會產生2n個向量。然后把這2n個向量組合起來,得到一個新的向量。我們就可以把這個新的向量作為固定的一個特征,之后該怎么處理就怎么處理。
③ELMO思路總結
所以ELMO相當於一個特征提取的方法,通過pretrain得到一個雙向多層LSTM語言模型。來一個句子,這個LSTM語言模型就可以把它變成一個序列的向量。這些向量是考慮了上下文的,而且是做過消歧的,是做過指代消解的,所以是一種比Word Embedding更好的方法。LSTM編碼完之后,這個向量就定住了。之后再往上加LSTM,加CNN,加全連接網絡,該怎么玩兒就怎么玩兒。
3.OpenAI GPT
(1)
GPT 也是通過LSTM學習語言模型。不同於ELMO的是,這個語言模型不是固定的,而是會根據任務進行Fine Tuning,微調。
問題:
Contextual Word Embedding作為特征。
不適合特定任務。
解決:
根據任務進行Fine-Tuning
使用Transformer代替ELMO的多層RNN/LSTM
(2)怎么用transformer做語言模型?
Transformer包括Encoder和Decoder,可以實現翻譯任務,一個英語句子一個法語句子,兩個句子。但是語言模型只有一個句子,顯然不能直接使用Transformer。
GPT其實相當於transformer的decoder。Decoder就和語言模型很像,編碼一個單詞的時候,只能看前面的句子,而不能看后面的。Self Attention是帶了Masked,也就是只能Attention到前面的句子,不能Attention到后面的。因為沒有了Encoder,也就沒有了Encoder和Decoder之間的Attention。
GPT有很多層模塊,每一層只有帶Masked Self Attention,再加上全連接層。Transformer做翻譯用了6個,而GPT用了12個,參數更多,效果更好。
(3)怎么Fine-Tuning?
訓練語言模型的時候,是一個句子,有的任務中不只是一個句子。
eg1:文本分類、情感分類問題,輸入是一個句子,輸出是一個類別。
eg2:兩個或多個句子
Entailment即判斷兩個句子關系,蘊含關系、矛盾關系,是有兩個句子的。
Similarity相似度計算,也是有兩個句子的。
問答任務,更是有多個句子。
對於這種不止一個句子的情況,我們訓練的時候仍然只需要一個句子,只有一個句子才能進行Fine-Tuning,一個句子一個模型。因此采用trikiler方法,強行把兩個句子拼起來。
但是如果直接拼起來的話,我們會弄不清楚,這個詞到底屬於第一個句子還是第二個句子。所以在單詞之間加了分隔符Delimit,當然前后也加了Start和Extract表示開始和結束。
4.BERT
(1)
OpenAI GPT問題:
單向信息流。
Pretraining(1個句子)和Fine-Tuning(2個句子)不匹配。
解決:
Masked LM(Language Model):解決單向信息流問題。
NSP(Next Sentence prediction) Multi-task Learning任務:變成2個句子的輸入,把Pretrain變成2個句子。
是一種Encoder。
(2)BERT輸入表示
輸入分兩段:輸入兩個句子,中間用[SEP] Separate分隔開,[CLS]表示句子開始。
BPE編碼:機器翻譯中常用的分詞技巧,把詞分得更系列的token。
輸入2個句子,輸出每個詞的編碼Token Embeddings,每個位置的編碼Position Embeddings,詞屬於上一個片段還是下一個片段Segment Embeddings。
(3)Masked LM怎么解決單向信息流?
單向信息流的問題,實際上是預測任務的約束,也就是用前面的詞預測后面的詞,或者后面的詞預測前面的詞,也就是只有一個方向。
BERT直接換成Masked LM任務,類似於完形填空,隨機Mask掉15%的詞,讓BERT來預測。
(4)怎樣把Pretrain變成2個句子?
引入新任務——預測句子關系,解決Pretraining和Fine-Tuning不匹配。
BERT以50%的概率隨機抽取2個連貫句子,50%概率抽取隨機2個句子,作為2個句子的輸入。
連續的句子值為1,不連續值為0。通過對是否是連續句子的預測,學習到兩個句子關系。這種關系在Entailment、Similarity、問答任務中很有用。
(5)怎樣Fine-Tuning?
①單個句子的任務:文本分類、情感分類 。
根據CLS對應的Word Embedding輸出進行分類。由於BERT使用了天涯若比鄰的Self-attention,CLS位置隨意,一般放開頭。
②兩個句子的任務:Entailment、Similarity。
仍然用CLS對應的Word Embedding來做預測。
③問答類任務:輸入兩個句子,預測某個詞是否是句子的開始或結束。
④序列標注:預測每個時刻是某種標簽。
5.代碼
(1)文件結構
run_classifier.py 用來做文本分類任務
run_squad.py 用來做閱讀理解類任務
(2)Fine-Tuning
(3)有比較多的數據,想要更好的效果,需要Pretraining
①數據預處理:
② pretraining:
由於耗時,通常使用Google的某個版本,在其基礎上進行訓練,需要指定init_checkpoint。
參考:
https://www.bilibili.com/video/BV1GE411o7XE?from=search&seid=8158434315525640721