見出し画像

Neural Network Consoleとの違いは? Kerasで回帰に対する2層Affine構造のAIモデルを検証しました


Kerasで回帰に対する2層Affine構造のAIモデルを検証しました

Neural Network Consoleでの回帰に対する2層Affine構造のAIモデルによる検証で、AIモデルの出力が1営業日分遅れる問題に遭遇しました。

詳しくは、下記の記事を参照ください。

この結果が正しいものなのか、あるいは、私が何かとんでもない過ちを犯しているのかが分からず困り果てました。

そこで、私の疑問に対する切り分けを行うため、同じ検証をKerasを使用した環境でもやってみることにしました。

2層Affine構造のAIモデルをKerasで作成するとこうなります

今回の評価で使用する2層Affine構造のAIモデルは下記の通りです。

2層Affine構造 AIモデル
2層Affine構造のAIモデル

このNeural Network Consoleで使用したAIモデルをKerasで作成すると、下記のようになります。

# 2層Affine構造のニューラルネットワークを構築
TestNN = keras.models.Sequential()
TestNN.add(Dense(100, input_dim = 4, activation = 'relu')) # 入力層(4) + Affine_1(100) + ReLU_1
TestNN.add(Dense(4, activation = 'linear')) # Affine_2(4)

# 学習プロセスの設定
TestNN.compile(loss = 'mean_squared_error', optimizer = 'adam', metrics = ['mae']) # 損失関数

TestNNが2層Affine構造のニューラルネットワーク(AIモデル)です。

KerasでのDenseがNeural Network ConsoleでのAffineに対応しています。

私が特徴的だと感じたのは、Dense(Affine)関数の引数に活性化関数であるReLUを指定できる点です。

また、活性化関数を指定しない場合は、activation = 'linear'とします。

Kerasで行うAIモデルの学習と評価に対する条件について

Kerasで行うAIモデルの学習と評価に対する条件を整理します。

先ず、AIモデルの学習と評価に使用するデータは、Neural Network Consoleで使用したものを使用します。

その他の条件も、私が把握できる範囲で同じとしました。

  • 学習および評価の条件

    • 学習データおよび評価データ: 同じものを使用

    • 学習データのシャッフル: 有効

    • バッチサイズ: 64

    • 最適化アルゴリズム: Adam

KerasによるAIモデルの学習および評価結果

Kerasを用いて、2層Affine構造のAIモデルに対する学習と評価を行いました。

先ずは、学習曲線を下記に示します。

学習曲線(2層Affine構造、1日分の日経平均株価)

縦軸は精度(ログスケール)、横軸はEpoch(学習データの使用回数)です。

また、LossおよびVal Lossは、以下の通りです。

  • Loss: 学習データを使用した場合の平均二乗誤差(Mean Squared Error)

  • Val Los: 評価データを使用した場合の平均二乗誤差

参考までに、同じ構造のAIモデルと条件を使用し、Neural Network Consoleで学習させた場合の学習曲線を下記に示します。

Neural Network Consoleでの学習曲線(同条件)

Neural Network Consoleの学習曲線において、縦軸はログスケールです。

2つの学習曲線を比較してみます。

先ず、Neural Network ConsoleでのCOSTは、KerasではLossに相当すると思われます。

COSTがほぼ40000前後であるのに対して、Lossも40000前後となっています。

続いて、Neural Network ConsoleでのVALIDATION ERRORは、KerasではVal Losに相当すると思われます。

VALIDATION ERRORが60000強~100000強の範囲で変動しているのに対して、Val Losは70000強~100000強の範囲で変動しています。

最後に、Neural Network ConsoleでのTRAINING ERRORについてですが、Kerasではどうすれば取得できるのか分かりませんでした。

次は、Kerasを使用した場合のAIモデルの評価結果に対して、実際の日経平均株価とAIモデルの予測値との比較を行います。

下記は、実際の日経平均株価の終値(y__3)とAIモデルの終値に対する予測値(y'__3)を比較したグラフです。

終値 実際の値 予測値 比較 Keras 2層Affine構造 1日分 日経平均株価
終値に対する実際の値と予測値の比較(Keras, 2層Affine構造、1日分の日経平均株価)

グラフの縦軸は日経平均株価([円])を、横軸は評価期間における営業日の日数を表しています。

Kerasを使用したAIモデルにおいても、Neural Network Consoleを使用したAIモデルの結果と同じく、終値に対する予測値(y'__3)が実際の日経平均株価の終値(y__3)に対して右方向にズレているように見えます。

続いて、上記の差分を算出し、グラフ化したものが下記となります。

終値 差分 Keras 2層Affine構造 1日分 日経平均株価
終値の差分(Keras, 2層Affine構造、1日分の日経平均株価)

グラフの縦軸は終値の差分([円])を、横軸は評価期間における営業日の日数を表しています。

これまでの検証結果と同じく、AIモデルの終値に対する予測値は、実際の終値に対してほぼ±800円の範囲で収まっています。

さらに、終値に対するRMSE(Root Mean Squared Error, 二乗平均平方根誤差)を算出すると、318.77円となりました。

ちなみに、実際の終値と翌営業日の終値に対する予測値のRMSEを算出したところ、44.02円となりました。

以上の結果から、Kerasを使用した場合においても、なぜか、AIモデルの出力が1営業日分遅れてしまうことが確認できました。

そういうことであれば、学習データに問題があると考えるのが自然だと思われます。

どのような学習データが良いのか、考えることにします。

Kerasを使用した場合のCPUリソースの使用状況について

今回、Kerasを使用したAIモデルの学習にかかった時間は78.30 [s]でした。

同様の検証をNeural Network Consoleで行った場合、3分4秒でした。

同様とはいえ、Neural Network Consoleでは、いつでもAIモデルの学習を一時停止できますし、学習曲線もリアルタイムに更新されます。

一方で、Kerasでは、一度学習が始まると終わるまで待たなければなりませんし、学習曲線も学習の終了まで出力されません。

つまり、便利さに関しては、圧倒的にNeural Network Consoleの方が上です。

このため、単純に比べることはできません。

しかし、Kerasを用いたPythonプログラムを実行すると、CPUリソースを100 [%]使用してくれます。

Neural Network Consoleの場合は、40 [%]程度のCPUリソースしか使用しませんでした。

私としては、CPUリソースを100 [%]使用しても良いので、少しでもAIモデルの学習にかかる時間を短くしたいと考えています。

このため、この点に関しては、Kerasを使用した環境の方が優位であると感じました。

この記事が気に入ったらサポートをしてみませんか?