HELLO CYBERNETICS

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

見たら瞬時に理解すべき数式

 

 

follow us in feedly

機械学習で現れる数式に関して、これを見たら瞬時に理解すべきものを載せておきます。

機械学習で現れる数式には大量の添字があり、それらのせいで一体どのような計算が行われているのかを瞬時に把握するのが難しくなっています。しかしもはやこれは慣れの問題です。

教科書を根気強く理解できるようにするのもいいですが、予めどのような表現があるのかを知っていれば、もっと楽に読み進めることができるはずです。そのための言わば事前に知っておくと言い数式たちを載せておきます。

 

 

 

f:id:s0sem0y:20170308054811p:plain

行列の行と列の数

計算の法則  

mn列の行列\bf Aを考えましょう。

n次元の縦ベクトル\bf xに対して\bf Aを左から掛けて\bf yを得た場合

 

\bf y = Ax

 

この\bf ym次元のベクトルになります。mn列の行列は左から掛けた場合はn次元のベクトルをm次元に変えるということです。

 

逆にm次元の横ベクトル\bf u^Tに対して\bf Aを右から掛けた場合は、得られるベクトルはn次元の横ベクトル\bf v^Tになります。(通常ボールド体でベクトルを表記する場合は縦ベクトルとして扱われることが多いです。横ベクトルとして扱う場合には、転置記号を用います。)

 

\bf v^T = u^TA

 

このような操作をもう少し一般的に解釈したければ、ベクトルというものも行列の一種だと考えるといいでしょう。

 

すなわちn次元の縦ベクトルはn1列の行列であり、m次元の横ベクトルは1m列の行列だと見なすのです。すると、この次元の変更の法則は至ってシンプルになります。

3✕6の行列と6✕1の行列は3✕1の行列を生み出します。

(3✕6)(6✕1)の行列は真ん中の6が消されて3✕1になるということです。このことを把握しておけば、以下のように行列計算が連なっていても、次元がどうなるかはすぐに把握できます。

 

\bf ABCDEFGH

 

の場合は、\bf A(6,3)で、\bf H(9,2)ならば、最終的得られる行列は(6,2)の行列です。途中の計算は結局真ん中で次元が調整されていきます。ベクトルも含んだ行列の計算が現れたときには、瞬時にその行列の行と列の数を把握できるようにしましょう。

 

特に頻出する形式

特に以下の形式(1,m)×(m,m)×(m,1)には注意してください。

これは実際には横ベクトル×行列×縦ベクトルという計算になっています

 

\bf x^TAx

 

ここまで読んだあなたは、すぐに(1,1)(スカラー)だと分かるはずですが、この形式を見た際にすぐにスカラーだと判断がつかない人が意外と多いです。

通常これは二次形式と呼ばれます。実態は多変数の二次関数になります。

 

また、(m,1)×(1,m)のようなものにも注意してください。当然(m,m)の行列になるとすぐに分かるのですが、実際には以下のように縦ベクトル×横ベクトルという計算になっています。

 

\bf xx^T 

 

これを見た場合に、すぐに行列になると判断ができない人が意外といます。

 

 

和の計算と行列表現

内積

z = \sum_i w_{i}x_i

 

これは内積です。

ベクトル{\bf w}=(w_1,...,w_n)^T{\bf x}=(x_1,...,xn)^Tとすれば

 

z = {\bf w}^T{\bf x}

 

と表せます。

 

行列計算

z_j = \sum_i w_{ji}x_i

 

この数式を瞬時に理解できますか?

jは実は計算上ほとんど意味のない添字です。では何のためにあるのかというと、iによって同じように計算されるzが複数個あるためです。そのうちのj番目のzz_jと表記されています。jを無視すればこれは丸っきり内積計算です。

 

この計算は、ベクトル{\bf z} = (z_1,...,z_m)^Tとベクトル{\bf x}=(x_1,...,x_n)^Tを考え以下の計算をしています。

 

\bf z = Wx

 

ここでjはベクトル\bf zj番目の成分を指定していることになります。

\bf Wmn列の行列でw_{ji}ji列目の成分として持ちます。

では次に

 

δ_k = \sum_j d_{jk} a_j

 

