Skip to content
Published on

BERT論文完全分析:双方向TransformerがNLPの構図を変えた方法

Authors
  • Name
    Twitter

1. 論文概要

「BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding」は、2018年10月にGoogle AI Languageチームの Jacob Devlin、Ming-Wei Chang、Kenton Lee、Kristina Toutanovaが発表した論文である。その後NAACL 2019でBest Long Paperに選出された。

BERTはBidirectional Encoder Representations from Transformersの略語で、名前の通りTransformerのEncoderを双方向に事前学習した言語表現モデルである。核心的なアイデアはシンプルだ。大規模な教師なしテキストコーパスで双方向文脈を学習した後、タスクごとにわずかなFine-tuningのみを行えばよいということである。

このシンプルなアプローチが11個のNLPベンチマークで同時にState-of-the-Art(SOTA)を達成した。GLUEスコアを80.5%まで引き上げ(7.7%の絶対改善)、SQuAD v1.1 F1を93.2(1.5ポイント改善)、SQuAD v2.0 F1を83.1(5.1ポイント改善)と記録した。BERTはNLPにおいてPre-training + Fine-tuningパラダイムを確立した論文であり、以降登場するほぼすべての言語モデルの出発点となった。


2. 背景:なぜ双方向が必要だったのか

2.1 事前学習言語表現の2つの流れ

BERT以前、事前学習された言語表現を活用するアプローチは大きく2つの流れに分かれていた。

Feature-basedアプローチ(ELMo)

Peters et al.(2018)が提案したELMo(Embeddings from Language Models)は、Forward LSTMとBackward LSTMをそれぞれ独立に学習した後、両方向のhidden stateを連結(concatenation)して文脈依存的な単語表現を生成した。ELMoの表現はダウンストリームタスクの入力Featureとして使用され、タスクごとに別途のアーキテクチャを設計する必要があった。

ELMok=γj=0Lsj[hk,j;hk,j]\text{ELMo}_k = \gamma \sum_{j=0}^{L} s_j \cdot [\overrightarrow{h}_{k,j}; \overleftarrow{h}_{k,j}]

ここでhk,j\overrightarrow{h}_{k,j}hk,j\overleftarrow{h}_{k,j}はそれぞれForward、Backward LSTMのjj番目レイヤーのhidden stateであり、sjs_jは学習可能な重みである。核心的な限界は、ForwardとBackwardが独立に学習されることだ。両方向の情報が深いレイヤーで相互作用できない。

Fine-tuningアプローチ(OpenAI GPT)

Radford et al.(2018)のGPT(Generative Pre-Training)はTransformer DecoderをLeft-to-Right Language Modelingで事前学習した後、ダウンストリームタスクに合わせてモデル全体をFine-tuningする方式を採った。タスクごとのアーキテクチャ変更が最小化されるという利点があったが、**単方向(Left-to-Right)**でのみ文脈をエンコードするという根本的な限界があった。

2.2 単方向の限界

「The bank of the river」における「bank」の意味を把握するには、「bank」の左側の「The」だけでなく右側の「river」も同時に見る必要がある。Left-to-Rightモデルは「bank」をエンコードする際に「river」を参照できない。これがGPT-1の根本的な限界であった。

ELMoは両方向を考慮するが、ForwardとBackwardをそれぞれ独立に学習してから単純連結する**「浅い(shallow)双方向」**である。真の双方向表現とは、すべてのレイヤーで左右の文脈が同時に相互作用しながら学習されるものでなければならない。

2.3 3つのアプローチの比較

特性ELMoGPT-1BERT
アーキテクチャBi-LSTMTransformer DecoderTransformer Encoder
方向性浅い双方向(独立学習)単方向(Left-to-Right)深い双方向
事前学習目標Forward + Backward LMLeft-to-Right LMMLM + NSP
ダウンストリーム適用Feature-basedFine-tuningFine-tuning
タスク別アーキテクチャタスクごとに設計必要最小限の変更最小限の変更
パラメータ数94M117M110M (Base) / 340M (Large)

BERTの核心的な貢献は、この2つのアプローチの長所を組み合わせたことである。GPTのようにFine-tuningベースでありながら、ELMoのように双方向文脈を活用するが、独立学習ではなく**すべてのレイヤーで同時に(deeply)**双方向文脈を学習する。


3. BERTアーキテクチャ

3.1 Transformer Encoder Stack

BERTはVaswani et al.(2017)のTransformerアーキテクチャのEncoder部分のみを使用する。Decoderは使用しない。各Encoderレイヤーは以下の2つのSub-layerで構成される。

  1. Multi-Head Self-Attention:入力系列のすべてのトークンが他のすべてのトークンを双方向に参照
  2. Position-wise Feed-Forward Network:各トークンに対して独立に非線形変換を実行

各Sub-layerにはResidual ConnectionとLayer Normalizationが適用される。

output=LayerNorm(x+Sublayer(x))\text{output} = \text{LayerNorm}(x + \text{Sublayer}(x))

