単語の分散表現とWord2Vec

単語を「意味のあるベクトル」に変換する技術
🔰 初心者

BoWやTF-IDFで単語を数値にできるって学びましたが、もっと良い方法はないんですか?

🎓 上級者

BoWやTF-IDFは単語の「出現回数」だけで表現するから、単語同士の意味の関係がわからないんだ。「犬」と「猫」が似た意味だと表現できない。そこで登場するのが分散表現だよ。まずは2つの表現方法の違いから見ていこう。

🔄 局所表現 vs 分散表現

局所表現(Local Representation)

1つの要素だけで単語を表す
  • 代表例:ワンホットベクトル
  • 単語ごとに1つの次元を割り当て
  • 該当する次元だけ1、他は全部0
  • 単語間の類似度を表現できない
  • 語彙数が増えると次元が爆発的に増加

分散表現(Distributed Representation)

複数の要素の組み合わせで単語を表す
  • 代表例:Word2Vec
  • 低次元(50〜300次元程度)の密なベクトル
  • 各次元が「何らかの意味的特徴」を表す
  • 似た意味の単語が近いベクトルになる
  • 単語間の演算が可能
1️⃣ ワンホットベクトル(One-Hot Vector)
🔰 初心者

ワンホットベクトルって具体的にどういうものですか?

🎓 上級者

語彙の数だけ次元を持つベクトルで、その単語に対応する位置だけ1、残りは全部0にする表現だよ。

ワンホットベクトルの例(語彙 = {猫, 犬, 鳥, 魚}) 猫 = 1 0 0 0 犬 = 0 1 0 0 ワンホットベクトルの問題点 ① 語彙数が増えると次元が爆発(10万語→10万次元) ② ほとんどが0のスパースなベクトル(メモリ非効率) ③ 「猫」と「犬」の類似度が計算できない(内積=0) ワンホットベクトルの限界を解決するのが「分散表現」 低次元の密なベクトルで意味の類似性を表現できる
🧮 分散表現と単語埋め込み
🔰 初心者

分散表現と単語埋め込みって同じものですか?

🎓 上級者

ほぼ同じ意味で使われるよ。分散表現は「単語を低次元の密なベクトルで表す」という概念、単語埋め込み(Word Embedding)はその具体的な手法を指すことが多いんだ。NNの中で使う場合は埋め込み層(Embedding Layer)と呼ぶよ。

用語意味関係
分散表現複数の次元に意味を分散させて単語を表現する概念上位概念
単語埋め込み(Word Embedding)分散表現を得るための具体的な手法群Word2Vec等の総称
埋め込み層(Embedding Layer)NN内でワンホット→分散表現に変換する層NNの部品として使う場合の名前
分散表現のイメージ:似た意味の単語が近くに配置される 次元1(例:動物↔乗り物) 次元2(例:小さい↔大きい) 動物クラスタ 電車 バス 乗り物クラスタ 女王
分散表現の有名な性質

「王」 − 「男」 + 「女」 ≒ 「女王」

単語ベクトルの演算で意味的な関係を表現できる。これが分散表現の最大の特徴。

📚 コーパス
🔰 初心者

分散表現を作るにはどんなデータが必要なんですか?

🎓 上級者

コーパス(Corpus)が必要だよ。コーパスとは、自然言語処理のために収集・整理された大規模なテキストデータのことだ。Wikipedia全文、新聞記事、書籍などが使われるよ。

分布仮説

分散表現の背景にある考え方:「ある単語の意味は、その周辺に出現する単語によって決まる」

例:「〇〇を飲む」の〇〇には「水」「コーヒー」「ジュース」が入る → これらは似た意味の単語
大量のコーパスから周辺語の共起パターンを学習することで、分散表現を獲得する。

⚖️ カウントベース手法 vs 推論ベース手法
🔰 初心者

分散表現を作る方法にはどんな種類がありますか?

🎓 上級者

大きく2つに分かれるよ。コーパス全体の統計情報を使うカウントベースと、NNで学習する推論ベースだ。

カウントベース手法

コーパス全体の統計情報から一括で求める
  • 共起行列を作成: 単語ペアが近くに出現した回数を集計
  • SVD(特異値分解)で次元削減し、低次元の分散表現を得る
  • コーパス全体を一度に処理(バッチ処理)
  • 大規模コーパスでは計算コストが高い

推論ベース手法

