🌟 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つの理由
双方向の文脈理解 : 前後両方から単語の意味を理解
大規模データでの事前学習 : 33億語のテキストで言語知識を獲得
Transfer Learning : 一度の学習を多くのタスクに転用できる
シンプルで汎用的な設計 : タスクに応じて出力層を変えるだけ
🔄 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にはBase とLarge の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] → 各位置 → ラベル予測
用途: 人名、地名の抽出
💡 ファインチューニングの利点
少ないデータで高性能 : 数百〜数千件でOK
学習が速い : 数時間で完了
計算資源が少なくて済む : GPU 1枚でOK
様々なタスクに適用可能 : 同じBERTを使い回せる
📝 練習問題
問題1:BERTの名前の意味
BERTの正式名称は何ですか?
Bidirectional Encoder Representations from Transformers
Basic Encoder Representations for Text
Bidirectional Embedding for Recurrent Transformers
Best Encoder for Robust Text-processing
解答を見る
正解:a
Bidirectional Encoder Representations from Transformers が正式名称です。
Bidirectional : 双方向
Encoder : TransformerのEncoder使用
Representations : 表現を学習
from Transformers : Transformerベース
問題2:MLMのマスク率
MLMでマスク対象として選ばれる単語の割合は?
5%
10%
15%
20%
解答を見る
正解:c
全単語の15% がマスク対象として選ばれます。
80%: [MASK]に置き換え
10%: ランダムな単語に置き換え
10%: 変更なし
問題3:[CLS]トークンの役割
[CLS]トークンは何に使われますか?
文の開始位置を示すだけ
文全体の表現を集約し、分類タスクに使用
単語を区切るための特殊トークン
マスク対象の位置を示す
解答を見る
正解:b
[CLS]は文全体の表現を集約し、分類タスクに使用 されます。
Self-Attentionで全トークンの情報を集約します。
問題4:BERTとGPTの違い
BERTとGPTの最も大きな違いは何ですか?
BERTは双方向、GPTは単方向
BERTはRNN、GPTはTransformer
BERTは英語のみ、GPTは多言語
BERTは小規模、GPTは大規模
解答を見る
正解:a
BERTは双方向、GPTは単方向 が最大の違いです。
BERT: Encoder、双方向、理解タスク向き
GPT: Decoder、単方向、生成タスク向き
問題5:BERT-Baseのパラメータ数
BERT-Baseの総パラメータ数は約何個ですか?
約1,100万(11M)
約1億1,000万(110M)
約3億4,000万(340M)
約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の活用