1. 程式人生 > 其它 >斯坦福NLP課程 | 第13講 - 基於上下文的表徵與NLP預訓練模型(ELMo, transformer)

斯坦福NLP課程 | 第13講 - 基於上下文的表徵與NLP預訓練模型(ELMo, transformer)



ShowMeAI斯坦福CS224n《自然語言處理與深度學習(Natural Language Processing with Deep Learning)》課程的全部課件,做了中文翻譯和註釋,並製作成了GIF動圖!視訊和課件等資料的獲取方式見文末


引言

授課計劃

  • Reflections on word representations / 詞向量知識回顧
  • Pre-ELMo and ELMO / ELMo模型
  • ULMfit and onward / ULMfit模型
  • Transformer architectures / Transformer結構
  • BERT / BERT

1.詞向量知識回顧

1.1 詞向量表徵

  • 現在我們可以獲得一個單詞的表示
    • 我們開始時學過的單詞向量
      • Word2vec,GloVe,fastText

1.2 預訓練的詞向量

  • POS和NER兩種表徵體系
  • 11個詞窗,100個隱層神經元,在12w詞上訓練7周
  • 我們可以隨機初始化詞向量,並根據我們自己的下游任務訓練它們
  • 但在絕大多數情況下,使用預訓練詞向量是有幫助的,因為它們本身是自帶資訊的 (我們可以在更大體量的預訓練語料上訓練得到它們)

1.3 未知詞的詞向量應用建議

  • 簡單且常見的解決方案:
  • 訓練時:詞彙表 \(\{\text { words occurring, say, } \geq 5 \text { times }\} \cup\{<\text{UNK}>\}\)
    • 所有罕見的詞 (資料集中出現次數小於 5) 都對映為 \(<\text{UNK}>\),為其訓練一個詞向量
  • 執行時:使用 \(<\text{UNK}>\)
    代替詞彙表之外的詞 OOV
  • 問題
    • 沒有辦法區分不同 UNK words,無論是身份還是意義

解決方案

  1. 使用字元級模型學習詞向量
  • 特別是在 QA 中,match on word identity 是很重要的,即使詞向量詞彙表以外的單詞
  1. 嘗試這些建議 (from Dhingra, Liu, Salakhutdinov, Cohen 2017)
  • 如果測試時的 \(<\text{UNK}>\) 單詞不在你的詞彙表中,但是出現在你使用的無監督詞嵌入中,測試時直接使用這個向量
  • 此外,你可以將其視為新的單詞,併為其分配一個隨機向量,將它們新增到你的詞彙表
  • 幫助很大或者也許能幫點忙
  • 你可以試試另一件事
    • 將它們分解為詞類 (如未知號碼,大寫等等),每種都對應一個 \(<\text{UNK-class}>\)

1.4 單詞的表示

存在兩個大問題

  • 對於一個 word type 總是是用相同的表示,不考慮這個 word token 出現的上下文
    • 我們可以進行非常細粒度的詞義消歧
  • 我們對一個詞只有一種表示,但是單詞有不同的方面,包括語義,句法行為,以及表達 / 含義

1.5 我們一直都有解決這個問題的辦法嗎?

  • 在NLM中,我們直接將單詞向量 (可能只在語料庫上訓練) 插入LSTM層
  • 那些LSTM層被訓練來預測下一個單詞
  • 但這些語言模型在每一個位置生成特定於上下文的詞表示

1.6 #論文解讀#

1.7 標籤語言模型 (Tag LM )

  • 步驟3:在序列標記模型中同時使用單詞嵌入和 LM 嵌入
  • 步驟2:為輸入序列中的每個標記準備單詞嵌入和 LM 嵌入
  • 步驟1:預訓練詞嵌入和語言模型
  • 與上文無關的單詞嵌入 + RNN model 得到的 hidden states 作為特徵輸入
