今回はNeural Network Consoleの使用例として、複雑な関数近似の近似を行っていきたいと思います。学習を進めるにあたり、中間ノードの数やエポック数の比較も行ってみたので参考にして頂ければと思います。
ディープラーニングに関する記事はこちら
スポンサーリンク
近似する関数
今回Neural Network Consoleを使って近似する関数は以下の関数としました。二次関数の上にsinカーブが乗っている関数ですね。また、今回のxの範囲は-10から10としました。
訓練データと検証データの作成方法についてですが、xを-10から10までの乱数で決定し、その時出力されるyの組み合わせを1つのデータとしています。ただし、ここで摘出したyに誤差を与えるため、実際には正規分布に従う誤差を加えています。
訓練データ数2000,検証データ数400として検証を行いました。
エポック数の決定
今回検討するモデルは最も基礎的なモデルで、中間層数1中間ノード数Nのモデルとします。Nの数は後程変更させた検証結果を説明します。エポック数を決定するにあたり、中間ノード数N=3として一旦検証しました。
また、出力層はSquaredErrorを用いており、これは正解データとの誤差の二乗を小さくする目的で使用するモジュールになります。
検証結果が下記のグラフになります。
上図の青い点が検証データをプロットしたものになり、オレンジの線が今回の学習により得られた近似曲線です。下の図に学習曲線を示しています。
エポックが100の時の学習曲線を見ると、右肩下がりなのでさらに学習を続けるべきと判断できます。一方エポック数1000の学習曲線を見ると、ほぼ収束しているように見えるので、これ以上エポック数を増やしても学習は進まないことが想像できます。
近似した関数の結果を見ても当然ですが、エポック数1000の時の方が学習が進んでいるため、より訓練データに近い近似関数が得られているのが分かります。
しかし、まだまだ理想的な近似曲線には至っていないので、次はエポック数は1000のままで、中間ノードの数を増やして検証していきます。
中間ノードの数
先ほどは中間ノードの数を3にしていましたが、今回は中間ノードの数を10,100,1000,10000の4種類で検証していきたいと思います。まずは学習曲線の確認から比較していきます。エポック数はすべて1000にしています。
どれを見ても収束しているように見えるので、学習は正常に終了していると判断しました。
それではどのような近似曲線になったか結果を確認していきます。下記がノード数ごとの近似曲線の結果になります。
想像通りですがやはりノード数が多いほどより正確に近似できていることが確認できます。実はノード10の時の近似結果よりも、ノード3の時のほうが近似関数としては正確になっています。ノード数が少ないうちは精度が逆転するようなケースがあるということかもしれません。
今回の目的はy=0.1*(x-2)^2+5*sin(x)を近似することでした。この目的を達成しているのはノード数10000になります。
しかし、ノード数はどんなケースでも増やせば良いのでしょうか?
例えば今回の関数において、そもそもsin(x)自体が誤差やばらつきと判断されるケースであれば、ノード10000のケースは過学習を起こしているケースになります。逆にノード10のケースが一番汎化性能が高いモデルになっているケースもあります。
つまり、むやみにノード数を増やせば良いのではなく、検証結果を確認し目的に応じた学習結果が得られているかを確認することがノード数を決定するうえで必要なことになってきます。
スポンサーリンク