STEP 16:BERTの理論

🎓 STEP 16: BERTの理論

Bidirectional Encoder Representations from Transformers – NLPに革命をもたらしたモデル

📋 このステップで学ぶこと

  • BERTの登場とNLPへのインパクト
  • Bidirectional(双方向)の意味と重要性
  • 事前学習タスク1: Masked Language Model(MLM)
  • 事前学習タスク2: Next Sentence Prediction(NSP)
  • BERTのアーキテクチャ(Base vs Large)
  • 特殊トークン([CLS]、[SEP]、[MASK])の役割
  • 事前学習とファインチューニングの2段階アプローチ

練習問題: 5問

🌟 1. BERTの登場

BERT(Bidirectional Encoder Representations from Transformers)は、 2018年10月にGoogleが発表した事前学習モデルです。 発表と同時に、11個のNLPタスクで最高性能を達成し、NLP界に革命をもたらしました。

1-1. BERTが革命的だった理由

【2018年以前のNLP開発の流れ】 ■ 従来のアプローチ(タスクごとに一から学習) 例: 感情分析モデルを作りたい場合 ステップ1: データ収集 ・映画レビューを数万件収集 ・「This movie is great!」→ Positive ・「Terrible waste of time」→ Negative ・人手でラベル付け(非常に時間がかかる) ステップ2: モデル設計 ・特徴量を手動で設計(BoW、TF-IDFなど) ・または、LSTMなどのモデルを設計 ステップ3: 訓練 ・ゼロからパラメータを学習 ・大量のデータが必要 ・計算時間も長い ステップ4: 評価 ・精度80%程度が限界… ■ 問題点 ・タスクごとに大量のデータが必要 ・訓練に時間がかかる ・別のタスクには使い回せない ・精度の限界がある
【BERTが変えたこと】 ■ 新しいアプローチ(Transfer Learning) ステップ1: 事前学習(Googleが実施) ・Wikipedia + BookCorpus(33億語) ・MLM + NSPタスクで訓練 ・64 TPU × 4日 ・言語の一般的な知識を獲得 → これを「事前学習済みモデル」として公開 ステップ2: ファインチューニング(私たちが実施) ・事前学習済みBERTをダウンロード ・タスク固有のデータ(数百〜数千件でOK!) ・GPU 1枚 × 数時間 ・高精度なモデルが完成 ■ BERTの利点 ・少ないデータで高精度(100倍少なくてOK) ・訓練が速い(数時間で完了) ・どんなタスクにも適用可能 ・同じBERTを使い回せる 【数字で見る効果】 従来手法: データ50,000件 + 訓練1週間 → 精度82% BERT: データ500件 + 訓練3時間 → 精度94% → 少ないデータ、短い時間で、高い精度!

1-2. BERTのベンチマーク結果

【質問応答タスク: SQuAD v1.1】 ■ タスクの説明 文章を読んで質問に答える 例: 文章: “東京は日本の首都である。人口は約1400万人。” 質問: “日本の首都はどこですか?” 回答: “東京”(文章から抽出) ■ 精度の推移(F1スコア) 2016年: 従来手法 = 67.7% 2017年: 改良版 = 73.2% 2018年前半: GPT = 78.1% 2018年10月: BERT-Base = 88.5% 2018年10月: BERT-Large = 90.9% 参考: 人間の精度 = 91.2% → BERT-Largeは人間とほぼ同等! 【自然言語理解ベンチマーク: GLUE】 ■ タスクの説明 11種類のNLPタスクの総合評価 ・感情分析(SST-2) ・文の類似度(STS-B) ・含意関係認識(MNLI) ・質問応答(QNLI) など ■ スコアの推移 2018年前半: 最高スコア = 74.3点 2018年10月: BERT-Large = 80.5点(+6.2点!) → 全タスクで大幅改善
💡 BERTが成功した4つの理由
  1. 双方向の文脈理解: 前後両方から単語の意味を理解
  2. 大規模データでの事前学習: 33億語のテキストで言語知識を獲得
  3. Transfer Learning: 一度の学習を多くのタスクに転用できる
  4. シンプルで汎用的な設計: タスクに応じて出力層を変えるだけ

🔄 2. Bidirectional(双方向)とは?

