Python(基本的なこと013: Tensorflow1.15_勾配降下法_簡単な方程式03_データ変更)

■データを変えて損失関数の結果の変化を見る。
前回は学習に関するパラメータについていろいろと変えてみた。使用したデータは、下の方程式から得たものだったけど、今回、zを最大9ランダムに増減させたデータと最大99ランダムに増減させたデータを使って、損失関数の結果など見てみる。

実行した結果が下の通り。学習ロジックなどは前回と同じ。
learning_rate:学習率
training_epochs:データの学習回数
batch_size:データの小グループ(batch)のサイズ。

learning_rate training_epochs batch_size 損失関数の結果
前回のデータ0.00001100 100.506 (epochs 12回目)
前回のデータ 0.000001 100 10 1.378 (epochs 100回目)
最大9増減0.00001100 10 1754.708 (epochs 100回目)
最大9増減0.0000110000101578.390 (epochs 10000回目)
最大9増減 0.000001100 10 1990.285 (epochs 100回目)

ランダムでzを最大9増減したデータの結果は、前回のデータのものより悪くなった(損失関数が大きい)。増減した分、もともとの方程式の結果からずれるので当然だと思う。epochs100まででは、まだ減少している途中のようだったので、10000まで広げて実行してみた。10000付近では1下げるのにepochsが400回ほど必要となる。とても前回のような小数レベルの結果にはたどり着きそうもない。
しかし、出てきたグラフを見てみると、今回の方がよい近似に見える。下の2つのうち上が前回のデータ、下が今回のランダムで最大9増減したデータ。赤線がy=0としたときのz=3*x+7のグラフ、オレンジがTensorflowで得た結果からのグラフ。

前回のデータ, learning_rate=0.00001, epochs: 10000, 損失関数: 0.602
最大9増減, learning_rate=0.00001, epochs: 10000, 損失関数: 1578.390

このグラフ自体はz=3x+y+7の3次元のうちy=0の一部分しか示していない。そのため、損失関数が大きいのは、他の部分で差が大きくなっているかもしれない。

次はランダムで最大99増減したデータ。

learning_rate training_epochs batch_size 損失関数の結果
前回のデータ0.0000110000100.602 (epochs 10000回目)
最大9増減0.0000110000101578.390 (epochs 10000回目)
最大99増減 0.00001 10000 10134523.608 (epochs 10000回目)
最大99増減, learning_rate=0.00001, epochs: 10000, 損失関数: 134523.608

ランダムでzを最大99増減した方が元のデータよりばらつきが大きくなるので、予想通り損失関数の値も大きくグラフもずれていた。
うーん、ここから何が読み取れるものか...。データをいじるのはこのくらいかなー。

learning_rateについて、webを少し調べたけど、勾配降下法の考え方として下のような感じらしい。ここでaがlearning_rate、それにかけているのが勾配(損失関数を微分したもの)となる。i-1回目の結果に対して、learning_rateで重みづけした勾配分を引いて、i回目をより小さくするというものらしい。極小部分では勾配が0になるので、そこが終点

いろいろとやってきてHelloworldレベルのイメージはついてきたけど、今回version1.15.5で試している。すでにversion2も出ているので、何かしら実際のサンプルデータを使って一端まとめとしたい。