Decoderを使用しないため、Auto-regressive Maskingがなく、すべての位置のトークンが他のすべての位置のトークンを自由に参照できる。これがBERTが**真の双方向(deeply bidirectional)**モデルとなれる構造的基盤である。

3.2 BERT-Base vs BERT-Large

論文は2つのモデルサイズを提示する。

設定BERT-BaseBERT-Large
Layers (LL)1224
Hidden Size (HH)7681,024
Attention Heads (AA)1216
Feed-Forward Size3,072 (4H4H)4,096 (4H4H)
Total Parameters110M340M

BERT-BaseはGPT-1と同一のモデルサイズ(レイヤー数、Hidden Size、Attention Head数)を持つよう意図的に設計された。これはアーキテクチャサイズではなく事前学習方法論の違いが性能向上の原因であることを公正に比較するためである。

各Attention Headの次元はdk=H/Ad_k = H / Aである。BERT-Baseでは768/12=64768 / 12 = 64、BERT-Largeでは1024/16=641024 / 16 = 64で、両モデルともHead当たりの次元は64で同一である。

3.3 活性化関数:GELU

BERTはTransformer原論文のReLUの代わりに**GELU(Gaussian Error Linear Unit)**を活性化関数として使用する。

GELU(x)=xΦ(x)=x12[1+erf(x2)]\text{GELU}(x) = x \cdot \Phi(x) = x \cdot \frac{1}{2}\left[1 + \text{erf}\left(\frac{x}{\sqrt{2}}\right)\right]

GELUはReLUとは異なり入力値に応じて滑らかに活性化され、負の領域でもわずかな勾配を維持する。以降GPT-2、RoBERTaなどほとんどのTransformerベースモデルで標準となった。


4. 入力表現(Input Representation)

BERTの入力表現は3つのEmbeddingの和で構成される。この設計により、単一モデルで単一文と文ペアのタスクの両方を処理できる。

4.1 WordPiece Tokenization

BERTは30,000個のWordPieceトークン語彙を使用する。WordPieceはByte-Pair Encoding(BPE)の変形で、頻度ベースではなく尤度(likelihood)ベースでサブワードを結合する。

例えば、「playing」は「play」+「##ing」に分離される。「##」接頭辞は、そのトークンが単語の先頭ではなく前のトークンの続きであることを示す。この方式の利点は以下の通りである。

  • OOV(Out-of-Vocabulary)問題の解決:どの単語もサブワードの組み合わせで表現可能
  • 形態素情報の保存:「play」と「playing」が「play」という共通トークンを共有
  • 語彙サイズの制御:30,000の限られた語彙ですべてのテキストをカバー

4.2 特殊トークン:[CLS]と[SEP]

BERTは2種類の特殊トークンを使用する。

[CLS](Classification Token):すべての入力系列の先頭に追加される。このトークンの最終hidden stateは、分類タスクにおいて系列全体の集約(aggregate)表現として使用される。Self-Attentionを通じて系列のすべてのトークン情報が[CLS]に集中するためである。

[SEP](Separator Token):2つの文を区切るために使用される。単一文タスクでは文の末尾に、文ペアタスクでは2つの文の間と2番目の文の末尾に追加される。

入力形式の例:

単一文:  [CLS] I love NLP [SEP]
文ペア:  [CLS] How old are you ? [SEP] I am 25 years old . [SEP]

4.3 3つのEmbeddingの和

各トークンの入力表現は以下の3つのEmbeddingをelement-wiseで合算して生成する。

Token Embedding:WordPieceトークンに対する学習可能なEmbeddingである。語彙サイズ30,000に対してR30000×H\mathbb{R}^{30000 \times H}サイズのEmbedding行列を持つ。

Segment Embedding:入力が文Aか文Bかを区別する学習可能なEmbeddingである。文Aに属するトークンはEAE_A、文Bに属するトークンはEBE_Bで表現される。単一文タスクではすべてのトークンがEAE_Aを使用する。

Position Embedding:系列内の位置情報をエンコードする学習可能なEmbeddingである。Transformer原論文のSinusoidal Positional Encodingとは異なり、BERTは**学習可能な(learned)**Position Embeddingを使用する。最大系列長は512である。

Input(xi)=Etoken(xi)+Esegment(xi)+Eposition(i)\text{Input}(x_i) = E_{\text{token}}(x_i) + E_{\text{segment}}(x_i) + E_{\text{position}}(i)

この3つのEmbeddingの和がTransformer Encoderの最初のレイヤーに入力される。


5. 事前学習方法論

BERTの事前学習は2つの教師なしタスクで構成される。この2つのタスクの設計がBERT論文の核心的な貢献である。

5.1 Masked Language Model(MLM)

動機:双方向学習のジレンマ

標準的なLanguage ModelはP(wtw1,...,wt1)P(w_t | w_1, ..., w_{t-1})、すなわち前のトークンが与えられた時の次のトークンの確率を予測する。これは本質的にLeft-to-Rightである。Bidirectional Language Modelを直接学習すると、各トークンが間接的に「自分自身を見ることができる」問題が発生する。多層ネットワークで双方向文脈が循環しながら、予測対象単語の情報が漏洩するのである。

