"機械学習","信号解析","ディープラーニング"の勉強

HELLO CYBERNETICS

深層学習、機械学習、強化学習、信号処理、制御工学などをテーマに扱っていきます

知っておくべき特殊な行列と便利な性質 (大学学部生の方にもおすすめ)

 

 

はじめに 

行列の基本的な性質を知っておくことは機械学習では重要なことです。

手法の要となっている式変形において、行列の性質が使われるケースが多いためです。

 

基礎編:特殊な行列

対称行列

対称行列\bf Aとは、

 

\bf A^T=A

 

が成り立つような行列のことです。

行列\bf Ai,j成分をa_{ij}と表せば、

 

a_{ij}=a_{ji}

 

と表現できます。

この対称行列は非常に良い性質を持っているため(後述)機械学習の様々な場面で現れます。

複素数まで概念を拡張した際に、同様の性質を持つ行列をエルミート行列と呼びますが、機械学習で現れることはおそらく無いでしょう。

 

直交行列

直交行列\bf Uとは単位行列をIとして

 

\bf UU^T=I

 

が成り立つような行列のことです。

行列\bf Uがベクトル\bf u_iを並べて\bf U=(u_1,u_2,...)と構成されているとしたときに、その中身である\bf u_i\bf u_j(ただしi≠j)を取り出せば、その内積は

 

\bf u_i・u_j=0

 

となります。唯一i=jのとき、すなわち同じベクトル同士の内積のみ値を持ちます。しかも、その時の内積の値(ベクトル\bf u_iの大きさの二乗)は1となっています。

 

すなわち直交行列\bf Uの中にあるベクトルたちは、互いに直交しており、しかも大きさが1のベクトルであるということです。

 

もっと端的に言えば、直交行列の中のベクトルたちは正規直交基底を成しています。

 

複素数まで概念を拡張した際に、上記の性質を持つ行列をユニタリ行列と言いますが、こちらも機械学習で現れることは無いと思っていいです。

 

直交行列\bf Uの重要な性質として、その逆行列\bf U^{-1}が直ちに

 

\bf U^{-1}=U^T

 

と求まることが挙げられます。これは定義から明らかですが、非常に重要な性質なので覚えておきましょう。直交行列の逆行列が知りたければ、転置するだけでいいのです。

 

一般の行列

上記の行列が特殊であるということは、普通の行列は当然上記の性質を持っていないということです。対称行列は転置したら自分自身になりますし、直交行列は転置したら逆行列になります。しかし普通の行列は全く別の行列になるのです。

 

わざわざ特別扱いするには意味があります。こじつければいくらでも特殊なものを見つけられそうですが、これらに固有名詞が付けられるのはそれ相応の価値があるからです。

後にこれらを使った応用例を見ることにします。

 

基礎編:逆行列と行列式

逆行列とは

すでに逆行列のことはご存知かと思います。行列\bf Aの逆行列\bf A^{-1}とは

 

\bf A^{-1}A=I

 

と元の行列との積を取ったときに単位行列になるようなもののことです。

この逆行列は必ずしも存在するとは限りません。

 

行列式とは

行列式では、行列Aに関して特殊な操作を施してスカラー値を得ます(この操作は意外に複雑です)。通常、行列\bf Aの行列式は\bf |A|det({\bf A})などと記述され、この行列式の値が0の場合はその行列に逆行列が存在しません。

 

2×2の行列が以下の場合

 

\begin{pmatrix}
a_{11} & a_{12} \\
a_{21} & a_{22}
\end{pmatrix}

 

行列式は

 

a_{11}a_{22}-a_{12}a_{21}

 

となります。具体的な計算方法は教科書などに譲りますが、知らなければいけない性質は行列式の値で逆行列が存在するかを調べられるということです。

 

ランク落ち

機械学習ではほとんど議論されることはありませんが、行列のランク落ちについても述べておきましょう。

n×nの行列\bf Aがあれば、ランク落ちしていなければこの行列のランクはnとなります。ではどのようなときにランク落ちするのかというと、行列\bf Aが縦ベクトル(あるいは横ベクトルでもいい)を並べてできた行列\bf A=(a_1,...,a_n)としたときに

 

{\bf a_i}=c{\bf a_j}

 

となるようなベクトルがある場合です。すなわち中の行列をベクトルの集まりと見たときに、あるベクトルが他のベクトルの整数倍で表せてしまう場合はランクが落ちるのです。

このようなベクトルの「被り」の数だけ行列のランクは落ちていきます。

 

一般に1つでもランク落ちが起こると、その行列の行列式は0になります。

従って、その行列に逆行列が存在しなくなります。

 

一般の行列で行と列の数が異なる場合で考えると、もっと複雑になりますが、逆行列の議論をする上では、もともと正方行列(行と列が同じ数)にしか定義できないので割愛しましょう。

 

 

ランク落ち ⇔ 行列式が0 ⇔ 逆行列が存在しない

 

ということを抑えておけばいいでしょう。

 

 

応用編:固有値問題

固有値と固有ベクトルと固有値問題

固有値と固有ベクトルに関しては以下の記事が参考になります。

s0sem0y.hatenablog.com

 

行列\bf Aに関する固有値問題とは

 

{\bf Ax}=λ{\bf x}

 

となるようなスカラーλとベクトル\bf xを見つける問題です。

このときのλを固有値、\bf xを固有ベクトルと呼びます。

行列Aにとって固有ベクトルは特別で、そこらへんのベクトルとは一線を画す存在なのです。上記の記事でも説明していますが、行列\bf Aをあるベクトルに作用させた場合には全く異なるベクトルに変形されるはずですが、固有ベクトルだけは単に定数倍されるだけです。

 

固有値問題

固有値問題の方程式を

 

{\bf Ax}-λ{\bf x}=\bf 0

 

({\bf A}-λ{\bf I}){\bf x}=\bf 0

 

と置いて解いていきます。

ここで場合分けをします。

 

1.({\bf A}-λ{\bf I})に逆行列が存在する場合。

2.({\bf A}-λ{\bf I})に逆行列が存在しない場合。

 

です。1.の場合は逆行列があるのならば、

 

({\bf A}-λ{\bf I}){\bf x}=\bf 0

 

の両辺に左辺からその逆行列を掛けてやれば、

 

\bf x=0

 

として値が求まります。これで固有ベクトルが求まりました。とてもつまらないですね。

どの行列にしても、この1.の場合は同じ結果になるわけですから、あまり意味がありません。ですから普通はこの場合分けで得られた固有ベクトル(零ベクトル)のことはわざわざ固有ベクトルと呼びません。したがって、考えるのはいつでも「2.」の場合だけになります。

 

2.の場合は、逆行列が存在しない条件が({\bf A}-λ{\bf I})の行列式が0であることですから、この問題を解けば良いことになります。すなわち

 

det({\bf A}-λ{\bf I})=0

 

を満たすλが固有値として求まります。そしてその固有値が求まったら、元々の方程式

 

({\bf A}-λ{\bf I}){\bf x}=\bf 0

 

λを代入して、残りの固有ベクトル\bf xも求めるという手準になります。

 

表記整える

通常、固有値は複数個見つかります。

そして各固有値に対してそれぞれ固有ベクトルが求まります。例えば、2×2の行列の固有値を求めた場合にλ=λ_1,λ_2と2つの固有値求まったとしましょう。

そして、それぞれの固有値に対して、固有ベクトルが1つずつ見つかりそれらをそれぞれ\bf x_1,x_2としておきましょう。

つまりこのとき

 

{\bf Ax_1}=λ_1{\bf x_1}

{\bf Ax_2}=λ_2{\bf x_2}

 

という2つの式が得られたことになります。これらを1つの式にまとめます。

行列\bf X=(x_1,x_2)を準備し、以下のように対角成分に固有値を並べた行列\bf Λ

 

\begin{pmatrix}
λ_1 & 0 \\
0 & λ_2 
\end{pmatrix}

 

を準備すれば

 

\bf AX=XΛ

 