\[\mathbf{h}_{k, l}=\left[\overrightarrow{\mathbf{h}}_{k, 1} ; \overleftarrow{\mathbf{h}}_{k, 1} ; \mathbf{h}_{k}^{L M}\right] \]
  • Char CNN / RNN + Token Embedding 作為 bi-LSTM 的輸入
  • 得到的 hidden states 與 Pre-trained bi-LM (凍結的) 的 hidden states 連線起來輸入到第二層的 bi-LSTM 中

1.8 命名實體識別 (NER)

  • 一個非常重要的NLP子任務:查詢分類文字中的實體

1.9 CoNLL 2003命名實體識別 (en news testb)

1.10 #論文解讀#

  • 語言模型在 Billion word benchmark 的8億個訓練單詞上訓練

語言模型觀察結果

  • 在監督資料集上訓練的語言模型並不會受益
  • 雙向語言模型僅有助於 forward 過程,提升約 0.2
  • 具有巨大的語言模型設計 (困惑度 30) 比較小的模型 (困惑度 48) 提升約 0.3

任務特定的BiLSTM觀察結果

  • 僅使用LM嵌入來預測並不是很好:88.17 F1
    • 遠低於僅在標記資料上使用 BiLSTM 標記器

1.11 #論文解讀#

  • 思路:機器翻譯是為了儲存意思,所以這也許是個好目標?
  • 使用 seq2seq + attention NMT system 中的 Encoder,即 2 層 bi-LSTM,作為上下文提供者
  • 所得到的 CoVe 向量在各種任務上都優於 GloVe 向量
  • 但是,結果並不像其他幻燈片中描述的更簡單的 NLM 訓練那麼好,所以似乎被放棄了
    • 也許NMT只是比語言建模更難?
    • 或許有一天這個想法會回來?

2.ELMo模型

2.1 #論文解讀#ELMo

  • Deep contextualized word representations. NAACL 2018.
  • word token vectors or contextual word vectors 的爆發版本
  • 使用長上下文而不是上下文視窗學習 word token 向量 (這裡,整個句子可能更長)
  • 學習深度 Bi-NLM,並在預測中使用它的所有層
  • 訓練一個雙向語言模型 (LM)
  • 目標是效果 OK 但不要太大的語言模型 (LM)
    • 使用 2 個 biLSTM 層
    • (僅) 使用字元CNN構建初始單詞表示
      • 2048 個 char n-gram filters 和 2 個 highway layers,512 維的 projection
    • 4096 dim hidden/cell LSTM狀態,使用 512 dim 的對下一個輸入的投影
    • 使用殘差連線
    • 繫結 token 的輸入和輸出的引數 (softmax),並將這些引數繫結到正向和反向語言模型 (LM) 之間
  • ELMo 學習 biLM 表示的特定任務組合
  • 這是一個創新,TagLM 中僅僅使用堆疊 LSTM 的頂層,ELMo 認為 BiLSTM 所有層都是有用的
\[\begin{aligned} R_{k} &=\left\{\mathbf{x}_{k}^{L M}, \overrightarrow{\mathbf{h}}_{k, j}^{L M}, \overleftarrow{\mathbf{h}}_{k, j}^{L M} \mid j=1, \ldots, L\right\} \\ &=\left\{\mathbf{h}_{k, j}^{L M} \mid j=0, \ldots, L\right\} \end{aligned} \] \[\mathbf{E} \mathbf{L} \mathbf{M} \mathbf{o}_{k}^{t a s k}=E\left(R_{k} ; \Theta^{t a s k}\right)=\gamma^{t a s k} \sum_{j=0}^{L} s_{j}^{t a s k} \mathbf{h}_{k, j}^{L M} \]
  • \(\gamma^{task}\) 衡量 ELMo 對任務的總體有用性,是為特定任務學習的全域性比例因子

  • \(\mathbf{s}^{task}\) 是 softmax 歸一化的混合模型權重,是 BiLSTM 的加權平均值的權重,對不同的任務是不同的,因為不同的任務對不同層的 BiLSTM 的

  • 首先執行 biLM 獲取每個單詞的表示
  • 然後,讓 (無論什麼) 最終任務模型使用它們
    • 凍結 ELMo 的權重,用於監督模型
    • 將 ELMo 權重連線到特定於任務的模型中
      • 細節取決於任務
        • 像 TagLM 一樣連線到中間層是典型的
        • 可以在生產輸出時提供更多的表示,例如在問答系統中

