STEP 7:コンテキスト化された埋め込み

🔄 STEP 7: コンテキスト化された埋め込み

静的埋め込みの限界とELMoによる文脈依存表現を学び、BERTへの橋渡しを理解します

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

  • 静的埋め込み(Word2Vec、GloVe、fastText)の限界
  • 多義語の問題と文脈の重要性
  • コンテキスト化された埋め込みとは何か
  • ELMo(Embeddings from Language Models)の仕組み
  • 双方向LSTM による文脈情報の活用
  • BERTへの橋渡しとなる重要な概念

練習問題: 4問

💻 このステップについて

このステップは概念の理解が中心です。
ELMoの実装は紹介しますが、現在はBERTが主流のため、 ELMoの詳細な実装よりもなぜコンテキスト化が必要かを理解することが重要です。
STEP 16以降でBERTを詳しく学びます。

📚 1. 静的埋め込みの復習

まず、STEP 5〜6で学んだWord2Vec、GloVe、fastTextを振り返りましょう。 これらは静的埋め込み(Static Embeddings)と呼ばれます。

1-1. 静的埋め込みとは?

📊 静的埋め込みの定義

静的埋め込みとは、1つの単語に対して 常に同じベクトルが割り当てられる方式です。

【静的埋め込みの特徴】 ■ 単語 → ベクトル の対応が固定 “computer” → [0.25, -0.13, 0.87, 0.42, …](常に同じ) “learning” → [0.18, 0.45, -0.23, 0.67, …](常に同じ) “bank” → [0.33, -0.28, 0.15, 0.89, …](常に同じ) ■ 文脈に関係なく同じベクトル 文1: “I went to the bank to withdraw money.” 文2: “She sat on the river bank.” 両方の文で “bank” は同じベクトル → [0.33, -0.28, 0.15, 0.89, …] ■ 代表的な手法 – Word2Vec(2013年) – GloVe(2014年) – fastText(2016年)

1-2. 静的埋め込みの利点

✅ 静的埋め込みの良い点
  • 計算が軽い:事前に計算済みのベクトルを参照するだけ
  • メモリ効率:単語ごとに1つのベクトルを保存
  • シンプル:実装が簡単で理解しやすい
  • 多くのタスクで有効:テキスト分類、クラスタリングなど

では、なぜ「静的」だと問題になるのでしょうか?

⚠️ 2. 静的埋め込みの限界:多義語の問題

静的埋め込みには致命的な欠点があります。 それは多義語(複数の意味を持つ単語)を区別できないことです。

2-1. 多義語とは?

【多義語の例】 ■ 英語の “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.” → これも文脈で意味が変わる

2-2. 日本語の多義語

【日本語の多義語の例】 ■ “橋” 1. “橋を渡る” → 構造物(bridge) 2. “橋渡しをする” → 仲介(mediation) ■ “かける” 1. “眼鏡をかける” → 装着する 2. “電話をかける” → 発信する 3. “迷惑をかける” → 与える 4. “時間をかける” → 費やす 5. “掛け算をする” → 乗算 → 同じ「かける」でも意味が全然違う! ■ “取る” 1. “写真を取る” 2. “休みを取る” 3. “年を取る” 4. “責任を取る” → 人間は文脈から意味を判断している

2-3. 静的埋め込みの問題点

⚠️ 静的埋め込みでは多義語を区別できない

Word2Vec、GloVe、fastTextは、どんな文脈でも 同じ単語には同じベクトルを返します。

【静的埋め込みの問題を具体的に】 ■ 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” 両方を組み合わせることで、 より正確に「銀行」と判断できる

4-5. ELMoの3層構造

【ELMoの3つの層と役割】 ■ 層0: 文字ベースの埋め込み – 単語を文字のCNNで表現 – 表面的な情報(スペル、形態素) ■ 層1: 第1層の双方向LSTM – 構文的な情報(品詞、文法) – 例: “bank” が名詞であること ■ 層2: 第2層の双方向LSTM – 意味的な情報(単語の意味) – 例: “bank” が銀行か川岸か ■ 最終的なELMoベクトル ELMo = γ × (s0×層0 + s1×層1 + s2×層2) s0, s1, s2: 各層の重み(タスクで学習) γ: スケーリング係数 タスクによって最適な重みが異なる: – 品詞タグ付け → 層1を重視 – 意味理解 → 層2を重視
✅ ELMoの特徴まとめ
  • 文脈依存:同じ単語でも文脈で異なるベクトル
  • 双方向:左右両方の文脈を活用
  • 多層:複数のLSTM層で深い表現
  • 転移学習:事前学習モデルを他タスクで利用可能
  • 文字ベース:未知語にも対応

📊 5. ELMoの効果を確認

ELMoが実際に多義語を区別できるか、概念的に確認しましょう。

