にほんごのれんしゅう

日本語として伝えるための訓練を兼ねたテクログ

RNNで関数近似

RNNで関数近似

DeepLearningの一種であるRNNで、任意の関数を学習させて、十分にある関数の挙動が観測できたとき、未知の任意の点で予想できることを示したいと思います。

始める前に諸々調査したこと

ディープラーニングで任意の連続する関数を再現可能です。

しかし、ディープラーニングは無限やかなり大きな値を扱うことは難しく、適切にフィットしない問題があります。無限大に発散しない(発散してもいいけど、目的とする値をなにか閉域に限定して変換する操作を行う)必要があります

もっと有機的で人間的な特徴を学習と予想を行う問題として、sketch-rnnというrnnで最初の一部だけを描き、学習した内容で残りを予想するという問題設定もあって面白くユニークです

図1. 関数近似もスケッチの特徴を学び学習するのも一緒な気がします

耳だけ描くと、残りの部分が自動的に機械学習の予想結果により描かれます

様々な関数をDeepLearingのRNNで近似する

RNNはn-1からn-mまでの情報を特徴量にnの系列でのデータを予想することができます。
この時、連続であることが望ましく、無限小、無限大を取らないような、一定の再帰性があると収束しやすいです。(発散する関数は予想が大きくなるに近づくにつれ、難しくなります)

 

図2. アステロイド(うまくいく)

 

図3. 二次関数(うまくいかない)

数式で表現する

ディープラーニングのRNNのEncoder-Decoderの一つの機能の粒度を関数として表現すると、このように表現することができると思います。

ディープラーニングで適切なF1, F2, F3を決定することで、次の系列のX,Yが予想可能になります

ネットワークで表現する

ディープラーニングのネットワークではこのように表せるように思います

図4. 作成したネットワーク(RNNのAutoEncoderモデルを参考に作成)

このネットワークは特に媒介変数がないと表現できないようなネットワークについて高い力を発揮しそうだと考えました。

実験

サイクロイド

サイクロイドはこのような図形になます

 

媒介変数をもちいた表現はこのようになります

 

学習

$ python3 20-train-cicloid.py --train

評価

trainで使用しなかったデータを使用して予想

$ python3 20-train-cicloid.py --predict

 

図6. 予想したサイクロイド

ステロイド

ステロイドはこのように表現され、一定の大きさよりは大きくなりません

 

図7. アステロイド

媒介変数をもちいた表現はこのようになります

 

学習

$ python3 20-train-asteroid.py --train

評価

trainで使用しなかったデータを使用して予想します

$ python3 20-train-asteroid.py --predict

 

図8. 予想したアステロイド(たまにyが0にドロップする)

対数らせん

対数らせんはこのように表現されます。無限に大きくなるので、媒介変数thetaを一定の大きさでストップします

 

図9. 対数らせん

媒介変数を用いた表現はこのようになります

 

対数らせんの図

図10. 予想すした対数らせん(微妙に歪んでいる)

コード説明

Githubからどなたでも確認することができます
10-prepare.py
上記の例で示した図を描くような数字の系列のデータセットを出力します
以下のファイルが生成されます

サイクロイド.pkl
アステロイド.pkl
カージオイド.pkl
対数らせん.pkl
リサージュ.pkl
インボリュート.pkl

20-train-asteroid.py
ステロイドを学習&予想します
20-train-kardio.py
カージオイドを学習&予想します
20-train-cicloid.py
サークロイドを学習&予想します
20-train-spiral.py
対数らせんを学習&予想します

まとめ

  • いろいろな媒介変数でないと表現が難しい関数をy = f(x)でない、系列予想の問題設定とすることで簡単に予想することができそうだとわかりました
  • とにかく時系列でもなんでも連続した数字として表現できるのであれば、(モデルが十分に大きければ)予想が可能そうです
  • 仮定や解析プロセスを挟まずに学習&予想することができるので、楽です

参考文献