と式をまとめることができます。(\bf AX=ΛXとはできません!注意!

固有値問題では、具体的に固有値と固有ベクトルが求まると、それらを代入して最終的には上記のような関係式が現れるということです。

 

実際には固有値の数が、行列のランクよりも少なかったり、そのような場合には1つの固有値に対して複数の固有ベクトルが見つかるという場合もあります。

その時でも代入する添字を揃えておけば上記のように表記することができます。

 

対角化

これまで、具体的な値を準備せずに、一般的にどのように表記されることになるのかだけを見てきました。言い換えると、最終的な表記を出発点に話を議論しても良いということです。

 

\bf AX=XΛ

 

固有値問題は、固有値と固有ベクトルを求めさえすれば最終的には上記のような形になることがわかりました。

この式の両辺左から\bf X^{-1}を掛けてみましょう。(とりあえず\bf Xには逆行列が存在するという仮定で)

 

\bf X^{-1}AX=Λ

 

となります。これを通常「対角化」と言います。

右辺は固有値を対角成分に並べたものです。

行列Aはその固有ベクトルを求めさえすれば、上記の計算で、単に固有値を対角成分に並べただけの行列に変形することができます。

 

もしも対角化の結果だけを知りたいならば、固有ベクトルを頑張って求めなくても、固有値を並べた行列になると予め分かっているので、簡単に対角化ができます。

 

ただし、固有ベクトルを並べて行列に逆行列が存在することが条件になることを忘れてはいけません。逆行列が存在しないようなケースでは対角化ができないのです。

それでも単純な形に変形したいという要望はあるので、そのような場合にも上手く変形をするための方法が存在しており「ジョルダン標準系」として知られています。

 

応用編:対称行列と直交行列での対角化

対称行列の対角化

対称行列の固有値は必ず実数値であることが知られています(証明は簡単です)。

そして固有値が実数値であることを使うと、対称行列の異なる固有値に属する固有ベクトルは互いに直交することもわかります(これも証明は簡単です)。

 

重要なのは、対称行列の異なるに属する固有ベクトルは互いに直交するということです。

仮に2×2の行列Aに関して以下が求まった(2つの固有値とそれぞれの固有ベクトル)としましょう。

 

{\bf Ax_1}=λ_1{\bf x_1}

{\bf Ax_2}=λ_2{\bf x_2}

 

 

すると\bf x_1・x_2=0

 

であるということです。対角化は\bf X=(x_1,x_2)として

 

\bf X^{-1}AX=Λ

 

で達成されることがわかっています。注目すべきは、固有ベクトルが互いに直交しているので、それを並べている行列\bf Xは直交行列であるということです。

従って、対称行列\bf Aに関しては

 

\bf X^TAX=Λ

 

で対角化を達成できるということです。

普通の行列ならば固有ベクトルを求めたあとに、それらを並べた行列をつくり、その逆行列を求めねばなりません。逆行列を求めるのは結構面倒で、コンピュータでもやはり計算コストを食うところです。

 

しかし、対称行列ならばそれを転置という操作に置き換えられるので非常に楽になります。

対角化しなければならない問題が出てきたときに、必ずその行列が対称行列ではないかを調べるようにしてください。愚直に問題を解くより遥かに早く楽に終わります。

 

対角化の応用例

指数関数f(t)=e^{at}はご存知でしょう。数学のあらゆる応用面で姿を表す関数です。

このaの部分がスカラーではなく行列\bf Aの場合は行列指数関数と呼ばれます。

これは以下で定義されます。

 

e^{{\bf A}t}=\sum _{k=0}^∞ \frac{1}{k!}{\bf A}^k t^k

 

これは行列の和ですから、成分ごとに考えてあげれば済む話です。

問題は、({\bf A}t)^kを計算するのが非常に困難であるということです。そもそも各項の成分を求められないという状態なわけです。

対角行列ならばべき乗は、各対角成分を個別にべき乗してあげれば済む話です。一般の行列では行列の積の計算が複雑であるがために、簡単な計算に帰着できません。

 

ここで行われる発想が、行列の対角化です。行列Aを対角化してしまいましょう。

 

\bf X^{-1}AX=Λ

 

と対角化できることを私達は知っています。逆に

 

\bf A=XΛX^{-1}

 

とも表せます。(通常この形式を行列Aの固有値分解と言います。)

 

この{\bf A}^kを計算するのはそこまで大変ではありません。

 

分かりやすいようにk=3で計算してみます。

 

{\bf A}^3={\bf AAA}={\bf (XΛX^{-1})(XΛX^{-1})(XΛX^{-1})}

 

\bf Aの対角化(固有値分解)を使うことで、上記のように変形されます。

そして\bf XX^{-1}の部分は単位行列になりますから

 

{\bf (XΛX^{-1})(XΛX^{-1})(XΛX^{-1})}=\bf XΛΛΛX^{-1}=XΛ^3X^{-1}

 

と変形されます。\bf Λはただの対角行列ですから簡単に求めることができますね。

k乗したいならば、固有値をk乗したものを対角成分に並べて、最後に固有ベクトルを並べた行列で上記のように挟むだけでいいのです。

 

これを使って定義式に代入してやれば

 

e^{{\bf A}t}=\sum _{k=0}^∞ \frac{1}{k!}{\bf (XΛX^{-1})}^k t^k={\bf X}\left( \sum _{k=0}^∞ \frac{1}{k!}{\bf Λ}^k t^k \right){\bf X^{-1}}

 

と表すことができます。

べき乗の計算はそれぞれスカラー値に行うだけになり、行列演算は両端の2つだけです。これらの行列は固有値問題を解く過程で求められますし、もしも行列\bf Aが対称行列ならば、逆行列を求める作業すらいらないということになります。

実は和の計算の部分は更に簡略化されます。対角行列の第(1,1)成分を考えれば

 

\sum _{k=0}^∞ \frac{1}{k!} λ_1^k t^k

 

となっており、これは定義から普通の指数関数

 

e^{λ_1t}

 

とあらわせてしまうのです。従って、\bf Aの固有値を求めたら上記のように指数関数を作って対角成分に並べ、固有ベクトルを求めてしまえば行列指数関数は求められることになります。

 

このテクニックを使う機会は、機械学習ではあまりないかもしれません。

しかし制御工学など連立微分方程式を基礎としている分野では頻出です。