特異値分解(SVD)-- 任意行列の分解術

固有分解は正方行列にしか適用できませんが、SVDにはその制限はありません——任意の行列にSVDを適用できます。

これはレコメンドシステム、画像圧縮、LoRAファインチューニングなどの技術の背後にある数学エンジンです。

SVD:行列を3つの部分に分解する

A
(m×n)
=
U
(m×m)
回転
×
Σ
(m×n)
スケーリング
×
VT
(n×n)
回転

幾何学的な直感:任意の線形変換 = 回転 + 座標軸に沿ったスケーリング + 再回転。

Σの対角成分は特異値と呼ばれ、大きい順に並び、行列の各直交方向における「エネルギー」を表します。

トランケーテッドSVD:最初のk個の特異値で近似する

\[ A \approx U_k \Sigma_k V_k^T \]

kが小さいほど = 圧縮率が高い = 近似が粗い。これは次元削減と圧縮の核となる考え方です。


身近な例

画像を1枚圧縮する

1000×1000 の行列(100万個の数値)を、SVDで分解した後、最初の10個の特異値だけで再構成します。

約 10×1000×2 = 20000 個の数値を保存するだけで、良好な近似が得られます。

これがSVD圧縮の威力です——重要でない「エネルギー」を捨て、核心となる構造を保持します。


数学的定義

\[ A = U \Sigma V^T \]

Uの列は左特異ベクトル(直交)、Vの行は右特異ベクトル(直交)、Σの対角成分 σ₁ ≥ σ₂ ≥ ... ≥ σ_r > 0 は特異値です。


Python ハンズオン

実例

import numpy as np

A = np.array([[1,0,0,0,2],[0,0,3,0,0],[0,0,0,0,0],[0,4,0,0,0]])
U, S, VT = np.linalg.svd(A)
print("特異値:", np.round(S, 2))  # [4. 3. 2.24 0.]
print("非ゼロ特異値の個数 = ランク =", np.sum(S > 1e-10))

# 画像圧縮のデモ:ランク1の画像
img = np.outer(np.array([1,2,3,2,1]), np.array([2,4,6,4,2]))
U_i, S_i, VT_i = np.linalg.svd(img)
print("\n画像行列の特異値:", np.round(S_i, 2))
# 1つの特異値だけで完全に再構成(ランク=1のため)
k = 1
approx = U_i[:,:k] @ np.diag(S_i[:k]) @ VT_i[:k,:]
print("k=1再構成誤差:", np.linalg.norm(img - approx))
奇异值: [4. 3. 2.24 0.]
非零奇异值个数 = 秩 = 3
图像矩阵的奇异值: [78.26 0. 0. 0. 0.]
k=1重建误差: 7.11e-14 (几乎完美)

AIでの応用シーン

LoRA ファインチューニングの数学的基礎

LoRAの仮定:\( \Delta W \) は低ランクである——これは \(\Delta W \) のSVDにおいて最初のr個の特異値だけが顕著で、残りは無視できるという仮定と同等です。rを小さくするほど、学習可能なパラメータは減りますが、近似精度は低下します。実際には r=8 または 16 が効果と効率の最適なバランス点となることが多く、これは重み行列の特異値の減衰速度に関する経験的観察に由来します。

レコメンドシステム:行列分解による協調フィルタリング

ユーザー-アイテム評価行列 R(m×n)にトランケーテッドSVDを適用:\( R \approx U_k \Sigma_k V_k^T \)。U_k の各行はユーザーのk次元潜在ベクトル、V_k の各行はアイテムのk次元潜在ベクトルです。ユーザー u のアイテム i に対する予測評価 = u の潜在ベクトルと i の潜在ベクトルのドット積です。

モデル圧縮と蒸留

全結合層の重み行列 W にSVDを行い、トランケーテッドSVDで近似:\( W \approx U_k \Sigma_k V_k^T \)。元の行列 m×n のパラメータ数は mn、分解後は k(m+n+1) です。k << min(m,n) のとき、パラメータ数は大幅に減少します。これはモバイル端末での大規模モデルのデプロイ時に非常に有用です。

PCA の SVD 実装

sklearn の PCA は内部で固有分解ではなくSVDを使用しています——中心化後のデータ行列に直接SVDを適用し、右特異ベクトル V の列が主成分方向となります。SVDは数値的に安定しており、共分散行列を明示的に計算する必要がありません。


その他の拡張