2.2 ELMo在序列標記器中的使用

2.3 CoNLL 2003命名實體識別 (en news testb)

2.4 ELMo結果:適用於所有任務

2.5 ELMo :層權重

  • 這兩個 biLSTM NLM 層有不同的用途 / 含義
    • 低層更適合低階語法,例如
      • 詞性標註(part-of-speech tagging)、句法依賴(syntactic dependency)、NER
    • 高層更適合更高級別的語義
      • 情緒、語義角色標記、問答系統、SNLI
  • 這似乎很有趣,但它是如何通過兩層以上的網路來實現的看起來更有趣

3.ULMfit模型

3.1 ULMfit

  • 在大型通用領域的無監督語料庫上使用 biLM 訓練
    • 在目標任務資料上調整 LM
    • 對特定任務將分類器進行微調
  • 使用合理大小的 1 GPU 語言模型,並不是真的很大
  • **在LM調優中要注意很多 **
    • 不同的每層學習速度
    • 傾斜三角形學習率 (STLR) 計劃
  • 學習分類器時逐步分層解凍和STLR
  • 使用 \(\left[h_{T}, \operatorname{maxpool}(\mathbf{h}), \operatorname{meanpool}(\mathbf{h})\right]\) 進行分類
  • 使用大型的預訓練語言模型,是一種提高效能的非常有效的方法

3.2 ULMfit效能

  • 文字分類器錯誤率

3.3 ULMfit遷移學習

  • 遷移學習

3.4 讓我們擴大規模

補充說明

  • 如果使用監督資料進行訓練文字分類器,需要大量的資料才能學習好

3.5 GPT-2語言模型(cherry-picked)輸出

補充說明

  • 文字生成的樣例

3.6 GPT-2語言模型(cherry-picked)輸出

4.Transformer結構

4.1 Transformer介紹

  • 所有這些模型都是以Transformer為主結構的,我們應該學習一下Transformer吧

補充說明

  • Transformer 不僅很強大,而且允許擴充套件到更大的尺寸

4.2 Transformers 動機

  • 我們想要並行化,但是RNNs本質上是順序的
  • 儘管有 GRUs 和 LSTMs,RNNs 仍然需要注意機制來處理長期依賴關係——否則狀態之間的 path length 路徑長度 會隨著序列增長
  • 但如果注意力讓我們進入任何一個狀態……也許我們可以只用注意力而不需要RNN?

4.3 Transformer 概覽

  • 序列到序列編碼解碼模型,但它是非迴圈非序列結構
  • 任務:平行語料庫的機器翻譯
  • 預測每個翻譯單詞
  • 最終成本/誤差函式是 softmax 分類器基礎上的標準交叉熵誤差

4.4 Transformer 基礎

  • 現在:我們定義 Transformer 網路的基本構建塊:第一,新的注意力層

4.5 點乘注意力 Dot-Product Attention

  • 輸入:對於一個輸出而言的查詢 \(q\) 和一組鍵-值對 (\(k-v\))
  • Query,keys,values,and output 都是向量
  • 輸出值的加權和
  • 權重的每個值是由查詢和相關鍵的內積計算結果
  • Query 和 keys 有相同維數 \(d_k\),value 的維數為 \(d_v\)
\[A(q, K, V)=\sum_{i} \frac{e^{q \cdot k_{i}}}{\sum_{j} e^{q \cdot k_{j}}} v_{i} \]

