自然言語処理における分散表現とは:単語をベクトルで表現する

こんにちは。ゆうせいです。

自然言語処理(Natural Language Processing、NLP)を学ぶ際、「分散表現」という概念が何度も登場します。Word2VecやGloVe、BERTといった話題のモデルもすべて、この分散表現を基礎としています。しかし、「単語をベクトルで表現する」という説明だけでは、なぜそれが必要なのか、従来の方法の何が問題だったのかについて、ピンとこない人も多いでしょう。本記事では、分散表現の定義から、その重要性、具体的な実装例までを、わかりやすく解説します。

分散表現とは何か

分散表現とは、言葉(単語)の意味を、複数の次元を持つベクトル(配列)で表現する手法です。

例えば、「犬」という単語を、以下のような300次元のベクトルで表すということです。

[0.2, -0.5, 0.8, 1.2, -0.3, ..., 0.1](計300個の数値)

各次元の数値が何を意味するかは、人間が直接的に理解できるわけではありません。しかし、機械学習モデルは、このベクトルの各要素を意味的な特徴として処理するのです。

重要なのは、単語の意味が「複数の次元に分散した形」で表現されているという点です。ここから「分散表現」という名前が来ています。

従来の表現方法:ワンホット表現

分散表現が登場する前、自然言語処理では「ワンホット表現」が一般的でした。

ワンホット表現とは、単語を one-hot ベクトルで表現する方法です。例えば、語彙に「犬」「猫」「走る」「食べる」の4語が含まれる場合、

犬 :[1, 0, 0, 0]
猫 :[0, 1, 0, 0]
走る:[0, 0, 1, 0]
食べる:[0, 0, 0, 1]

というように、その単語に対応する位置だけが1で、他はすべて0になります。

ワンホット表現は単純で実装しやすいという利点があります。しかし、大きな欠点があります。

ワンホット表現の問題点

ワンホット表現には、以下のような根本的な問題があります。

  1. 次元数が膨大になる

語彙に100万語あれば、各ベクトルは100万次元になります。自然言語処理では語彙が数百万に達することも珍しくなく、これはメモリと計算量の浪費です。

  1. 意味的な関係を表現できない

ワンホット表現では、単語同士の距離や類似性を計算しにくいのです。例えば、「犬」と「猫」は意味的に似ている(両方とも動物)にもかかわらず、ベクトルとしては [1,0,0,0] と [0,1,0,0] で、内積は0です。

一方、「犬」と「走る」のように意味が全く異なるペアも、内積は0になってしまいます。つまり、ワンホット表現では、すべての異なる単語間の距離が等しく見えるのです。

  1. 類推ができない

ワンホット表現では、「王 - 男 + 女 = 女王」というような意味的な関係を数式で表現することができません。

分散表現が解決すること

分散表現は、これらの問題をすべて解決します。

  1. 次元数を削減できる

分散表現では、通常100〜300次元程度のベクトルで十分です。100万語の語彙でも、各単語を300次元で表現できるため、計算効率が圧倒的に向上します。

  1. 意味的な関係を捉える

同じ文脈に現れやすい単語は、似たベクトルになるように学習されます。その結果、「犬」と「猫」のベクトルは類似度が高くなり、一方「犬」と「走る」は低くなります。

例えば、Word2Vecで学習した場合、「犬」のベクトルと「猫」のベクトルの内積(コサイン類似度)は0.7程度の高い値になるのです。

  1. 類推ができる

分散表現の性質を利用すると、以下のような計算が可能になります。

king_vector - man_vector + woman_vector ≈ queen_vector

意味的な類推をベクトル演算で表現できるようになるのです。

具体例で理解する

単語を2次元ベクトルで表現した例を考えてみます(実際には300次元ですが、図示のため2次元にしています)。

横軸を「動作性」(動詞度)、縦軸を「具体性」(物体度)とする二次元の空間があるとします。

犬  :[0.8, 0.9](具体的な動物、動きもある)
猫  :[0.7, 0.85](犬に似ている)
走る :[0.2, 0.1](動作で、抽象的)
美しい:[0.1, 0.05](形容詞で、さらに抽象的)

