2020年3月4日水曜日

ロト6は攻略できるか(その3)

 前回はロト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の初期値には乱数を入れている。

 幸いな事にPythonで配列を計算するライブラリー(NumPy)がFortranの配列演算と相性が良いので助かった。出来上がったプログラムは全部で800行程度であるが、Deep Learning の処理自体は100行程度だろう。層数や隠れ層の幅、学習率は任意パラメータとしている。

 実際に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回学習の結果)

 4層の(本来の)Deep Learning も試してみた。ある回の当選番号とその直前50回分との関係を全てのデータで500回ほど学習させ次回を予想する、これを初期値を変えて10回行い結果を平均してみたが、これには私のCore i5-9600K(3.7GHz)で80分ほどかかり、以下の表を作成するだけで計17時間以上かかった。この表では平均値(16.3)より大きい数字は赤色で表示している。理想的には100%の数字が7つあり他が0%なら完璧に予想出来ている訳であるが、結果を見ると予想出来ているとは言い難い。実際の抽選では必ずしも予想確率の高い赤い数字が選択されておらず、回によって確率が平均より大きいか小さいかに偏った数字が選択されている場合が多いように見受けられる。
(4層500回学習の結果)


 そこで最近13回のAI予想確率と実際に当たった数字の関係を調べた。
 43個の数字各々の予想確率で平均値(16.3)より大きいものと小さい物の数をカウントした(優勢の物に色を付けている)。また実際に選ばれた数字が予想確率分布の上下どちらに属するか当選数字分布を調べた。
 本来AI予想が当たっている場合、当選数字は全て予想確率の高いものの中から選ばれ、当選数字分布は(0,7)となる筈である。しかしこの表ではそうなっておらず、逆に予想確率の低い番号だけで構成されている場合もある事を示している。情報理論によると良く当たる天気予報と同様によく外す天気予報も同じくらい情報を持っている。当たらない事が分かっていればいわゆる逆張りをすればよい。
 そこで再度この表を見ると、当選数字は予想確率分布の数の多い方に偏っている場合が多いことに気づく(そうでない場合を灰色にした)。表で示した13回のうち9回がこれに当たる。 そういう意味ではこのAI予想はある程度の情報を与えていることになる。要するに予想確率分布の数の多い方に限定して張れば良い。そうすると選ぶべき数字が43の1/2~2/3程度に限定され当選確率が上がる事になる。
 
 この数をもっと限定できる適切な Deep Learning のパラメータがあるのかどうか、あれこれ探ってみたいが時間がかかりすぎるのが欠点。

・・・つづく・・・