BERTの「B」はBidirectional(双方向)を意味します。 これがBERTの最も重要な特徴です。

2-1. 単語の意味は文脈で決まる

【例1: “bank”の多義性(英語)】 文1: “I went to the bank to deposit money.” (お金を預けるために銀行に行った) → bank = 金融機関 🏦 文2: “We sat on the river bank.” (私たちは川岸に座った) → bank = 川岸 🌊 同じ “bank” でも文脈で意味が変わる! 【例2: “橋/箸”の同音異義語(日本語)】 文1: “大きな橋を渡った” → 「はし」= bridge 🌉 文2: “お箸を使って食べた” → 「はし」= chopsticks 🥢 音は同じでも意味が違う 【結論】 単語の意味を正しく理解するには、 前後の文脈を見る必要がある!

2-2. 従来手法の問題点

【従来手法1: 左から右だけ見る(GPT方式)】 文: “私は銀行で働いています” 処理の流れ: 時刻1: “私” を処理(文脈なし) 時刻2: “は” を処理(”私”だけ見える) 時刻3: “銀行” を処理(”私は”だけ見える) ↑ この時点で “働いて” はまだ見えない! → 銀行 = 金融機関?川岸?判断できない ■ 問題点 “銀行”を理解する時点では、 “で働いています”という重要な情報が使えない 【従来手法2: 両方向を別々に訓練(ELMo方式)】 ■ 左から右のモデル(Forward) “私は銀行” で “銀行” を理解 ■ 右から左のモデル(Backward) “で働いています” で “銀行” を理解 ■ 最後に結合 Forward(“銀行”) + Backward(“銀行”) = 最終表現 ■ 問題点 ・2つのモデルは別々に訓練される ・訓練時に互いの情報を使えない ・「浅い」双方向(表面的な結合)

2-3. BERTの解決策:真の双方向

【BERTの「真の双方向」】 文: “私は銀行で働いています” BERTの処理: “銀行” を理解する時、同時に両方向を見る 左側の情報: “私は” ↓ “銀行” ← 両方の情報を同時に使用 ↑ 右側の情報: “で働いています” → “銀行” = 金融機関(確信を持って判断) 【どうやって実現?】 答え: TransformerのSelf-Attention STEP 13で学んだように、Self-Attentionは 「全ての位置から全ての位置を見る」 例: “私 は 銀行 で 働いて います” “銀行”のSelf-Attention計算: ・”私” との関連度 = 0.1 ・”は” との関連度 = 0.05 ・”銀行”(自分)との関連度 = 0.2 ・”で” との関連度 = 0.15 ・”働いて” との関連度 = 0.35 ← 高い! ・”います” との関連度 = 0.15 → “働いて”との関連が高い → 金融機関と判断 【BERTの構造】 BERT = Transformer Encoder × N層 入力文 ↓ Token Embedding + Position Embedding ↓ Encoder Layer 1(Self-Attention + FFN) ↓ Encoder Layer 2 ↓ … ↓ Encoder Layer 12(または24) ↓ 各位置の文脈化された表現
💡 なぜBERT以前は「真の双方向」ができなかったのか?

従来の言語モデルは「次の単語を予測する」タスクで訓練されていました。

例: “I love ___” → “you”を予測

このタスクでは、答え(”you”)を見てはいけません(カンニング)。 だから「左から右」しか見られなかったのです。

BERTはMLMという新しいタスクを使うことで、 この問題を解決しました。

🎭 3. 事前学習タスク1: Masked Language Model(MLM)

BERTの最も重要な事前学習タスクがMasked Language Model(MLM)です。 これが「真の双方向」を可能にした革新的なアイデアです。

3-1. MLMの基本アイデア

【従来の言語モデル vs MLM】 ■ 従来: 次の単語を予測 入力: “I love” 予測: 次の単語は? 答え: “you” 問題: ・答え(”you”)を見たらカンニング ・だから左から右しか見られない ■ MLM: マスクされた単語を予測 入力: “I [MASK] you” 予測: [MASK]の位置の単語は? 答え: “love” 利点: ・答えが[MASK]で隠されている ・左側(”I”)も右側(”you”)も見てOK ・双方向の文脈を使える! 【具体例】 元の文: “今日はとても天気が良いので、公園に散歩に行きました” ステップ1: 単語をランダムに選んでマスク マスク後: “今日はとても[MASK]が良いので、公園に散歩に行きました” ステップ2: BERTが予測 左側の情報: “今日はとても” 右側の情報: “が良いので、公園に散歩に行きました” BERTの予測: “天気” = 0.85 ← 最も確率が高い “気分” = 0.08 “体調” = 0.03 … ステップ3: 正解と比較して学習 正解: “天気” 予測: “天気”(正解!)