4.6 點乘注意力矩陣表示法

  • 當我們有多個查詢 \(q\) 時,我們將它們疊加在一個矩陣 \(Q\)
\[A(Q, K, V)=\operatorname{softmax}\left(Q K^{T}\right) V \]

4.7 縮放點乘注意力

  • 問題\(d_k\) 變大時,\(q^Tk\) 的方差增大 → 一些 softmax 中的值的方差將會變大 → softmax 得到的是峰值 → 因此梯度變小了
  • 解決方案:通過 query / key 向量的長度進行縮放
\[A(Q, K, V)=\operatorname{softmax}\left(\frac{Q K^{T}}{\sqrt{d_{k}}}\right) V \]

4.8 編碼器中的自注意力

  • 輸入單詞向量是 queries,keys and values
  • 換句話說:這個詞向量自己選擇彼此
  • 詞向量堆疊= Q = K = V
  • 我們會通過解碼器明白為什麼我們在定義中將他們分開

4.9 多頭注意力

  • 簡單 self-attention 的問題
    • 單詞只有一種相互互動的方式
  • 解決方案多頭注意力
  • 首先,通過矩陣 \(W\)\(Q\)\(K\)\(V\) 對映到 \(h = 8\) 的許多低維空間
  • 然後,應用注意力,然後連線輸出,通過線性層
\[\text {MultiHead}(\boldsymbol{Q}, \boldsymbol{K}, \boldsymbol{V})=\text {Concat(head}_{1}, \ldots, \text { head }_{h}) \] \[\text {where head}_{i}=\text {Attention}\left(Q W_{i}^{Q}, K W_{i}^{K}, V W_{i}^{V}\right) \]

4.10 完整的transformer模組

  • 每個 Block 都有兩個 子層
    • 多頭 attention
    • 兩層的前饋神經網路,使用 ReLU
  • 這兩個子層都
    • 殘差連線以及層歸一化
    • LayerNorm(x+Sublayer(x))
    • 層歸一化將輸入轉化為均值是 \(0\),方差是 \(1\),每一層和每一個訓練點 (並且添加了兩個引數)
\[\mu^{l}=\frac{1}{H} \sum_{i=1}^{H} a_{i}^{l} \quad \sigma^{l}=\sqrt{\frac{1}{H} \sum_{i=1}^{H}\left(a_{i}^{l}-\mu^{l}\right)^{2}} \quad h_{i}=f\left(\frac{g_{i}}{\sigma_{i}}\left(a_{i}-\mu_{i}\right)+b_{i}\right) \]

4.11 編碼器輸入

  • 實際的詞表示是 byte-pair 編碼
  • 還添加了一個 positional encoding 位置編碼,相同的詞語在不同的位置有不同的整體表徵
\[\begin{aligned} \begin{cases} PE(pos, 2i)=\sin \left(pos / 10000^{2 i / d_{model}}\right) \\ PE(\text {pos}, 2 i+1)=\cos \left(pos / 10000^{2 i / d_{model}}\right) \end{cases} \end{aligned} \]

4.12 完整編碼器Encoder

  • encoder 中,每個 Block 都是來自前一層的 \(Q\)\(K\)\(V\)
  • Blocks 被重複 6 次 (垂直方向)
  • 在每個階段,你可以通過多頭注意力看到句子中的各個地方,累積資訊並將其推送到下一層。在任一方向上的序列逐步推送資訊來計算感興趣的值
  • 非常善於學習語言結構

4.13 第5層的注意力視覺化

  • 詞語開始以合理的方式關注其他詞語
  • 不同的顏色對應不同的注意力頭

4.14 注意力視覺化

  • Implicit anaphora resolution
  • 對於代詞,注意力頭學會了如何找到其指代物
  • 在第五層中,從 head 5 和 6 的單詞 its 中分離出來的注意力。請注意,這個詞的注意力是非常鮮明的。