これは分かるでしょうか。今回はkが計算上は意味のない添字で、何番目のδかを指定しているものです。実際に計算に関与しているのはjです。

この場合は{\bf δ} = (δ_1,...,δ_m)^T{\bf a} = (a_1,...,a_n)^Tを考えれば

 

{\bf δ}^T = {\bf a}^T \bf D

 

という行列計算になります。\bf Dnm列の行列でd_{jk}j

k列目の成分として持ちます。

 

行列の行と列の把握の仕方を知っていれば、これらもすぐに理解できるでしょう。計算に意味のない添字はまさしくベクトルの次元を指定しているものです。行列は、その次元を変換してやるものであることを知っていれば、添字の対応関係も明白になります。

 

出現場面

ニューラルネットワークでは非常に頻繁に現れます。

ニューラルネットのユニットの番号を指定するのに、計算には関係ない添字が使われたり、あるいは何層目かを指定するためにz_j^{(l)}などという表現も出てきます。 それでも計算に関係ない部分だと思えば、ややこしさは低減するでしょう。あくまで「どれ」なのかを指定するための都合なのです。

 

s0sem0y.hatenablog.com

 

でも述べましたが、行列表示での計算は見た目もよく、計算もプログラムと相性が良いため、多用される表現となっています。

 

固有値と固有ベクトル

固有ベクトルは、ほとんど変換を受けないベクトル

ある行列Aがあります。この行列Aでベクトル\bf xを変換して、ベクトル\bf yが得られたとしましょう。このことを数式で書くと以下となります。

 

A\bf x=\bf y

 

になります。

図式的に書きましょう。ベクトル\bf xAに入力したら\bf yが出てくるという状態です。この\bf yは通常、\bf xとは異なったものに変換されています。実際に適当な行列とベクトルを使って計算してみてください。

 

f:id:s0sem0y:20161001173511p:plain

 

もしもベクトル\bf xを色々加工したいならば、いろんな行列Aを試せば良いのです。通常コンピュータグラフィック(CG)はこのAを色々取り揃えておくことで、画像の描写を決めています。しかし今回はその話ではありません。

 

注目すべきは、とあるAに対して、なぜかほとんど変換を受けないベクトル\bf xがあることです。行列Aに対して、色々ベクトル\bf xを変えてみて入力をしてみると、λ\bf xとなって出てくることがあるのです。

 

 

f:id:s0sem0y:20161001173334p:plain

 

行列Aはベクトルを全く違うベクトルに変えてしまうもののはずです。

しかし、ある特定のベクトル\bf xだけは、ただ定数倍だけされて出てくるのです。このように、本来ならば全く違うものに変わるはずが、ほとんど行列Aの影響を受けない(定数倍されるだけの)ベクトルを行列Aの固有ベクトルと言います。

図から数式に戻れば

 

A\bf x=λ\bf x

 

固有値とは、固有ベクトルがどれだけ定数倍されたかを表す

今、行列Aに対してほとんど変換を受けないのが行列Aの固有ベクトルだと言いました。しかし、少しだけ変換を受けており、定数倍だけ長さが変わっているのです。この、どれくらい長さが変わったのかの倍率を固有値と言います。

すなわち上の図で言えばλが行列Aの固有値というわけです。

 

行列に付随する、定数倍という変換しか受けない特別なベクトルを固有ベクトル、そのときの倍率が固有値ということです。

 

従って、単に固有値!とか固有ベクトル!というふうには使いません。「どの行列の」固有ベクトルと固有値なのかをいつでもセットで考えなければいけません。

 

固有ベクトルだけが満たしている特別な式

 

行列Aとその固有ベクトル\bf xの関係は、その固有値λを使って

 

A\bf x=λ\bf x

 

と表すことができます。この式を解けば、具体的な固有ベクトルと固有値が求まるというわけです。行列Aに関する特別なベクトルと、その特別な定数倍が得られるのです。

 

 

出現場面 

主成分分析とは、データの分散共分散行列の固有値問題を解くことにほかなりません。

固有ベクトルは、データが大きく変動している新たな主軸を表しており、固有値の大きさがその変動の大きさを評価することに使われます。

 

また特異値分解では、行列を特異ベクトルを並べた行列と、特異値を対角成分に持つ行列の積に分解します。例えばN個の時系列d次元データ\bf x_1,x_2,...,x_Nがあれば、これをdN列の行列とすることができます。

