AI・数学入門:コサイン類似度はなぜ「単位ベクトルの内積」と同じなのか?

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

新人エンジニアとしてAIやデータ分析の勉強を始めると、「コサイン類似度(Cosine Similarity)」という言葉を本当によく耳にしますよね。

そして、同時に「コサイン類似度とは、ベクトルを単位ベクトル化(正規化)してから内積をとったもの」という説明もよく聞くはずです。

「...え、なんでその2つが同じなの?」

「そもそも、なんでそんな面倒なことをするの?」

そんな疑問を抱えているあなたのために、今日はこの2つが数学的に全く同じであることを数式でスッキリ証明しちゃいます!

さらに、なぜAIの世界ではベクトルの「大きさ」をあえて無視して「方向」だけを見たいのか、その理由も具体的な例でしっかり解説しますよ。


証明:「コサイン類似度」と「単位ベクトルの内積」が等しい理由

「数学」と聞くと身構えてしまうかもしれませんが、大丈夫。一つ一つ順番に見れば、とってもシンプルです。

まず、比較したい2つのベクトル、 \vec{a} \vec{b} があるとしましょう。

A. コサイン類似度の「定義」を確認しよう

まず、教科書に載っているコサイン類似度 \cos(\theta) の「標準的な公式」はこれです。

$\cos(\theta) = \frac{\vec{a} \cdot \vec{b}}{|\vec{a}| |\vec{b}|} $

それぞれの記号の意味はこうなっています。

  • \vec{a} \cdot \vec{b} : \vec{a} \vec{b} の「内積(ないせき)」です。英語では Dot Product と呼ばれます。
  • |\vec{a}| : \vec{a} の「大きさ(長さ)」です。Magnitude(マグニチュード)やNorm(ノルム)と呼ばれます。
  • |\vec{b}| : \vec{b} の「大きさ(長さ)」ですね。

この式は、「2つのベクトルの内積を、それぞれの大きさ(長さ)の積で割る」ことを意味しています。

これがコサイン類似度を計算する「普通の」やり方です。

B. 「単位ベクトル化してから内積」を計算してみよう

次に、あなたが疑問に思っている「ベクトルを単位ベクトル化してから内積を取る」操作を、そのまま数式にしてみましょう。