5-1. 多義語の区別

【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(異なるベクトル) → 意味の違いを区別できる ✅

5-3. ELMoの性能向上

📈 ELMoによる精度向上(2018年時点)

ELMoは発表当時、多くのNLPタスクで最高性能を達成しました。

【ELMoの性能向上例(2018年)】 タスク 改善幅 ───────────────────────────────────── 質問応答(SQuAD) +4.7% 感情分析(SST-5) +3.3% 固有表現認識(CoNLL 2003) +2.1% 意味役割ラベリング +3.2% 共参照解析 +3.3% テキスト含意認識 +5.0% → ほぼ全てのタスクで大幅な改善! → コンテキスト化埋め込みの有効性を証明

💻 6. ELMoの実装(参考)

ELMoの実装例を紹介します。 現在はBERTが主流のため、参考程度にご覧ください。

⚠️ 注意

ELMoは2018年の技術で、現在はBERTが主流です。
このセクションは概念理解のための参考です。
実務ではSTEP 16以降で学ぶBERTを使用することをお勧めします。

6-1. TensorFlow Hubでの使用例

# TensorFlow HubでELMoを使用する例(参考) # ※ 実行には時間がかかります import tensorflow as tf import tensorflow_hub as hub import numpy as np # ELMoモデルの読み込み # 初回はモデルのダウンロードに時間がかかります(約1GB) elmo = hub.load(“https://tfhub.dev/google/elmo/3”) # テキストの準備 texts = [ “I went to the bank to withdraw money”, “She sat on the river bank” ] # ELMo埋め込みを取得 # signatures[“default”]でデフォルトの推論を実行 embeddings = elmo.signatures[“default”]( tf.constant(texts) )[“elmo”] # 形状の確認 print(f”埋め込みの形状: {embeddings.shape}”) # 出力: (2, max_length, 1024) # 2文、各単語に1024次元のベクトル
実行結果(例): 埋め込みの形状: (2, 8, 1024)

6-2. Hugging Face Transformersでの代替

現在はHugging Face TransformersでBERTを使う方が一般的です。 STEP 17で詳しく学びます。

# Hugging Face TransformersでBERTを使う例(現在の主流) # pip install transformers from transformers import BertTokenizer, BertModel import torch # BERTモデルとトークナイザーの読み込み tokenizer = BertTokenizer.from_pretrained(‘bert-base-uncased’) model = BertModel.from_pretrained(‘bert-base-uncased’) # テキストの準備 texts = [ “I went to the bank to withdraw money”, “She sat on the river bank” ] # トークン化 inputs = tokenizer(texts, return_tensors=”pt”, padding=True) # BERT埋め込みを取得 with torch.no_grad(): outputs = model(**inputs) embeddings = outputs.last_hidden_state print(f”埋め込みの形状: {embeddings.shape}”) # 出力: torch.Size([2, max_length, 768])
実行結果(例): 埋め込みの形状: torch.Size([2, 10, 768])
💡 実務でのアドバイス

ELMoの実装を深く学ぶよりも、 BERTの使い方を習得する方が実用的です。 STEP 16〜17でBERTを詳しく学びますので、 ここではコンテキスト化の概念を理解しておきましょう。

🌉 7. BERTへの橋渡し

ELMoはBERTの前身として重要な役割を果たしました。 ELMoの功績と限界を理解することで、BERTの革新性が分かります。

7-1. ELMoの歴史的意義

🏆 ELMoが切り開いた道
  • コンテキスト化の有効性を証明:文脈依存の埋め込みが効果的と示した
  • 双方向の重要性を示した:左右両方の文脈が必要
  • 転移学習の威力:事前学習+ファインチューニングの有効性
  • NLP全タスクで改善:分類、質問応答、NERなど全てで向上

7-2. ELMoの限界

【ELMoの限界】 ■ 限界1: LSTMは並列化できない LSTMは順番に処理する必要がある: I → went → to → the → bank → … (前の単語の処理が終わらないと次に進めない) → 長い文だと学習が遅い → GPUの並列計算能力を活かせない ■ 限界2: 「疑似的な」双方向 ELMoの双方向: – Forward LSTM: 左→右で独立に処理 – Backward LSTM: 右→左で独立に処理 – 最後に結合 問題: Forward と Backward が「同時に」情報を見ていない → 「真の」双方向ではない ■ 限界3: 浅い層数 ELMo: 2層のLSTM → より深いモデルでさらに性能向上の余地

7-3. ELMo vs BERT の比較

項目 ELMo (2018) BERT (2018)
アーキテクチャ 双方向LSTM Transformer
双方向性 Forward + Backward を別々に 真の双方向(全単語同時)
並列化 不可(逐次処理) 可能(高速)
層数 2層 12〜24層
精度 高い より高い