3-2. マスクの詳細ルール(重要!)

【マスク対象の選択】 全単語の15%をランダムに選んでマスク対象にする 例: 100単語の文 → 15単語がマスク対象 【選ばれた15%の扱い(3パターン)】 ■ パターン1(80%): [MASK]トークンに置き換え 元: “美味しい” → 後: “[MASK]” 目的: マスクされた位置を予測する基本的な学習 ■ パターン2(10%): ランダムな別の単語に置き換え 元: “美味しい” → 後: “悲しい”(ランダム) 目的: モデルが[MASK]に依存しすぎないようにする ■ パターン3(10%): 変更なし(元のまま) 元: “美味しい” → 後: “美味しい” 目的: 実際の単語でも予測できるようにする 【なぜ3パターン必要か?】 問題: [MASK]トークンは事前学習時のみ存在 ファインチューニング時には[MASK]がない もし100%を[MASK]にすると: ・モデルが「[MASK]を見たら予測する」と学習 ・実際のテキスト([MASK]なし)では予測できない ランダム置き換えと変更なしを混ぜることで: ・どの単語も予測対象になり得る ・[MASK]がなくても正しく動作

3-3. MLMの学習プロセス

【MLMの学習フロー】 ■ ステップ1: 入力の準備 元の文: “私は今日、美味しいラーメンを食べました” トークン化: [“私”, “は”, “今日”, “、”, “美味しい”, “ラーメン”, “を”, “食べ”, “ました”] 特殊トークン追加: [“[CLS]”, “私”, “は”, …, “[SEP]”] マスク適用(15%): [“[CLS]”, “私”, “は”, “今日”, “、”, “[MASK]”, “ラーメン”, …] ■ ステップ2: BERTに入力 入力トークン列 ↓ Token Embedding + Position Embedding ↓ Transformer Encoder × 12層 ↓ 各位置の出力ベクトル(768次元 × トークン数) ■ ステップ3: [MASK]位置で予測 [MASK]位置の出力ベクトル(768次元) ↓ 全結合層(768次元 → 語彙サイズ30,000次元) ↓ Softmax → 各単語の確率分布 予測結果: “美味しい”: 0.82 ← 最も高い確率 “熱い”: 0.05 “大きい”: 0.03 … ■ ステップ4: 損失計算と学習 正解: “美味しい” 損失 = CrossEntropyLoss = -log(0.82) これを数億の文で繰り返す!
✅ MLMが学習すること
  • 語彙的知識: 単語の意味、品詞、使われ方
  • 構文的知識: 文法、語順、共起関係
  • 意味的知識: 単語間の関係、類義語、対義語
  • 世界知識: 常識、事実関係

🔗 4. 事前学習タスク2: Next Sentence Prediction(NSP)

BERTの2つ目の事前学習タスクはNext Sentence Prediction(NSP)です。 2つの文が連続しているかどうかを判断するタスクです。

4-1. NSPの基本アイデア

【NSPのタスク】 2つの文を入力し、「連続しているか」を2値分類 ■ ケース1: IsNext(連続している) 文A: “私は昨日映画館に行きました” 文B: “とても面白い映画でした” → ラベル: IsNext ✓ ■ ケース2: NotNext(連続していない) 文A: “私は昨日映画館に行きました” 文B: “富士山は日本一高い山です” → ラベル: NotNext ✗ 【訓練データの作成】 50%: IsNext(実際に連続する文ペア) 50%: NotNext(ランダムに組み合わせた文ペア)

4-2. NSPの入力形式

