ベクトルの内積とは?図解でわかりやすく — 幾何・成分・射影から機械学習での使われ方まで

2つのベクトルは「どれくらい似た方向を向いているか」——この問いに1つの数で答えるのが内積(inner product / dot product)です。矢印2本というビジュアルな対象を、たった1つのスカラーに要約する。この一見地味な演算が、実は驚くほど広い世界を支えています。

  • 物理では、力と移動方向の内積が「仕事」になります。斜めに引いたソリに対して、実際に前進に効く力はどれだけか——内積が答えます
  • 機械学習では、検索エンジンの「クエリと文書の関連度」も、ChatGPTの中で動くattentionの「どの単語に注目するか」のスコアも、正体はぜんぶ内積です

本記事では、内積を「幾何の定義」「成分の計算」「射影という本当の意味」の3つの顔から解説し、2つの定義が同じものであることを余弦定理で証明します。さらに高次元空間での内積のふるまいと、機械学習での使われ方までつなげます。

本記事の内容

  • 内積の直感 — 「向きの近さメーター」としての内積
  • 幾何学的定義 $|\bm{a}||\bm{b}|\cos\theta$ と成分表示 $\sum a_i b_i$、その等価性の証明
  • 射影 — 内積は「影の長さ」を測っている
  • 性質(対称性・線形性・ノルムとの関係)と直交の意味
  • 高次元では「ランダムなベクトルはほぼ直交する」ことの実測
  • コサイン類似度・attention など機械学習への接続

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

内積は「向きの近さメーター」

定義に入る前に、内積が測っているものを一枚の絵でつかみましょう。

内積は2つのベクトルがどれだけ同じ方向を向いているかのメーター

同じ長さのベクトルでも、向きが近ければ内積は大きな正の値直角なら0逆向きに近ければ負になります。値が連続的に変わる「向きの近さメーター」だと思ってください。温度計が温度を1つの数にするように、内積は「2本の矢印の関係」を1つの数にします。

では、このメーターはどんな式で作られているのでしょうか。定義は2通りあります。

定義1: 幾何学的定義 — 長さと角度で測る

2つのベクトル $\bm{a}, \bm{b}$ のなす角を $\theta$ とするとき、内積は次のように定義されます。

$$ \begin{equation} \bm{a} \cdot \bm{b} = |\bm{a}|\,|\bm{b}|\cos\theta \end{equation} $$

ここで $|\bm{a}|, |\bm{b}|$ はそれぞれのベクトルの長さ(ノルム)です。

幾何学的定義: 内積は長さ×長さ×cosθ

式の3つの部品のうち、向きの情報を担っているのは $\cos\theta$ だけです。この $\cos\theta$ が、先ほどの「メーター」の針の役割を果たします。

なす角とcosθ: 内積の符号は90°を境に切り替わる

$\cos\theta$ は $\theta = 0°$(完全に同じ向き)で最大値1、$90°$ でちょうど0、$180°$(正反対)で最小値 $-1$ を取ります。つまり内積の符号は「90°より近いか遠いか」を教えてくれる仕組みになっています。特に

$$ \bm{a} \cdot \bm{b} = 0 \quad \Longleftrightarrow \quad \bm{a} \perp \bm{b} $$

(ゼロベクトルを除く)——「内積ゼロ=直交」は、あらゆる分野で使い倒される最重要の性質です。

この定義は直感的ですが、実際に計算するには角度 $\theta$ を知る必要があり不便です。そこで登場するのが、もう1つの顔です。

定義2: 成分表示 — 掛けて足すだけ

ベクトルを成分で $\bm{a} = (a_1, a_2, \dots, a_n)$, $\bm{b} = (b_1, b_2, \dots, b_n)$ と書くと、内積は

$$ \begin{equation} \bm{a} \cdot \bm{b} = a_1 b_1 + a_2 b_2 + \cdots + a_n b_n = \sum_{i=1}^{n} a_i b_i \end{equation} $$

