上がるの? 下がるの? 二値分類 AIを使って日経平均株価の予測に挑戦 初めてのLSTM編
前回の記事より、今後の課題を振り返る
前回は、RNNにおいて最も単純な構造であるElman Netを使って、日経平均株価の予測に対する二値分類を行いました。
Elman Netでは、実用的な性能を得ることは難しいとのことでしたが、実際に試したところ、これまでと変わらない結果となりました。
今回は、今後の課題として挙げたLSTM(Long Short Term Memory)を使って、日経平均株価の予測に対する二値分類を行います。
LSTMを構築する際に参照したのは、前回の記事でも紹介した下記の動画「Deep Learning入門:数式なしで理解するLSTM (Long short-term memory)」です。
AIモデルに使用したRNN LSTMの構造図
先ずは、動画に基づいて構築したLSTMの構造図を下記に示します。
上記のLSTMを構築するにあたり、参照した動画には存在しないものを1つだけ追加しました。
それは、Reshapeです(Inputの下に配置されています)。
このReshapeの役割は、下記の通りです。
Reshapeの役割
入力される1行14列のベクトルデータを2行7列に変形する
ベクトルデータの中身は下記の通り
2営業日分のローソク足(終値、始値、高値、安値)
2営業日分の移動平均(5, 25, 75日)
LSTMの構造は、Elman NetにInputGate機能、ForgetGate機能、OutputGate機能の3つを加えたものです。
上記の動画を見て、この点が理解できると、その構造が分かってくると思います。
AIモデルの学習および評価を実行
早速、LSTMを使って日経平均株価の予測を行ってみます。
下記は、LSTMに前回の記事で作成したRNN用の学習データを学習させた際の学習曲線です。
前回のElman Netを使用した結果と同じく、LSTMを使用しても学習曲線はほぼ平行となってしまいました。
以下に、評価結果の混同行列を示します。
上記の混同行列は、前回のElman Netを使用した場合の結果と同一でした。
残念ながら、LSTMを使用しても、日経平均株価の予測に対する二値分類の性能向上を図ることはできませんでした。
RNN LSTMを微修正してAffineの出力ニューロン数を100に変更
RNNの構造を用いたAIモデルは、フィードバックループが存在するためにパラメーターの調整が(少なくとも私には)難しいという特徴があります。
つまり、どこかのパラメーターを適当に修正すると、辻褄が合わない箇所が発生し、AIモデルの学習および評価を実行するとエラーが出てしまうのです。
このため、現状はようやく動作した状態を維持しつつ、LSTMの学習および評価を行ってきました。
しかし、現状の構造は中間層のAffineの出力ニューロン数が7つとなっており、流石に少ないと感じています。
なぜなら、これまでのAIモデルで使用してきたAffineの出力ニューロン数は100だったからです。
このため、Affineの出力ニューロン数が100となるようにAIモデルの構造を修正しました。
それが下記となります。
新たにAffineNをReccurentInputの下に追加し、OutShapeパラメーターを100としました。
そして、Affineの出力ニューロン数を100としたAIモデルの学習曲線が下記となります。
Affineの出力ニューロン数を100とした結果、学習曲線のCOSTとTRAINING ERRORが低下しました。
一方で、VALIDATION ERRORが上昇する結果となってしまいました。
Neural Network Consoleのマニュアルによると、COST, TRAINING ERRORおよびVALIDATION ERRORの説明は次の通りです。
Neural Network Consoleのマニュアルより
COSTは、最適化段階でのロス関数の出力値を示す
ERRORは、Epochの終了時点での学習データ、評価データそれぞれにおけるロス関数の出力値を示す
つまり、学習データに対するERRORがTRAINING ERROR
つまり、評価データに対するERRORがVALIDATION ERROR
インターネットでVALIDATION ERRORが上昇している状況について調べたところ、過学習の状態に陥っているとのことでした。
過学習とは、AIモデルが学習データで最適化されすぎた結果、条件が異なる他の評価データに対して学習した性能が十分に発揮されない状態です。
AIモデルの学習に3時間もかけたのに、この結果とは、残念です。
とりあえず、AIモデルの評価における混同行列を以下に示します。
Affineの出力ニューロン数を100としたことで、y'=0の列に数値が並ぶようになりました。
この点に関しては、大きな進歩です。
しかし、Accuracy(分類精度)は53.84%から50.29%に低下してしまいました。
今後の課題
LSTMの使用に加えて、中間層であるAffineの出力ニューロン数を100とした結果、ようやく二値分類のスタートラインに立てたような気がしています。
今後は、過学習への対策を検討していきます。
ちなみに、インターネットで過学習への対策について調べたところ、下記の方法が紹介されていました。
過学習への対策
学習データ(説明変数)の見直し
AIモデルの見直し
また、LSTMを使った多クラス分類の検証も進めていきたいと思います。
番外編 LSTMで使われている2つのDelayについて
上記のLSTMの構成を見ていて、ふと気がついたことがあります。
Mul2_2の出力に接続されている2つのDelay(Delay_HとDelay_C)ですが、1つで良いのではないかと思いました。
Delayに関するNeural Network Consoleの説明には、下記のようにあります。
Delay
RecurrentNeuralNetworkにおける時間遅れ信号を示すレイヤーです。
Delayのパラメーターとして、時間遅れ信号のサイズ、初期値、等があるのですが、今回は、2つのDelayで同じパラメーターを使用しています。
2つのDelayを異なるパラメーターで制御する場合は上記の構造となるのでしょうが、同じパラメーターで制御する場合は1つで良いのではないでしょうか。
ちなみに、Delayを1つにまとめると、LSTMの構造は下記のとなります。
Delayを1つにまとめた状態でAIモデルの学習、評価を実行してみましたが、Delayを2つ使った構造の結果との違いは認められませんでした。
AIモデルのデータについて
今回作成したAIモデルのデータは、Googleドライブにて共有しています。
URL: https://drive.google.com/drive/folders/1GjFfESdB8D63JWxULEJzx8gXNoEQfpcm?usp=drive_link
N225_LSTM_1.sdcproj
Neural Network Console用のプロジェクトファイル
基本となるLSTM構造のAIモデル
N225_LSTM_Affine100N.sdcproj
Neural Network Console用のプロジェクトファイル
中間層のAffineの出力ニューロン数を100としたLSTM構造のAIモデル