BERTはこのジレンマをCloze Task(穴埋め問題)からインスピレーションを得たMasked Language Modelで解決する。

15%マスキング戦略

各学習系列でWordPieceトークンの15%をランダムに選択してマスキングする。そして選択されたトークンの元の単語を予測することが学習目標である。

しかし単純に[MASK]トークンに置換すると問題が生じる。Fine-tuning時には[MASK]トークンが入力に登場しないため、事前学習とFine-tuningの間に**不一致(mismatch)**が発生する。

80/10/10ルール

この不一致を緩和するために、選択された15%のトークンを以下の比率で処理する。

比率処理方法例(「my dog is hairy」で「hairy」が選択された場合)
80%[MASK]トークンに置換my dog is [MASK]
10%ランダムトークンに置換my dog is apple
10%元のトークンを維持my dog is hairy

この戦略の効果を具体的に見ると以下の通りである。

  • 80% [MASK]:モデルが文脈から元の単語を復元するよう学習
  • 10% Random:モデルがすべての入力トークンについて実際の単語かどうか不確実にし、どの位置でも正しい表現を維持するよう強制
  • 10% Unchanged:Fine-tuning時に観察される実際の入力との差を縮小

論文のAblation Studyで80/10/10比率が最適であり、100% [MASK]のみ使用するとFeature-basedアプローチで性能が大幅に低下した。

MLM Loss関数

MLMの損失関数はマスキングされた位置でのみCross-Entropy Lossを計算する。

LMLM=iMlogP(xix~)\mathcal{L}_{\text{MLM}} = -\sum_{i \in \mathcal{M}} \log P(x_i | \tilde{x})

ここでM\mathcal{M}はマスキングされたトークンのインデックス集合、x~\tilde{x}はマスキング処理された入力系列、P(xix~)P(x_i | \tilde{x})はモデルがマスキングされた位置iiで元のトークンxix_iを予測する確率である。

具体的には、マスキングされた各位置の最終hidden state hih_iを語彙サイズにプロジェクションした後、Softmaxを適用する。

P(xix~)=softmax(Whi+b)xiP(x_i | \tilde{x}) = \text{softmax}(W \cdot h_i + b)_{x_i}

ここでWRV×HW \in \mathbb{R}^{|V| \times H}は出力重み行列、V|V|は語彙サイズ(30,000)である。

MLMの欠点は、各バッチでトークンの15%のみを予測するため、一般的なLeft-to-Right LMより収束が遅いことである。しかし論文ではこのコストを相殺して余りある性能向上を実験的に実証した。

5.2 Next Sentence Prediction(NSP)

動機

Question Answering(QA)やNatural Language Inference(NLI)のようなタスクは、2つの文の間の関係を理解する必要がある。この関係は単純なLanguage Modelingでは学習しにくい。

学習方法

NSPは二値分類タスクである。2つの文AとBが与えられた時、Bが実際にAの次に来る文なのか(IsNext)、コーパスからランダムに選択された文なのか(NotNext)を予測する。

  • 50%:BはAの実際の次の文(IsNext)
  • 50%:Bはコーパスからランダム選択(NotNext)
[CLS] The man went to [MASK] store [SEP] He bought a gallon [MASK] milk [SEP]
Label: IsNext

[CLS] The man [MASK] to the store [SEP] Penguin [MASK] are flight ##less birds [SEP]
Label: NotNext

[CLS]トークンの最終hidden state CCを二値分類器に入力して予測する。

P(IsNextC)=softmax(WNSPC)P(\text{IsNext} | C) = \text{softmax}(W_{\text{NSP}} \cdot C)

NSPの効果と論争

論文のAblation StudyでNSPを除去するとQNLI(-3.5%)、MNLI(-0.5%)、SQuAD(-0.6%)で有意な性能低下が観察された。特に文ペア関係推論が重要なタスクで低下が顕著であった。

しかし、その後RoBERTa(Liu et al., 2019)の研究でNSPの効果に疑問が提起された。RoBERTaはNSPを除去してもBERTより高い性能を達成し、NSPの効果は学習データの構成方法により大きく左右されると主張した。

5.3 全体事前学習損失

最終的な事前学習損失はMLMとNSP損失の和である。

L=LMLM+LNSP\mathcal{L} = \mathcal{L}_{\text{MLM}} + \mathcal{L}_{\text{NSP}}

5.4 事前学習データと設定

