cs-kb
一覧に戻る

行列演算と内積

2026年4月11日19時間前に更新
線形代数行列演算内積ベクトルコサイン類似度深層学習

行列演算と内積

概要

行列演算と内積は、機械学習・深層学習のほぼすべての計算の基盤となる道具である。 ニューラルネットワークの順伝播、注意機構のスコア計算、線形変換など、あらゆる操作が 行列の積と内積として表現される。本記事では、Transformerの理解に必要な範囲で これらの概念を定式化し、実装する。

直感・モチベーション

なぜ「行列」という形で数を扱うのか。

スカラー(単一の数)では「1つの量」しか表せない。ベクトルは「方向を持つ量」、 つまり複数の特徴を並べたものだ。行列はさらに一歩進んで、「ベクトルからベクトルへの 変換(線形写像)」を表す。

Transformerで言えば、トークン(単語)の意味を512次元のベクトルとして表し、 重み行列 WW を掛けることで「Query空間」「Key空間」へと写像する。 この「写像」こそが行列積の本質である。

内積(ドット積)は、「2つのベクトルがどれだけ同じ方向を向いているか」を1つの スカラーで表す。Attention機構では、QueryとKeyの内積がトークン間の関連度スコアになる。

数学的定式化

ベクトルと内積

nn 次元列ベクトル a,bRn\mathbf{a}, \mathbf{b} \in \mathbb{R}^n の内積を以下で定義する:

ab=i=1naibi\mathbf{a} \cdot \mathbf{b} = \sum_{i=1}^{n} a_i b_i

これは ab\mathbf{a}^\top \mathbf{b}(行ベクトルと列ベクトルの積)とも書ける。

幾何学的な意味:

ab=abcosθ\mathbf{a} \cdot \mathbf{b} = \|\mathbf{a}\| \|\mathbf{b}\| \cos\theta

θ\theta は2ベクトル間の角度。内積が大きい ⟺ 方向が近い。

行列積

ARm×kA \in \mathbb{R}^{m \times k}BRk×nB \in \mathbb{R}^{k \times n} のとき、積 C=ABRm×nC = AB \in \mathbb{R}^{m \times n}(i,j)(i, j) 成分は:

Cij=l=1kAilBljC_{ij} = \sum_{l=1}^{k} A_{il} B_{lj}

つまり CC(i,j)(i,j) 成分 = AA の第 ii 行と BB の第 jj 列の内積

重要な制約:AA の列数と BB の行数が一致しなければならない(kk が共通)。

転置

行列 ARm×nA \in \mathbb{R}^{m \times n} の転置 ARn×mA^\top \in \mathbb{R}^{n \times m} は行と列を入れ替えたもの:

(A)ij=Aji(A^\top)_{ij} = A_{ji}

Transformerでは QKQK^\top(Query と Key の転置の積)として内積を一括計算するために使う。

ノルム(ベクトルの大きさ)

a=aa=i=1nai2\|\mathbf{a}\| = \sqrt{\mathbf{a} \cdot \mathbf{a}} = \sqrt{\sum_{i=1}^{n} a_i^2}
内積の幾何学的解釈の導出を見る

余弦定理より、c=ab\mathbf{c} = \mathbf{a} - \mathbf{b} として:

c2=a2+b22abcosθ\|\mathbf{c}\|^2 = \|\mathbf{a}\|^2 + \|\mathbf{b}\|^2 - 2\|\mathbf{a}\|\|\mathbf{b}\|\cos\theta

一方、ノルムの定義から:

c2=ab2=i(aibi)2=iai22iaibi+ibi2=a22(ab)+b2\|\mathbf{c}\|^2 = \|\mathbf{a} - \mathbf{b}\|^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 = \|\mathbf{a}\|^2 - 2(\mathbf{a} \cdot \mathbf{b}) + \|\mathbf{b}\|^2

2式を等置すると:

2abcosθ=2(ab)ab=abcosθ-2\|\mathbf{a}\|\|\mathbf{b}\|\cos\theta = -2(\mathbf{a} \cdot \mathbf{b}) \quad \Rightarrow \quad \mathbf{a} \cdot \mathbf{b} = \|\mathbf{a}\|\|\mathbf{b}\|\cos\theta

