【ニューラルネットワークの基礎研究24】
LASSO回帰因子を損失値に応じて小さくしてみる
前回の実験では、重みを減衰させるために学習回数に応じてLASSO回帰因子を小さくしていきました。
しかしながら、学習による損失値の減少の仕方が学習序盤と学習終盤で異なることから、序盤では良い効果が得られていましたが、後半ではいまいちでした。
そこで今回はLASSO回帰因子の大きさを損失値に比例した値を与えてみます。
なお、ネットワークの構造はこれまでと同様、中間層のユニット数100で4層のニューラルネットワーク(102-100-100-100-100-101)を用意して、重みの初期値の範囲を-1から1までランダムに与えています。
【これまでの結果】
→ 1変数の2次関数の学習 1 2 3 4
→ 係数が変化する2次関数の学習 1 2 3 4
→ べきが変化するべき関数の学習 1 2 3
→ 学習効果を高めるにはディープ(層数)と並列数(ユニット数)のどちらが有効か?
→ 底が変化する指数関数の学習 1 2 3
→ 関数形ごとの学習成果の比較
→ 角振動数が変化する三角関数の学習 1 2
→ 関数の入力数と出力数を一致させた構造 1 2
→ 重みの初期値依存性
→ 重み減衰のためにLASSO回帰因子を与えてみる
→ LASSO回帰因子を学習回数に応じて小さくしてみる
ニューラルネットワークの基本パラメータ
・ニューラルネットワークの構造:順伝播型ニューラルネットワーク(FFNN)
・学習方法:通常の勾配法(学習率固定、逆誤差伝搬法)
・学習率:eta = 0.01;
・ミニバッチ数:100 (サンプルは無限に用意できるためミニバッチという概念は存在しませんが、ランダムに用意したミニバッチ数分のサンプルに対する平均を用いて学習を進める)
・活性化関数(中間層):ReLU(ランプ関数)
・活性化関数(出力層):恒等関数
・損失関数:2乗和
※独立したネットワークを10個用意してそれぞれ個別に学習させて、学習効果の高かった上位5つの「学習回数」vs「損失値」をグラフ化します。
※参考ページ
中間層のユニット数100で4層のニューラルネットワーク(102-100-100-100-100-101)
(1)から(4)までは比較用で、(5)~(10)がLASSO回帰因子に損失値に比例した値を与えた結果です。
(1) LASSO回帰因子:0(比較用)
(2) LASSO回帰因子:0.0005(固定、比較用)
(3) LASSO回帰因子:1.0から学習100回ごとに1/1.3倍した結果(比較用)
(4) 初期重みを0.5倍(比較用)
(5) LASSO回帰因子:損失値そのもの
(6) LASSO回帰因子:損失値/1.25
(7) LASSO回帰因子:損失値/1.5
(8) LASSO回帰因子:損失値/2
(9) LASSO回帰因子:損失値/3
(10) LASSO回帰因子:損失値/4
考察と次の課題
・LASSO回帰因子を(9)「損失値/3」とした場合が一番学習効果が高い。
・LASSO回帰因子を(8)「損失値/2」とした時が最も学習が安定している。
・しかしながら、(5)のもともと重みを0.5倍したものには及ばない。
→ ただし、序盤の学習効果は(5)を上回っているので、効果的なLASSO回帰因子の与え方がありそう。
次の課題
・もともと重みを0.5倍してLASSO回帰因子を与えてみる。
・そろそろ、物理シミュレーションと組み合わせた最適化問題に適用してみる。
【メモ】入力値のaとx_0からx_Nまでの取り扱いが対等であることに違和感がある
→ 入力値 a の影響を強めるために、aユニットからのつながりを第2層目だけではなくその他の全ユニットとの結合とすることで、もしかしたらさらなる改善が図れるかもしれない。
プログラムソース(C++)
・http://www.natural-science.or.jp/files/NN/FFNNs_epoch_Functions2.zip
※VisualStudio2017のソルーションファイルです。GCC(MinGW)でも動作確認しています。