設定
学習データBooksCorpus(800M語)+ English Wikipedia(2,500M語)
総データサイズ約16GBのテキスト
語彙サイズ30,000 WordPieceトークン
最大系列長512トークン
Batch Size256系列(128,000トークン/バッチ)
学習ステップ1,000,000ステップ(約40エポック)
OptimizerAdam(β1=0.9\beta_1=0.9, β2=0.999\beta_2=0.999, ϵ=106\epsilon=10^{-6}
Learning Rate1e-4(10,000ステップwarmup後linear decay)
Dropout0.1(すべてのレイヤー)
ActivationGELU
Hardware4個Cloud TPU Pod(16 TPUチップ、BERT-Base)/ 16個Cloud TPU Pod(64 TPUチップ、BERT-Large)
学習時間BERT-Base: 4日、BERT-Large: 4日

6. Fine-tuning戦略

BERTのFine-tuningは驚くほどシンプルである。事前学習済みBERTの上にタスク別出力レイヤー1つを追加し、モデル全体をEnd-to-EndでFine-tuningする。事前学習に比べてFine-tuningは非常に高速で、ほとんどのタスクで単一Cloud TPUで1時間以内、GPUでは数時間以内に完了する。

6.1 Fine-tuningハイパーパラメータ

ほとんどのタスクで以下のハイパーパラメータ範囲がうまく機能する。

ハイパーパラメータ推奨範囲
Batch Size16, 32
Learning Rate (Adam)5e-5, 4e-5, 3e-5, 2e-5
Epochs2, 3, 4
Dropout0.1(事前学習と同一)

6.2 文/文ペア分類(Classification)

感性分析(SST-2)、自然言語推論(MNLI, RTE)、文類似度(STS-B, MRPC, QQP)などのタスクでは、[CLS]トークンの最終hidden state CRHC \in \mathbb{R}^Hを分類器に入力する。

P(yx)=softmax(WC+b)P(y | x) = \text{softmax}(W \cdot C + b)

ここでWRK×HW \in \mathbb{R}^{K \times H}KKはラベル数である。

文ペアタスクの場合、入力形式は以下の通り。

[CLS] Sentence A [SEP] Sentence B [SEP]

Segment Embeddingで文AとBを区別し、[CLS]の表現が2つの文間の関係をエンコードする。

6.3 質疑応答(Question Answering, QA)

SQuAD(Stanford Question Answering Dataset)で質問と文章が与えられると、文章から回答に該当する区間(span)の開始と終了位置を予測する。

[CLS] Question [SEP] Passage [SEP]

開始位置ベクトルSRHS \in \mathbb{R}^Hと終了位置ベクトルERHE \in \mathbb{R}^Hを学習し、文章の各トークンiiに対して開始/終了確率を計算する。

Pstart(i)=eSTijeSTj,Pend(i)=eETijeETjP_{\text{start}}(i) = \frac{e^{S \cdot T_i}}{\sum_j e^{S \cdot T_j}}, \quad P_{\text{end}}(i) = \frac{e^{E \cdot T_i}}{\sum_j e^{E \cdot T_j}}

ここでTiT_iはトークンiiの最終hidden stateである。候補回答span (i,j)(i, j)のスコアはSTi+ETjS \cdot T_i + E \cdot T_jjij \geq i)で計算される。

SQuAD v2.0では回答がない場合も処理する必要があるため、回答がない時は開始と終了位置を共に[CLS]に設定して「回答なし」確率を計算する。

6.4 固有表現認識(Named Entity Recognition, NER)

CoNLL-2003 NERタスクでは各トークンをPerson、Organization、Location、Miscellaneous、Otherのいずれかに分類する。この時、[CLS]表現ではなく各トークンの最終hidden stateを分類器に入力する。

P(yix)=softmax(WNERTi+bNER)P(y_i | x) = \text{softmax}(W_{\text{NER}} \cdot T_i + b_{\text{NER}})

WordPieceで分離されたサブワードトークンの場合、一般的に最初のサブワードの予測値を該当単語のラベルとして使用する。

6.5 Sequence Labelingの一般化

NERを含めてPOS Tagging、Chunkingなど系列の各トークンにラベルを付与するすべてのタスクに同一の方式を適用できる。BERTの各トークン表現が双方向文脈を十分にエンコードしているため、CRF(Conditional Random Field)のような追加的な系列モデリングレイヤーなしでも高い性能を達成する。

6.6 Feature-basedアプローチ

BERTはFine-tuning以外にもFeature-basedアプローチとして使用できる。Transformer Encoderを固定(freeze)し、特定レイヤーのhidden stateをFeatureとして抽出して別のモデルに入力する方式である。

論文でCoNLL-2003 NERタスクにFeature-based方式を適用した結果、最後の4レイヤーのhidden stateを連結(concatenation)した表現が96.1% F1(dev)を達成し、Fine-tuning方式の96.4% F1(dev)に近接した。これはBERTの事前学習された表現自体が非常に豊富な言語情報を含んでいることを示している。


7. 核心数式の整理

7.1 Self-Attention(Scaled Dot-Product Attention)

BERTの各Encoderレイヤーで実行されるSelf-Attentionの数式である。

Attention(Q,K,V)=softmax(QKTdk)V\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V

ここでQ=XWQQ = XW^QK=XWKK = XW^KV=XWVV = XW^Vであり、dk=H/Ad_k = H / Aは各Attention Headの次元である。

7.2 Multi-Head Attention