NNで周辺語を予測しながら学習する
  • 代表例:Word2Vec
  • コーパスからミニバッチで少しずつ学習
  • 新しいデータが追加されても再学習が容易
  • 大規模コーパスにも対応しやすい
カウントベース手法の流れ コーパス 大量のテキスト 共起行列 単語ペアの共起回数 SVD(特異値分解) 次元削減 分散表現 低次元ベクトル SVDで高次元の共起行列を低次元に圧縮し、重要な情報だけを残す

SVD(Singular Value Decomposition / 特異値分解)

行列を3つの行列の積に分解して次元削減する数学的手法

共起行列は語彙数 × 語彙数の巨大な行列になる。SVDはこれを分解して重要な情報だけを残すことで、低次元の分散表現を得る。

主成分分析(PCA)と似た考え方で、「最も情報を多く含む軸」から順に取り出す。

弱点: 語彙数が大きいと計算コストが非常に高い → 大規模コーパスには推論ベース手法(Word2Vec)が有利

GloVe(Global Vectors for Word Representation)

カウントベースと推論ベースの「いいとこ取り」をした手法(Stanford, 2014年)

仕組み:コーパス全体の共起行列の統計情報を活用しつつ、その情報をNNの学習(最適化)で効率よく分散表現に変換する。カウントベースのグローバルな統計情報と、推論ベースの学習効率の両方を兼ね備えている。

Word2Vecとの違い:Word2Vecは局所的な文脈窓(周辺語)から学習するのに対し、GloVeはコーパス全体の共起統計を直接モデル化する。Word2Vecと同等以上の性能を発揮し、特に大規模コーパスでの学習に強い。

名前の由来:Global Vectors = コーパス全体(グローバル)の統計を使ったベクトル表現

🎯 Word2Vec
🔰 初心者

Word2Vecって具体的にどうやって分散表現を学習するんですか?

🎓 上級者

Word2Vecは推論ベース手法の代表で、2つのモデルがあるんだ。CBOWスキップグラム。どちらもNNを使って「ある単語の周辺にどんな単語が出るか」を予測しながら、分散表現を学習するよ。

CBOW(Continuous Bag of Words)

周辺語から中心語を予測する
  • 入力: 前後の周辺語(文脈)
  • 出力: 中心にある単語を予測
  • 例:「猫 が _____ を 食べた」→「魚」を予測
  • 学習が速い
  • 頻出語に強い

スキップグラム(Skip-gram)

中心語から周辺語を予測する
  • 入力: 中心の単語
  • 出力: 前後の周辺語を予測
  • 例:「魚」→「猫」「が」「を」「食べた」を予測
  • CBOWより精度が高い傾向
  • 低頻出語にも強い
CBOW 周辺語 → 中心語を予測 食べた 入力(周辺語) NN 出力(中心語) スキップグラム 中心語 → 周辺語を予測 入力(中心語) NN 食べた 出力(周辺語) どちらも学習後のNNの重みが単語の分散表現(ベクトル)になる
Word2Vecの覚え方

CBOW:周辺語 → 中心語(Context → Wordの順)
スキップグラム:中心語 → 周辺語(中心語から周辺に「スキップ」するイメージ)

G検定ではスキップグラムの方が精度が高いと覚えておこう。

🔧 埋め込み層(Embedding Layer)
🔰 初心者

埋め込み層ってNNの中でどう使うんですか?

🎓 上級者

埋め込み層は、ワンホットベクトルを入力として受け取り、対応する分散表現のベクトルを出力する層だよ。実質的にはルックアップテーブル(辞書引き)として機能するんだ。

埋め込み層の動作イメージ ワンホットベクトル 「猫」= [1, 0, 0, 0, ...] 高次元・スパース 埋め込み層 重み行列で変換 (学習 or Word2Vecで初期化) 分散表現ベクトル 「猫」= [0.23, -0.51, 0.87, ...] 低次元・密(50〜300次元) Word2Vecの学習済み重みで埋め込み層を初期化する手法も一般的
📊 単語表現手法の全体比較
手法種別特徴弱点
ワンホットベクトル局所表現シンプル。1つの次元で1単語を表す次元爆発、類似度計算不可
BoW / TF-IDF局所表現出現回数 / 重要度でベクトル化語順を無視、次元が大きい
SVD(カウントベース)分散表現共起行列を次元削減して分散表現を得る大規模コーパスで計算コスト大
Word2Vec(推論ベース)分散表現NNで周辺語を予測しながら学習多義語を1つのベクトルで表現
📂 トピックモデル(文書のクラスタリング)
🔰 初心者

