# BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
[1810.04805](https://arxiv.org/pdf/1810.04805.pdf)
## Abstract and Introduction
* 對 unlabel 文字的深度雙向上下文表示
* 只附加1個 ouput layer 就可以適用各種任務
* pre-train model 已被證明在 sentence-level 或 token-level 的任務中有很好的功效
* 作者認為需要雙向理解才能加強 pre-train model 的功用
* 克漏字與預測下一句來進行 pre-training
## Related Work
### Unsupervised Feature-based Approaches
* 預訓練比從頭開始的 embedding 相比有很大的改進
* 預訓練模型從簡單的 word embedding 到 sentence embedding 到 paragraph embedding 甚至是預測下一句,好多人做過
* ELMo 開創了雙向但沒有 deep 不過也提升了不少
* 有人用了雙向的 LSTM 結果跟 ELMo 差不多
* 有人提出克漏字可以提高效能
* 這方法只對 unlabel 有用
### Unsupervised Fine-tuning Approaches
* 用了預訓練模型再 fine-tune 下游被驗證有效
* 不論是在 left-to-right language modeling 或 auto encoder
### Transfer Learning from Supervised Data
* 有人也證實了監督學習到很大的資料集的 transfer learning
* 如自然語言推理
## BERT
* 框架的2步驟: 預訓練、微調
* 每個任務的微調都不同,但是用相同架構和參數繼續訓練,如圖
* 
* 基本上只有輸入和輸出不太一樣
### Model Architecture
* 數層雙向 transformer 的 encoder
* transformer block 表示為 $L$,hidden size $H$,self-attention head $A$
* $\text{BERT}_\text{BASE}$ (L = 12, H = 768, A = 12, 總參數 110M)
* $\text{BERT}_\text{LARGE}$ (L = 24, H = 1024, A = 16, 總參數 340M)
* BERTBASE 是為了跟 OpenAi GPT 比較所以一樣大
* 但 BERT 用雙向自注意,GPT 只注意左邊的字
### Input/Output Representations
* 為了讓 BERT 處理各式各樣的下游任務,input representation 能夠明確地在一個 token 序列中表示單個句子或一對句子
* 在整個工作中,**句子**可以是連續文本的任意跨度,而不是實際的語言句子
* **序列**是指輸入到 BERT 的 token 序列,它可以是單句或打包在一起的兩個句子
* 用 WordPiece embedding 和 30000 個 token 單字
* [CLS] 用來對應最終 hidden state,做為整個序列的 representation
* 用2種方式區分句子
* [SEP] 區隔 token
* 加入 position embedding 到每個 token 區別屬於句子 A/B
* input embedding 表 $E$
* final hidden vector:
* H 維度的 vector
* C 為 [CLS] 的輸出 ($C \in \mathbb{R}^H$)
* $T_i$ 為第 i 個 token 的輸出 ($T_i \in \mathbb{R}^H$)
* input representation 是由對應的 token 及 position, segment embedding 組合而成,如下圖
* 
### Pre-training BERT
* 不會右到左或左到右的訓練,而是底下的2種非監督式預訓練
#### Task #1: Masked LM
* 深層雙向的模型一定比左至右或右至左或2者的淺層聯集來的強
* 而一般的模型都只能左至右或右至左
* 但雙向的模型讓每個 word 間接地知道自己的意思
* 並且可以在多層上下文中預測目標
* 為了訓練雙向 representation ,隨機遮蔽一些 token
* 我們稱為 masked LM (以前叫 cloze task)
* 如同標準語言模型 (language modle, LM) ,把最後對應 masked 的 hidden vector 餵給字典的輸出 softmax
* 在實驗中,隨機遮蔽序列的 15% wordpiece token
* 與 denoising auto-encoders 的重構輸入不同
* 雖然這樣就可以 train 出一個雙向的模型,但在 fine tune 會出現落差,因為下游任務不會有 [MASK]
* 為減輕落差,全部序列的 15% 中只有 80% 會變 [MASK],10% 便隨機的 token,10% 不變 (比較在附錄C2)
* 接著 $T_i$ 用 cross entropy 預測原本的 token i
#### Task #2: Next Sentence Prediction (NSP)
* 許多下游(如QA, NLI)都基於2句子間的關係,但語言建模辦不到
* 為訓練上述功能,預訓練了可以在單一語料庫 (monolingual corpus) 中生成二質化的下個句子預測任務 (next sentence prediction task)
* 實務上,50% 是真的下一句
* 圖1的 C 就是用來預測是否為下一句的 token
* 以前的論文都只有把 sentence embedding 傳給下游,BERT把全部都傳過去
##### Pre-training data
* 遵循現有文獻的語料庫
* 為了增長序列,用的是 document level 而非經過修改的 sentence level 語料庫
* BookCorpus (800M) 跟 English Wikipedia (2500M)
* 維基只用了文本的部分,列表、標題都忽略
### Fine-tuning BERT
* 因為 transformers 的 self-attention 機制讓 fine-tuning 變得更容易
* 只要適當地更改輸入及輸出
* 以前應用在成對文本時,在做 cross attention 前,會先獨立把文本編碼
* self-attention 一樣解決了這個問題
* 直接建好任務導向的模型 end-to-end 更新所有參數
* 相對於預訓練時的句子 A, B 在 fine-tune 輸入
* 意義上成對的句子
* 蘊含假設
* QA 的問題與片段
* 退化的文字-∅,用於非類或序列標記
* [CLS]用於分類任務,如:需求或情感分析
## Experiments
* 超參數與結果細節參照論文
### GLUE
* 多元自然語言理解任務
* 把 [CLS] 對應的向量 $C$ 當作整個句子的特徵向量
* 在 fine-tune 新增的參數只有一個分類層
* $W \in R ^{K \times H}$
* $K$: label 個數
* loss = $log(softmax(CW^T))$
### SQuAD v1.1
* 100k 成對的 QA
* 預測 passage 中答案的區段
* 問題跟文章片段一起輸入,前者當句子 A 後者當句子 B
* 在 fine-tune 時加入起始和結束向量 $S, E \in R^H$
* 單詞 i 作為答案範圍的開始的概率計算為 $T_i$ 和 $S$ 之間的點積,然後是段落中所有單詞的 softmax
* $P_i = \frac{e^{S \cdot T_i}} {\sum_je^{S \cdot T_j}}$
* 類似的工式也用於預測結束
* 候選句分數為 $S \cdot T_i + E \cdot T_j$
* 預測時選擇 $j \geq i$ 且分數最大的區段
* 訓練目標為正確的起點和終點位置的 log likelihood 的總和
### SQuAD v2.0
* 允許在提供的段落中不存在簡短答案的可能性擴展了SQuAD 1.1問題定義
* 使問題更加實際
* 我們將沒有答案的問題,以 [CLS] token 開頭和結尾視為答案範圍
* 沒答案的分數為 $s_{null} =S·C + E·C$
* 跟 $j \geq i$ 且分數最大的區段比較,決定答案(根據開發集設定 threshold)
### SWAG
* 包含 113k 成對句子,評估基於常識的推理
* 給定一個句子,任務是在四個選擇中選擇最合理的推理
* 進行 fine-tune 時,我們建了四個輸入序列,每個輸入序列都包含給定句子(句子A)和可能的延續詞(句子B)的串聯
* 多用一個向量跟 [CLS] 的對應向量 $C$ 做點積算分
## Ablation Studies
### Effect of Pre-training Tasks
* 使用與 BERTBASE 完全相同的預訓練資料,微調方案和超參數評估兩個預訓練目標,證明了 BERT 雙向深度的重要性
* No NSP
* 只用 MLM 訓練
* LTR & No NSP
* 使用標準由左到右(LTR)LM(而不是MLM)訓練只看左邊上下文的模型
* left-only constraint 也應用於微調,因為刪除它會引入預訓練/微調不匹配,從而降低下游性能
* 也不使用 NSP
* 可以直接跟 Open AI 的 GPT 比較
* 但要用比較大的資料集
* NSP 大幅影響 QNLI, MNLI, and SQuAD 1.1
* 用上面 2 個方法比較雙向學習的成效,LTR 都爛很多,尤其是 MRPC and SQuAD
* 為了嘗試平衡 LTR 模型,在頂部增加 BiLSTM ,可以加強在 SQuAD 的性能但還是沒雙向的好,另外還損害了 GLUE 的性能
* 作者知道可以像 ELMo 一樣,訓練 2 個不同方向的模型並串接特徵向量,但
* 這是單個雙向模型的兩倍成本
* 對於 QA 這樣的任務,是不直觀的,因為 RTL 模型將無法確定問題的答案
* 這絕對不如深度雙向模型強大,因為它可以在每一層使用左右上下文
### Effect of Model Size
* 訓練了許多具有不同層數,隱藏單元和 attent head 的BERT模型,而其他方面則使用了與之前所述相同的超參數和訓練過程
* 即使對於只有 3,600 label data 的 MRPC,它與所有預訓練任務也大不相同,較大的模型也會導致所有四個資料集的嚴格準確性提高
* 跟以往大型的模型相比有顯著的改善
* 只要模型已經過充分的預訓練,縮放到極限模型大小也將導致非常小的規模任務的重大改進
* 當直接在下游任務上對模型進行微調,且僅使用很少數量的隨機初始化的附加參數時,即使下游任務資料很少,特定任務模型也可以從更大、更具表達力的預訓練表示中受益
### Feature-based Approach with BERT
* 到目前為止,所有提出的BERT結果都使用了微調方法
* 其中在預訓練模型中添加了一個簡單的分類層,並且在下游任務上共同對所有參數進行了微調
* 然而,從預訓練模型中提取固定特徵具有某些優勢
* 首先,並非所有任務都可以由 Transformer 編碼器體系結構輕鬆表示,因此需要添加特定於任務的模型結構
* 其次,預先計算出訓練集的昂貴特徵向量,然後在此之上使用較便宜的模型運行許多實驗具有很大的計算優勢
* 作者比較 2 種用 BERT 在 CoNLL-2003 NER 的任務
* 使用了一個保留大小寫的 WordPiece 模型,並且包括了資料提供的最長上下文文檔
* 按照慣例,我們將其公式化為標記任務,但在輸出中不使用 CRF 層
* 我們使用第一個 sub-token 的作為 NER 標籤集上令牌級別分類器的輸入
* 為了消除微調方法,我們通過從一個或多個層提取 activations 而無需微調 BERT 的任何參數來應用 feature-base 的方法
* 這些 contextual embedding 用在分類層之前,隨機初始化的兩層768維 BiLSTM 的輸入。
* BERTLARGE 效能最好
* 效果最好的方法將來自預訓練的 Transformer 的前四個隱藏層的 token 連接起來,這僅比微調整個模型低 0.3 F1
* 表示 BERT 對於微調和 feature base 的方法均有效
## Conclusion
* 最近的經驗改進表示,由於使用語言模型進行了轉移學習、豐富的、無監督的預訓練是許多語言理解系統不可或缺的一部分
* 特別是,這些結果使即使是資源匱乏的任務也可以從深度單向體系結構中受益
* 我們的主要貢獻是將這些發現進一步推廣到深度雙向體系結構
* 使相同的經過預訓練的模型能夠成功解決各種NLP任務
###### tags: `Paper`