NLP(五)Seq2seq/Transformer/BERT


導論

自然語言處理,NLP,接下來的幾篇博客將從四方面來展開:

(一)基本概念和基礎知識

(二)嵌入Embedding

(三)Text classification

(四)Language Models

(五)Seq2seq/Transformer/BERT

(六)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

https://www.bilibili.com/video/BV1H441187js?p=4

李理的博客:http://fancyerii.github.io/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM