分解すると見える世界 ー特異値分解ー

2019年10月23日(水)
森田 大樹

はじめに

世界解釈において「分解」ほど人間に愛されたものはないのではないかと思う。幼い頃のアルバム写真に写る背丈の小さな私と無残に解体された玩具。水を電気分解した化学の実験。仕事場でブレイクダウンという声が聞こえる。仕事を小さな粒度に分けることをそう呼ぶらしい。

ただ、単に大きくて複雑な何かを一度に認知できないだけかもしれない。にしても、とかく人間は小さな単位を追い求めるような気がする。だから数学においても、分解という手段に打って出るのはなんら不思議なことではないと思える。

行列を行列で分解する

とある正方行列$A$が固有値$λ$、固有ベクトル$p$を持つとしましょう。このとき、これら3つの文字が方程式$Ap = λp$で結ばれます。これが前回の内容でした。

実は1つの行列に対して固有値・固有ベクトルの組は複数存在する場合があります。仮に$n$個の組があったとすると、

$$Ap_1=λ_1 p_1$$ $$Ap_2=λ_2 p_2$$ $$   ⋮   $$ $$Ap_n=λ_n p_n$$

とそれぞれの組に対して方程式が成り立ちます。これらの式、もう少し綺麗に書ける気がしませんか。まず、固有ベクトルを横に並べた行列$P=(p_1 p_2 ⋯ p_n)$を定めてみます。さらに、対角成分に固有値を並べた$Λ=diag(λ_1, λ_2, ⋯ ,λ_n)$も用意しておきましょう。さて$n$個の方程式はどうなるでしょうか。

行列積の取り方に気を付けると、

$$AP = PΛ$$

と行列を用いた1つの方程式にまとめることができます。何かしらの処理を1行のプログラムで実現することをワンライナーと呼びますが、それに似た美しさを感じます。

さてこの$P$ですが、必ず正則行列となります。従って、逆行列$P^{ -1 }$が存在して

$$A = PΛP^{ -1 }$$

というように$A$を主語に書き直すことができます。これを固有値分解と呼びます。$A$が3つの行列で分解できていますね。この固有値分解の良いところは後ほど紹介するとして、この分解手法に1つだけダメ出しをしたいと思います。それは「$A$が正方行列でないと適用できない」という制限です。この制限は結構強いです。なぜでしょう。それは正方形の行列は中々手に入らないからです。エクセルのデータが正方であることはほとんどないですよね。行と列の数が揃っているというのは結構珍しいのです。

そこで、一般の$n$行$m$列の行列に対しては特異値分解という手法を使いましょう。$A$を特異値分解すると、3つの行列を使って

$$A = UΣV^*$$

と$A$を分解できます。こちらの手法には「正方」という制限はありません。特異値分解をきちんと説明すると、$U$が$n$行$m$列のユニタリ行列であったり、$Σ$は特異値という値を対角成分に並べていくが実は途中から0になることもあったりと少しややこしい定義になりますが、今は忘れてください。今回大事なのは、$UΣV^*$を列ベクトルの単位で再計算すると $$A = σ_1 u_1 v_1^T + σ_2 u_2 v_2^T + ⋯ + σ_r u_r v_r^T$$

と表現できることです($U=(u_1, u_2, ⋯ ,u_r)$といった具合です)。ちなみに$σ$が特異値であり、値が大きいものから順に$σ_1,σ_2, ⋯$とするのが普通です。

この式の分解を丁寧すぎるぐらい丁寧に記述すると、

