ひるね日記

調べ物の備忘録とか

Neural Networkでハートを描く!!@TensorFlow[関数近似]

Tensorflowを使ってハートを描く関数を近似してみようと思います。

sin波の関数近似

手始めにsin波の関数近似を試したいと思います。
ソースコードはこちらにおいてあります。
github.com


今回用いたネットワークはこのようなシンプルなFFNです。
f:id:hirune924:20180205233352p:plain
これで学習を走らせると...
f:id:hirune924:20180206005704g:plain
このようにsin波を描くことができました!簡単ですね。

ハート関数

いよいよハートを描いていく前にハート関数をおさらいしておきます。
ハートを描くための関数はいろいろあるのですが、今回は実装が簡単そうなこちらの関数を採用しました。
【閑話】フルタチさんCM「ハートのグラフ」をエクセルで書いてみた – ウェブプラ
y=\sqrt{|x|}\pm\sqrt{6-x^2}
-\sqrt{6}\le x \le \sqrt{6}

さて実装

いよいよハートを描いていきましょう。
sin波と違ってこれが難しいのはひとつのxに対して2つの出力があり、実質2つの関数を同時に学習する必要がある部分です。
とりあえず下のようなグラフを作成しました。
f:id:hirune924:20180206000315p:plain
そして結果がこちら
f:id:hirune924:20180206001919g:plain
うん、努力は認める。

たぶんlossの関数とか最適化の手法とかをいじくればできるかもしれないけど、あまり筋道だった解決プランが思いつかなかったので力技に出ることにした。(いい方法あったら教えてください)

力技で解決

悩みに悩んだ末、力技を持って解決しました。
採用されたのが下のグラフ
f:id:hirune924:20180206002807p:plain
いや〜、力技過ぎてもはやダサい。。。
ちなみにlossを計算するときは2つの出力を一つにまとめて誤差逆伝搬にもっていってます。
こういうのはなんて言うんだろう、アンサンブル学習?マルチタスクLoss???

このグラフを学習した結果がこちら
f:id:hirune924:20180206004332g:plain

いや〜、もう完璧ですね!
上と下のグラフがくっつきそうでくっつかない、いじらしいところが片想いの初恋のようですね!!

まとめ

単純なグラフでは複数の関数を一度に近似するのは難しいことがわかりました。
もっと現実的な問題を扱う時でも、明らかに種類の違うタスクを一度に学習させる必要があるときは出力層の手前でネットワークを分けるのが良いかもしれませんね。
関数近似は試すのは簡単ですがいろいろと考えることが多くとても勉強になるのでおすすめです!
活性化関数を変えてみてもグラフの形が微妙に変わって面白いです!