自然言語モデルの発展

Word2Vecの先へ — FastText・Doc2Vec・Seq2Seq・ELMo
🔰 初心者

Word2Vecで単語をベクトルにできるのはわかりましたが、Word2Vecにも弱点はあるんですか?

🎓 上級者

Word2Vecには大きく3つの弱点があるんだ。これらを解決するために様々なモデルが登場したよ。

Word2Vecの3つの弱点

未知語(OOV)に対応できない — 学習時に見なかった単語はベクトル化できない
文書全体の意味を表せない — 単語単位のベクトルしか作れない
多義語を区別できない — 「bank(銀行/土手)」が1つのベクトルになってしまう

Word2Vecの弱点を解決するモデルの進化 Word2Vec 単語→ベクトル FastText ①OOV問題を解決 Doc2Vec ②文書全体をベクトル化 BiRNN 双方向の文脈理解 Seq2Seq 系列→系列の変換 ELMo ③文脈に応じた表現 Word2Vecの3つの弱点を、それぞれ異なるモデルが解決していった
FastText
🔰 初心者

Word2Vecで学習していない新しい単語が出てきたらどうなるんですか?

🎓 上級者

それがOOV(Out-of-Vocabulary / 未知語)問題だよ。Word2Vecでは学習時の語彙にない単語はベクトル化できない。FastTextはこれを解決したんだ。

OOV(Out-of-Vocabulary)問題

学習時の語彙に含まれない未知語を処理できない問題。
例えば「コロナ禍」のような新造語や、「走れ」「走った」のような活用形がすべて別単語扱いになってしまう。
Word2Vecは単語単位で学習するため、未知語にはベクトルが割り当てられない。

Word2Vec

単語をそのまま1つの単位として学習
  • 「走る」「走った」「走れ」は全部別の単語
  • 学習していない単語 → ベクトル化不可能
  • 新語・専門用語に弱い

FastText

単語を「文字のn-gram(部分文字列)」に分解して学習
  • 「走る」→「<走」「走る」「る>」等の部品に分解
  • 未知語でも部品の組み合わせでベクトル化可能
  • 活用形・新語・誤字にも対応
FastTextのサブワード分解のイメージ 「where」 ↓ 文字n-gramに分解(n=3の場合) <wh whe her ere re> <where> 各部品のベクトルの合計が単語のベクトルになる → 未知語でも部品から推定可能

FastText(Facebook / Meta、2016年)

サブワード(文字n-gram)を活用してOOV問題を解決した単語分散表現モデル

仕組み:単語を文字レベルの部品(サブワード)に分解し、各部品のベクトルの合計で単語を表現する。

メリット:

  • 未知語でも部品の組み合わせでベクトル化できる(OOV問題を解決)
  • 活用形・派生語が共通の部品を共有するため、語形変化に強い
  • 誤字・スペルミスにもある程度対応できる

学習方法:Word2Vecと同じくCBOWとスキップグラムに対応。

📄 Doc2Vec
🔰 初心者

Word2Vecは単語のベクトルですよね。文書全体を1つのベクトルにできないんですか?

🎓 上級者

Doc2Vec(Paragraph Vector)がまさにそれだよ。Word2Vecのアイデアを拡張して、文書全体を1つの固定長ベクトルにできるんだ。

Word2Vec

単語 → ベクトル
  • 1つの単語に1つのベクトル
  • 文書全体を扱うには工夫が必要
  • (単語ベクトルの平均を取る等)

Doc2Vec

文書 → ベクトル
  • 文書全体に1つのベクトルを割り当て
  • 文書の意味をまるごと捉えられる
  • 文書分類・類似文書検索に有用
Doc2Vecの仕組み:Word2Vecに「文書ID」を追加 Word2Vec(CBOW) 周辺語1 周辺語2 周辺語3 NN 中心語 Doc2Vec(PV-DM) 周辺語1 周辺語2 周辺語3 文書ID NN 中心語 ↑ CBOWの入力に「文書ID」を追加 → 文書ベクトルを学習

Doc2Vec / Paragraph Vector(Le & Mikolov、2014年)

