斯坦福NLP課程 | 第13講 - 基於上下文的表徵與NLP預訓練模型(ELMo, transformer)
阿新 • • 發佈:2022-05-16
- 作者:韓信子@ShowMeAI,路遙@ShowMeAI,奇異果@ShowMeAI
- 教程地址:http://www.showmeai.tech/tutorials/36
- 本文地址:http://www.showmeai.tech/article-detail/250
- 宣告:版權所有,轉載請聯絡平臺與作者並註明出處
- 收藏ShowMeAI檢視更多精彩內容
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}>\)
-
問題:
- 沒有辦法區分不同 UNK words,無論是身份還是意義
解決方案
- 使用字元級模型學習詞向量
- 特別是在 QA 中,match on word identity 是很重要的,即使詞向量詞彙表以外的單詞
- 嘗試這些建議 (from Dhingra, Liu, Salakhutdinov, Cohen 2017)
- 如果測試時的 \(<\text{UNK}>\) 單詞不在你的詞彙表中,但是出現在你使用的無監督詞嵌入中,測試時直接使用這個向量
- 此外,你可以將其視為新的單詞,併為其分配一個隨機向量,將它們新增到你的詞彙表
- 幫助很大或者也許能幫點忙
- 你可以試試另一件事
- 將它們分解為詞類 (如未知號碼,大寫等等),每種都對應一個 \(<\text{UNK-class}>\)
1.4 單詞的表示
存在兩個大問題
- 對於一個 word type 總是是用相同的表示,不考慮這個 word token 出現的上下文
- 我們可以進行非常細粒度的詞義消歧
- 我們對一個詞只有一種表示,但是單詞有不同的方面,包括語義,句法行為,以及表達 / 含義
1.5 我們一直都有解決這個問題的辦法嗎?
- 在NLM中,我們直接將單詞向量 (可能只在語料庫上訓練) 插入LSTM層
- 那些LSTM層被訓練來預測下一個單詞
- 但這些語言模型在每一個位置生成特定於上下文的詞表示
1.6 #論文解讀#
- Semi-supervised sequence tagging with bidirectional language models
- 想法:想要獲得單詞在上下文的意思,但標準的 RNN 學習任務只在 task-labeled 的小資料上 (如 NER )
- 為什麼不通過半監督學習的方式在大型無標籤資料集上訓練 NLM,而不只是詞向量
1.7 標籤語言模型 (Tag LM )
- 步驟3:在序列標記模型中同時使用單詞嵌入和 LM 嵌入
- 步驟2:為輸入序列中的每個標記準備單詞嵌入和 LM 嵌入
- 步驟1:預訓練詞嵌入和語言模型
- 與上文無關的單詞嵌入 + RNN model 得到的 hidden states 作為特徵輸入
- 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 #論文解讀#
- https://arxiv.org/pdf/1708.00107.pdf
- 也有一種思路:使用訓練好的序列模型,為其他NLP模型提供上下文
- 思路:機器翻譯是為了儲存意思,所以這也許是個好目標?
- 使用 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 所有層都是有用的
-
\(\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
-
Howard and Ruder (2018) Universal Language Model Fine-tuning for Text Classification.
- 轉移 NLM 知識的一般思路是一樣的
- 這裡應用於文字分類
- 在大型通用領域的無監督語料庫上使用 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
- 主要推薦資源
- http://nlp.seas.harvard.edu/2018/04/03/attention.html
- The Annotated Transformer by Sasha Rush
- 一個使用PyTorch的Jupyter筆記本,解釋了一切!
- 主要推薦資源
- 現在:我們定義 Transformer 網路的基本構建塊:第一,新的注意力層
4.5 點乘注意力 Dot-Product Attention
- 輸入:對於一個輸出而言的查詢 \(q\) 和一組鍵-值對 (\(k-v\))
- Query,keys,values,and output 都是向量
- 輸出值的加權和
- 權重的每個值是由查詢和相關鍵的內積計算結果
- Query 和 keys 有相同維數 \(d_k\),value 的維數為 \(d_v\)
4.6 點乘注意力矩陣表示法
- 當我們有多個查詢 \(q\) 時,我們將它們疊加在一個矩陣 \(Q\) 中
4.7 縮放點乘注意力
- 問題:\(d_k\) 變大時,\(q^Tk\) 的方差增大 → 一些 softmax 中的值的方差將會變大 → softmax 得到的是峰值 → 因此梯度變小了
- 解決方案:通過 query / key 向量的長度進行縮放
4.8 編碼器中的自注意力
- 輸入單詞向量是 queries,keys and values
- 換句話說:這個詞向量自己選擇彼此
- 詞向量堆疊= Q = K = V
- 我們會通過解碼器明白為什麼我們在定義中將他們分開
4.9 多頭注意力
- 簡單 self-attention 的問題
- 單詞只有一種相互互動的方式
- 解決方案:多頭注意力
- 首先,通過矩陣 \(W\) 將 \(Q\),\(K\),\(V\) 對映到 \(h = 8\) 的許多低維空間
- 然後,應用注意力,然後連線輸出,通過線性層
4.10 完整的transformer模組
- 每個 Block 都有兩個
子層
- 多頭 attention
- 兩層的前饋神經網路,使用 ReLU
- 這兩個子層都
- 殘差連線以及層歸一化
- LayerNorm(x+Sublayer(x))
- 層歸一化將輸入轉化為均值是 \(0\),方差是 \(1\),每一層和每一個訓練點 (並且添加了兩個引數)
- Layer Normalization by Ba, Kiros and Hinton,
- https://arxiv.org/pdf/1607.06450.pdf
4.11 編碼器輸入
- 實際的詞表示是 byte-pair 編碼
- 還添加了一個 positional encoding 位置編碼,相同的詞語在不同的位置有不同的整體表徵
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
- BERT (Bidirectional Encoder Representations from Transformers): Pre-training of Deep Bidirectional Transformers for Language Understanding
- BERT:用於語言理解的預訓練深度雙向 transformers
- 問題:語言模型只使用左上下文或右上下文,但語言理解是雙向的
- 為什麼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 推薦閱讀
- The Annotated Transformer 程式碼解析
- jalammar 的一系列視覺化簡單教程
6.視訊教程
可以點選 B站 檢視視訊的【雙語字幕】版本
7.參考資料
- 本講帶學的線上閱翻頁版本
- 《斯坦福CS224n深度學習與自然語言處理》課程學習指南
- 《斯坦福CS224n深度學習與自然語言處理》課程大作業解析
- 【雙語字幕視訊】斯坦福CS224n | 深度學習與自然語言處理(2019·全20講)
- Stanford官網 | CS224n: Natural Language Processing with Deep Learning
ShowMeAI系列教程推薦
- 大廠技術實現 | 推薦與廣告計算解決方案
- 大廠技術實現 | 計算機視覺解決方案
- 大廠技術實現 | 自然語言處理行業解決方案
- 圖解Python程式設計:從入門到精通系列教程
- 圖解資料分析:從入門到精通系列教程
- 圖解AI數學基礎:從入門到精通系列教程
- 圖解大資料技術:從入門到精通系列教程
- 圖解機器學習演算法:從入門到精通系列教程
- 機器學習實戰:手把手教你玩轉機器學習系列
- 深度學習教程 | 吳恩達專項課程 · 全套筆記解讀
- 自然語言處理教程 | 斯坦福CS224n課程 · 課程帶學與全套筆記解讀
NLP系列教程文章
- NLP教程(1)- 詞向量、SVD分解與Word2vec
- NLP教程(2)- GloVe及詞向量的訓練與評估
- NLP教程(3)- 神經網路與反向傳播
- NLP教程(4)- 句法分析與依存解析
- NLP教程(5)- 語言模型、RNN、GRU與LSTM
- NLP教程(6)- 神經機器翻譯、seq2seq與注意力機制
- NLP教程(7)- 問答系統
- NLP教程(8)- NLP中的卷積神經網路
- NLP教程(9)- 句法分析與樹形遞迴神經網路
斯坦福 CS224n 課程帶學詳解
- 斯坦福NLP課程 | 第1講 - NLP介紹與詞向量初步
- 斯坦福NLP課程 | 第2講 - 詞向量進階
- 斯坦福NLP課程 | 第3講 - 神經網路知識回顧
- 斯坦福NLP課程 | 第4講 - 神經網路反向傳播與計算圖
- 斯坦福NLP課程 | 第5講 - 句法分析與依存解析
- 斯坦福NLP課程 | 第6講 - 迴圈神經網路與語言模型
- 斯坦福NLP課程 | 第7講 - 梯度消失問題與RNN變種
- 斯坦福NLP課程 | 第8講 - 機器翻譯、seq2seq與注意力機制
- 斯坦福NLP課程 | 第9講 - cs224n課程大專案實用技巧與經驗
- 斯坦福NLP課程 | 第10講 - NLP中的問答系統
- 斯坦福NLP課程 | 第11講 - NLP中的卷積神經網路
- 斯坦福NLP課程 | 第12講 - 子詞模型
- 斯坦福NLP課程 | 第13講 - 基於上下文的表徵與NLP預訓練模型
- 斯坦福NLP課程 | 第14講 - Transformers自注意力與生成模型
- 斯坦福NLP課程 | 第15講 - NLP文字生成任務
- 斯坦福NLP課程 | 第16講 - 指代消解問題與神經網路方法
- 斯坦福NLP課程 | 第17講 - 多工學習(以問答系統為例)
- 斯坦福NLP課程 | 第18講 - 句法分析與樹形遞迴神經網路
- 斯坦福NLP課程 | 第19講 - AI安全偏見與公平
- 斯坦福NLP課程 | 第20講 - NLP與深度學習的未來