參考:https://mp.weixin.qq.com/s/Tk7wc5aq8qaaeBz6cXRd_Q
一、概述
NLP 領域中只有小部分標注過的數據,而有大量的數據是未標注,如何只使用標注數據將會大大影響深度學習的性能,所以為了充分利用大量未標注的原始文本數據,需要利用無監督學習來從文本中提取特征,最經典的例子莫過於詞嵌入技術。但是詞嵌入只能 word-level 級別的任務(同義詞等),沒法解決句子、句對級別的任務(翻譯、推理等)。出現這種問題原因有兩個:
- 首先,是因為不清楚要下游任務,所以也就沒法針對性的進行行優化;
- 其次,就算知道了下游任務,如果每次都要大改模型也會得不償失。
為了解決以上問題,作者提出了 GPT 框架,用一種半監督學習的方法來完成語言理解任務,GPT 的訓練過程分為兩個階段:無監督Pre-training 和 有監督Fine-tuning。目的是在於學習一種通用的 Representation 方法,針對不同種類的任務只需略作修改便能適應。
接下來我們詳細介紹下 GPT。
二、GPT
GPT 訓練過程分為兩個階段:
第一個階段是 Pre-training 階段,主要利用大型語料庫完成非監督學習;
第二階段是 Fine-tuning,針對特定任務在相應數據集中進行監督學習,通過 Fine-tuning 技術來適配具體任務。
下圖為 GPT 的架構圖:
1) Pre-training
從上圖我們可以看出,GPT 采用 Transformer 來代替 LSTM 作為特征提取器,並基於語言模型進行訓練(即根據前面的詞預測后面的詞)。這里只使用了 Transformer 的 Decoder 部分,並且每個子層只有一個 Masked Multi Self-Attention(768 維向量和 12 個 Attention Head)和一個 Feed Forward,共疊加使用了 12 層的 Decoder。
這里簡單解釋下為什么只用 Decoder 部分:語言模型是利用上文預測下一個單詞的,因為 Decoder 使用了 Masked Multi Self-Attention 屏蔽了單詞的后面內容,所以 Decoder 是現成的語言模型。又因為沒有使用 Encoder,所以也就不需要 encoder-decoder attention 了。
對於給定的非監督語料庫的 Token 序列 U={u1,u2,...,un} ,基於語言模型的目標函數:
其中,k 是上下文窗口的大小,P 為條件概率,θ 為條件概率的參數,參數更新采用 SGD。
GPT 輸入文本和位置 Embedding(采用使用 one-hot 編碼),經過 12 層的 Transformer 的 Decoder 后通過 Softmax 得到輸出:
其中, U={u-k,...,u-1}是當前單詞的前面 k 個 Token,n 為神經網絡的層數,We是 Token 的 Embedding 矩陣, Wp是位置編碼的 Embedding 矩陣,在GPT中,作者對position embedding矩陣進行隨機初始化,並讓模型自己學習,而不是采用正弦余弦函數進行計算。
舉例解釋GPT的預訓練:
比如:原文本序列是【1,2,3,4,5】,在訓練的時候就錯開一位進行訓練,輸入就是【SEP,1,2,3,4,5】,輸出就是【1,2,3,4,5,EOS】,這樣其實每一位的輸出就只依賴於前面的一位,個人理解相當於上下文窗口為1了,也就是變成bigram模型(二元模型)了。參考n-gram模型https://www.jianshu.com/p/e0598adb07ad
2)Fine-tuning
完成預訓練后,我們會得到一個訓練好的 Transformer 模型,接下來我們要用這個訓練好的模型來完成特定的監督學習的任務。
假設我們有個帶標簽的數據集 C,即每一個 Token 序列 x1,x2,...,xm 都有一個標簽 y。我們將 Token 序列輸入,並通過 Transformer 模型得到輸出的狀態 hlm,然后把這個加到線性層進行輸出並預測標簽 y:
其中, Wy是線性層的權重。
所以針對該監督學習,我們也有新的目標函數:
另外,將預訓練好的語言模型作為輔助目標進行 Fine-tuning 不僅可以使監督模型更具泛化性,還可以加速收斂。於是我們有:
其中, λ為權重,一般設置為0.5。