Contextual Word Representations and Pretraining
一、Word Representations
在2018年之前,我們使用的詞向量表征技術主要有三個:Word2Vec、Glove、FastText。但是這三個方法都普遍存在在一些問題,就是無法解決一次多義的問題,即對于同一個詞無論上下文的單詞是否相同,訓練出來的詞向量都是一樣的。
通常我們訓練詞向量的時候,首先會初始化所有的詞向量,并且在訓練過程中不斷地改變這些向量的值,需要注意的是訓練的目標是我們自己定義的任務,而詞向量僅僅是副產物而已。
當我們手中的語料不足時訓練出來的詞向量效果不會很理想,這是用通常會使用他人已經訓練好的詞向量,并且以預訓練的詞向量來作為初始值,在訓練過程中凍結或者微調。
我們訓練好的詞向量是不可能涵蓋所有詞的(這里主要有兩個原因,一是訓練語料中本來就不存在這些詞,二是這些詞在訓練語料中出現次數過少),這就會存在一個未登錄詞的問題,遇到這個問題的時候我們怎么處理呢?
首先,最簡單和最普遍的解決方法就是將所有未登錄的詞映射為<UNK>,并且為它訓練一個詞向量。但是這種方法存在缺點,它把這些未登錄詞都視為相同,不能區分它們的區別。
為了解決上面的方法存在的問題,人們開始考慮訓練字符集別的詞向量。
除此之外還有一些其他的方法:
1.如果測試時的<unk>單詞出現在未受監督的單詞嵌入中,請使用測試時的向量。
2.對于其他單詞,只需給它們分配一個隨機向量,將它們添加到詞匯表中即可。
3.將事物折疊成單詞類(如未知數字、大寫的事物等),并為每個類設置一個<unk class>
二、ELMO
下面我們來看下這個神經網絡:
在一個NLM中,我們快速地通過LSTM層獲得單詞向量(可能只在語料庫上訓練)。這些LSTM層被訓練來預測下一個單詞。但是這些語言模型在每個位置都產生了上下文特定的單詞表示!
下面來介紹一些經典的模型:
1、Peters et al. (2017): TagLM – “Pre-ELMo”
論文地址:https://arxiv.org/pdf/1705.00108.pdf
核心思想:通過上下文中獲取單詞的含義,但只在task-labeled的小任務(例如,NER)上使用RNN來進行訓練。
算法的核心步驟如下:
1.預訓練詞向量和語言模型
2.在輸入序列中準備好單詞嵌入和語言模型嵌入。
3.在序列標記模型中同時使用單詞嵌入和語言模型嵌入。
該模型結構圖如下:
論文得出的結論如下:
1、通過對語言模型觀察我們得出:使用有監督數據集來訓練的語言模型效果甚微,使用雙向語言模型僅對向前有利,網絡結構越復雜效果越好。
2、通過對任務特定BILSTM觀察可知:僅使用lm嵌入來預測并不好,僅在標簽數據上使用bilstm進行標記
2、Also in the air: McCann et al. 2017: CoVe
論文地址:https://arxiv.org/pdf/1708.00107.pdf
網絡結構示意圖如下:
核心思想是使用經過訓練的序列模型為其他NLP模型提供上下文。
使用兩層的LSTM來為seq2seq+attention編碼器的提供雙下文
結果:產生的COVE向量在各種任務上都優于Glove向量。
但是,結果并不像其他幻燈片中描述的簡單NLM那樣強大,因此最后被舍棄。
3、Peters et al. (2018): ELMo: Embeddings from Language
Models
ELMO是第一個使用雙向語言模型來獲得詞向量的方法。
論文名稱及地址:
Deep contextualized word representations. NAACL 2018.
https://arxiv.org/abs/1802.05365
網絡結構圖:
ELMO是詞向量或上下文詞向量的突破性算法:它使用長上下文而非上下文窗口學習詞向量(此處,整個句子可能更長),使用雙向的深層NLM進行訓練并使用其所有層進行預測。
我們來簡要介紹下這個模型:首先,它訓練了一個雙向的語言模型,其次,其性能很好并且模型不大:使用2個bilstm層,使用字符級的CNN建立初始單詞表示(2048 char n-gram過濾器和2個HighWay層,512 dim投影),使用4096 dim hidden/cell lstm狀態,512dim投影到下一個輸入,使用殘差鏈接,連接token輸入和輸出(SoftMax)的參數,并將這些參數連接在正向和反向語言模型之間。
ELMO用于學習特定任務的雙向語言模型表示的組合,這是首次僅使用LSTM堆棧頂層的模型,ELMO的任務可以簡單表示為:
:根據任務衡量ELMO的總體效用;
:Softmax歸一化混合物模型權重
在使用雙向語言模型獲得詞向量后,我們在下游任務中使用詞向量時,凍結有監督模型中的ELMO部分,并且將EMLO的權重根據不同的任務來連接不同的模型中。
模型中的兩個bilstm nlm層具有不同的用途/含義,
1、較低層學習的是較低級別的語法等。
2、高層次學習的是語義。
三、ULMfit
論文名稱及地址:
Howard and Ruder (2018) Universal Language Model Fine-tuning for Text Classification.
https://arxiv.org/pdf/1801.06146.pdf
ULMfit主要是使用遷移學習來進行文本分類:
遷移學習示意圖:
算法的核心思想:
1.在大的通用域語料庫上訓練語言模型
2.在目標任務數據上調整語言模型
3.作為目標任務的分類器進行微調
模型結構圖如下:
UMLfit使用大小合理的“1-gpu”語言模型,由于是利用別人預訓練好的模型進行遷移學習,因此模型通常不大。
在語言模型微調過程中非常小心,每層采用不同的學習率,即傾斜三角形學習率(STLR)策略,開始學習率逐漸增大大,后面逐漸變小。
在學習分類器時逐步解凍并且采用STLR策略,分類時使用串聯的方法
近年預訓練語言模型發展歷程:
四、transformer:
transformer的出現主要是為了利用純attention來解決RNN系列網絡無法并行的問題。
transformer網絡概況:
我們從圖中可以看到:它是一個沒有使用循環神經網絡的Seq2Seq編碼器解碼器模型。最初應用于使用并行語料庫進行機器翻譯并預測每個單詞的翻譯。
最終的成本/誤差函數是SoftMax分類器頂部的標準交叉熵誤差。
如果我們要詳細地了解transformer,可以參考下面地資源:
http://nlp.seas.harvard.edu/2018/04/03/attention.html
這是一個使用pytorch在jupyter notebook上來解釋transformer的教程。
接下來我們首先了解transformer中的attention部分。
1、attention:
inputs:一個查詢q和一組鍵值(k-v)對。
Query, keys, values, and output都是向量。
輸出是值的加權和,其中每個值的權重由查詢的內部乘積和相應的鍵計算,查詢和鍵具有相同的維數。
輸出公式如下:
當我們遇到多個查詢時,我們將它們使用堆棧的方法組成矩陣Q,那么上面這個公式就變為如下形式:
但是這個公式存在一個缺點:
因此這里進行了一個縮放處理:
示意圖如下:
2、self-attention
接下來介紹一下self-attention,self-attention有什么特點呢?
1.輸入詞向量是查詢、鍵和值。
2.詞向量本身相互進行選擇。
3.字向量stack=Q=K=V
1.Encoder self-attention
2.Decoder self-attention
缺點在于只有一種詞的相互作用方式,下面我們來介紹一下Multi-head attention
3、Multi-head attention
其大概步驟如下:
1.首先通過W矩陣將q,k,v映射到h=8的低維空間
2.然后連接輸出并通過線性層傳輸
其計算公式如下:
示意圖如下:
與CNN和傳統的Attention相比,Multi-head attention還是有很多特性的。
下面以這句話為例子:
The cat stuck out its tongue and licked its owner
當使用CNN處理這段話時,體現的是相對位置的不同線性變換,其示意圖如下:
當使用普通的Attention時,體現的是權重的平均:
當使用Multi-Attention時,在輸入和輸出上具有不同線性變換的并行行Attention層:
4、transformer block
1.encoder
encoder結構部分的示意圖如下:
在transformer中,每個塊有兩層,每層由一個Multihead attention和一個兩層的采用ReLU激活函數的前饋神經網絡組成。
其結構可以由下圖表示:
這兩個步驟中的每一個還具有:
Residual (short-circuit) connection 和 LayerNorm
LayerNorm(x + Sublayer(x))
layerNorm將輸入更改為每個層和每個訓練點的平均值0和方差1(并添加兩個以上參數),公式表示如下:
在transformer中,encoder部分的每個塊(共6個)中, Q=K=V且Q、K、V都來自上一層。并且實際上詞向量的表示是字節對編碼,除此之外,還添加了位置編碼,因此不同位置的相同單詞具有不同的整體表示。
positional encoding的計算公式如下:
2.decoder
結構示意圖如下:
相對于encoder部分decoder對子層進行了一定的更改,
1.使用self-attention對先前生成的輸出進行masked decoder
2.Encoder-Decoder Attention,查詢來自前一個解碼器層,鍵和值來自編碼器的輸出。
transformer的相關細節如下:
1.字節對編碼
2.檢查點平均
3.學習率變化的Adam優化器
4.在每一層訓練過程中僅在在添加參擦連接之前使用dropout
5.標簽平滑
6.使用帶有beam search和長度懲罰的自動回歸解碼
五、BERT: Devlin, Chang, Lee, Toutanova (2018)
BERT (Bidirectional Encoder Representations from Transformers):
Pre-training of Deep Bidirectional Transformers for Language
Understanding
ELMO、GPT、BERT結構對比圖:
BERT主要解決的是傳統語言模型只使用左上下文或右上下文,但語言理解是雙向的這一問題。圖例如下:
BERT在工程上采用的技巧是:
1.在訓練過程中隨機mask掉15%的token,而不是把像cbow一樣把每個詞都預測一遍。最終的損失函數只計算被mask掉那個token。
Mask如何做也是有技巧的,如果一直用標記[MASK]代替(在實際預測時是碰不到這個標記的)會影響模型,所以隨機mask的時候10%的單詞會被替代成其他單詞,10%的單詞不替換,剩下80%才被替換為MASK。要注意的是Masked LM預訓練階段模型是不知道真正被mask的是哪個詞,所以模型每個詞都要關注。
2.在為了訓練一個理解句子的模型關系,預先訓練一個二進制化的下一句測任務,這一任務可以從任何單語語料庫中生成。具體地說,當選擇句子A和B作為預訓練樣本時,B有50%的可能是A的下一個句子,也有50%的可能是來自語料庫的隨機句子。
BERT sentence pair encoding
BERT中每個輸入向量由下面幾個組成:
token嵌入是單詞片段
學習分段嵌入來表示每個句子
位置嵌入與其他Transformer架構是一樣的
BERT model fine tuning
使用BERT訓練好模型以后,我們在下游任務中使用它的時候,只需要根據當前的任務對它進行微調即可。
transformer在圖形和語音方面的應用
1.transformer在圖像方面的應用
總體結構圖如下:
image transformer layer:
2.transformer在語音方面的應用
在語言方面,采用的是Multihead Attention和convolution的組合結構relative attention,對于一段音頻來說可得到下面的表示:
傳統anttention觀察的部分:
relative anttention觀察的部分: