内積 とは
検索窓に単語を打ちこんでも、検索エンジンは文章を一文字ずつ比べたりはしません。文章ごとにベクトルに変えておき、二つのベクトルがどれだけ同じ向きを指しているかを見ます。この「どれだけ同じ向きか」を一つの数で測る道具が内積です。a·b = |a||b|cos θ。二つのベクトルの長さと、二つがなす角のコサインを掛けた値です。ここで長さを取り除くと cos θ だけが残り、これがまさにコサイン類似度です。同じ向きなら似ていて、直角なら無関係、反対なら正反対です。検索も推薦も単語の埋めこみも、すべてこの一行の上で動いています。
緑の矢印 a は固定しておき、青い矢印 b を二つのスライダーで扱います。一方のスライダーは b の角度を、もう一方は b の長さを変えます。下に表示される a·b の値が、二つのスライダーの両方に反応します。b を長くすると値が丸ごと大きくなる長さの効果が現れ、b を回すと、同じ向きなら正、直角なら 0、反対向きなら負に変わる向きそろえの効果が現れます。符号によって文字の色が緑、薄い色、赤に変わり、a の上に落ちる b の足(金色の点)もいっしょに動きます。内積一つが長さと向きそろえの二つを同時に抱えていることを、手で感じられます。
内積は別の目でも見られます。a を +x 軸に長さ 2 で寝かせておき、b の角度だけをスライダーで回すと、金色で描かれる棒が、b を a の上へまっすぐ落とした影、つまり射影です。棒の先にはその長さが書かれます。すると a·b は、ちょうど |a| 掛けるその射影の長さになります。b を a のほうへ寝かせると影が長くなって内積は大きく、b を立てるほど影が短くなって内積は小さくなります。直角になると影は 0 なので、内積も 0 です。鈍角に入ると影が反対側へ回り、内積は負になります。内積とは結局、あるベクトルが別のベクトルの向きにどれだけのびているかを長さで測り、|a| 倍した値なのです。
内積の符号だけを取り出して見ると、規則はとても単純です。a を +x 軸に置き、b の角度 θ を 0 度から 360 度までスライダーで動かすと、平面が二つの領域に塗り分けられます。a と同じ側の半平面(θ が 90 度の内側)は緑色で、そこでは内積が正です。ちょうど 90 度と 270 度、つまり直角では 0 です。反対側の半平面(90 度と 270 度のあいだ)は赤色なので、内積は負です。b を回すと、下の文字が正・0・負と変わり、値もいっしょに表示されます。符号一つで、同じ側か、無関係か、反対側かが決まることがひと目でわかります。
今度は長さを完全に取り除きます。cos θ = a·b / (|a||b|)。この値はいつも -1 と +1 のあいだに入ります。a を固定して、b の角度と長さを二つのスライダーで変えると、決定的な場面が現れます。b の長さだけを伸ばしたり縮めたりしても cos θ はびくともせず、下の -1 から +1 まで引かれたゲージの針はその場から動きません。反対に角度を回すと、針がすうっと滑ります。コサイン類似度は大きさを無視して向きだけを見るものなのです。だから検索エンジンや埋めこみは、文章が長くても短くても、指している向きだけで二つの文章が似ているかを比べます。
最後に、内積がちょうど 0 になる瞬間を自分でつかまえます。a は固定で、青い矢印 b を手でドラッグして平面の上を動き回ると、下に a·b の値がリアルタイムで表示されます。b が a と直角をなす場所を通るとき、値が 0 を横切り、矢印が金色に光って「直交」の文字が出ます。内積が 0 だということは、二つの向きが完全に垂直、つまり互いに無関係で独立だという意味です。この性質が、座標軸をすっきりさせています。x 軸と y 軸が直交しているので、一方の軸に沿って動いても、もう一方の軸の値は揺れないからです。きれいな基底は、すべてこの内積 0 から生まれます。