と計算できます。対応する成分どうしを掛けて、ぜんぶ足す——それだけです。

成分表示の計算: 対応する成分を掛けて足すだけ

例えば $\bm{a} = (2, -1, 3)$、$\bm{b} = (4, 0, -2)$ なら

$$ \bm{a} \cdot \bm{b} = 2 \times 4 + (-1) \times 0 + 3 \times (-2) = 8 + 0 – 6 = 2 $$

角度を一切測らずに計算できました。しかも、この式は3次元を超えた $n$ 次元でもそのまま使えます。幾何の定義の「角度」は3次元までしか目に見えませんが、成分の定義なら100次元でも計算できます。むしろ高次元では、この式で計算した内積から逆に「角度」を定義します。

ここで当然の疑問が湧きます——長さと角度で定義した式と、成分を掛けて足す式が、なぜ同じ値になるのでしょうか?

2つの定義が一致することの証明

道具は余弦定理です。ベクトル $\bm{a}, \bm{b}$ と、その差 $\bm{a} – \bm{b}$ は三角形を作ります。

三角形の3辺に余弦定理を適用して2つの定義をつなぐ

3辺の長さは $|\bm{a}|$、$|\bm{b}|$、$|\bm{a}-\bm{b}|$ で、$|\bm{a}|$ と $|\bm{b}|$ の間の角が $\theta$ です。余弦定理を書くと

$$ |\bm{a}-\bm{b}|^2 = |\bm{a}|^2 + |\bm{b}|^2 – 2|\bm{a}||\bm{b}|\cos\theta $$

左辺を成分で展開します。$|\bm{a}-\bm{b}|^2 = \sum_i (a_i – b_i)^2$ なので、2乗を開くと

$$ \sum_i (a_i – b_i)^2 = \sum_i a_i^2 – 2\sum_i a_i b_i + \sum_i b_i^2 = |\bm{a}|^2 – 2\sum_i a_i b_i + |\bm{b}|^2 $$

これを余弦定理の左辺に代入すると

$$ |\bm{a}|^2 – 2\sum_i a_i b_i + |\bm{b}|^2 = |\bm{a}|^2 + |\bm{b}|^2 – 2|\bm{a}||\bm{b}|\cos\theta $$

両辺から $|\bm{a}|^2 + |\bm{b}|^2$ を消して $-2$ で割れば

$$ \sum_i a_i b_i = |\bm{a}||\bm{b}|\cos\theta $$

2つの定義は完全に同じものでした。「掛けて足す」という機械的な計算が、ちゃんと「長さ×長さ×向きの近さ」という幾何学的な意味を持っている——これが内積の美しさです。

数値でも確認しておきましょう。

import numpy as np

a = np.array([2, -1, 3])
b = np.array([4, 0, -2])

# 成分の定義
dot = np.dot(a, b)   # a @ b でも同じ
print(f"成分計算の内積: {dot}")

# 幾何の定義(角度を逆算して確認)
na, nb = np.linalg.norm(a), np.linalg.norm(b)
cos_theta = dot / (na * nb)
theta_deg = np.degrees(np.arccos(cos_theta))
print(f"|a|={na:.4f}, |b|={nb:.4f}, cosθ={cos_theta:.4f}, なす角={theta_deg:.1f}度")
print(f"幾何計算の内積: {na * nb * cos_theta:.4f}")
# => 成分計算の内積: 2
# => |a|=3.7417, |b|=4.4721, cosθ=0.1195, なす角=83.1度
# => 幾何計算の内積: 2.0000

成分で計算した内積2と、長さ・角度から計算した値がぴったり一致します。なす角は83.1度——ほぼ直角に近いので、内積が小さい正の値なのも納得です。

定義と証明が済んだところで、内積の「一番大事な読み方」に進みます。

射影: 内積は「影の長さ」を測っている