重要な性質・注意点

  • 非可換性:一般に ABBAAB \neq BA(積の順序を変えると結果が変わる)
  • 計算量Rm×k\mathbb{R}^{m \times k}Rk×n\mathbb{R}^{k \times n} の積は O(mkn)O(mkn)。Transformerの系列長 nn が大きいと QKQK^\topO(n2d)O(n^2 d) となりボトルネックになる
  • 分配法則は成立:A(B+C)=AB+ACA(B+C) = AB + AC
  • 結合法則は成立:(AB)C=A(BC)(AB)C = A(BC)
  • 転置の積(AB)=BA(AB)^\top = B^\top A^\top(順序が逆転することに注意)

アルゴリズムと実装例

python
import math def dot_product(a: list[float], b: list[float]) -> float: """ベクトルの内積""" assert len(a) == len(b), "ベクトルの次元が一致しません" return sum(x * y for x, y in zip(a, b)) def norm(a: list[float]) -> float: """ベクトルのL2ノルム""" return math.sqrt(dot_product(a, a)) def cosine_similarity(a: list[float], b: list[float]) -> float: """コサイン類似度:内積を両ノルムで割ったもの""" return dot_product(a, b) / (norm(a) * norm(b)) def matmul(A: list[list[float]], B: list[list[float]]) -> list[list[float]]: """行列積 C = AB""" m, k = len(A), len(A[0]) k2, n = len(B), len(B[0]) assert k == k2, f"次元不一致: A の列数={k}, B の行数={k2}" C = [[0.0] * n for _ in range(m)] for i in range(m): for j in range(n): for l in range(k): C[i][j] += A[i][l] * B[l][j] return C def transpose(A: list[list[float]]) -> list[list[float]]: """転置行列""" m, n = len(A), len(A[0]) return [[A[i][j] for i in range(m)] for j in range(n)] # --- 動作確認 --- if __name__ == "__main__": # 内積の例 a = [1.0, 2.0, 3.0] b = [4.0, 5.0, 6.0] print(f"内積: {dot_product(a, b)}") # 32.0 print(f"コサイン類似度: {cosine_similarity(a, b):.4f}") # 0.9746 # 行列積の例(Attention で使う QK^T を想定) Q = [[1.0, 0.0], [0.0, 1.0]] # 2x2 K = [[1.0, 2.0], [3.0, 4.0]] # 2x2 Kt = transpose(K) scores = matmul(Q, Kt) print(f"QK^T = {scores}") # [[1.0, 3.0], [2.0, 4.0]]

まとめ

  • 内積はベクトル間の類似度を1つのスカラーで表す操作で、ab=iaibi\mathbf{a} \cdot \mathbf{b} = \sum_i a_i b_i
  • 行列積 C=ABC = AB(i,j)(i,j) 成分は AA の第 ii 行と BB の第 jj 列の内積
  • 転置 (AB)=BA(AB)^\top = B^\top A^\top は積の順序が逆転する
  • Transformerでは QKQK^\top という行列積でトークン間の類似度を一括計算する
  • 行列積の計算量は O(mkn)O(mkn) であり、系列長が長いほど高コストになる

関連記事

前提知識

  • なし(本記事がシリーズの出発点)

派生技術

  • ソフトマックス関数 — 内積スコアを確率分布に変換する
  • 注意機構 (Attention Mechanism) — QKQK^\top を使ってトークン間の重みを計算する

応用事例

  • Transformer — QK/dkQK^\top / \sqrt{d_k} として Scaled Dot-Product Attention に使用

用語解説

用語説明
スカラー単一の数値
ベクトル複数の数値を順序付きに並べたもの。方向と大きさを持つ
行列数値を行と列の2次元に並べたもの。線形写像を表す
内積2つのベクトルの対応する成分を掛けて合計したスカラー値
転置行列の行と列を入れ替える操作
ノルムベクトルの大きさ(長さ)。L2ノルムは各成分の二乗和の平方根
コサイン類似度内積を両ベクトルのノルムで割った値。方向の一致度を −1〜1 で表す
線形写像ベクトル空間の間の構造を保つ変換。行列積として表現できる

関連リンク

この記事からの参照