BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

## 概要
- Transformer を用いた双方向言語モデルを提案
    - Bidirectional Encoder Representation from Transformer (BERT)
- 双方向言語モデル学習タスクを２つ提案
    - Masked Language Model
    - Next Sentence Prediction
- 提案手法で事前学習した言語モデルを Fine tuning するだけで多数のタスクにおいてSoTA を達成 


## 提案モデル
1. 双方向言語モデル BERT
2. 言語モデルへの入力の工夫
3. 言語モデル学習タスク

### 1. 双方言語モデル BERT
- Transformer の encoder 部分をそのまま言語モデルとしたもの ( Fig.1 左端） 
- 先行研究では Transformer, LSTM を言語モデルとして用いているものがあるが，どれも単方向モデルだった (Fig.1 中央・右端）
![スクリーンショット 2018-10-19 21.21.32.png](https://qiita-image-store.s3.amazonaws.com/0/140539/1f0818a3-9574-8577-8b74-80b71f0ba293.png)

### 2. 言語モデルへの入力の工夫
- 本論文では２つの Sentence をつなげた Sequence を言語モデルへの入力とする(後述)
- 入力は 3種類の embedding を Concatしたものを使用 (Fig.2 参照)
    - **Token Embeddings (単語情報）**
        - WordPiece Embedding を使用
            - 語彙サイズ: 30,000 token 
        - 入力Sequence 先頭に CLS token を追加
            - 分類タスクにこのTokenの出力を用いる 
        - 2つの Sentence の間には SEP token を追加 
    - **Position Embeddings （位置情報）**
        - 各位置に対する embedding を用意
        - 512番目まで用意
    - **Segment Embeddings （Sentenceの相対位置情報）** 
        - ２つの Sentence を区別できるように １番目のSentence に A embedding, ２番目のSentence に B embedding を用意
        - 適用するタスクによって，入力する Sentence が１つとなる場合には A embedding のみ使用

       
![スクリーンショット 2018-10-19 21.21.42.png](https://qiita-image-store.s3.amazonaws.com/0/140539/f2b07613-97dc-2b79-2b8e-05426aac74a5.png)

### 3. 言語モデル学習タスク
下記２つの言語モデル学習タスクで BERT を学習させる
- Masked Language Model
- Next Sentence Prediction

*実際には２つのタスクを同時に実行させて学習

#### 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
-  例
    -  元：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
- ２つのセンテンス間の関係性を言語モデルに学習させる
- ２つのセンテンスをつなぎ合わせたものを入力データとし，それらが実際に連続するものか否かを判定する２値分類タスク
    - 50% : 連続する２つのセンテンスをつなぎ合わせたもの
    - 50% : ランダムに２つのセンテンスをつなぎ合わせたもの
- 繋ぎ方等は上述の言語モデルへの入力の工夫を参照
- 入力例

![スクリーンショット 2018-10-19 23.02.01.png](https://qiita-image-store.s3.amazonaws.com/0/140539/8d771bd7-93ff-c13d-47b9-bc29497ad4ae.png)


## 事前学習と各タスクへの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 

- データセット
    - BookCorpus, English Wikipedia を使用
    - Wikipedia からはテキスト部分のみ抽出 (図のキャプション，表中のテキスト等は除外）
- 学習する誤差関数
    - 上記２タスクの誤差関数を足し合わせたもの
    - 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)$$

![スクリーンショット 2018-10-19 21.21.58.png](https://qiita-image-store.s3.amazonaws.com/0/140539/c9d31b7e-bbd6-27e9-87ae-f53176f02087.png)

## 実験結果
- General Language Understanding Evaluation(GLEU) benchmark において SoTA
    - GLEU( https://gluebenchmark.com/)
        - 既存の様々なNLP分類タスクのデータセットを Dev, Train, Test に分割してまとめて提供してくれる benchmark
        - Test データに対する推定精度は GLEU 側のサーバーで一元的に計算される
        - 各タスクの概要については Ryobotさんが丁寧にまとめて下さっているのでそちらを参照．
        
            <blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">GLUEベンチマークの全言語理解タスクでぶっちぎりのSOTA！<br>質疑応答タスクのSQuADでもSOTA！<br>話題の手法BERTってなにっ？（24層16注意ヘッドのTransformer！？）<br><br>paper: <a href="https://t.co/1yapHc0RTd">https://t.co/1yapHc0RTd</a> <a href="https://t.co/dAr3Lq9rPi">pic.twitter.com/dAr3Lq9rPi</a></p>&mdash; Ryobot | りょぼっと (@_Ryobot) <a href="https://twitter.com/_Ryobot/status/1050925881894400000?ref_src=twsrc%5Etfw">2018年10月13日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
 https://twitter.com/_Ryobot/status/1050925881894400000 
      
![スクリーンショット 2018-10-19 21.22.07.png](https://qiita-image-store.s3.amazonaws.com/0/140539/928f227f-042b-df2d-dc93-c6b56457e1d4.png)

- SQuAD 質疑応答タスクにおいてもSoTA

![スクリーンショット 2018-10-19 21.22.18.png](https://qiita-image-store.s3.amazonaws.com/0/140539/eea780d2-2692-e8d6-0c02-1ff97ca98c45.png)

- CoNLL-2003 名詞分類タスクにおいてもSoTA

![スクリーンショット 2018-10-19 21.22.26.png](https://qiita-image-store.s3.amazonaws.com/0/140539/0b4b7fa2-d9e6-d3c6-bae1-f4c6050fc068.png)