【BERTへの入力形式】 形式: [CLS] 文A [SEP] 文B [SEP] 例: [CLS] 私は昨日映画館に行きました [SEP] とても面白い映画でした [SEP] ・[CLS]: 文全体の表現を集約(分類に使用) ・[SEP]: 文と文の区切り 【Segment Embedding】 文Aと文Bを区別: [CLS] 私 は 昨日 … [SEP] とても 面白い … [SEP] A A A A … A B B … B 【NSPの予測】 [CLS]位置の出力ベクトル(768次元) ↓ 全結合層(768 → 2) ↓ Softmax ↓ IsNext: 0.92, NotNext: 0.08
⚠️ NSPに関する後の研究結果

2019年のRoBERTaの研究で、NSPの効果について発見がありました:

  • NSPなしでもMLMだけで十分な性能が出る
  • NSPは「簡単すぎる」タスクという指摘
  • RoBERTaではNSPを削除して性能向上

ただし、質問応答など文ペアを扱うタスクでは有用な場合もあります。

4-3. 事前学習の全体像

【BERTの事前学習まとめ】 ■ 使用データ ・Wikipedia(英語): 約25億語 ・BookCorpus: 約8億語 → 合計約33億語 ■ 訓練の目的関数 Total Loss = MLM Loss + NSP Loss ■ 計算資源 BERT-Base: 16 TPU × 4日 BERT-Large: 64 TPU × 4日 推定コスト: 数百万円〜数千万円 → 個人では絶対にできない規模! → だからGoogleの事前学習済みモデルを使う

🏗️ 5. BERTのアーキテクチャ

BERTにはBaseLargeの2つのバージョンがあります。

5-1. BERT-BaseとBERT-Largeの比較

項目 BERT-Base BERT-Large
層数(L) 12 24
隠れ層次元(H) 768 1024
Attentionヘッド数 12 16
総パラメータ数 約1.1億(110M) 約3.4億(340M)
【選択の目安】 ■ BERT-Baseを使う場合 ・計算資源が限られている(GPU 1枚) ・データセットが小〜中規模 ・まず試してみる場合 ■ BERT-Largeを使う場合 ・高い精度を求める場合 ・大規模データセット ・計算資源が豊富

5-2. BERTの入力表現

【BERTへの入力: 3つの埋め込みの合計】 最終入力 = Token Embedding + Segment Embedding + Position Embedding ■ Token Embedding: 単語を768次元ベクトルに ■ Segment Embedding: 文A/文Bを区別 ■ Position Embedding: 位置情報(学習可能) 【具体例】 入力: [CLS] I love NLP [SEP] 位置: 0 1 2 3 4 Token: [CLS] I love NLP [SEP] Token Emb: E_CLS E_I E_love E_NLP E_SEP Segment Emb: E_A E_A E_A E_A E_A Position Emb: PE_0 PE_1 PE_2 PE_3 PE_4 ───────────────────────────── 最終入力: Token + Segment + Position

5-3. 特殊トークン

🔤 BERTの特殊トークン
  • [CLS]: 入力の先頭。文全体の表現を集約し、分類タスクで使用
  • [SEP]: 文と文の区切り。入力の末尾にも追加
  • [MASK]: MLM訓練時のマスク位置
  • [PAD]: 系列長を揃えるパディング
  • [UNK]: 未知語

🎯 6. 事前学習とファインチューニング

BERTの使い方は2段階のアプローチです。

6-1. 2段階のアプローチ

【ステージ1: 事前学習(Pre-training)】 実施者: Google データ: Wikipedia + BookCorpus(33億語) タスク: MLM + NSP 計算: 64 TPU × 4日 結果: bert-base-uncased など → 一度だけ実施、モデルを公開 【ステージ2: ファインチューニング(Fine-tuning)】 実施者: 私たち データ: タスク固有のデータ(数百〜数千件) タスク: 感情分析、質問応答など 計算: GPU 1枚 × 数時間 結果: タスク特化モデル → 何度でも実施可能

6-2. ファインチューニングの例

【例: 感情分析】 ■ モデル構築 事前学習済みBERT ↓ [CLS]位置の出力(768次元) ↓ 全結合層(768 → 2)← 新規追加 ↓ Softmax ↓ Positive / Negative ■ 設定 学習率: 2e-5〜5e-5(小さい値) エポック数: 2〜4 バッチサイズ: 16〜32 ■ 結果比較 従来手法: 精度82%(データ50,000件) BERT: 精度94%(データ5,000件) → 1/10のデータで12%精度向上!