4.15 Transformer解碼器

  • decoder 中有兩個稍加改變的子層
  • 對之前生成的輸出進行 Masked decoder self-attention
  • Encoder-Decoder Attention,queries 來自於前一個 decoder 層,keys 和 values 來自於 encoder 的輸出
  • Blocks 同樣重複 6 次

4.16 Transformer的技巧與建議

細節(論文/之後的講座)

  • Byte-pair encodings
  • Checkpoint averaging
  • Adam 優化器控制學習速率變化
  • 訓練時,在每一層新增殘差之前進行 Dropout
  • 標籤平滑
  • 帶有束搜尋和長度懲罰的自迴歸解碼
  • 因為 transformer 正在蔓延,但他們很難優化並且不像LSTMs那樣開箱即用,他們還不能很好與其他任務的構件共同工作

4.17 Transformer機器翻譯實驗結果

4.18 Transformer解析任務實驗結果

5.BERT模型

5.1 #論文解讀# BERT

  • 問題:語言模型只使用左上下文或右上下文,但語言理解是雙向的
  • 為什麼LMs是單向的?
    • 原因1:方向性對於生成格式良好的概率分佈是有必要的 [我們不在乎這個]
    • 原因2:雙向編碼器中單詞可以 看到自己
  • 單向 與 雙向 上下文對比
  • 解決方案:掩蓋 \(k \%\) 的輸入單詞,然後預測 masked words
  • 不再是傳統的計算生成句子的概率的語言模型,目標是填空
    • 總是使用 \(k = 15 \%\)
  • Masking 太少:訓練太昂貴
  • Masking 太多:沒有足夠的上下文
  • GPT 是經典的單項的語言模型
  • ELMo 是雙向的,但是兩個模型是完全獨立訓練的,只是將輸出連線在一起,並沒有使用雙向的 context
  • BERT 使用 mask 的方式進行整個上下文的預測,使用了雙向的上下文資訊

5.2 BERT 訓練任務:預測下一句

  • 學習句子之間的關係,判斷句子 B 是句子 A 的後一個句子還是一個隨機的句子。

5.3 BERT 句對編碼

  • token embeddings 是 word pieces (paly, ##ingpaly, ##ing)
  • 使用學習好的分段嵌入表示每個句子
  • 位置嵌入與其他 Transformer 體系結構類似
  • 將以上三種 embedding 相加,作為最終輸入的表示

5.4 BERT 模型結構與訓練

  • Transformer encoder (和之前的一樣)
  • 自注意力 ⇒ 沒有位置偏差
    • 長距離上下文 機會均等
  • 每層乘法 ⇒ GPU / TPU上高效
  • 在 Wikipedia + BookCorpus 上訓練
  • 訓練兩種模型尺寸
    • BERT-Base: 12-layer, 768-hidden, 12-head
    • BERT-Large: 24-layer, 1024-hidden, 16-head
  • Trained on 4x4 or 8x8 TPU slice for 4 days

5.5 BERT 模型微調

  • 只學習一個建立在頂層的分類器,微調的每個任務

5.6 BERT GLUE多工結果

  • GLUE benchmark 是由自然語言推理任務,還有句子相似度和情感
  • MultiNLI
    • Premise: Hills and mountains are especially sanctified in Jainism.
    • Hypothesis: Jainism hates nature.
    • Label: Contradiction
  • CoLa
    • Sentence: The wagon rumbled down the road. Label: Acceptable
    • Sentence: The car honked down the road. Label: Unacceptable

5.7 CoNLL 2003命名實體識別 (en news testb)

5.8 BERT在SQuAD問答上的表現

5.9 BERT預訓練任務效果

5.10 BERT引數量級對效果影響

  • 從 119M 到 340M 的引數量改善了很多
  • 隨引數量提升還在提高

5.11 推薦閱讀

6.視訊教程

可以點選 B站 檢視視訊的【雙語字幕】版本

7.參考資料

ShowMeAI系列教程推薦

NLP系列教程文章

斯坦福 CS224n 課程帶學詳解