2016年4月5日火曜日

自動微分をする

よく、コンピュータの理論を勉強する前に基礎である線形代数を勉強してほうが良いといわれています。

この線形代数なのですが、おじさんの時代は主にベクトルとか逆行列とかをやっていました。まぁゲームとかを作る際に座標の計算とかをしないといけないからなのですが。

しかしこの線形代数、時代とともに旬な領域が変化していまして、最近は二重数とか自動微分とかをイギリスの大学で勉強するようです。

おじさんの時代は二乗すると-1になる数はiしかなかったのに。
二乗すると-1になる数三つに増えてるし、近頃は二乗すると0になる二重数があるらしいです。素粒子みたくフェルミ的とかボソン的なんていうらしいです。
二重数の話はまた後ろに書くとして、まずは自動微分について。

自動微分とはプログラムで関数の値の計算をするとなんとその導関数の値も同時に計算できちゃうアルゴリズムというか理論です。

たとえばx=1でいうと
y=x^2を計算すると1ですが、同時にy'=2*xの答え2も計算できてしまう。

ただそれだけなんです。
手動で計算したほうがはやいじゃん!

と思っていたのですが、よく調べてみると、単純な数式ならば手動で微分すればよいんですが、Σとかがある複雑な式の導関数の計算ができたり、ニュートン法と組み合わせれば、逆関数がわからない複雑な方程式が解けたり、計算が高速にできたりします。

早い話が、条件はありますが方程式が高速に解けるのです。
このため、深層学習のとかでも使われていたりします。

この自動微分の計算ですが、二重数と関係があるようで、二重数の虚部というのか実部でない部分の計算と同じなのです。

つまり二重数で関数を計算すると実部が関数の値で、実部でない部分が関数を微分した値になります。


ほんとかよ!素粒子と深層学習が一緒なのかよ!
ということで、確かめてみました。

自動微分の理論からプログラミング
http://kivantium.hateblo.jp/entry/2016/03/25/010320

二重数の理論からプログラミング
http://qiita.com/skitaoka/items/b7d0b19e13a7c6832773

この二つのライブラリで計算値が一緒になるんですね。
あらーびっくり。




0 件のコメント:

コメントを投稿