1. \vec{a} の単位ベクトル \vec{a'} を求める

まず「単位ベクトル」とは何でしょうか?

これは「大きさが1のベクトル」のことです。向きは元のベクトルと全く同じですが、長さだけが 1 になっているベクトルのことですね。

作り方は簡単で、元のベクトル \vec{a} を、その大きさ |\vec{a}| で割ってあげれば作れます。

$\vec{a'} = \frac{\vec{a}}{|\vec{a}|} $

2. \vec{b} の単位ベクトル \vec{b'} を求める

\vec{b} も同じです。 \vec{b} をその大きさ |\vec{b}| で割ります。

$\vec{b'} = \frac{\vec{b}}{|\vec{b}|} $

3. 単位ベクトル \vec{a'} \vec{b'} の内積を計算する

準備ができました。この2つの単位ベクトルの内積 \vec{a'} \cdot \vec{b'} を計算してみましょう。

$\vec{a'} \cdot \vec{b'} = \left( \frac{\vec{a}}{|\vec{a}|} \right) \cdot \left( \frac{\vec{b}}{|\vec{b}|} \right) $

この計算では、 |\vec{a}| |\vec{b}| も、ただの数値(専門用語でスカラーと呼びます)です。

内積の計算では、スカラーは自由に分母や分子にまとめることができます。

なので、分母を |\vec{a}| |\vec{b}| として、分子を \vec{a} \cdot \vec{b} としてまとめることができます。

$\vec{a'} \cdot \vec{b'} = \frac{\vec{a} \cdot \vec{b}}{|\vec{a}| |\vec{b}|} $

結論:2つの式が完全に一致!

さあ、AとBの最終結果を見比べてみてください!

  • A(コサイン類似度の公式): \cos(\theta) = \frac{\vec{a} \cdot \vec{b}}{|\vec{a}| |\vec{b}|}
  • B(単位ベクトルの内積): \vec{a'} \cdot \vec{b'} = \frac{\vec{a} \cdot \vec{b}}{|\vec{a}| |\vec{b}|}

...どうでしょう?

見事に、2つの式が完全に一致しましたね!

これが、「コサイン類似度を計算すること」と「両方のベクトルを単位ベクトル(長さ1)に正規化してから内積を計算すること」が、数学的に全く同じ(等価)である理由です。

スッキリしましたか?


「大きさ」を無視して「方向」だけを見る仕組み

数式で同じになることは分かりました。

では、直感的には、なぜこの操作がベクトルの「大きさ」を無視して「方向」だけを見ることになるのでしょうか?

単位ベクトル化 = 長さを強制的に「1」に揃える

「単位ベクトル化」という操作は、さっきも説明した通り、ベクトルの「方向」は一切変えずに、その「長さ(大きさ)」だけを強制的に 1 に縮めたり伸ばしたりする操作です。

どんなに長いベクトルも、どんなに短いベクトルも、全て「長さ1」のベクトルに作り変えてしまうわけです。

全てのベクトルを、原点(0,0)から半径1の円(3次元なら球)の表面に、ぐいっとマッピングするイメージですね。

長さが「1」だと、内積は「コサイン」そのものになる

ここで、中学校や高校で習った「内積のもう一つの定義(幾何学的な定義)」を思い出してみましょう。

こんな式、見覚えがありませんか?

$\vec{a} \cdot \vec{b} = |\vec{a}| |\vec{b}| \cos(\theta) $

この式は、「2つのベクトルの内積は、2つのベクトルの大きさの積に、間の角度のコサイン \cos(\theta) を掛けたもの」という意味でした。

では、もし、 \vec{a} \vec{b} が両方とも単位ベクトル(つまり |\vec{a}| = 1 かつ |\vec{b}| = 1 )だったら、この式はどうなるでしょうか?

さっき作った単位ベクトル \vec{a'} \vec{b'} を使ってみましょう。

$\vec{a'} \cdot \vec{b'} = |\vec{a'}| |\vec{b'}| \cos(\theta) $

|\vec{a'}| |\vec{b'}| も、どちらも 1 ですから...

$\vec{a'} \cdot \vec{b'} = (1) \cdot (1) \cdot \cos(\theta) $

$\vec{a'} \cdot \vec{b'} = \cos(\theta) $

すごい!

単位ベクトル同士の内積を計算すると、間の角度のコサイン \cos(\theta) そのものが出てきました。

ベクトルの「大きさ」という要素が (1) \cdot (1) の部分で式から完全に消え去り、「角度(方向)」に関する情報だけが残るのです。

これが、「大きさ」を無視して「方向」だけを見ている、という直感的な理由です。


実践:なぜベクトルの「大きさ」を無視したいの?

「方向だけ見るのは分かったけど、なんでわざわざ大きさを捨てるの?情報が減っちゃうじゃん!」

そう思いますよね。

その答えは、「大きさ」がノイズ(邪魔な情報)になってしまうケースが、AIの世界には非常に多いからです。

具体例:単語の「意味」を比べたい時

自然言語処理(NLP)で、単語をベクトルで表現する「単語ベクトル」の例を考えてみましょう。

AIが「王様」「女王」「リンゴ」という単語を、意味を捉えたベクトルとして表現したとします。

(※実際は数百次元ですが、ここでは分かりやすく2次元で考えますね)

  • \vec{a} (王様) = [8, 2] (「人間/王族」軸が8、「食料」軸が2)
  • \vec{b} (女王) = [7, 2] (「人間/王族」軸が7、「食料」軸が2)
  • \vec{c} (リンゴ) = [1, 5] (「人間/王族」軸が1、「食料」軸が5)

この時点で、「王様」と「女王」は似た方向を、「リンゴ」は全然違う方向を向いているのが分かります。

もし「大きさ」がノイズになったら?

ここで、学習に使ったデータ(教科書)の中で、「王様」という単語だけが、たまたま他の単語より非常〜に頻繁に出現したとします。

その結果、AIが「王様」のベクトルだけ、やたらと大きな値(長いベクトル)で学習してしまいました。

  • \vec{d} (すごく頻繁な王様) = [16, 4] ( \vec{a} のちょうど2倍)

さあ、大変です。

私たちは単語の「意味」が似ているか知りたいのに、「単語の出現頻度」という無関係な情報が、ベクトルの「大きさ」という形でノイズとしてのっかってしまいました。

「大きさ」を無視する(コサイン類似度)と!

ここでコサイン類似度の登場です!

コサイン類似度は、計算の過程で強制的にベクトルを「単位ベクトル(長さ1)」に直してくれます。

\vec{a} (王様) の方向 = [8, 2]

\vec{d} (すごく頻繁な王様) の方向 = [16, 4] = 2 * [8, 2]

この2つのベクトル、大きさは 1 倍と 2 倍で違いますが、「方向」は全く同じですよね?

コサイン類似度で計算すると、 \vec{a} \vec{d} も、全く同じ「単位ベクトル」として扱われます。

その結果、こうなります。

  • \cos(\vec{d}, \vec{a}) (すごく頻繁な王様 vs 王様)→ 方向が全く同じなので、値は 1.0 になります。(類似度MAX!)
  • \cos(\vec{d}, \vec{b}) (すごく頻繁な王様 vs 女王)→ $\vec{d}$ と $\vec{b}$ は非常に近い方向を向いているため、 1.0 にとても近い値(例: 0.99)になります。
  • \cos(\vec{d}, \vec{c}) (すごく頻繁な王様 vs リンゴ)→ $\vec{d}$ と $\vec{c}$ はかなり異なる方向を向いているため、 0 に近い値(例: 0.3)になります。

これです!

「出現頻度が多いからベクトルが大きくなってしまった」という「大きさ」のノイズを完全に無視して、「王様」と「女王」は意味的に(=方向が)似ている、と正しく判断できました。


まとめと今後の学習指針

今日のポイントをまとめますね。

  1. コサイン類似度の計算は、数学的に「ベクトルを単位ベクトル化(長さ1に正規化)してから内積を取る」ことと全く同じ(等価)です。
  2. 単位ベクトル同士の内積は、ベクトルの「大きさ」の影響が (1) \times (1) で消え、純粋な「角度(方向)」の情報 \cos(\theta) だけが残ります。
  3. AIやNLPの分野では、「単語の出現頻度」のようなベクトルの「大きさ」に出てくるノイズを無視し、「意味」のような「方向」だけを比べたいことが多いため、コサイン類似度が大活躍するのです。

コサイン類似度は、今日お話しした単語ベクトルの比較だけでなく、推薦システム(あなたと「好み」の方向が似ている人を探す)や、文章の類似度判定など、本当に色々な場所で使われている基本技術です。

もし、あなたがさらにAIと数学の世界を探求したいなら、次は「ユークリッド距離」と「コサイン類似度」の違いについて調べてみるのがオススメです。

「近さ」を測るのになぜ「2点間のまっすぐな距離(ユークリッド距離)」を使わず、わざわざ「角度(コサイン類似度)」を使うのか?

その答えを探求してみると、AIがデータをどのように「見て」いるのか、さらに深く理解できるはずですよ!

一緒に頑張りましょう!

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

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