コサイン類似度(Cosine Similarity)は、ベクトル間の類似度を測定するための指標であり、特に高次元空間におけるデータの類似性を評価する際に広く用いられています。大規模言語モデル(LLM: Large Language Models)においても、コサイン類似度はテキストデータの解析や応用において重要な役割を果たしています。本稿では、コサイン類似度の基礎から応用、LLMにおける具体的な利用方法、メリットとデメリット、さらには関連する概念や技術について、解説していきます。
1. コサイン類似度の基礎概念
1.1 ベクトル空間モデル
コサイン類似度は、ベクトル空間モデル(Vector Space Model, VSM)に基づいています。VSMは、テキストデータを数値ベクトルとして表現し、そのベクトル間の関係性を解析する手法です。各単語や文書は、高次元の空間における点として表され、これにより数学的な手法を用いた解析が可能となります。
1.2 コサイン類似度の定義
コサイン類似度は、2つのベクトル間の角度の余弦を用いて類似度を測定します。具体的には、以下の式で定義されます:
\[
\text{Cosine Similarity} (\mathbf{A}, \mathbf{B}) = \frac{\mathbf{A} \cdot \mathbf{B}}{|\mathbf{A}| |\mathbf{B}|}
\]
ここで、
- \(\mathbf{A} \cdot \mathbf{B}\) はベクトルの内積
- \(|\mathbf{A}|\) および \(|\mathbf{B}|\) は各ベクトルのノルム(長さ)
コサイン類似度は、値が -1 から 1 の範囲を取り、1 に近いほど2つのベクトルは方向が類似しており、0 に近いほど無関係、-1 に近いほど逆方向を向いていることを示します。実際のテキストデータでは、ベクトルの要素が非負であるため、コサイン類似度は 0 から 1 の範囲に収まることが一般的です。
1.3 具体例
例えば、単純な2次元ベクトル \(\mathbf{A} = [1, 2]\) と \(\mathbf{B} = [2, 4]\) を考えます。この場合、
\[
\mathbf{A} \cdot \mathbf{B} = (1 \times 2) + (2 \times 4) = 2 + 8 = 10
\]
\[
|\mathbf{A}| = \sqrt{1^2 + 2^2} = \sqrt{1 + 4} = \sqrt{5} \approx 2.236
\]
\[
|\mathbf{B}| = \sqrt{2^2 + 4^2} = \sqrt{4 + 16} = \sqrt{20} \approx 4.472
\]
\[
\text{Cosine Similarity} (\mathbf{A}, \mathbf{B}) = \frac{10}{2.236 \times 4.472} = \frac{10}{10} = 1
\]
この結果、2つのベクトルは完全に同じ方向を向いており、コサイン類似度は 1 となります。
1.4 ベクトルの方向と長さの具体例
ベクトルの方向と長さの違いを具体的に理解するために、次の例を考えます。
例えば、2つのベクトル \(\mathbf{A} = [1, 1]\) と \(\mathbf{B} = [2, 2]\) を見てみましょう。
- 方向: \(\mathbf{A}\) と \(\mathbf{B}\) は同じ方向を向いています。これは、ベクトルが平行であり、互いに同じ比率で拡大・縮小されたものであるためです。この場合、ベクトルが指し示す方向は同じですが、大きさ(長さ)は異なります。
- 長さ: ベクトルの長さ、つまりノルムを計算すると、\(|\mathbf{A}| = \sqrt{1^2 + 1^2} = \sqrt{2} \approx 1.414)、(|\mathbf{B}| = \sqrt{2^2 + 2^2} = \sqrt{8} \approx 2.828\) となります。ベクトル \(\mathbf{B}\) はベクトル \(\mathbf{A}\) よりも長いですが、方向は同じです。
このように、コサイン類似度はベクトルの方向(角度)を基に類似度を計算するため、ベクトルの長さが異なっていても方向が同じであればコサイン類似度は 1 になります。例えば、\(\mathbf{A}\) と \(\mathbf{B}\) のコサイン類似度を計算すると、内積は \((1 \times 2) + (1 \times 2) = 4\)、ノルムの積は \((\sqrt{2}) \times (\sqrt{8}) = \sqrt{16} = 4\) となり、結果的にコサイン類似度は 1 です。
1.4.1 方向が同じで長さが違う例
方向が同じで長さが違うベクトルの例として、上記の \(\mathbf{A} = [1, 1]\) と \(\mathbf{B} = [2, 2]\) があります。このようなベクトルは互いに同じ方向を向いていますが、長さが異なるため、ベクトルの大きさに違いがあります。これは、例えば同じ方向に向けて別々の力を加えるシナリオ(2倍の力を加えるなど)をイメージすることで理解できます。
1.4.2 方向も長さも同じ例
方向も長さも同じベクトルの例として、\(\mathbf{A} = [1, 1]\) と \(\mathbf{B} = [1, 1]\) のようなベクトルが挙げられます。この2つのベクトルは、同じ方向に同じ大きさで向いているため、完全に重なり合っています。例えば、同じ強さで同じ方向に進む2つの物体を考えるとわかりやすいでしょう。
1.4.3 方向が違っていて長さが同じ例
方向が違っていて、長さが同じベクトルの例として、\(\mathbf{A} = [1, 0]\) と \(\mathbf{B} = [0, 1]\) があります。この場合、\(|\mathbf{A}| = |\mathbf{B}| = 1\) ですが、\(\mathbf{A}\) はx軸上にあり、\(\mathbf{B}\) はy軸上にあります。つまり、長さは同じでも互いに直交している(90度の角度を持つ)ため、方向は異なります。これは例えば、東に進む車と北に進む車のように、進む距離は同じでも進行方向が異なる状況を想像することで理解できます。
1.5 トークンベースの具体例
LLMでテキストを扱う際には、トークンと呼ばれる単位に分割してベクトル化します。例えば、「猫が歩いている」という文を考えます。この文を以下のようにトークン化し、それぞれを埋め込みベクトルに変換するとします。
- トークン化: 「猫」、「が」、「歩いて」、「いる」
- 埋め込みベクトル:
- 「猫」: \(\mathbf{V}_{ \text{猫}} = [0.1, 0.3, 0.5, 0.2]\)
- 「が」: \(\mathbf{V}_{ \text{が}} = [0.05, 0.02, 0.1, 0.03]\)
- 「歩いて」: \(\mathbf{V}_{ \text{歩いて}} = [0.4, 0.3, 0.6, 0.7]\)
- 「いる」: \(\mathbf{V}_{ \text{いる}} = [0.2, 0.1, 0.3, 0.4]\)
この4つのトークンをベクトル化し、それぞれのトークン間の類似度をコサイン類似度で計算することができます。例えば、「猫」と「歩いて」のコサイン類似度を計算する場合:
\[ \mathbf{V}_{\text{猫}} \cdot \mathbf{V}_{\text{歩いて}} = (0.1 \times 0.4) + (0.3 \times 0.3) + (0.5 \times 0.6) + (0.2 \times 0.7) = 0.04 + 0.09 + 0.3 + 0.14 = 0.57 \]
\[
|\mathbf{V}_{ \text{猫}}| = \sqrt{0.1^2 + 0.3^2 + 0.5^2 + 0.2^2} = \sqrt{0.01 + 0.09 + 0.25 + 0.04} = \sqrt{0.39} \approx 0.624
\]
\[
|\mathbf{V}_{ \text{歩いて}}| = \sqrt{0.4^2 + 0.3^2 + 0.6^2 + 0.7^2} = \sqrt{0.16 + 0.09 + 0.36 + 0.49} = \sqrt{1.1} \approx 1.049
\]
\[ \text{Cosine Similarity} (\mathbf{V}_{\text{猫}}, \mathbf{V}_{\text{歩いて}}) = \frac{0.57}{0.624 \times 1.049} \approx \frac{0.57}{0.654} \approx 0.871 \]
このように、埋め込みベクトルを用いたトークン間のコサイン類似度を計算することで、トークン同士の意味的な関連性を数値として捉えることができます。この結果から、「猫」と「歩いて」はある程度関連性があることがわかります。
2. コサイン類似度の計算方法
2.1 ベクトルの表現
コサイン類似度を計算するためには、まず対象となるテキストをベクトルとして表現する必要があります。このベクトル化には以下のような手法が用いられます:
- Bag of Words(BoW): 各単語の出現回数をカウントし、ベクトルの要素とする方法。
- TF-IDF(Term Frequency-Inverse Document Frequency): 単語の重要度を考慮した重み付けを行う方法。
- Word Embeddings(単語埋め込み): 単語を低次元の連続空間にマッピングする方法(例:Word2Vec、GloVe)。
- 文・文書埋め込み: 文や文書全体をベクトル化する方法(例:Doc2Vec、Sentence-BERT)。
LLMでは、通常、Transformerベースのモデルを用いて高次元かつ文脈依存の埋め込みベクトルを生成します。これにより、単語や文の意味的な関係性が反映されたベクトルが得られます。
2.2 計算ステップ
コサイン類似度を計算する具体的な手順は以下の通りです:
- ベクトルの取得: 比較対象となる2つのテキスト(例:文書、単語)のベクトルを取得します。
- 内積の計算: 2つのベクトルの内積を計算します。
- ノルムの計算: 各ベクトルのノルム(長さ)を計算します。
- 類似度の算出: 内積を各ベクトルのノルムの積で割り、コサイン類似度を算出します。
3. 大規模言語モデル(LLM)におけるコサイン類似度の応用
3.1 テキストの類似性評価
LLMはテキストデータを高次元のベクトルとして表現するため、コサイン類似度を用いて異なるテキスト間の類似性を評価することが可能です。例えば、質問応答システムにおいて、ユーザーの質問とデータベース内の既存の質問との類似度を計算し、最も適切な回答を提供する際に利用されます。
3.2 クラスタリングと分類
LLMによって生成されたテキストの埋め込みベクトルを基に、コサイン類似度を用いてデータのクラスタリングや分類を行うことができます。類似度の高いベクトル同士を同一クラスタに分類することで、テーマやトピックに基づいたグルーピングが可能となります。
3.3 検索エンジンと情報検索
検索エンジンにおいて、ユーザーのクエリと文書のベクトル間のコサイン類似度を計算し、最も関連性の高い文書を上位に表示する際に利用されます。これにより、ユーザーの意図に即した検索結果を提供することが可能です。
3.4 推薦システム
推薦システムでは、ユーザーの過去の行動や嗜好をベクトルとして表現し、他のユーザーやアイテムとのコサイン類似度を計算することで、関連性の高いアイテムを推薦することができます。
3.5 意味的な類似性の理解
LLMは文脈依存の埋め込みを生成するため、単なる表面的な類似性だけでなく、意味的な類似性を評価することが可能です。コサイン類似度を用いることで、異なる表現であっても意味的に類似したテキストを検出することができます。
4. コサイン類似度の利点と欠点
4.1 利点
- 計算の容易さ: コサイン類似度は計算が簡単であり、効率的に類似度を測定することができます。
- 高次元データへの適用性: 高次元空間においても性能を発揮し、特にテキストデータのような高次元ベクトルに適しています。
- ベクトルの大きさに依存しない: コサイン類似度はベクトルの方向性に基づくため、ベクトルの大きさ(ノルム)に依存せず、テキストの長さや頻度の違いを補正します。
- 意味的な類似性の評価: 特に埋め込みベクトルを用いる場合、コサイン類似度は意味的な類似性を効果的に評価します。
4.2 欠点
- 角度に基づく評価: コサイン類似度はベクトル間の角度を基に評価するため、同じ方向を向いていても大きさが異なる場合の違いを捉えにくい場合があります。
- 疎なベクトルへの感度: 高次元かつ疎なベクトルでは、ノイズや無関係な特徴の影響を受けやすく、類似度の評価が不安定になることがあります。
- 非線形な関係の無視: コサイン類似度は線形な関係性しか捉えられないため、非線形な関係性を持つデータには適用しづらい場合があります。
- ベクトルの前処理の影響: ベクトル化の方法や前処理の違いによって、類似度の結果が大きく変わる可能性があります。
5. まとめ
コサイン類似度は、ベクトル間の類似度を効率的かつ効果的に測定するための強力な指標であり、特に大規模言語モデルにおいては、テキストデータの解析や応用において欠かせない役割を果たしています。高次元空間におけるデータの類似性評価、クラスタリング、情報検索、推薦システムなど、多岐にわたる応用が可能です。一方で、文脈依存性や高次元データの疎性、非線形な関係性の無視といった限界も存在します。これらの課題を克服するために、埋め込みベクトルの質の向上や次元削減手法の活用、ハイブリッドな類似度評価手法の導入など、様々な改善手法が提案されています。



