【多義語の例】
■ 英語の “bank”
意味1: 銀行(financial institution)
例: “I went to the bank to withdraw money.”
(お金を下ろしに銀行に行った)
意味2: 川岸(river bank)
例: “She sat on the river bank.”
(彼女は川岸に座った)
→ 全く異なる意味なのに、同じ単語!
■ 英語の “apple”
意味1: りんご(果物)
例: “I ate an apple for breakfast.”
意味2: Apple社(企業)
例: “Apple released a new iPhone.”
→ これも文脈で意味が変わる
【静的埋め込みの問題を具体的に】
■ Word2Vecの場合
単語 “bank” のベクトル:
vector(“bank”) = [0.33, -0.28, 0.15, 0.89, -0.42, …]
このベクトルは「銀行」と「川岸」の意味が
ごちゃ混ぜになった「平均的な」ベクトル
文1: “I went to the bank to withdraw money.”
この “bank” のベクトル = [0.33, -0.28, 0.15, 0.89, …]
文2: “She sat on the river bank.”
この “bank” のベクトル = [0.33, -0.28, 0.15, 0.89, …]
→ 同じベクトル!意味の違いを区別できない ❌
■ なぜ問題?
タスク: 「銀行に関する文書を分類したい」
文1の “bank” = 銀行 → 関連あり ✓
文2の “bank” = 川岸 → 関連なし ✗
静的埋め込みでは両方とも同じベクトルなので、
区別できずに誤分類してしまう
2-4. 人間はどうやって区別している?
【人間の理解プロセス】
文: “I went to the bank to withdraw money.”
人間の思考:
1. “withdraw money”(お金を下ろす)という文脈を見る
2. お金を下ろす場所 = 銀行
3. よって “bank” = 銀行 と判断
文: “She sat on the river bank.”
人間の思考:
1. “river”(川)と “sat on”(座った)という文脈を見る
2. 川の近くで座れる場所 = 川岸
3. よって “bank” = 川岸 と判断
→ 人間は「周りの単語(文脈)」から意味を推測している!
💡 必要なもの
単語の意味を正確に理解するには、
文脈を考慮した埋め込みが必要です。
これがコンテキスト化された埋め込み
(Contextualized Embeddings)です。
🔄 3. コンテキスト化された埋め込みとは?
コンテキスト化された埋め込みは、
静的埋め込みの限界を克服するために開発された手法です。
3-1. 基本アイデア
💡 コンテキスト化の核心
「同じ単語でも、文脈によって異なるベクトルを生成する」
【静的埋め込み vs コンテキスト化された埋め込み】
■ 静的埋め込み(Word2Vec等)
入力: 単語
出力: ベクトル(常に同じ)
“bank” → [0.33, -0.28, 0.15, …](固定)
■ コンテキスト化された埋め込み(ELMo、BERT等)
入力: 単語 + 文脈(周りの文)
出力: ベクトル(文脈で変わる)
“I went to the bank to withdraw money”
この文での “bank” → [0.82, 0.15, -0.23, …](銀行の意味)
“She sat on the river bank”
この文での “bank” → [-0.15, 0.67, 0.45, …](川岸の意味)
→ 同じ “bank” でも異なるベクトル!
3-2. なぜ文脈でベクトルが変わる?
【文脈からの情報抽出】
文: “I went to the bank to withdraw money”
“bank” の周りの単語:
– “went to the” → どこかに行った
– “to withdraw money” → お金を下ろす
これらの情報から:
→ お金を下ろす場所 = 銀行
→ “bank” のベクトルは「銀行」寄りになる
文: “She sat on the river bank”
“bank” の周りの単語:
– “sat on” → 何かの上に座った
– “river” → 川
これらの情報から:
→ 川の近くで座れる場所 = 川岸
→ “bank” のベクトルは「川岸」寄りになる
コンテキスト化された埋め込みは、
このような「周りの単語からの情報」をベクトルに反映させる
3-3. 静的 vs コンテキスト化 の比較
項目
静的埋め込み
コンテキスト化埋め込み
ベクトル数
単語ごとに1つ
文脈ごとに異なる
多義語
区別できない
文脈で区別できる
計算量
軽い(参照のみ)
重い(都度計算)
精度
良い
より良い
代表例
Word2Vec, GloVe, fastText
ELMo, BERT, GPT
🧠 4. ELMo(Embeddings from Language Models)
ELMoは、2018年にAllen Institute for AIが発表した
最初の成功したコンテキスト化された埋め込みです。
4-1. ELMoとは?
📖 ELMoの正式名称
ELMo = Embeddings from Language Models
言語モデルから得られる埋め込み
発表: 2018年2月
発表者: Allen Institute for AI(AI2)
論文タイトル: “Deep contextualized word representations”
4-2. ELMoの基本アイデア
【ELMoの核心アイデア】
「言語モデルの中間層から単語の表現を取り出す」
■ 言語モデルとは?
次の単語を予測するモデル
例: “I went to the ___”
→ 「bank」「store」「park」などが来そう
このタスクを解くために、
モデルは文脈を理解する必要がある
■ ELMoの発想
言語モデルの学習中に、
モデル内部で文脈を理解した表現が作られる
その「文脈を理解した表現」を取り出して
単語埋め込みとして使おう!
4-3. ELMoのアーキテクチャ
ELMoは双方向LSTM(Bidirectional LSTM)を使っています。
【双方向LSTMとは?】
通常のLSTM: 左から右へ一方向に読む
双方向LSTM: 左→右 と 右→左 の両方向で読む
例文: “I went to the bank to withdraw money”
■ Forward LSTM(左→右)
I → went → to → the → bank → to → withdraw → money
↑
この時点で
“I went to the” の情報を持っている
■ Backward LSTM(右→左)
money → withdraw → to → bank → the → to → went → I
↑
この時点で
“to withdraw money” の情報を持っている
■ 双方向LSTMの統合
“bank” の表現 = Forward の情報 + Backward の情報
= “I went to the” + “to withdraw money”
→ 両方の文脈を活用!
【ELMoの構造図】
入力文: “I went to the bank to withdraw money”
┌────────────────────────────────────────────┐
│ ELMo アーキテクチャ │
├────────────────────────────────────────────┤
│ │
│ 層0: 文字ベース埋め込み(Character CNN) │
│ 各単語を文字から作成 │
│ │
│ 層1: 双方向LSTM(第1層) │
│ Forward: I → went → to → the → … │
│ Backward: … ← the ← to ← went ← I │
│ │
│ 層2: 双方向LSTM(第2層) │
│ より高度な文脈理解 │
│ │
└────────────────────────────────────────────┘
↓
各単語の ELMo ベクトル
= 層0 + 層1 + 層2 の重み付き和
4-4. なぜ双方向が重要?
💡 双方向の重要性
単語の意味を理解するには、左右両方の文脈が必要です。
【一方向だけでは不十分な例】
文: “I went to the bank to withdraw money”
■ Forward LSTMのみ(左→右)の場合
“bank” を処理する時点:
見える情報: “I went to the”
見えない情報: “to withdraw money”
“I went to the” だけでは、
bank が銀行か川岸か分からない!
■ Backward LSTMのみ(右→左)の場合
“bank” を処理する時点:
見える情報: “to withdraw money”
見えない情報: “I went to the”
“to withdraw money” があれば銀行と分かる!
でも他の文脈が失われる
■ 双方向LSTM(ELMo)
“bank” を処理する時:
Forward の情報: “I went to the”
Backward の情報: “to withdraw money”
両方を組み合わせることで、
より正確に「銀行」と判断できる
【ELMoによる “bank” の区別】
■ 文1: “I went to the bank to withdraw money”
文脈: “withdraw money”(お金を下ろす)
ELMo(“bank” | 文1) = [0.82, 0.15, -0.23, 0.45, …]
(銀行寄りのベクトル)
■ 文2: “She sat on the river bank”
文脈: “river”, “sat on”(川、座る)
ELMo(“bank” | 文2) = [-0.15, 0.67, 0.45, -0.32, …]
(川岸寄りのベクトル)
■ 文3: “The bank approved my loan”
文脈: “approved”, “loan”(承認、ローン)
ELMo(“bank” | 文3) = [0.78, 0.22, -0.18, 0.51, …]
(銀行寄りのベクトル)
■ 類似度の比較
文1 vs 文2: 低い(意味が異なる)
文1 vs 文3: 高い(同じ「銀行」の意味)
文2 vs 文3: 低い(意味が異なる)
→ ELMoは文脈から意味を正しく区別できる!
5-2. Word2Vec vs ELMo の比較
【静的埋め込み vs コンテキスト化埋め込み】
■ Word2Vec(静的)
文1: “I went to the bank to withdraw money”
文2: “She sat on the river bank”
Word2Vec(“bank”) = [0.33, -0.28, 0.15, …]
(両方で同じベクトル)
類似度: 1.0(完全に同じ)
→ 意味の違いを区別できない ❌
■ ELMo(コンテキスト化)
文1: “I went to the bank to withdraw money”
ELMo(“bank” | 文1) = [0.82, 0.15, -0.23, …]
文2: “She sat on the river bank”
ELMo(“bank” | 文2) = [-0.15, 0.67, 0.45, …]
類似度: 約0.3〜0.5(異なるベクトル)
→ 意味の違いを区別できる ✅