前回はロト6の当選数字のパターンを色々調べて出現傾向を調べてみた。実は昨年8月、数年ぶりに何となく買ったロト6が4等に当たり(それから助平根性が出て)その4等を原資として時々買い、その後暫くはあまり原資を減らすことなく買い続けることが出来たが10月頃に数字の出方が変わったようで全く当たらなくなり、11月に原資が底を突いた。
そこで前からやりたかったAIによる予測に挑戦してみる事とした。いわゆる Deep Learning である。数年前に興味があって買った Deep Learning の本(Pythonで記述)が積読になっていたので、改めてこれを読んでロト6の Deep Learning に挑んた。残念ながら私はPythonは不慣れだしバグ大好きの弱い型付けの言語は嫌いなので同じような流れをFortranで書いてみた。
Deep Learning の処理は Y=f(W*X+B) という基本演算で構成される。Xが入力でありYが出力 、Wが重み、Bがバイアスで、Wが2次元配列、Y,X,Bは1次元配列、fが非線形の出力関数である。WとBが任意パラメータで、これらの値が学習内容に相当する。この基本演算を複数層直列に積み上げることでAIを構成する(Wikipediaによると4層以上ないと Deep Learning とは言わないらしいが、以下は爺の手習いということで勘弁してもらいたい)。
第1層の入力X1がAIの入力であり最終層の出力YnがAIの出力である。ロト6の場合X1は学習や予測に使う過去の抽選結果であり、その大きさは学習に使うデータ数(=抽選回数)×43、Ynは各数字の出現確率を表す43個の数値とした。1層のみのDeepLearning は単なるx元1次連立方程式の最適パラメータ決定になる。基本演算を2段以上積み重ねると層間に外部には出ない接続 Ym⇒Xm+1(隠れ層)が出来る。
学習を行うためには最終的な演算結果(output)と真値(truth)の差(誤差、loss)をフィードバックしWとBの値を修正するカラクリが必要であり、誤差を 微分(dX/dY)的な係数を掛けながら処理とは逆方向に伝搬させ、係数(学習率?)を掛けてWやBを修正する。WやBの初期値には乱数を入れている。
実際に2層の Deep Learning、隠れ層を100にしてロト6の過去データ(ボーナス数字を含む7つの数字)を読み込ませると、あっという間に過去データを学習し100%正解できるようになった。じっさい高々1500回にもならない過去データではAIと言うほどの性能も必要無いようだ。しかし過去データの最後の部分を隠して予想させてみるとこれが全く当たらない。次図は第1459回までのデータを使ったとある結果である(**が当たった数字)。
ここで過去データを Deep Learning のやり方に従って学習データと評価データに分け、 学習データで学習させた後で評価データを評価してみた。そうすると繰り返し回数を多くして学習を進めるほど評価は悪化する。いわゆる過学習の状態なのだろう。ロト6は原理的にランダムな現象なので当然と言えば当然である。
何回も試しているうちに、乱数による初期設定を変更しても隠れ層の幅を変更しても結果の傾向はあまり変わらない事に気づいた。簡単な Deep Learning でも過去のデータは十分学習できて方向性を持った予想を出せるようである(ただし予想結果は現実とは合っていないが)。次表は第1459回までのデータを使って色々パラメータを変えながら第1460回を予想した結果である(黄色マーカが本数字、緑はボーナス数字)。値は確率(%)を表す(水平方向の合計値はボーナス数字を含んでいて約700%になる。##は100%を超えた値)。
3層の Deep Learning は学習に時間がかかる。2層だと50回も繰り返せば概ね安定するが3層だと収束するまで1桁上の学習が必要のようである。直近の予想確率例と抽選結果は次のようなもので当たるも八卦当たらぬも八卦といった所である。
(3層100回学習の結果)