天天看點

GPT 原了解析

本文首發于我的個人部落格 Sui Xin’s Blog

原文:https://suixinblog.cn/2019/09/gpt.html

作者:Sui Xin

GPT(Generative Pre-Training)是一個典型的兩階段式模型:無監督預訓練+監督下遊任務微調。而在 NLP 任務中,上遊的無監督預訓練任務多半采用語言模型來實作,下遊的監督任務直接對上遊的模型進行簡單改造即可使用。

GPT 為了能夠有效的抓取文本中的語義資訊,使用了單向的 Transformer Decoder 子產品建構标準的語言模型,再使用預訓練得到的網絡架構與參數進行下遊監督任務的微調,取得了不錯的效果。

論文:Improving Language Understanding by Generative Pre-Training

模型架構

無監督預訓練語言模型

對于語料 U = ( u 1 , … , u n ) \mathcal{U}=\left(u_{1}, \dots, u_{n}\right) U=(u1​,…,un​),GPT 建構标準的語言模型:

L 1 ( U ) = ∑ i log ⁡ P ( u i ∣ u i − k , … , u i − 1 ; Θ ) L_{1}(\mathcal{U})=\sum_{i} \log P\left(u_{i} | u_{i-k}, \ldots, u_{i-1} ; \Theta\right) L1​(U)=i∑​logP(ui​∣ui−k​,…,ui−1​;Θ)

文章中使用 Transformer Decoder 子產品加上前饋神經網絡,最後使用 softmax 輸出目标詞的分布:

h 0 = U W e + W p h l =  transformer  − b 1 o c k ( h l − 1 ) ∀ l ∈ [ 1 , n ] P ( u ) = softmax ⁡ ( h n W e T ) \begin{aligned} h_{0} &=U W_{e}+W_{p} \\ h_{l} &=\text { transformer }_{-} \mathrm{b} 1 \mathrm{ock}\left(h_{l-1}\right) \forall l \in[1, n] \\ P(u) &=\operatorname{softmax}\left(h_{n} W_{e}^{T}\right) \end{aligned} h0​hl​P(u)​=UWe​+Wp​= transformer −​b1ock(hl−1​)∀l∈[1,n]=softmax(hn​WeT​)​

注:(不确定部分)實驗中,語言模型中的 Transformer Decoder 子產品不同于标準的 Transformer 模型,而是使用了 Transformer 的另一個版本:GENERATING WIKIPEDIA BY SUMMARIZING LONG SEQUENCES。其中,使用了名為 Local attention 和 Memory-compressed attention 的子產品。

下遊監督任務微調

對于通過第一階段的預訓練得到的語言模型,對于特定的任務進行 fine-tuning。

對于一個監督資料集 C \mathcal{C} C,其中的資料為一個序列 x 1 , … , x m x^{1}, \ldots, x^{m} x1,…,xm 和一個标簽 y y y。将序列輸入預訓練模型後得到輸出向量為 h l m h_{l}^{m} hlm​,接着使用一個線性層來預測标簽:

P ( y ∣ x 1 , … , x m ) = softmax ⁡ ( h l m W y ) P\left(y | x^{1}, \ldots, x^{m}\right)=\operatorname{softmax}\left(h_{l}^{m} W_{y}\right) P(y∣x1,…,xm)=softmax(hlm​Wy​)

需極大化的似然函數為:

L 2 ( C ) = ∑ ( x , y ) log ⁡ P ( y ∣ x 1 , … , x m ) L_{2}(\mathcal{C})=\sum_{(x, y)} \log P\left(y | x^{1}, \ldots, x^{m}\right) L2​(C)=(x,y)∑​logP(y∣x1,…,xm)

另外,作者發現,使用語言模型來輔助監督學習的任務進行微調,有兩個好處:

  1. 提升監督模型的泛化性;
  2. 加速收斂。

是以,最終下遊使用的監督模型目标函數為:

L 3 ( C ) = L 2 ( C ) + λ ∗ L 1 ( C ) L_{3}(\mathcal{C})=L_{2}(\mathcal{C})+\lambda * L_{1}(\mathcal{C}) L3​(C)=L2​(C)+λ∗L1​(C)

不同類型下遊任務的輸入變換

GPT 使用兩階段式模型的另外一個好處是,作者期望通過第一階段的預訓練語言模型,學習到盡可能多的自然語言資訊,且對于大多數下遊任務,隻需要簡單的修改輸入而不需要修改模型架構即可完成微調。對于 NLP 中的幾種主流任務,GPT 分别做了如下的變換政策:

GPT 原了解析

其他

模型還包括一些細節:

  • Adam 優化器的學習率使用了退火政策;
  • 使用了 bytepair encoding(BPE);
  • 使用了 Gaussian Error Linear Unit(GELU) 激活函數;
  • Position embedding 通過學習得來,而不是标準 Transformer 的正弦函數。

模型特點

優點

  • 特征抽取器使用了強大的 Transformer,能夠捕捉到更長的記憶資訊,且較傳統的 RNN 更易于并行化;
  • 友善的兩階段式模型。

缺點

  • 标準的 LM 隻對單向進行模組化,不符合真實場景,模組化能力受到限制。

GPT-2

論文:Language Models are Unsupervised Multitask Learners

GPT-2 是 GPT 的直接更新版,效果驚人。相比之下,GPT-2 有如下幾點改進:

  1. 建構了一個更加龐大的資料集 WebText,其涵蓋的領域比較廣泛,共有 8 百萬文檔,40 GB;
  2. 使用了更加龐大的網絡架構:最大 48 層 Transformer,1542M 參數,1600 維;
  3. GPT-2 提出這樣訓練得到的模型,能夠在 zero-shot 情形下也有不錯的表現,進而證明了語言模型預訓練的意義。

參考

GPT 官方網址:https://openai.com/blog/language-unsupervised/

GPT 官方 GitHub:https://github.com/openai/finetune-transformer-lm

GPT-2 官方網址:https://openai.com/blog/better-language-models/

GPT-2 官方 GitHub:https://github.com/openai/gpt-2

繼續閱讀