Neural Networkでハートを描く!!@TensorFlow[関数近似]
Tensorflowを使ってハートを描く関数を近似してみようと思います。
sin波の関数近似
手始めにsin波の関数近似を試したいと思います。
ソースコードはこちらにおいてあります。
github.com
今回用いたネットワークはこのようなシンプルなFFNです。
これで学習を走らせると...
このようにsin波を描くことができました!簡単ですね。
ハート関数
いよいよハートを描いていく前にハート関数をおさらいしておきます。
ハートを描くための関数はいろいろあるのですが、今回は実装が簡単そうなこちらの関数を採用しました。
【閑話】フルタチさんCM「ハートのグラフ」をエクセルで書いてみた – ウェブプラ
さて実装
いよいよハートを描いていきましょう。
sin波と違ってこれが難しいのはひとつのxに対して2つの出力があり、実質2つの関数を同時に学習する必要がある部分です。
とりあえず下のようなグラフを作成しました。
そして結果がこちら
うん、努力は認める。
たぶんlossの関数とか最適化の手法とかをいじくればできるかもしれないけど、あまり筋道だった解決プランが思いつかなかったので力技に出ることにした。(いい方法あったら教えてください)
力技で解決
悩みに悩んだ末、力技を持って解決しました。
採用されたのが下のグラフ
いや〜、力技過ぎてもはやダサい。。。
ちなみにlossを計算するときは2つの出力を一つにまとめて誤差逆伝搬にもっていってます。
こういうのはなんて言うんだろう、アンサンブル学習?マルチタスクLoss???
このグラフを学習した結果がこちら
いや〜、もう完璧ですね!
上と下のグラフがくっつきそうでくっつかない、いじらしいところが片想いの初恋のようですね!!
まとめ
単純なグラフでは複数の関数を一度に近似するのは難しいことがわかりました。
もっと現実的な問題を扱う時でも、明らかに種類の違うタスクを一度に学習させる必要があるときは出力層の手前でネットワークを分けるのが良いかもしれませんね。
関数近似は試すのは簡単ですがいろいろと考えることが多くとても勉強になるのでおすすめです!
活性化関数を変えてみてもグラフの形が微妙に変わって面白いです!