$|\bm{a}||\bm{b}|\cos\theta$ という式は、区切り方を変えると別の顔を見せます。$|\bm{b}|\cos\theta$ をひとかたまりと見てください。

内積はa方向にできるbの影の長さ×aの長さ

$|\bm{b}|\cos\theta$ は、$\bm{b}$ の先端から $\bm{a}$ に垂線を下ろしたときの「影の長さ」——$\bm{b}$ を $\bm{a}$ 方向へ射影(projection)した長さです。つまり内積とは、「$\bm{b}$ のうち $\bm{a}$ 方向に効いている成分(影の長さ $|\bm{b}|\cos\theta$)」に $\bm{a}$ の長さを掛けたもの——相手方向の成分を取り出す演算なのです。$\bm{b}$ が $\bm{a}$ と直角なら影の長さはゼロ。内積ゼロの正体は「相手方向の成分を全く持っていない」ことでした。

この「効いている成分だけ取り出す」という読み方が最も鮮やかに現れるのが、物理の仕事です。

物理の仕事W=F・dは内積そのもの

ソリを斜め上に引いて距離 $\bm{d}$ だけ動かすとき、した仕事は $W = \bm{F} \cdot \bm{d}$ です。力のうち進行方向の成分 $|\bm{F}|\cos\theta$ だけが移動に寄与し、垂直成分は1ミリも仕事をしません。内積はこの物理的事実をそのまま数式にしたものです。

内積の基本性質

計算で頻繁に使う性質をまとめます。いずれも成分の定義に代入すれば素直に確認できます。

$$ \begin{align} \bm{a} \cdot \bm{b} &= \bm{b} \cdot \bm{a} && \text{(対称性)} \\ \bm{a} \cdot (\bm{b} + \bm{c}) &= \bm{a} \cdot \bm{b} + \bm{a} \cdot \bm{c} && \text{(分配法則)} \\ (k\bm{a}) \cdot \bm{b} &= k(\bm{a} \cdot \bm{b}) && \text{(スカラー倍)} \\ \bm{a} \cdot \bm{a} &= |\bm{a}|^2 && \text{(自分との内積 = 長さの2乗)} \end{align} $$

4つ目は特に重要です。自分自身とのなす角は $0°$、$\cos 0° = 1$ なので $\bm{a}\cdot\bm{a} = |\bm{a}|^2$——内積が長さ(ノルム)の親であることを示しています。距離は長さから、長さは内積から作られる。線形代数の幾何は、内積を土台に組み上がっているのです。

また、$|\cos\theta| \leq 1$ から直ちに

$$ |\bm{a} \cdot \bm{b}| \leq |\bm{a}||\bm{b}| $$

というコーシー・シュワルツの不等式が従います。「影は本体より長くなれない」と読めば直感的です。

ここまでは2〜3次元の「見える」世界の話でした。しかし機械学習で内積が活躍する舞台は、数百〜数千次元です。高次元で内積はどうふるまうのでしょうか。

高次元の内積: ランダムなベクトルはほぼ直交する

高次元空間には、低次元の直感を裏切る有名な現象があります。でたらめに選んだ2つのベクトルは、次元が上がるほど「ほぼ直交」になるのです。

import numpy as np

rng = np.random.default_rng(0)
for d in [3, 30, 300]:
    cos_list = []
    for _ in range(4000):
        u, v = rng.standard_normal(d), rng.standard_normal(d)
        cos_list.append(u @ v / (np.linalg.norm(u) * np.linalg.norm(v)))
    print(f"次元 d={d}: cosθの標準偏差 = {np.std(cos_list):.4f}(目安 1/√d = {1/np.sqrt(d):.4f})")
# => 次元 d=3:   cosθの標準偏差 = 0.5819(目安 0.5774)
# => 次元 d=30:  cosθの標準偏差 = 0.1813(目安 0.1826)
# => 次元 d=300: cosθの標準偏差 = 0.0568(目安 0.0577)

高次元ではランダムなベクトル同士はほぼ直交する