6-3. 様々なタスクへの適用

【BERTが適用できるタスク】 ■ 文分類: [CLS] 文 [SEP] → [CLS]出力 → 分類 用途: 感情分析、スパム検出 ■ 文ペア分類: [CLS] 文A [SEP] 文B [SEP] → [CLS]出力 → 分類 用途: 自然言語推論、類似度判定 ■ 質問応答: [CLS] 質問 [SEP] 文章 [SEP] → 各位置 → Start/End予測 用途: SQuAD形式 ■ 固有表現認識: [CLS] 文 [SEP] → 各位置 → ラベル予測 用途: 人名、地名の抽出
💡 ファインチューニングの利点
  1. 少ないデータで高性能: 数百〜数千件でOK
  2. 学習が速い: 数時間で完了
  3. 計算資源が少なくて済む: GPU 1枚でOK
  4. 様々なタスクに適用可能: 同じBERTを使い回せる

📝 練習問題

問題1:BERTの名前の意味

BERTの正式名称は何ですか?

  1. Bidirectional Encoder Representations from Transformers
  2. Basic Encoder Representations for Text
  3. Bidirectional Embedding for Recurrent Transformers
  4. Best Encoder for Robust Text-processing
正解:a

Bidirectional Encoder Representations from Transformersが正式名称です。

  • Bidirectional: 双方向
  • Encoder: TransformerのEncoder使用
  • Representations: 表現を学習
  • from Transformers: Transformerベース

問題2:MLMのマスク率

MLMでマスク対象として選ばれる単語の割合は?

  1. 5%
  2. 10%
  3. 15%
  4. 20%
正解:c

全単語の15%がマスク対象として選ばれます。

  • 80%: [MASK]に置き換え
  • 10%: ランダムな単語に置き換え
  • 10%: 変更なし

問題3:[CLS]トークンの役割

[CLS]トークンは何に使われますか?

  1. 文の開始位置を示すだけ
  2. 文全体の表現を集約し、分類タスクに使用
  3. 単語を区切るための特殊トークン
  4. マスク対象の位置を示す
正解:b

[CLS]は文全体の表現を集約し、分類タスクに使用されます。 Self-Attentionで全トークンの情報を集約します。

問題4:BERTとGPTの違い

BERTとGPTの最も大きな違いは何ですか?

  1. BERTは双方向、GPTは単方向
  2. BERTはRNN、GPTはTransformer
  3. BERTは英語のみ、GPTは多言語
  4. BERTは小規模、GPTは大規模
正解:a

BERTは双方向、GPTは単方向が最大の違いです。

  • BERT: Encoder、双方向、理解タスク向き
  • GPT: Decoder、単方向、生成タスク向き

問題5:BERT-Baseのパラメータ数

BERT-Baseの総パラメータ数は約何個ですか?

  1. 約1,100万(11M)
  2. 約1億1,000万(110M)
  3. 約3億4,000万(340M)
  4. 約17億5,000万(1.75B)
正解:b

BERT-Baseは約1億1,000万(110M)パラメータです。

  • 層数: 12
  • 隠れ層: 768次元
  • ヘッド数: 12

参考: BERT-Largeは340M

📝 STEP 16 のまとめ

✅ このステップで学んだこと
  • BERTの革命: 2018年、NLPに革命をもたらした事前学習モデル
  • 双方向性: 前後の文脈を同時に理解する「真の双方向」
  • MLM: マスクされた単語を予測(15%、80/10/10ルール)
  • NSP: 文の連続性を判断(50% IsNext、50% NotNext)
  • アーキテクチャ: Base(110M)とLarge(340M)
  • 特殊トークン: [CLS]、[SEP]、[MASK]の役割
  • 2段階アプローチ: 事前学習→ファインチューニング
🎯 次のステップの準備

STEP 17: BERTのファインチューニングでは、 実際にBERTを使った実装を学びます!

  • Hugging Face Transformersライブラリ
  • 事前学習済みモデルの読み込み
  • トークナイザーの基本
  • 感情分析の実装
  • 日本語BERTの活用
📝

学習メモ

自然言語処理(NLP) - Step 16

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE