seegongsik
単語帳
工業数学

SVD は回転・伸ばし・回転だ

どんな行列も回転・軸の伸ばし・回転の三段階、単位円は楕円になり特異値がその半径だ

どんなにごちゃついた行列でも、ふたを開ければきれいな三動作にすぎません。まず一度回し(Vᵀ)、二つの軸方向に別々に伸ばし(Σ)、もう一度回します(U)。この行列に単位円をまるごと入れると、整った楕円が一つ出てきます。その楕円の半軸の長さこそが特異値です。そして最大の特異値ひとつが、楕円の形をほぼ全部背負います。画像圧縮と PCA はこの一つの事実の上に立っています。最初のウィジェットで動作を一つずつ踏みながら、円が楕円になる様子を追ってみてください。

ボタンで段階を一つずつ踏んでみてください。段階0はただの単位円で、その上に右特異ベクトル v1, v2 が示されます。段階1の Vᵀ は円を回しますが、円は円なので形は変わりません。代わりに v1, v2 がちょうど x 軸と y 軸の上に乗ります。段階2の Σ はその二軸方向だけに伸ばし、x に σ1、y に σ2 の整った楕円を作ります。段階3の U はその楕円をもう一度回して傾いた最終形、すなわち A の像にします。その二つの半軸が σ1·u1 と σ2·u2 です。回転・伸ばし・回転、この三動作がどんな行列でも作り出します。

今度は回転をすべて取り除き、伸ばしだけ残します(U = V = I)。スライダー σ1 は x 軸方向に、σ2 は y 軸方向に単位円をどれだけ引っ張るかを決め、その二値が楕円の半軸の長さになります。特異値とは結局、その軸が何倍に伸びるかです。σ1 を大きくすると楕円は横に長くなり、σ2 を小さくすると縦に平たくなります。片方を 0 近くまで下げてみてください。楕円がその軸方向に完全につぶれて一本の線分になります。その瞬間、行列のランクが 2 から 1 に落ち、警告が出ます。

今度は三つの部品を自分の手に取ります。スライダーで最初の回転角(V)、二つの伸ばし倍率(σ1, σ2)、最後の回転角(U)を決めると、それがそのまま A = U Σ Vᵀ になります。画面は格子がどう変形するかと、単位円がどの楕円へ向かうかを並べて見せ、下の数字板にはその A の四成分が出ます。角度と倍率をあれこれ回すと、どれだけ勝手に見える行列の数でも、結局きれいな回転二つと軸伸ばし一つから来ていると分かります。どんな 2×2 行列も、回転 → 軸伸ばし → 回転、この分解を逃れられません。

この分解には方向が二組あります。入る側の v1, v2(右特異ベクトル)と、出る側の u1, u2(左特異ベクトル)です。トグルで組を選んでください。v1 を A に通すとちょうど σ1·u1 が出て、v2 を通すと σ2·u2 が出ます。つまり入力方向 v が出力方向 u に変わり、その長さが特異値だけ掛けられます。単位円上の青い矢印が入力 v、楕円上の矢印がその出力です。V の方向が入って U の方向が出て、特異値が大きさを決める。これが SVD の一行要約です。

最後に、楕円の形が本当に大きな特異値ひとつにほぼ全部入るのかを確かめます。トグルのランク2は完全な A、つまり傾いた楕円全体です。ランク1に切り替えると σ1·u1·v1ᵀ の一片だけが残り、楕円が最も長い軸(長軸)の上に完全に落ち着いて、長さ σ1 の線分になります。小さな σ2 の片を捨てたわけです。画面にはその大きな片が担うエネルギー比 σ1²/(σ1²+σ2²) がパーセントで出ます。たいていこの一片だけで形のほとんどが残ります。最大の特異値だけ残しても形がほぼ保たれる、これが圧縮と PCA の核心の発想です。

実際に使うSVD はあらゆる行列を A = U Σ Vᵀ、すなわち回転 → 軸伸ばし → 回転に分けます。単位円を入れると楕円が出て、その半軸の長さが特異値 σ1 ≥ σ2 です。Σ は各軸を σ だけ伸ばす純粋な伸ばし、U と V は純粋な回転です。右特異ベクトル v は入力方向、左特異ベクトル u は出力方向なので A·vi = σi·ui が成り立ちます。σ が 0 ならその軸は死んでランクが落ち、最大の σ だけ残す低ランク近似が形のほとんどを保ちます。画像圧縮、PCA、推薦システム、ノイズ除去はすべてこの一つから流れ出ます。勝手なデータも結局は回転・伸ばし・回転です。
工業数学
このページがお役に立ったなら支援する