MultiHead(Q,K,V)=Concat(head1,...,headA)WO\text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, ..., \text{head}_A) \cdot W^O headi=Attention(QWiQ,KWiK,VWiV)\text{head}_i = \text{Attention}(QW_i^Q, KW_i^K, VW_i^V)

BERT-BaseではA=12A=12、BERT-LargeではA=16A=16個のheadを使用する。

7.3 Feed-Forward Network

各Attention Sub-layer後のPosition-wise FFNである。

FFN(x)=GELU(xW1+b1)W2+b2\text{FFN}(x) = \text{GELU}(xW_1 + b_1)W_2 + b_2

ここでW1RH×4HW_1 \in \mathbb{R}^{H \times 4H}W2R4H×HW_2 \in \mathbb{R}^{4H \times H}である。内部次元がHidden Sizeの4倍のBottleneck構造である。

7.4 MLM Loss(再整理)

マスキングされたトークン集合M\mathcal{M}に対するCross-Entropy Lossである。

LMLM=1MiMlogexp(Wxihi)v=1Vexp(Wvhi)\mathcal{L}_{\text{MLM}} = -\frac{1}{|\mathcal{M}|}\sum_{i \in \mathcal{M}} \log \frac{\exp(W_{x_i} \cdot h_i)}{\sum_{v=1}^{|V|} \exp(W_v \cdot h_i)}

ここでhih_iはマスキングされた位置iiの最終hidden state、WvW_vは出力Embedding行列のvv番目の行、V=30,000|V| = 30,000である。

7.5 NSP Loss

LNSP=[ylogP(IsNext)+(1y)logP(NotNext)]\mathcal{L}_{\text{NSP}} = -\left[y \log P(\text{IsNext}) + (1-y) \log P(\text{NotNext})\right]

ここでy{0,1}y \in \{0, 1\}は実際のラベルである。

7.6 全体事前学習目標

Lpretrain=LMLM+LNSP\mathcal{L}_{\text{pretrain}} = \mathcal{L}_{\text{MLM}} + \mathcal{L}_{\text{NSP}}

8. 実験結果

8.1 GLUE Benchmark

GLUE(General Language Understanding Evaluation)は9個のNLUタスクで構成されるベンチマークである。BERT-LargeはGLUE全体スコア**80.5%**を達成し、従来SOTA対比7.7%の絶対改善を記録した。

タスクメトリックBERT-BaseBERT-Large従来SOTA
MNLI-m / MNLI-mmAccuracy84.6 / 83.486.7 / 85.980.6 / 80.1
QQPF171.272.166.1
QNLIAccuracy90.592.787.4
SST-2Accuracy93.594.993.2
CoLAMatthews Corr52.160.535.0
STS-BSpearman Corr85.886.581.0
MRPCF188.989.386.0
RTEAccuracy66.470.161.7
WNLIAccuracy-65.165.1

特にCoLAで従来SOTA対比**25.5%**の絶対改善が印象的である。CoLA(Corpus of Linguistic Acceptability)は文の文法的適格性を判断するタスクで、深い言語理解が必要である。

8.2 SQuAD v1.1

SQuAD v1.1(Stanford Question Answering Dataset)は文章から回答区間を抽出するExtractive QAタスクである。

モデルEM (Exact Match)F1
従来SOTA(単一モデル)84.491.0
BERT-Large(単一モデル)84.190.9
従来SOTA(アンサンブル)86.791.7
BERT-Large + TriviaQA(アンサンブル)87.493.2

TriviaQAデータを活用したアンサンブルモデルがF1 93.2を達成し、人間の性能(91.2 F1)を初めて超過した。

8.3 SQuAD v2.0

SQuAD v2.0はv1.1に**回答のない質問(unanswerable questions)**を追加したバージョンである。

モデルEMF1
従来SOTA73.777.0
BERT-Large(単一モデル)80.083.1

従来SOTA対比F1で6.1ポイント改善を達成した。回答可能かどうかを判断する能力において、BERTの双方向文脈理解が特に強みを見せた。

8.4 SWAG

SWAG(Situations With Adversarial Generations)は常識推論タスクで、与えられた文に続く最も適切な後続文を4つの候補から選択する。

モデルDev AccuracyTest Accuracy
Human-88.0
ESIM + ELMo51.952.7
OpenAI GPT-78.0
BERT-Base81.6-
BERT-Large86.686.3

BERT-LargeはGPTを8.3%上回り、人間の性能(88.0%)に近接した。

8.5 Ablation Study:事前学習タスクの影響

論文でBERT-Baseを基準として事前学習タスクの重要性を分析した。

設定MNLI-mQNLIMRPCSST-2SQuAD F1
BERT-Base (MLM + NSP)84.488.486.792.788.5
No NSP83.984.986.592.687.9
LTR (Left-to-Right) & No NSP82.184.377.592.177.8
LTR + BiLSTM & No NSP82.184.175.791.684.9

核心的な発見事項は以下の通りである。

  1. NSP除去:QNLIで3.5%低下、文ペア関係が重要なタスクで影響大
  2. Left-to-Right:双方向対比SQuADで10.7 F1低下、トークンレベルタスクで双方向性が決定的
  3. LTR + BiLSTM:BiLSTMを追加しても双方向事前学習を代替できない

