回 6-1 分野 6 ベクトルと行列
内積は、2 つ のベクトルの同じ番目の数どうしを掛けて、全部足した数です。a = (1, 2)、b = (3, 4) なら 1 × 3 + 2 × 4 = 11 です。内積は |a| × |b| × cos θ とも等しく、向きがそろうほど大きく、直角なら 0、逆向きなら負になります。内積を 2 つ の長さで割った cos θ がコサイン類似度で、生成 AI の検索で文の近さを測るのに使われます。
内積の式を、手で数えた数と頁の中で動く Python の数の両方で確かめ、埋め込みの検索で何をしているかまでつなげます。
文 ゆめさくコード編集部 公開 2026年10月30日 更新 2026年10月30日 出典を確かめた日 2026年10月30日
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 乗して足し、平方根を取ります。
内積 a・b には、同じ値になる 2 つ の式があります。
書き方 式 使う場面 成分の式 a1 × b1 + a2 × b2 + … 数の 並びから計算する 角の式 \ a\ × \ b\ × cos θ 向きの そろい方を読む
θ は 2 つ の矢印のなす角 (0° から 180°) です。プログラムでは成分の式で計算し、角の式で意味を読みます。
内積の 符号で 向きが分かる 長さは 0 以上なので、内積の符号は cos θ の符号と同じです。
内積 なす角 θ 向き 正 0° 以上 90° 未満 だいたい同じ向き 0 90° 直角 (垂直) 負 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 を返します。
動かす 内積と長さとコサイン類似度
実行すると、次の通りに出ます
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 の範囲に収めてから渡します。
動かす なす角を度で出す
実行すると、次の通りに出ます
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 本 目は、文の近さを測る小さな例です。本物の埋め込みは学習した模型が作りますが、ここでは「どの語が何回出たか」を数えた並びで代わりにします。
動かす 語の数で文の近さを測る
実行すると、次の通りに出ます
語の数 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 でした。正しいのはどれですか。
ア 2 つは同じ向き イ 2 つは直角 ウ 2 つは逆向き エ 2 つの 長さが同じ 3 問目
このコードを動かすと何が出ますか。
a = [3, 4]
print(sum(x * x for x in a))説明課題 「RAG の検索で、問いに近い文書を選ぶときに、内積をそのまま使わずコサイン類似度を使うことが多いのはなぜか」を、長さと向きの言葉を使って 3 文で説明してください。書いたら、下の模範解答を開いて比べてください。
あなたの説明
模範解答 模範解答を開く 自分の 説明を 書いてから 開いて、 比べてください。
内積は |a| × |b| × cos θ なので、向きがそろっているほど大きくなるが、ベクトルの長さが大きいほども大きくなる。そのまま比べると、内容が近いかどうかより、長いベクトルの文書が上に来やすい。コサイン類似度は内積を 2 つ の長さで割って cos θ だけを取り出すので、向きのそろい方、つまり内容の近さだけで並べられる。
文や 画像が 数の 並びに 置き換えられた あと、 近い物を 探す 仕組みが 内積 1 つ で 説明できると、 RAG の 検索の 精度の 話に 数で 入れます。 いまの 自分が 転職までの 道の どの 段に いるかは、 転職診断で 確かめられます。
もっと深く この 回の 続きを、 ゆめさくの コースの 章や 道具で 深められます。 頁の 中の 確認クイズに 答えた あと、 手を 動かす量を 増や したい ときに 使ってください。
一次資料 どれも 2026年 10月 30日 に開いて、題と中身を確かめました。