この行列を特異値分解すれば、そのデータセットに特別に存在する特異ベクトルと特異値なるものを把握できるのです。仮に、しばらく時間を置いて同じように時系列データをN個集めて特異値分解をしたときに、まったく異なる特異ベクトルと特異値が得られた場合には、最初のデータと何か違いがあるということです。

つまり正常な状態の時系列データに対して特異値分解を施し、それらの特異ベクトルを保持して、時系列データと比較することで異常検知などに用いることができるのです。

 

この特異値分解は、固有値問題のことが分かっていればすぐに理解できます。

 

深層学習でも、データを白色化しておく前処理などが有効で、この際にも主成分分析の一種が用いられます。

 

勾配 

勾配はスカラー関数の各成分の傾き

 

スカラー関数L({\bf w})のベクトル\bf wによる微分を勾配ベクトルと言います。

具体的に二次元の\bf wで考えましょう。

 

\frac {\partial L}{\partial {\bf w}}は、スカラーLをベクトル{\bf w} = (w_1,w_2)^Tで微分しており、以下で定義されます。

 

\frac {\partial L}{\partial {\bf w}}=(\frac{\partial L}{\partial w_1} ,\frac{\partial L}{\partial w_2})^T

 

 

勾配ベクトルの第一成分は\bf wの第一成分が少し変化したときの変化量(微分)になっています。同じように第n成分は\bf wの第n成分が少しだけ変化したときの変化量です。

仮に勾配ベクトルの第一成分が正の値で2の場合には、\bf wの第一成分が少し増えw_1+⊿w_1となった場合にはLL + 2⊿w_1になることを示しています。

これは丸っきり一次元の微分と同じです。すなわち勾配ベクトルの各成分は、各成分方向の傾きを表しているということです。

 

勾配はスカラー関数の等高線の法線ベクトル

多くの教科書で出てくる、「等高線の法線ベクトルである」という表現に困惑する人は少なくないです。勾配(傾き)だから接線ではないのか?と感じるのです。

そもそも等高線とは何でしょうか。地図に載っている山を考えればわかりやすいでしょう。高さを表しています。山の同じ高さの部分を線で結んでいるのです。つまりある等高線l_1の隣の等高線l_2は、l_1の部分より山が高いか低いかであります。

その場所に移動するにはどうすればいいかというと、山を下るか、あるいは登るしかありません。すなわち勾配方向に負に移動するか正に移動するかです。

下の図では、標高がL({\bf w})であり、地図上の位置が{\bf w}=(w_1,w_2)^Tで指定されているという状況です。標高がL = l_1になる地点とL = l_2になる地点が、それぞれ青い線と赤い線で表されています。山を登る方向である勾配ベクトルは、等高線にとっては法線ベクトルになっています。

 

f:id:s0sem0y:20161112131233p:plain

もしもこの図とは異なって、右側から山を登ろうとする場合は、傾斜は緩やかになります。従って勾配ベクトルは小さくなります。ですが、それでもやはり登る方向であることに変わりはなく、等高線に対しては法線ベクトルになっています。

 

 

出現場面

機械学習のあらゆる場面で姿を表します。

学習、すなわち損失関数(評価関数)の最小化問題を解く基本的手立ては、上記のように勾配を求め、損失関数が減少する方向に少しずつ\bf wを更新していく勾配法です。

勾配に対する性質をよく理解していれば、学習を早めたりする工夫をすることができます。

例えば学習が停滞するのは、勾配が小さいからでしょう。単に勾配を計算するだけでなく、もっと良い更新の方向を探ることが最適化の主な研究対象ともなっています。

学習が停滞する要因として以下の記事が参考になるかと思います。

 

s0sem0y.hatenablog.com

 

 

終わりに

今回上げたのは必要最低限の知識です。

本当に瞬時に意味が理解できてほしいものだけをピックアップしました。

逆にこれだけを当たり前のように読みこなせるならば、ある程度は何をしているのかを理解することが可能となるでしょう。

 

機械学習の数学に関する話は以下の記事で紹介しています。

s0sem0y.hatenablog.com

s0sem0y.hatenablog.com

s0sem0y.hatenablog.com