8.6 Ablation Study:モデルサイズの影響

設定LHAParamsMNLI-mMRPCSST-2SQuAD F1
3-layer37681245M77.979.888.475.6
6-layer67681267M80.684.391.183.7
BERT-Base1276812110M84.486.792.788.5
BERT-Large24102416340M86.687.893.791.3

モデルサイズを大きくするとすべてのタスクで一貫して性能が向上した。特に小さなデータセット(MRPC: 3,600個の学習例)でも大きなモデルがより良い性能を示した点が注目に値する。これは事前学習が十分な知識を提供し、少ないFine-tuningデータでも大きなモデルを効果的に学習できることを示唆する。


9. コード例:HuggingFace Transformers

9.1 BERTによるMasked Language Model予測

from transformers import BertTokenizer, BertForMaskedLM
import torch

# モデルとトークナイザのロード
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
model = BertForMaskedLM.from_pretrained("bert-base-uncased")
model.eval()

# マスキングされた文の準備
text = "The capital of France is [MASK]."
inputs = tokenizer(text, return_tensors="pt")

# [MASK]位置の検索
mask_token_index = torch.where(inputs["input_ids"] == tokenizer.mask_token_id)[1]

# 予測
with torch.no_grad():
    outputs = model(**inputs)
    logits = outputs.logits

# Top-5予測トークンの抽出
mask_logits = logits[0, mask_token_index, :]
top5_tokens = torch.topk(mask_logits, 5, dim=1)

print(f"入力: {text}")
print("Top-5予測:")
for i, (token_id, score) in enumerate(
    zip(top5_tokens.indices[0], top5_tokens.values[0])
):
    token = tokenizer.decode([token_id])
    print(f"  {i+1}. {token} (score: {score:.4f})")

出力例:

入力: The capital of France is [MASK].
Top-5予測:
  1. paris (score: 18.2341)
  2. lyon (score: 12.1456)
  3. lille (score: 10.8923)
  4. toulouse (score: 10.5678)
  5. marseille (score: 10.3210)

9.2 文分類(Sentiment Analysis)Fine-tuning

from transformers import BertTokenizer, BertForSequenceClassification
from transformers import Trainer, TrainingArguments
from datasets import load_dataset

# データセットのロード(SST-2)
dataset = load_dataset("glue", "sst2")
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")

# トークナイズ
def tokenize_function(examples):
    return tokenizer(
        examples["sentence"],
        padding="max_length",
        truncation=True,
        max_length=128,
    )

tokenized_datasets = dataset.map(tokenize_function, batched=True)

# モデル初期化(2クラス分類)
model = BertForSequenceClassification.from_pretrained(
    "bert-base-uncased",
    num_labels=2,
)

# 学習設定(論文の推奨ハイパーパラメータ)
training_args = TrainingArguments(
    output_dir="./results",
    num_train_epochs=3,              # 論文推奨: 2-4
    per_device_train_batch_size=32,  # 論文推奨: 16または32
    learning_rate=2e-5,              # 論文推奨: 2e-5 ~ 5e-5
    weight_decay=0.01,
    warmup_ratio=0.1,
    evaluation_strategy="epoch",
    save_strategy="epoch",
    load_best_model_at_end=True,
    metric_for_best_model="accuracy",
)

# Trainerで学習
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=tokenized_datasets["train"],
    eval_dataset=tokenized_datasets["validation"],
)

trainer.train()

9.3 質疑応答(Question Answering)

from transformers import BertTokenizer, BertForQuestionAnswering
import torch

tokenizer = BertTokenizer.from_pretrained("bert-large-uncased-whole-word-masking-finetuned-squad")
model = BertForQuestionAnswering.from_pretrained("bert-large-uncased-whole-word-masking-finetuned-squad")
model.eval()

# 質問と文章
question = "What is BERT?"
context = """BERT is a language representation model developed by Google.
It stands for Bidirectional Encoder Representations from Transformers.
BERT is designed to pre-train deep bidirectional representations from
unlabeled text by jointly conditioning on both left and right context
in all layers."""

# トークナイズ
inputs = tokenizer(question, context, return_tensors="pt")

# 予測
with torch.no_grad():
    outputs = model(**inputs)
    start_logits = outputs.start_logits
    end_logits = outputs.end_logits

# 回答の抽出
start_idx = torch.argmax(start_logits)
end_idx = torch.argmax(end_logits)

answer_tokens = inputs["input_ids"][0][start_idx : end_idx + 1]
answer = tokenizer.decode(answer_tokens)
print(f"質問: {question}")
print(f"回答: {answer}")
# 出力: 回答: a language representation model developed by google

9.4 固有表現認識(NER)

from transformers import pipeline

# NERパイプラインの作成
ner_pipeline = pipeline(
    "ner",
    model="bert-base-cased",  # NERでは大文字小文字の区別が重要
    aggregation_strategy="simple",
)