この空間では、意味的に似た単語は近い位置に配置されます。「犬」と「猫」の距離は小さく、「犬」と「走る」の距離は大きいのです。

分散表現の学習方法

分散表現がどのように学習されるかは、複数の手法があります。

Word2Vecは、大量のテキストコーパスから、「単語がどんな文脈に現れるか」という情報を学習することで、分散表現を獲得します。基本的な考え方は「同じ文脈に現れやすい単語は似た意味を持つ」という仮説です。

例えば、文「犬は走る速度が速い」と「猫は走る速度が速い」という二つの文があれば、Word2Vecは「犬と猫は同じ文脈(走る速度が~)に現れるから、似た単語だ」と判断し、両者のベクトルを近づけるように学習します。

GloVeは、Word2Vecの考え方を発展させたもので、単語同時出現行列(co-occurrence matrix)という統計情報を利用して、より効率的に分散表現を獲得します。

BERT のような深層学習モデルでは、大量のテキストから「次の単語を予測する」「マスクされた単語を復元する」といったタスクを通じて、より洗練された分散表現を学習します。

分散表現の性質

学習された分散表現には、以下のような興味深い性質があります。

線形性:ベクトル演算で意味的な関係を表現できます。

king - man + woman ≈ queen
Tokyo - Japan + France ≈ Paris

このような類推が可能になるのは、分散表現が連続的な意味空間に単語を埋め込んでいるからです。

類似性:コサイン類似度で単語の意味的な近さを測ることができます。

類似度 = (ベクトルAとベクトルBの内積) / (|ベクトルA| × |ベクトルB|)

値が1に近いほど似ている、0に近いほど無関係、-1に近いほど正反対です。

可合成性(compositionality):複数の単語の意味を組み合わせるとき、ベクトルを足し合わせることで、その組み合わせの意味に近いベクトルが得られることが多いです。

「美しい」のベクトル + 「犬」のベクトル ≈ 「美しい犬」の意味に近いベクトル

分散表現の応用

分散表現は、自然言語処理のあらゆる場面で活用されています。

単語の類似度計算:「このテキストに最も似た単語は何か」といった検索やレコメンデーション。

文書分類:分散表現を平均化して文書ベクトルを作り、テキスト分類を行う。

感情分析:各単語の分散表現から、テキスト全体の感情を推定する。

機械翻訳:異なる言語の分散表現を同じ空間に射影(マッピング)することで、言語間の対応を学習する。

質問応答システム:質問と回答候補の分散表現を比較して、最適な回答を選ぶ。

分散表現と深層学習

分散表現は、深層学習が自然言語処理を革命的に進歩させた重要な要素です。

従来の機械学習では、人間が手作業で特徴を設計していました(特徴エンジニアリング)。一方、分散表現を使うことで、大量のテキストから自動的に意味的な特徴が学習されるようになったのです。

さらに、Transformer や BERT といったモデルでは、文脈に応じて同じ単語でも異なる分散表現を持つ「文脈的な分散表現」が学習されるようになり、より精密な意味理解が可能になっています。

まとめ

分散表現とは、単語の意味を複数の次元に分散させたベクトルで表現する手法です。

従来のワンホット表現と比べて、次元数が少なくて済む、単語間の意味的な関係を保持できる、ベクトル演算で類推ができるという利点があります。

Word2Vec、GloVe、BERTなど、様々な学習方法があり、「同じ文脈に現れる単語は似た意味を持つ」という仮説に基づいて、大量のテキストコーパスから自動的に学習されます。

分散表現を理解することは、現代の自然言語処理技術を理解する上での基礎になります。

次のステップとして、gensimやscikit-learnといったライブラリを使って、実際にWord2Vecを訓練したり、学習済みモデルで単語の類似度や類推を計算したりすることをお勧めします。その実験を通じて、分散表現がどのように機能しているかを、体験的に理解できるようになるでしょう。

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
海外放浪の末、2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。

学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。