ランダムな2ベクトルの $\cos\theta$ の分布は、次元が3→30→300と上がるにつれて0の周りに鋭く集中していきます。ばらつきはおよそ $1/\sqrt{d}$ で縮み、300次元では標準偏差0.057——ほとんどのペアが「89度〜91度」あたりに収まる計算です。

これは機械学習にとって福音です。高次元空間では「無関係なものは勝手にほぼ直交してくれる」ので、内積が大きい=偶然ではない本物の関係というシグナルになります。数百次元の埋め込みベクトルで意味の近さを内積で測れるのは、この性質のおかげです。

機械学習での内積: 類似度検索からattentionまで

最後に、内積が現代の機械学習でどう使われているかを見ます。

機械学習での内積: 埋め込み検索とattentionスコア

類似度検索では、単語や文をベクトル(埋め込み)にして、クエリとの内積が大きいものを探します。左図では、クエリのベクトルと最も内積が大きい「犬」が検索結果になります。ただし内積は長さにも影響されるため、「向きの近さ」だけを取り出したいときは長さで正規化します。

$$ \cos\theta = \frac{\bm{a} \cdot \bm{b}}{|\bm{a}||\bm{b}|} $$

これがコサイン類似度です。幾何の定義式を $\cos\theta$ について解いただけ——内積の兄弟であることが分かります。

長さで正規化すると向きの近さだけが残る=コサイン類似度

同じ向きでも長いベクトルは内積が大きく出ます(左図)。正規化すると長さの影響が消え、純粋な「向きの近さ」になります(右図では長さの違う2本が同じ類似度に揃う)。使い分けの詳細はコサイン類似度の記事で扱います。

attention(Transformer)では、「いまの単語(クエリ $\bm{q}$)が、どの単語(キー $\bm{k}_j$)に注目すべきか」のスコアがまさに内積 $\bm{q} \cdot \bm{k}_j$ です。右図のように、内積スコアをsoftmaxで確率に変換したものが注意重みになります。ChatGPTが動いている間、内部では膨大な数の内積($QK^\top$)が計算され続けています——高校数学の内積は、生成AIの心臓部で現役なのです。

まとめ

本記事では、ベクトルの内積を3つの顔から解説しました。

  • 内積は「向きの近さメーター」: 同方向で正・直交で0・逆方向で負。符号は90°を境に切り替わる
  • 2つの定義は等価: 幾何の $|\bm{a}||\bm{b}|\cos\theta$ と成分の $\sum a_i b_i$ は余弦定理で結ばれる。計算は成分で、解釈は幾何で
  • 本当の意味は射影: 内積は「相手方向に効いている成分(影の長さ)」を測る。物理の仕事 $W = \bm{F}\cdot\bm{d}$ はその代表例
  • ノルムの親: $\bm{a}\cdot\bm{a} = |\bm{a}|^2$。コーシー・シュワルツの不等式 $|\bm{a}\cdot\bm{b}| \leq |\bm{a}||\bm{b}|$ も $|\cos\theta|\leq 1$ から直ちに従う
  • 高次元ではランダム同士はほぼ直交(ばらつき $1/\sqrt{d}$): だから高次元埋め込みの内積は「本物の関係」のシグナルになる
  • 機械学習の至るところに登場: コサイン類似度は内積の正規化版、attentionのスコア $QK^\top$ は内積の総当たり表

次のステップとして、以下の記事も参考にしてください。

画像なし
コサイン類似度とは?内積との関係から使いどころまで図解でわかりやすく解説
内積を正規化して「向きの近さ」だけを取り出す。埋め込み検索の定番指標
画像なし
アテンションを直感で理解する ― 数式の前に『注目』のイメージをつかむ
内積がAI(Transformer)の中でどう主役を張っているか
画像なし
ソフトマックス関数の定義・性質・数値安定な実装
内積スコアを確率(重み)に変換する、attentionのもう1つの部品