text = "Google released BERT in 2018 at their Mountain View headquarters."
results = ner_pipeline(text)

for entity in results:
    print(f"Entity: {entity['word']:20s} | "
          f"Label: {entity['entity_group']:5s} | "
          f"Score: {entity['score']:.4f}")

9.5 BERT Embeddingの抽出(Feature-basedアプローチ)

from transformers import BertModel, BertTokenizer
import torch

tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
model = BertModel.from_pretrained("bert-base-uncased", output_hidden_states=True)
model.eval()

text = "BERT produces contextualized word embeddings."
inputs = tokenizer(text, return_tensors="pt")

with torch.no_grad():
    outputs = model(**inputs)

# すべてのレイヤーのhidden states(13個:embedding + 12 layers)
all_hidden_states = outputs.hidden_states  # tuple of (batch, seq_len, 768)

# [CLS]トークンによる文表現(最終レイヤー)
sentence_embedding = outputs.last_hidden_state[:, 0, :]
print(f"文の埋め込み次元: {sentence_embedding.shape}")  # (1, 768)

# 論文方式:最後の4レイヤーを連結(Feature-based)
last_4_layers = torch.cat(
    [all_hidden_states[i] for i in [-4, -3, -2, -1]], dim=-1
)
print(f"最後の4レイヤー連結次元: {last_4_layers.shape}")  # (1, seq_len, 3072)

10. BERTの影響と後続研究

BERTはNLP分野にパラダイム転換をもたらした。「事前学習 + Fine-tuning」という方法論は今やNLPの標準となり、BERTの限界を克服するための数多くの後続研究が生まれた。

10.1 RoBERTa(Liu et al., 2019, Meta AI)

Robustly Optimized BERT Pretraining Approach。BERTのアーキテクチャを変更せずに、学習方法論のみを最適化して性能を大幅に向上させた。

主な変更点:

  • NSP除去:NSPがかえって性能を損なうことを実験的に実証
  • Dynamic Masking:BERTはデータ前処理時にマスキングを固定(static)するが、RoBERTaはエポックごとにマスキングパターンを変更
  • より多くのデータ:16GBから160GBへ10倍増加(CC-News、OpenWebText、Storiesを追加)
  • より大きなバッチ:256から8,000へ増加
  • より長い学習:BPE語彙50,000個、より多くの学習ステップ

結果:GLUE、SQuAD、RACEのすべてのタスクでBERT-Largeを凌駕。BERTの事前学習が**深刻に過少学習(undertrained)**されていたことを示唆する。

10.2 ALBERT(Lan et al., 2019, Google)

A Lite BERT。パラメータ効率性に焦点を当てたモデルである。

主な技法:

  • Factorized Embedding Parameterization:語彙Embedding次元(EE)とHidden次元(HH)を分離。V×HV \times Hの代わりにV×E+E×HV \times E + E \times Hでパラメータ削減。例:E=128E=128なら30000×768=23M30000 \times 768 = 23Mパラメータが30000×128+128×768=3.9M30000 \times 128 + 128 \times 768 = 3.9Mに減少
  • Cross-layer Parameter Sharing:すべてのTransformerレイヤーが同一のパラメータを共有。パラメータ数を大幅に削減しつつ性能低下を最小化
  • Sentence Order Prediction(SOP):NSPの代わりに、2つの連続する文の順序が正しいかを判別するタスク。NSPより難しいタスクで、文間関係の学習に効果的

結果:BERT-Large対比18分の1のパラメータで同等以上の性能を達成。

10.3 DistilBERT(Sanh et al., 2019, Hugging Face)

Knowledge Distillationを活用してBERTを圧縮したモデルである。

  • BERT-Baseの40%のサイズ(66Mパラメータ、6レイヤー)
  • BERT-Baseの60%の速度向上
  • BERT-Base性能の97%を維持
  • 学習時にTeacher(BERT-Base)のSoft Labelを模倣するDistillation Lossを使用
  • SQuAD v1.1で86.9 F1(BERT-Base: 88.5 F1)

モバイル、エッジデバイスへのデプロイに適した軽量モデルの出発点となった。

10.4 ELECTRA(Clark et al., 2020, Google/Stanford)

Efficiently Learning an Encoder that Classifies Token Replacements Accurately。BERTのMLM学習非効率性を根本的に改善したモデルである。

核心アイデア:

  • Generator-Discriminatorアーキテクチャ:小さなGenerator(MLM)がマスキングされたトークンを埋め、Discriminatorが各トークンが原本かGeneratorが生成したものかを判別
  • すべてのトークンで学習:BERTは15%のマスキングされたトークンでのみ学習するが、ELECTRAはすべてのトークンで「原本 vs 置換」判別を学習するため学習効率が大幅に向上
  • Replaced Token Detection(RTD):MLMよりも効率的な事前学習目標

結果:同一の計算予算でBERT、RoBERTa、ALBERTを凌駕。特に小型モデル(ELECTRA-Small)で効率性の差が最大化。

10.5 DeBERTa(He et al., 2020, Microsoft)