Word2Vecを拡張して文書全体を固定長のベクトルに変換するモデル

仕組み:CBOWの入力に「文書ID」を追加して、周辺語+文書情報から中心語を予測する。学習後、文書IDのベクトルが文書全体の意味を表す。

用途:文書分類、類似文書の検索、文書のクラスタリング

🔄 双方向RNN(BiRNN)
🔰 初心者

RNNは前の単語から順に処理しますよね。でも文の意味って後ろの単語も重要じゃないですか?

🎓 上級者

その通り!通常のRNNは左→右(順方向)にしか情報を伝えられない。でも「彼は___を飲んだ」の空欄を埋めるには、右側の「飲んだ」という情報も必要だよね。そこでBiRNN(双方向RNN)が登場したんだ。

双方向RNN(BiRNN)の構造 入力(単語の系列) 順方向→ h→₁ h→₂ h→₃ h→₄ ←逆方向 h←₁ h←₂ h←₃ h←₄ 出力(順方向+逆方向を結合) [h→₁ ; h←₁] [h→₂ ; h←₂] [h→₃ ; h←₃] [h→₄ ; h←₄] 各位置で「左からの文脈」と「右からの文脈」の両方を考慮できる

BiRNN(Bidirectional RNN / 双方向RNN)

順方向と逆方向の2つのRNNを並列に走らせ、両方の隠れ状態を結合する手法

仕組み:同じ入力系列に対して、左→右(順方向)と右→左(逆方向)の2つのRNNを走らせる。各位置で両方の隠れ状態を結合して出力する。

メリット:各単語が「前の文脈」だけでなく「後ろの文脈」も考慮できるため、文の理解度が大幅に向上。

応用:BiLSTM(双方向LSTM)としてELMoやNERタスクなどで広く使用される。

🔗 Encoder-Decoder / Seq2Seq
🔰 初心者

機械翻訳って、入力が英語で出力が日本語ですよね。入力と出力の長さが違うのに、RNNで対応できるんですか?

🎓 上級者

普通のRNNでは難しい。そこでEncoder-Decoder(エンコーダー・デコーダー)モデルが登場したんだ。Seq2Seq(Sequence to Sequence)とも呼ばれるよ。

Seq2Seq(Encoder-Decoder)モデルの構造 エンコーダー(Encoder) 入力系列を「文脈ベクトル」に圧縮 RNN RNN RNN I am a cat 文脈 ベクトル デコーダー(Decoder) 文脈ベクトルから出力系列を生成 RNN RNN RNN 私は です 入力と出力の長さが異なっていてもOK → 機械翻訳・要約・対話など幅広く活用

Seq2Seq / Encoder-Decoder モデル(Sutskever et al., 2014年)

入力系列を固定長の文脈ベクトルに圧縮し、そこから出力系列を生成するモデル

エンコーダー:入力系列(例:英語の文)をRNN/LSTMで処理し、最後の隠れ状態を文脈ベクトルとして出力。文の意味を1つのベクトルに圧縮する。

デコーダー:文脈ベクトルを受け取り、RNN/LSTMで出力系列(例:日本語の文)を1単語ずつ生成する。

用途:機械翻訳、文章要約、対話システム、質問応答

弱点:長い文の情報を1つの文脈ベクトルに押し込むため、長文で情報が失われやすい → Attention機構で解決(後に発展)

🌐 GNMT(Google Neural Machine Translation)
🔰 初心者

Seq2Seqモデルが翻訳に使えるのはわかりましたが、実際のGoogle翻訳にもこの仕組みが使われているんですか?

🎓 上級者

Google翻訳は2016年にGNMT(Google Neural Machine Translation)という、Seq2Seqを大幅に強化したモデルに切り替えたんだ。これにより翻訳品質が劇的に向上したよ。

GNMTの構成:Seq2Seq + Attention + 深い層 エンコーダー 8層のLSTM (第1層はBiLSTM) 残差接続で勾配消失を防止 Attention機構 入力の各単語への 「注目度」を計算 デコーダー 8層のLSTM Attentionの情報を使って 1単語ずつ生成 Attention機構により、長文でもどの入力単語に注目すべきかを学習 → 翻訳品質が大幅向上

