自然言語処理と機械学習こそが最強の学問

CSの大学院生が真の最強学問である自然言語処理と機械学習の内容を書いていく予定。時々全然違う分野の記事も書くかもしれない。

ニューラルネットワークの2変数関数近似能力

PRMLによると、ニューラルネットワークは万能近似器で、コンパクトな定義域を持つ任意の連続関数を近似できるらしい。ちょっと信じられないが、実際に調べてみると、英語WikipediaにUniversal Approximation Theoremという記事があって、シグモイド関数を使ったニューラルネットワークでの近似能力がすでに証明されている。

それでも確かめてみないと気がすまないので、最近実装したニューラルネットワークを使って、2変数関数の近似能力を色々と試してみた。

実験時の条件はsigmoidの隠れ層がひとつ、隠れ層のニューロンの数は2〜5、学習率は0.05~0.2で、訓練時間30秒程度に設定している。

すべてのケースでトレーニングデータとテストデータをそれぞれ500個ずつ用意して、実験した。

 

1)恒等写像のケース:

 f(x,y) = x

これぐらいはさすがに簡単にできた。収束速度が爆速だった。

テストケースの結果を2つ乗せると、こんな感じ。

 f(0.3301, 0.1987) = 0.3283

 f(0.6437, 0.9990) = 0.6437

 

2)加法のケース

 f(x,y) = x+y

これも簡単にできた。やはり収束速度が早かった。

 f(0.7511, 0.0781)=0.8289

 f(0.5151, 0.9377)=1.4533

 

3)乗法のケース

 f(x,y)=xy

最初の非線形のケース。最初は隠れ層のニューロンは2に設定して実行したが、ローカルな最適値で止まってしまって、収束しなかった。ニューロンの数を3に増やして、学習率を下げたらとうまく収束した。ただ、収束速度が上の2つの簡単なケースより遅かった。

 f(0.6897, 0.7320) = 0.5093

 f(0.2276, 0.9412) = 0.2138

 

4)すこし難しいケース

 f(x,y) = x^{2}y

上より難しいモデルなので、ニューロンの数が2のときにやはり収束しなかった。3〜5で試してみると、4の時に一番収束が早かった。ただ、それでもいままでで一番収束の速度が遅かった。

 f(0.5022,0.1622) = 0.0423

 f(0.9077,0.0617) = 0.0488

 

結論:

関数モデルが難しくなると、収束に時間がかかり、ニューロン数を増やさなければいけないがことがわかったが、やはりニューラルネットワークの近似能力はすごかった。ただ、パラメータの調整が結構難しい。ニューロンの数と学習率をうまく設定しないと、パフォーマンスがかなり変化することもわかった。遺伝的アルゴリズムあたりを使って設定したらもっと手軽にできるのかな。

時間があれば、もっと難しいケースでも実験してみたい。