C++
機械学習
ディープラーニング
ニューラルネットワーク
実験

【ニューラルネットワークの基礎研究23】 LASSO回帰因子を学習回数に応じて小さくしてみる

前回の実験では、重みをちょうど良い大きさへ減衰させるために、損失関数にLASSO回帰因子によるペナルティを加えて、学習を開始した序盤に重みを抑える方法を導入してみました。LASSO回帰因子の値が固定の場合にはLASSO回帰因子0の場合と比較して良い結果を得ることができませんでした。
そこで今回はLASSO回帰因子をはじめ1として学習100回ごとに指数関数的に減衰させてみます。 なお、ネットワークの構造はこれまでと同様、中間層のユニット数100で4層のニューラルネットワーク(102-100-100-100-100-101)を用意して、重みの初期値の範囲を-1から1までランダムに与えています。

【これまでの結果】
→ 1変数の2次関数の学習
→ 係数が変化する2次関数の学習
→ べきが変化するべき関数
学習効果を高めるにはディープ(層数)と並列数(ユニット数)のどちらが有効か?
→ 底が変化する指数関数の学習
関数形ごとの学習成果の比較
→ 角振動数が変化する三角関数の学習
→ 関数の入力数と出力数を一致させた構造
重みの初期値依存性
重み減衰のためにLASSO回帰因子を与えてみる

ニューラルネットワークの基本パラメータ

・ニューラルネットワークの構造:順伝播型ニューラルネットワーク(FFNN)
・学習方法:通常の勾配法(学習率固定、逆誤差伝搬法)
・学習率:eta = 0.01;
・ミニバッチ数:100 (サンプルは無限に用意できるためミニバッチという概念は存在しませんが、ランダムに用意したミニバッチ数分のサンプルに対する平均を用いて学習を進める)
・活性化関数(中間層):ReLU(ランプ関数)
・活性化関数(出力層):恒等関数
・損失関数:2乗和
※独立したネットワークを10個用意してそれぞれ個別に学習させて、学習効果の高かった上位5つの「学習回数」vs「損失値」をグラフ化します。
参考ページ

中間層のユニット数100で4層のニューラルネットワーク(102-100-100-100-100-101)

(1) LASSO回帰因子:0(比較用)

(2) LASSO回帰因子:0.0005(固定、比較用)

(3) LASSO回帰因子:1.0から学習100回ごとに1/1.5倍した結果

(4) LASSO回帰因子:1.0から学習100回ごとに1/1.4倍した結果

(5) LASSO回帰因子:1.0から学習100回ごとに1/1.3倍した結果

(6) LASSO回帰因子:1.0から学習100回ごとに1/1.2倍した結果

(7) 初期重みを0.5倍(比較用)

考察と次の課題

・(3) から (6) を比較すると、(5) が学習効果が最もよく上がっているのがわかる。(1) よりも効果が上がっていることもわかる。
・一方、もともと初期重みを0.5倍した(7)の方が、圧倒的に学習効果が良い。
・ただし、学習の序盤(10000程度まで)を見ると (7) よりも (3)~(6)の方が学習効果が上回っている。
→ 学習回数に応じた単純な減衰では無理だが、LASSO回帰因子の与え方を工夫することで、重みの初期値依存性を消すことができそう。

次の課題

・LASSO回帰因子を損失値の大きさによって変更してみる。

プログラムソース(C++)

http://www.natural-science.or.jp/files/NN/FFNNs_epoch_Functions2.zip
※VisualStudio2017のソルーションファイルです。GCC(MinGW)でも動作確認しています。