GNMT(Google Neural Machine Translation / Google, 2016年)

Seq2SeqにAttention機構と深い層を追加し、Google翻訳を劇的に改善したモデル

構成:8層のLSTMエンコーダー(第1層はBiLSTM)+ Attention機構 + 8層のLSTMデコーダー

Attention機構:Seq2Seqの弱点(長い文の情報が文脈ベクトル1つに圧縮されて失われる問題)を解決。デコーダーが出力を生成するたびに、入力のどの単語に注目すべきかを動的に決定する。

その他の工夫:

  • 残差接続:ResNetと同じ仕組みで、深い層でも学習を安定させる
  • Wordpiece:単語をサブワード単位に分割してOOV問題にも対応

成果:従来のフレーズベース統計翻訳から大幅に翻訳品質が向上し、Google翻訳に実装された。

Attention機構とは?

翻訳時に「入力文のどの部分に注目すべきか」を自動的に学習する仕組み。

例:「I love cats」→「私は猫が好きです」を翻訳するとき
・「猫」を出力する時 → 入力の「cats」に高い注目度
・「好き」を出力する時 → 入力の「love」に高い注目度

文脈ベクトル1つに圧縮するのではなく、毎回入力全体を参照できるため、長文でも情報が失われにくい。
この考え方はその後のTransformerの基盤になった。

🧠 ELMo
🔰 初心者

Word2Vecだと「bank」が銀行でも土手でも同じベクトルになっちゃうんですよね。文脈に応じて変わるようにはできないんですか?

🎓 上級者

それを実現したのがELMoだよ。Word2Vecは学習後にベクトルが固定される「静的な表現」だけど、ELMoは文脈に応じてベクトルが変わる「動的な表現」なんだ。これを文脈化された単語表現と呼ぶよ。

Word2Vec(静的な表現)

1つの単語 = 常に同じベクトル
  • 「bank」は常に1つのベクトル
  • 文脈を考慮しない
  • 多義語の区別ができない

ELMo(文脈化された表現)

同じ単語でも文脈によって異なるベクトル
  • 「I went to the bank」→ 銀行のベクトル
  • 「river bank」→ 土手のベクトル
  • 前後の文脈を考慮してベクトルが変わる
ELMoの仕組み:双方向LSTMの多層出力を重み付け結合 入力文:「 I went to the bank 」 BiLSTM 第1層(構文的な特徴) → 品詞・構文の情報を捉える BiLSTM 第2層(意味的な特徴) → 単語の意味・文脈を捉える ELMo表現 = 全層の出力を重み付けして結合 → 文脈に応じたベクトル

ELMo(Embeddings from Language Models / Peters et al., 2018年)

双方向LSTMを使って文脈に応じた動的な単語表現を生成するモデル

仕組み:大規模コーパスで事前学習した双方向LSTM(BiLSTM)の各層の出力を重み付けして結合することで、文脈に応じた単語ベクトルを生成する。

特徴:

  • 浅い層 → 構文的な特徴(品詞など)を捉える
  • 深い層 → 意味的な特徴(多義語の意味など)を捉える
  • 全層を重み付けして結合 → タスクに最適な表現を自動で獲得

意義:事前学習+ファインチューニング」パラダイムの先駆け。この後のBERTやGPTにつながる重要なモデル。

📊 モデル全体比較
モデル解決した課題アプローチ特徴
FastTextOOV(未知語)問題サブワード(文字n-gram)未知語・活用形に対応可能
Doc2Vec文書レベルの表現Word2Vec+文書ID文書全体を固定長ベクトルに
BiRNN片方向の文脈しか見れない順方向+逆方向のRNNを結合前後両方の文脈を考慮
Seq2Seq入出力の長さが異なるタスクエンコーダー+デコーダー翻訳・要約・対話に活用
GNMT長文の翻訳品質Seq2Seq+Attention+深い層Google翻訳に実装。Attention機構で長文にも対応
ELMo多義語(文脈依存の意味)双方向LSTMの多層出力文脈に応じた動的なベクトル
📝 まとめ
G検定で押さえるべきポイント