$$A = σ_1 \begin{pmatrix} u_{ 11 }^{ (1) } v_{ 11 }^{ (1) } & \ldots & u_{ 1n }^{ (1) } v_{ 1n} ^{ (1) } \\ \vdots & \ddots & \vdots \\ u_{ m1 }^{ (1) } v_{ m1 }^{ (1) } & \ldots & u_{ mn }^{ (1) } v_{ mn }^{ (1) }\\ \end{pmatrix} + σ_2 \begin{pmatrix} u_{ 11 }^{ (2) } v_{ 11 }^{ (2) } & \ldots & u_{ 1n }^{ (2) } v_{ 1n } ^{ (2)} \\ \vdots & \ddots & \vdots \\ u_{ m1 }^{ (2) } v_{ m1 }^{ (2) } & \ldots & u_{ mn }^{ (2) } v_{ mn }^{ (2) }\\ \end{pmatrix} + … σ_r \begin{pmatrix} u_{ 11 }^{ (r) } v_{ 11 }^{ (r) } & \ldots & u_{ 1n }^{ (r)} v_{ 1n } ^{(r)} \\ \vdots & \ddots & \vdots \\ u_{ m1 }^{ (r) } v_{ m1 }^{ (r) } & \ldots & u_{ mn }^{ (r) } v_{ mn }^{ (r) }\\ \end{pmatrix}$$

という感じになります。今回は、この式がポイントです。画像に特異値分解を適用して、この式の意味を考えていきましょう。

画像を画像で分解する

では、カエルの画像を特異値分解してみます(画像は「イラストや」からお借りしてきました。解像度は縦772、横800です)。

プログラムで解析した結果、今回は合計で772個の特異値が手に入りました。これはつまり「このカエルの画像は772個の画像(行列)の和で表現できる!」ということです。先ほどの式が図1に対応します。たくさんの行列を足し算していましたが、1つ1つが「カエル成分」なわけですね。

図1:カエルを構成するカエル成分の抽出

「どこまで足したら、カエルっぽく見えるだろう?」

これは気になるところですね。772個すべての画像を足し合わせないとカエルはでき上がらないのでしょうか。ということで、早速検証してみます(図2)。

図2:カエルの再構成

さすがに$k=1 ~ 4$程度だと元の画像とはほど遠いですね。しかしどうでしょう。$k=30$ならカエルだとしっかり認識できます。カエルという特徴を掴むだけなら772個すべての行列は必要なく、たった30個で良いのですね。$k=100$及び$400$だと、もう元の画像とどこが異なるのかも分かりません。ということで、極端なことを言ってしまえば$k=400$以降の行列は必要ありません。

このように、特異値分解を使って元の行列の近似行列を作る操作のことを低ランク近似といいます。固有値分解にも言えることですが、分解をすることで元の行列の中から本質的に重要なものだけを抽出できます。この低ランク近似はディープラーニングでも応用可能です。特に畳み込みニューラルネットワークを実装する上で利用されているケースが目立ちます。低ランク近似を行うことで行列を圧縮し、低計算量で省メモリなモデルを構築できるようです。

おわりに

「$2+3$は?」と問われて困る人はそうそういないでしょうが、「5は何と何を足したもの?」と聞かれると途端に困ってしまいますね。解が多すぎて一意に定まりません。多くの場合、分解するためには何か制約を加えなければならないものです。今回の特異値分解でいうと、固有値と固有ベクトルを使って分解をするというのが制約に当たるでしょう。

次回は低ランク近似の延長線上にある「非負値行列因子分解」という非常に有名な多変量解析の手法を紹介します。名前が主張している通り、行列に「非負値制約」を課すのですが、これもなんとも強力なのです。それでは、次回もお楽しみに!

スキルアップAI
東京工業大学情報理工学院修了。大学院時代は数理モデリングの手法を用いた脳神経科学の研究に携わる。 大手インターネット企業でマルチビッグデータシステムの開発・運用業務に従事した後、個人事業主として独立。現在SkillUpAI講師と並行し、MoneyForwardLab特別研究員として金融系データの解析業務を行う。2018年、ショウジョウバエ大規模ニューラルネットワークの数理モデリングの分野でIEEE Computational Intelligence Society Japan Chapter Young Research Award受賞。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています