ベクトルと内積

回 6-1 分野 6 ベクトルと行列

内積は、2 つのベクトルの同じ番目の数どうしを掛けて、全部足した数です。a = (1, 2)、b = (3, 4) なら 1 × 3 + 2 × 4 = 11 です。内積は ⁠|a⁠| × ⁠|b⁠| × cos θ とも等しく、向きがそろうほど大きく、直角なら 0、逆向きなら負になります。内積を 2 つの長さで割った cos θ がコサイン類似度で、生成 AI の検索で文の近さを測るのに使われます。

内積の式を、手で数えた数と頁の中で動く Python の数の両方で確かめ、埋め込みの検索で何をしているかまでつなげます。

2 つの文が「近い」とは、数で言うと何か

生成 AI の検索では、文を数百から数千の数の並びに置き換え、並びどうしの「向きのそろい方」で近さを測ります。そのそろい方を 1 つの数にするのが内積です。

数の並びをベクトルと呼びます。ベクトル (1, 2) と (3, 4) の内積は、同じ番目どうしを掛けて足した 1 × 3 + 2 × 4 = 11 です。足し算と掛け算しか使わないので、並びが 3 つでも 1,536 個でも同じ手順で計算できます。

この回では、内積の計算、長さ、なす角、そして埋め込みの近さを測るコサイン類似度を、Python で数えて確かめます。

ベクトル、長さ、内積

ベクトルは数の並び

高校数学では、ベクトルを「向きと大きさを持つ矢印」と習います。平面の矢印は (右に 3、上に 4) のように 2 つの数で書けるので、プログラムでは数の並び (リスト) として持ちます。

並びの数の個数を次元と呼びます。平面は 2 次元、空間は 3 次元です。文の埋め込みは 1,536 次元のように大きくなりますが、計算の手順は 2 次元と変わりません。

長さ

ベクトル a = (a1, a2) の長さ ⁠|a⁠| は、三平方の定理で √(a1² + a2²) です。(3, 4) の長さは √(9 + 16) = 5 です。次元が増えても、全部の数を 2 乗して足し、平方根を取ります。

内積の 2 つの式

内積 a・b には、同じ値になる 2 つの式があります。

書き方式使う場面
成分の式a1 × b1 + a2 × b2 + …数の並びから計算する
角の式\a\× \b\× cos θ向きのそろい方を読む

θ は 2 つの矢印のなす角 (0° から 180°) です。プログラムでは成分の式で計算し、角の式で意味を読みます。

内積の符号で向きが分かる

長さは 0 以上なので、内積の符号は cos θ の符号と同じです。

内積なす角 θ向き
正0° 以上 90° 未満だいたい同じ向き
090°直角 (垂直)
負90° より大きく 180° 以下だいたい逆向き

ただし、どちらかが長さ 0 のベクトル (全部 0 の並び) なら、内積は向きに関係なく 0 です。垂直の条件「内積が 0」は、2 つとも長さ 0 でないときに使います。

長さ 0 でない 2 つのベクトルが平行 (同じ向きか逆向き) なのは、θ が 0° か 180° のとき、つまり内積が ⁠|a⁠| × ⁠|b⁠| か −⁠|a⁠| × ⁠|b⁠| のときです。

図で読むと「影の長さ × 長さ」

b に真上から光を当てて、a の影を b の上に落とします。影の長さは ⁠|a⁠| × cos θ です。内積は「a の影の長さ × b の長さ」と読めます。a が b と同じ向きに伸びているほど影が長く、内積が大きくなります。θ が 90° より大きいと、影は b と逆の側に落ちるので、cos θ も内積も負になります。

内積の性質

計算を楽にする性質は、次の通りです。k は決まった数です。

性質式
入れ替えても同じa・b = b・a
分配a・(b + c) = a・b + a・c
定数倍(k a)・b = k (a・b)
自分との内積a・a = \a\²

自分との内積が長さの 2 乗になるので、長さは √(a・a) で計算できます。

なす角とコサイン類似度

角の式を cos θ について解くと、次の形になります。

cos θ = (a・b) ÷ (⁠|a⁠| × ⁠|b⁠|)

この cos θ を、機械学習ではコサイン類似度と呼びます。値は −1 以上 1 以下で、1 なら同じ向き、0 なら直角、−1 なら逆向きです。長さで割っているので、長さが違っても向きだけを比べられます。両方とも長さが 0 でないときにだけ計算できます。

外積との違い

内積は 2 つのベクトルから 1 つの数を出します。外積は 3 次元の 2 つのベクトルから、両方に直角なベクトルを出します。3D の画面で面の向きを求めるときは外積、近さや角度を測るときは内積を使います。

動かして確かめる

1 本目は、内積、長さ、コサイン類似度を、標準の Python だけで計算します。長さ 0 のベクトルは割り算ができないので、None を返します。

動かす 内積と長さとコサイン類似度

python実行可能
出力

▶ 実行ボタンを押すと結果がここに表示されます

実行すると、次の通りに出ます

a・b 11
|b| 5.0
cos 0.9839
直角 0
逆 -1.0
ゼロ None

(1, 2) と (3, 4) の内積は 11、(3, 4) の長さは 5 です。コサイン類似度は約 0.98 で 1 に近く、ほぼ同じ向きです。(1, 2) と (−2, 1) は内積が 0 で直角、(1, 2) と (−2, −4) はちょうど逆向きで −1 です。長さ 0 のベクトルは向きが無いので、コサイン類似度を出せません。

2 本目は、なす角を度で出し、3 次元でも同じ関数がそのまま使えることを確かめます。math.acos は cos の値から角を返します。小数の誤差で 1 をわずかに超えると止まるので、−1 から 1 の範囲に収めてから渡します。

動かす なす角を度で出す

python実行可能
出力

▶ 実行ボタンを押すと結果がここに表示されます

実行すると、次の通りに出ます

45.0
90.0
180.0
27.266
1.0000000000000002
0.0

(1, 0) と (1, 1) は 45°、(1, 0) と (0, 5) は 90°、(2, 2) と (−1, −1) は 180° です。3 次元の (1, 2, 2) と (2, 1, 2) も同じ関数で、約 27.3° と出ました。最後の 2 行は同じベクトルどうしです。小数の誤差で cos が 1.0000000000000002 とわずかに 1 を超えています。このまま math.acos に渡すと ValueError で止まるので、範囲に収める行が要ります。収めたあとの角は 0° です。

3 本目は、文の近さを測る小さな例です。本物の埋め込みは学習した模型が作りますが、ここでは「どの語が何回出たか」を数えた並びで代わりにします。

動かす 語の数で文の近さを測る

python実行可能
出力

▶ 実行ボタンを押すと結果がここに表示されます

実行すると、次の通りに出ます

語の数 9
A 0.816
B 0.408
C 0.204

問い「猫 を 飼う」に一番近いのは A で、B、C の順です。どの文も 9 個の語の数を並べた 9 次元のベクトルで、問いとのコサイン類似度で並べ替えています。RAG の検索は、この語の数の代わりに埋め込みのベクトルを使い、同じように内積から近さの順を出しています。

内積だけで決めると外れる所

長さで割らないと、長い文が有利になる

内積そのものは、ベクトルが長いほど大きくなります。語の数で作ったベクトルでは、長い文ほど数が大きく、内容が近くなくても内積が大きくなりがちです。向きだけを比べたいときは、長さで割ったコサイン類似度を使います。

長さ 0 のベクトルには向きが無い

全部 0 の並びは長さが 0 で、コサイン類似度の割り算ができません。語の数のベクトルなら、問いの語が 1 つも辞書に無いと全部 0 になります。1 本目のコードのように、先に長さを調べて別の扱いにします。

近いのは「数の並び」で、意味ではない

コサイン類似度が測るのは、ベクトルの向きのそろい方です。語の数のベクトルでは、「好きではない」と「好き」は同じ語を含むので近く出ます。埋め込みは意味をある程度まで並びに写しますが、数の近さと人が感じる意味の近さは、いつも一致するとは限りません。検索の結果は、人が読んで確かめます。