ここまでは「単語」をベクトルにする話でしたが、「文書」をグループ分けする方法はありますか?

🎓 上級者

それがトピックモデルだよ。文書の集まりから「どんな話題(トピック)が含まれているか」を自動で発見する教師なし学習の手法だ。文書のクラスタリング(グループ分け)に使われるよ。

トピックモデルの基本的な考え方

1つの文書は複数のトピックが混ざってできている。
例:あるニュース記事は「政治 60%」+「経済 30%」+「外交 10%」のように、複数の話題が混合している。

トピックモデルは、大量の文書からトピック(話題)を自動的に発見し、各文書がどのトピックをどの程度含んでいるかを推定する。

トピックモデルの進化 LSA(潜在的意味解析) 単語×文書の行列を SVDで次元削減 行列分解アプローチ(確率なし) 確率化 pLSA(確率的潜在意味解析) 文書=トピックの確率的な混合 確率モデルに拡張 弱点:新しい文書に対応しにくい ベイズ化 LDA(潜在的ディリクレ配分法) ディリクレ分布を 事前分布として追加 現在最もよく使われるトピックモデル 共通の考え方 「文書 = トピックの混合」「トピック = 単語の出現確率の分布」 文書に直接ラベルを付けずに、潜在的なトピックを自動発見する(教師なし学習)

LSA(Latent Semantic Analysis / 潜在的意味解析)

単語と文書の関係からSVDで潜在的な意味構造を発見する手法

仕組み:単語×文書の行列を作り、SVD(特異値分解)で次元を圧縮して隠れた意味構造を見つける。

前のセクションで学んだ「カウントベース手法 → SVD」の流れを文書レベルに適用したもの。

特徴:確率的なモデルではなく、純粋に行列分解で意味構造を捉える。LSI(Latent Semantic Indexing)とも呼ばれる。

pLSA(Probabilistic LSA / 確率的潜在意味解析)

LSAを確率モデルに拡張し、トピックの混合を確率で表現する手法

改良点:LSAの行列分解を確率モデルに置き換えた。「各文書はいくつかのトピックを確率的に持っていて、各トピックは単語の出現確率で表される」と考える。

弱点:学習データの文書にしか適用できない(新しい文書が来ると対応しにくい=過学習しやすい)。これを解決したのがLDA。

LDA(Latent Dirichlet Allocation / 潜在的ディリクレ配分法)

ディリクレ分布を事前分布として加え、新しい文書にも対応できる最も代表的なトピックモデル

改良点:pLSAにディリクレ分布という事前分布を追加した。これにより、学習データにない新しい文書にも対応できる(汎化性能が高い)。

生成モデル:「文書がどう生成されるか」の確率的プロセスを定義し、それを逆算してトピックを推定する。

現在最もよく使われるトピックモデル

ディリクレ分布とは?

「確率の分布」を生成する確率分布(メタ的な分布)。

LDAでは2つの場面で使われる:
各文書のトピック混合比率の事前分布(「この文書はどのトピックをどの割合で含むか」)
各トピックの単語出現確率の事前分布(「このトピックではどの単語が出やすいか」)

パラメータ(α)が小さいと → 1つのトピックに偏りやすい(スパース)
パラメータが大きいと → 複数のトピックが均等に混ざりやすい

LDAの考え方:文書はこう「生成」される Step 1 ディリクレ分布から トピック比率を決定 Step 2 トピック比率に従って トピックを1つ選ぶ Step 3 選んだトピックの 単語分布から単語を生成 Step 2-3を繰り返す → 文書ができる 具体例:ある記事のトピック比率が「政治 60%、経済 30%、外交 10%」の場合 → 60%の確率で「政治トピック」が選ばれ、そのトピックの単語分布から「選挙」「議会」などが生成される 実際の学習では、この生成プロセスを「逆算」して、文書からトピックを推定する
手法アプローチ特徴弱点
LSA行列分解(SVD)シンプル。SVDで潜在意味を抽出確率的な解釈ができない
pLSA確率モデルトピック混合を確率で表現新しい文書に対応しにくい(過学習)
LDAベイズモデルディリクレ事前分布で汎化性能向上パラメータ調整が必要
📝 まとめ
G検定で押さえるべきポイント