7-4. NLP技術の進化

【NLP技術の進化タイムライン】 2013年: Word2Vec(Google) → 静的埋め込みの登場 → 単語の意味をベクトルで表現 2014年: GloVe(Stanford) → グローバルな共起統計を活用 2016年: fastText(Facebook) → サブワードで未知語に対応 2018年2月: ELMo(AI2)★ このステップ → コンテキスト化された埋め込み → 文脈で異なるベクトル 2018年10月: BERT(Google) → Transformerベース → 真の双方向、並列化可能 → NLPの標準技術に 2018年6月〜: GPT, GPT-2, GPT-3, GPT-4(OpenAI) → 大規模言語モデル → ChatGPTの基盤 ELMoは「静的」から「コンテキスト化」への 重要な転換点となった

📝 練習問題

このステップで学んだ内容を確認しましょう。

問題1:静的埋め込みの限界

Word2VecやGloVeなどの静的埋め込みが抱える最大の問題は何ですか?

  1. ベクトルの次元数が高すぎる
  2. 多義語の異なる意味を区別できない
  3. 学習に時間がかかりすぎる
  4. メモリを大量に消費する
正解:b

静的埋め込みの最大の問題は、多義語を区別できないことです。

例:

  • “bank”(銀行)も “bank”(川岸)も同じベクトル
  • 文脈を無視して、常に同じベクトルを返す

人間は文脈から意味を判断できますが、 静的埋め込みはそれができません。

問題2:ELMoの特徴

ELMoが静的埋め込みと異なる最も重要な特徴は何ですか?

  1. ベクトルの次元数が大きい
  2. 学習速度が速い
  3. 文脈に応じて異なるベクトルを生成する
  4. メモリ使用量が少ない
正解:c

ELMoの最も重要な特徴は、文脈に応じて異なるベクトルを生成することです。

比較:

  • 静的埋め込み:“bank” → 常に同じベクトル
  • ELMo:“I went to the bank” → 銀行寄りのベクトル
  • ELMo:“river bank” → 川岸寄りのベクトル

これにより、多義語の異なる意味を区別できます。

問題3:双方向LSTMの役割

ELMoが双方向LSTMを使う理由として最も適切なものはどれですか?

  1. 学習速度を向上させるため
  2. 左右両方の文脈情報を活用するため
  3. メモリ使用量を削減するため
  4. ベクトルの次元数を増やすため
正解:b

双方向LSTMの目的は、左右両方の文脈を活用することです。

例:“I went to the bank to withdraw money”

  • Forward LSTM:“I went to the” を見ている
  • Backward LSTM:“to withdraw money” を見ている
  • 両方を統合:“withdraw money” から「銀行」と判断

一方向だけでは文脈が不完全になります。

問題4:ELMoとBERTの関係

ELMoからBERTへの主な改善点として正しくないものはどれですか?

  1. LSTMからTransformerへの変更
  2. 並列化可能になり学習が高速化
  3. 真の双方向処理が可能に
  4. 静的埋め込みに戻った
正解:d

BERTもコンテキスト化された埋め込みです。 静的埋め込みには戻っていません。

ELMo → BERTの改善:

  • a. アーキテクチャ:LSTM → Transformer ✅
  • b. 並列化:LSTMは逐次的 → Transformerは並列化可能 ✅
  • c. 双方向性:別々に処理 → 全単語を同時に見る(真の双方向)✅
  • d. 静的に戻った → 誤り。BERTもコンテキスト化 ❌

📝 STEP 7 のまとめ

✅ このステップで学んだこと
  • 静的埋め込みの限界:多義語を区別できない
  • 多義語の問題:“bank”(銀行/川岸)など同じ単語でも意味が異なる
  • コンテキスト化:文脈に応じて異なるベクトルを生成
  • ELMo:双方向LSTMで文脈を活用(2018年)
  • 双方向の重要性:左右両方の文脈が必要
  • BERTへの橋渡し:コンテキスト化の有効性を証明
💡 NLPの大きな転換点

第1世代(〜2017年):静的埋め込み

  • Word2Vec, GloVe, fastText
  • 単語ごとに固定ベクトル
  • 文脈を無視

第2世代(2018年〜):コンテキスト化埋め込み

  • ELMo, BERT, GPT
  • 文脈で変わるベクトル
  • 多義語を区別可能

ELMoは第2世代のパイオニアとして、 現代NLPの基礎を築きました。

🎯 次のステップの準備

次のSTEP 8では、RNNによるテキスト処理を学びます。

ELMoの基礎となったRNNとLSTMの仕組みを復習し、 実際にテキスト分類タスク(感情分析)を実装していきます。

RNN → LSTM → Transformer への流れを理解することで、 なぜTransformerが革命的だったのかが分かるようになります。

📝

学習メモ

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

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