仕事でどう使うか

内積とコサイン類似度を使う場面は、次の通りです。

  • RAG と意味の検索。問いの文と手元の文書をそれぞれ埋め込みのベクトルにし、コサイン類似度の高い順に文書を取り出して、生成 AI に渡す
  • 推薦。利用者と商品をそれぞれベクトルで表し、内積が大きい組を「好みに合う」と見なす
  • 重複の検出。よく似た問い合わせや記事を、コサイン類似度がしきい値を超えるかで見つける
  • ニューラルネットの 1 つの点の計算。入力の並びと重みの並びの内積に、決まった数を足して出力を作る。行列の積 (6-2) は、この内積をたくさん並べた物
  • 画面とゲームの計算。光が面に当たる明るさは、光の向きと面の向きの内積で決まる

よくある問い

内積はどうやって計算しますか

2 つのベクトルの同じ番目の数を掛けて、全部足します。(1, 2, 3) と (4, 5, 6) なら 1 × 4 + 2 × 5 + 3 × 6 = 32 です。2 つの並びの長さ (次元) がそろっていないと計算できません。

内積が 0 になるのはどんなときですか

2 つとも長さ 0 でなければ、なす角が 90° (直角) のときです。どちらかが全部 0 の並びなら、角に関係なく内積は 0 です。

内積が負になるのはどういう意味ですか

なす角が 90° より大きく、2 つがだいたい逆向きという意味です。コサイン類似度なら −1 に近いほど逆向きです。

コサイン類似度とユークリッド距離はどう違いますか

ユークリッド距離は 2 つの点の間の長さで、ベクトルの長さの違いも距離に入ります。コサイン類似度は長さで割るので、向きだけを比べます。長さを 1 にそろえたベクトルどうしなら、距離の 2 乗は 2 − 2 × コサイン類似度になり、どちらで並べても順は同じです。

埋め込みのベクトルは何次元ですか

使う模型によって違います。たとえば OpenAI の text-embedding-3-small は、既定で 1,536 次元のベクトルを返します。次元が大きくても、内積の計算は同じ番目を掛けて足すだけです。

確認クイズ

答えだと思う選択肢を押すと、その場で正誤と理由が開きます。3 問すべてに正しく答えると、この回は修了で、石が緑に変わります (この端末のブラウザに残ります)。間違えた問いは、あとから解き直せます。

1 問目

a = (2, −1, 3)、b = (1, 4, 2) の内積はいくつですか。

2 問目

長さが 0 でない 2 つのベクトルのコサイン類似度が 0 でした。正しいのはどれですか。

3 問目

このコードを動かすと何が出ますか。

a = [3, 4]
print(sum(x * x for x in a))

説明課題

「RAG の検索で、問いに近い文書を選ぶときに、内積をそのまま使わずコサイン類似度を使うことが多いのはなぜか」を、長さと向きの言葉を使って 3 文で説明してください。書いたら、下の模範解答を開いて比べてください。

模範解答

自分の説明を書いてから開いて、比べてください。

この回の先の一歩

文や画像が数の並びに置き換えられたあと、近い物を探す仕組みが内積 1 つで説明できると、RAG の検索の精度の話に数で入れます。いまの自分が転職までの道のどの段にいるかは、転職診断で確かめられます。

もっと深く

この回の続きを、ゆめさくのコースの章や道具で深められます。頁の中の確認クイズに答えたあと、手を動かす量を増やしたいときに使ってください。

一次資料

どれも 2026年10月30日に開いて、題と中身を確かめました。

次へ

分野 6 ベクトルと行列の回

  1. 6-1ベクトルと内積長さ、内積、コサイン類似度この回
  2. 6-2行列と行列の積積の数え方、計算量 n^3頁で読む
  3. 6-3グラフと隣接行列頂点、辺、次数、隣接リスト頁で読む

分野 6 の頁へ戻るほかの分野を見る