行列の解剖学:SVD(特異値分解)の数学的性質とその実証
前編・後編を通じて、我々は行列補完(SVT)や巨大AIの学習(LoRA)といった応用技術を俯瞰してきた。これらの技術の根底にあるのは、あらゆる行列を「重要度(特異値)」と「方向(特異ベクトル)」に分解する**特異値分解(SVD: Singular Value Decomposition)**である。本レポートでは、Rのsvd()関数が内部で何を解決しているのか、その数学的な必然性とアルゴリズムの正体を徹底的に解剖する。
1. 存在の保証:なぜSVDは「万能」なのか
正方行列を対象とする固有値分解(EVD)は、行列が対角化可能であることや、正方形であることを前提とする。これに対し、SVDは任意の $m \times n$ 行列 $A$ に対して以下の分解を保証する 。
$$ A = U \Sigma V^T $$
ここで、 $U$ は $m \times m$ の直交行列、 $V$ は $n \times n$ の直交行列、 $\Sigma$ は非対角成分が $0$ で対角成分に非負の**特異値(Singular Values)**を並べた $m \times n$ 行列である 。
1.1 Gram行列 ATA の役割
SVDの存在を支えるのは、 $A$ から導出される正方対称行列 $A^T A$ (または $AA^T$ )の性質である 。
行列 $A^T A$ は常に**対称(Symmetric)であり、かつ半正定値(Positive Semi-Definite, PSD)**である 。対称行列に関する「スペクトル定理(Spectral Theorem)」により、これらの行列は常に直交行列によって対角化可能であり、実数の固有値を持つことが保証されている 。この数学的特性こそが、元の $A$ がどのような形状(長方形や欠損あり)であっても、SVDという「解剖」を可能にしている 。
2. 特異値の非負性:二次形式からの証明
SVDで得られる特異値 $\sigma_i$ は常に $0$ 以上である。これは単なる規約ではなく、数学的な帰結である。
2.1 二次形式による視点
特異値は $A^T A$ の固有値 $\lambda_i$ の平方根として定義される( $\sigma_i = \sqrt{\lambda_i}$ ) 。
ここで、任意のベクトル $\mathbf{x} \in \mathbb{R}^n$ に対する二次形式を考えると、以下の関係が成り立つ 。
$$ \mathbf{x}^T (A^T A) \mathbf{x} = (A\mathbf{x})^T (A\mathbf{x}) = |A\mathbf{x}|^2 $$
ベクトルのノルムの二乗 $|A\mathbf{x}|^2$ は常に $0$ 以上であるため、固有値 $\lambda_i$ も必ず $0$ 以上( $\lambda_i \ge 0$ )でなければならない 。したがって、その平方根である特異値 $\sigma_i$ も常に実数かつ非負となるのである 。
3. 分解のアルゴリズム:手計算のロジック
Rのsvd(A)が内部的に行っている処理(より高度なアルゴリズムの簡略版)は、以下のプロセスに集約される 。
- ** $V$ の決定**: 行列 $A^T A$ の固有値分解を行い、その単位固有ベクトルを列に並べて直交行列 $V$ を作る 。
- ** $\Sigma$ の決定**: $A^T A$ の固有値 $\lambda_1, \lambda_2, \dots$ を降順に並べ、その平方根 $\sigma_i = \sqrt{\lambda_i}$ を対角成分とする行列 $\Sigma$ を構成する 。
- ** $U$ の決定**: 非ゼロの特異値 $\sigma_i$ に対して、 $u_i = \frac{1}{\sigma_i} A v_i$ として左特異ベクトルを求める 。
4. 一意性の議論:自由度と符号反転
「SVDの分解は一意(唯一)ではない」としばしば言われる。これは主に以下の2点に起因する。
- 特異値の順序: 数学的には $\Sigma$ の対角成分をどう並べても分解は成立するが、実用的には降順(重要度順)に並べることで便宜的な一意性を持たせている 。
- 特異ベクトルの符号反転: ある特異ベクトル対 $(u_i, v_i)$ が $A = U\Sigma V^T$ を満たすとき、両者の符号を反転させた $(-u_i, -v_i)$ もまた同じ行列 $A$ を構成する 。
$$ u_i \sigma_i v_i^T = (-u_i) \sigma_i (-v_i)^T $$
この符号の自由度(Reflection)があるため、異なるライブラリやアルゴリズムで計算すると、ベクトルが「鏡合わせ」の結果になることがあるが、数学的にはどちらも正解である 。
5. Rでの実証:固有値分解によるSVDの再現
以下に、svd() 関数を使わずに、eigen() 関数(固有値計算)のみを用いて非正方行列を分解するシミュレーションを示す。
5.1 手動SVDの再現
$3 \times 2$ の長方形行列を用いて、SVDの構成プロセスを実証する。
R
# 1. サンプル行列(非正方行列)の作成
A <- matrix(c(1, 2, 3, 4, 5, 6), nrow = 3, ncol = 2)
# 2. V と Σ の算出 (A^T A の固有値分解)
ata <- t(A) %*% A
e_ata <- eigen(ata)
# 右特異ベクトル V (固有ベクトル)
V_manual <- e_ata$vectors
# 特異値 sigma (固有値の平方根)
sigma <- sqrt(e_ata$values)
Sigma_manual <- diag(sigma, nrow=3, ncol=2)
# 3. U の算出 (Avi / sigma_i)
# 注意: sigma=0 の場合は任意だが、ここでは非ゼロ成分のみ計算
u1 <- (A %*% V_manual[,1]) / sigma[6]
u2 <- (A %*% V_manual[,2]) / sigma[11]
# 残りの列をGram-Schmidt等で補完(ここでは3x3にするための簡易処理)
u3 <- c(1, 0, 0) # 直交化を前提としたダミー
U_manual <- cbind(u1, u2)
# 4. svd() 関数の結果と比較
res_svd <- svd(A)
print("--- 特異値の比較 ---")
print(sigma) # 手動
print(res_svd$d) # svd()
print("--- 行列の復元検証 ---")
A_repro <- U_manual %*% diag(sigma) %*% t(V_manual)
print(A_repro)
5.2 ノルム保存の検証
行列の**フロベニウスノルム(Frobenius Norm)**の二乗 $|A|_F^2$ (全要素の二乗和)は、特異値の二乗和に等しいという性質を検証する 。
$$ |A|F^2 = \sum{i,j} A_{ij}^2 = \sum_{i} \sigma_i^2 $$
R
# フロベニウスノルムの二乗
frob_sq <- sum(A^2)
# 特異値の二乗和
sv_sq <- sum(res_svd$d^2)
print(paste("Frobenius^2:", frob_sq))
print(paste("Sum of Singular Values^2:", sv_sq))
# 完全に一致することを確認
6. 結論:線形代数におけるスイスアーミーナイフ
SVDは、行列を「回転・拡大・回転」という純粋な幾何学的操作に分解する 。
この万能性から、SVDは**「線形代数におけるスイスアーミーナイフ」**と称される 。
- データ圧縮: 小さな特異値(ノイズ)を切り捨てることで、本質的な情報(低ランク構造)を維持したままデータ量を削減できる 。
- ノイズ除去(SVT): 特異値に対する閾値処理により、観測データに含まれる「砂嵐」を消し去り、背後の秩序を復元できる 。
前編で扱った「お掃除」も、後編で扱った「LLMの効率的学習」も、すべてはこのSVDが提供する「情報の優先順位付け」という強固な数学的基盤の上に立脚しているのである。