Decoding-enhanced BERT with Disentangled Attention。Attentionメカニズム自体を改善したモデルである。

主な革新:

  • Disentangled Attention:既存のBERTはToken EmbeddingとPosition Embeddingを合算(sum)した後にAttentionを行うが、DeBERTaはContentとPositionを分離して別々のAttentionを実行。Content-to-Content、Content-to-Position、Position-to-Contentの3種類のAttentionを結合
  • Enhanced Mask Decoder:Decodingレイヤーで絶対位置情報を注入し、相対位置と絶対位置情報の両方を活用

結果:同一モデルサイズでBERT、RoBERTa対比より高い性能。特に学習データの半分のみでも既存モデルを凌駕し、SuperGLUEで人間の性能を超過。

10.6 後続研究の系譜

BERT (2018)
├── RoBERTa (2019) ─── 学習方法論の最適化
├── ALBERT (2019) ─── パラメータ効率性
├── DistilBERT (2019) ─── Knowledge Distillation
├── ELECTRA (2020) ─── 学習効率性 (RTD)
├── DeBERTa (2020) ─── Attentionメカニズムの改善
├── SpanBERT (2020) ─── Span単位マスキング
├── ERNIE (2019) ─── Knowledge-enhanced事前学習
└── ModernBERT (2024) ─── 現代的アーキテクチャの適用

11. 限界点と教訓

11.1 BERTの限界

1. 事前学習-Fine-tuning不一致(Pre-train/Fine-tune Discrepancy)

[MASK]トークンは事前学習でのみ登場しFine-tuningでは現れない。80/10/10戦略で緩和するが根本的には解決されない。ELECTRAのRTDがこの問題をよりエレガントに解決した。

2. マスキングされたトークン間の独立性仮定

MLMはマスキングされたトークンを独立に予測する。例えば「New York」がすべてマスキングされると、「New」と「York」の予測が独立に行われる。実際にはこの2つのトークンの間には強い依存性がある。XLNet(Yang et al., 2019)がPermutation Language Modelingでこの問題を解決しようとした。

3. 学習非効率性

各バッチでトークンの15%のみを予測するため、収束により多くの学習ステップが必要である。ELECTRAがすべてのトークンで学習することでこの非効率性を大幅に改善した。

4. 最大系列長の制限

512トークンの最大長制限は長い文書の処理に不適切である。Self-AttentionのO(n2)O(n^2)複雑度のため系列長を大幅に増やすことが困難である。Longformer、BigBirdなどがSparse Attentionでこの問題を緩和した。

5. 生成タスクに不適

BERTはEncoder-onlyモデルであるため、テキスト生成(要約、翻訳、対話など)には直接使用できない。生成タスクはGPT系列(Decoder-only)やT5、BART系列(Encoder-Decoder)がより適している。

6. NSPの効果に疑問

RoBERTaの実験でNSPがかえって性能を損なう可能性があることが明らかになった。問題はNSP自体が簡単すぎるタスクであり、ランダムに選択された文はトピック(topic)の違いだけで容易に識別できるということである。

11.2 論文から得られる教訓

1. シンプルなアイデアの力

BERTの核心アイデア(双方向文脈を学習する)は驚くほどシンプルである。複雑なアーキテクチャ革新ではなく、事前学習目標(MLM)の変更だけで劇的な性能向上を達成した。

2. スケーリングの効果

Ablation Studyでモデルサイズとデータサイズを大きくすると一貫して性能が向上することを示した。これは以降のScaling Law研究やGPT-3など大規模モデル開発の礎となった。

3. Transfer Learningパラダイムの確立

ImageNet事前学習がComputer Visionを変革したように、BERTはNLPにおいて事前学習された言語モデルを活用することがすべてのタスクの出発点となるべきであることを実証した。もはやタスク別アーキテクチャを最初から設計する必要はなくなった。

4. 公正な比較の重要性

BERT-BaseをGPT-1と同一サイズに設計することで、アーキテクチャサイズではなく方法論の違いが性能向上の原因であることを明確に示した。これは研究論文の実験設計における重要な教訓である。


12. まとめ

BERTは2018年の発表以降、NLP分野の構図を完全に変えた論文である。双方向文脈学習というシンプルかつ強力なアイデアをMasked Language Modelという洗練された方法で実装し、11個のベンチマークを同時に席巻してその効果を実証した。

BERTの最大の遺産は特定のベンチマークの数値ではない。**「大規模教師なしコーパスで事前学習した後、少量のラベル付きデータでFine-tuningする」**というパラダイムをNLPに確立したことである。このパラダイムはその後GPT-3、T5、PaLM、LLaMAに至るまで現代言語モデルの根幹となった。

もちろんBERTにも限界があった。マスキング不一致、学習非効率性、系列長制限などの問題はRoBERTa、ELECTRA、Longformerなどの後続研究で一つずつ解決されていった。しかしこれらすべての後続研究がBERTという出発点の上に築かれたという事実が、BERT論文の歴史的重要性を物語っている。


References