概要
- Transformer を用いた双方向言語モデルを提案
- Bidirectional Encoder Representation from Transformer (BERT)
- 双方向言語モデル学習タスクを2つ提案
- Masked Language Model
- Next Sentence Prediction
- 提案手法で事前学習した言語モデルを Fine tuning するだけで多数のタスクにおいてSoTA を達成
提案モデル
- 双方向言語モデル BERT
- 言語モデルへの入力の工夫
- 言語モデル学習タスク
1. 双方言語モデル BERT
- Transformer の encoder 部分をそのまま言語モデルとしたもの ( Fig.1 左端)
- 先行研究では Transformer, LSTM を言語モデルとして用いているものがあるが,どれも単方向モデルだった (Fig.1 中央・右端)
2. 言語モデルへの入力の工夫
- 本論文では2つの Sentence をつなげた Sequence を言語モデルへの入力とする(後述)
- 入力は 3種類の embedding を Concatしたものを使用 (Fig.2 参照)
-
Token Embeddings (単語情報)
- WordPiece Embedding を使用
- 語彙サイズ: 30,000 token
- 入力Sequence 先頭に CLS token を追加
- 分類タスクにこのTokenの出力を用いる
- 2つの Sentence の間には SEP token を追加
- WordPiece Embedding を使用
-
Position Embeddings (位置情報)
- 各位置に対する embedding を用意
- 512番目まで用意
-
Segment Embeddings (Sentenceの相対位置情報)
- 2つの Sentence を区別できるように 1番目のSentence に A embedding, 2番目のSentence に B embedding を用意
- 適用するタスクによって,入力する Sentence が1つとなる場合には A embedding のみ使用
-
Token Embeddings (単語情報)
3. 言語モデル学習タスク
下記2つの言語モデル学習タスクで BERT を学習させる
- Masked Language Model
- Next Sentence Prediction
*実際には2つのタスクを同時に実行させて学習
Masked Language Model
- 入力シーケンスの 15% を確率的に置き換え,置き換える前の token を予測させるタスク
- 15% 中 80%:MASK token に置き換え
- my dog is hairy -> my dog is [MASK]
- 15% 中 10%:ランダムに別の token に置き換え
- my dog is hairy -> my dog is apple
- 15% 中 10%:そのまま
- my dog is hairy -> my dog is hairy
- 15% 中 80%:MASK token に置き換え
- 例
- 元:my dog is hairy
- 入力:my dog is [MASK]
- 出力:$T_0, T_1, T_2, T_3$
- 各位置に対する出力ベクトル
- [MASK] の位置に対応するベクトル $T_3$ に SoftMax をかけることで元の token id 計算,正しい token id を出力できるように学習
Next Sentence Prediction
- 2つのセンテンス間の関係性を言語モデルに学習させる
- 2つのセンテンスをつなぎ合わせたものを入力データとし,それらが実際に連続するものか否かを判定する2値分類タスク
- 50% : 連続する2つのセンテンスをつなぎ合わせたもの
- 50% : ランダムに2つのセンテンスをつなぎ合わせたもの
- 繋ぎ方等は上述の言語モデルへの入力の工夫を参照
- 入力例
事前学習と各タスクへのFine tuning
事前学習
-
モデル設定 (L:transformerのブロック数, A: transformerのAttention Head数, H: 隠れ次元のサイズ)
- BERT_base
- L=12, H=768, A=12, Total Parameters=110M
- BERT_large
- L=24, H=1024, A=16, Total Parameters=340M
- BERT_base
-
データセット
- BookCorpus, English Wikipedia を使用
- Wikipedia からはテキスト部分のみ抽出 (図のキャプション,表中のテキスト等は除外)
-
学習する誤差関数
- 上記2タスクの誤差関数を足し合わせたもの
- mean masked LM likelihood + mean next sentence prediction likelihood
Fine tuning
k値分類タスクに対して (Fig.3 左上,右上)
- CLS token に対応するh次元出力ベクトル C を k次元ベクトルに変換する k x h行列 W を新たに用意
- モデルのk値分類出力 P を下記で算出
- 分類精度が上がるようにW と 事前学習したBERT を Finetune
$$P = softmax(CW^T)$$
質疑応答タスクに対して (Fig.3 左下)
- Question と Paragraph が与えられ,Question に対する解答に対応する部分を Paragraph から抜き出すタスク
- 解答部分の開始,終了位置のスコアを算出するための h次元ベクトル S, E を新たに用意
- 開始・終了位置の推定精度が上がるように S, E と事前学習した BERT を Finetune
- 開始・終了部分の推定方法
- i 番目の token に対応する 出力を $T_i$ とし, 開始スコア $P_i$ を算出
- 全ての token で最も $P_i$ が大きい位置を開始位置とする
- 終了位置も同様に S の代わりに E を用いて決定
$$ P_i = \frac{e^{S T_i}}{\sum_j e^{S T_j}} $$
名詞分類タスクに対して (Fig.3 右下)
- k 値分類タスクと同様に各tokenに対するh次元出力ベクトルを k 次元ベクトルに変換する k x h 行列 W を新たに用意
- 各 token の分類分類出力を $P_i$ を下記で算出
- 分類精度が上がるように W と事前学習した BERT を Finetune
$$P_i = softmax(T_iW^T)$$
実験結果
- General Language Understanding Evaluation(GLEU) benchmark において SoTA
- GLEU( https://gluebenchmark.com/)
-
既存の様々なNLP分類タスクのデータセットを Dev, Train, Test に分割してまとめて提供してくれる benchmark
-
Test データに対する推定精度は GLEU 側のサーバーで一元的に計算される
-
各タスクの概要については Ryobotさんが丁寧にまとめて下さっているのでそちらを参照.
GLUEベンチマークの全言語理解タスクでぶっちぎりのSOTA!
— Ryobot | りょぼっと (@_Ryobot) 2018年10月13日
質疑応答タスクのSQuADでもSOTA!
話題の手法BERTってなにっ?(24層16注意ヘッドのTransformer!?)
paper: https://t.co/1yapHc0RTd pic.twitter.com/dAr3Lq9rPi
-
- GLEU( https://gluebenchmark.com/)
- SQuAD 質疑応答タスクにおいてもSoTA
- CoNLL-2003 名詞分類タスクにおいてもSoTA