前回 勝敗予想モデルの入力ベクトル形式の変更 : TensorFlow将棋ソフト開発日誌 #7
目次 TensorFlow将棋ソフト開発日誌 目次
ソース githubにありますが今のところ自分にしか読めないコードです
学習・1回・25時間
今回のお話
- 学習サンプルと試験サンプルを分けた
- 学習サンプルを使って1周学習をした
- 試験サンプルを使って正答率を出してみたら予想より低かった
- 今後の課題
学習サンプルと試験サンプルを分けた
今までは学習できるか、つまりバックプロパゲーションを繰り返してロスが下がっていくかだけを確認していたのでサンプルの扱いがぞんざいでしたが学習->試験を繰り返して性能を確認していく段階になったのでそれなりにきちんとしておきます。
- 2chkifu のデータを使っています
- 自分が取得した時点で 62626 戦のデータがありました
- このうち%TORYOで終了しているものを抽出
- 0 - 49999を学習データ 50000 - 62626 を試験データとしています
学習サンプルを使って1周学習をした
25時間かかったぜ・・・
今までのモデルと上記のデータを使用して1周学習をしました。
- 学習データの30手以降の各盤面をサンプルとします。左右反転をしたものもサンプルとします。
- サンプル数は8,700,000程度、100サンプルをミニバッチとしています。
ロスのグラフです
正答率のグラフです(correct_rateのつもりが誤字ってますね。最近気づきました)
割といい感じ。
試験サンプルを使用して正答率を出してみた
- 100のミニバッチを投入して正答の平均を出す
- ミニバッチごとの正答率をさらに投入回数で平均する
# 結果。正答率平均、全ミニバッチ中最低正答率、全ミニバッチ中最高正答率
correct rate(21400): avg 0.5575672660085642, min 0.3699999451637268, max 0.75
学習中の正答率よりかなり低い値になりました。将棋では先手の勝率が52%なんて言われています。つまり全部先手が勝つと予測すると52%正答するようなイメージです。それよりもちょっとだけいい感じ。つまり、うーん・・・。
考察と課題
試験の正答率が低い直接の原因
将棋のデータの性質上、学習サンプルにも試験サンプルにも同じ盤面が相当数入っている。ただし学習中に同じ対戦は投入していないので学習中の正答率と試験の正答率はだいたい同じくらいの値になると予想していた。しかし実際には試験の正答率は学習中のものよりもかなり低い数字になった。
バグ以外に考えられる原因がわからないのでコードレビューを終えたら「一旦はそういう性能である」と考えることにする。
1エポックではそんなに性能が出ないのではないか
- イテレーション数 = 学習のループ数。バッチ学習ならだいたい学習サンプル数 / ミニバッチサイズ
- エポック数 = 学習サンプル全体1セットを何回学習させたか
いろいろな論文を見ていると複数回のエポックで学習させているのが普通であり、自分の場合もこれから何回も学習させれば正答率が変わるかもしれない。その場合は1エポック25時間というのがネックになる。今のモデルは「えいやっ!」でとりあえず感覚的に作ったモデルであるためこれからチャンネル数は増えるだろうし層数も増やしたい。そうするとますます実験に時間がかかってくる。
half floatを使えば速度は稼げるかもしれないが学習に支障が出るかもしれないので避けたいところ。対応は可能だろうけれどあまりそこで手間を取られたくない。
あるいはどんなデータであれバリエーションを確保し投入していけば性能の向上が見込めるのであれば複数エポックを学習させるのではなく自己対戦による自律学習に移行してしまうのも良いのかもしれない。それであれば1回の投入データ数を絞ることで実験時間のコントロールは可能。しかし学習速度が遅いことには変わりがない。
札束か。やはり札束なのか。GPUを増やすことは少し考えています。
試験に時間がかかる
試験についてもミニバッチを投入する形で行っているがだいたい1000サンプル/秒くらいかかっている(GPU使用率は100%付近で推移している)。将来的に実際に将棋を指すに当たってこの程度の速度ではあまり満足なソフトが書けない。TensorFlowの使いこなしの部分で問題があるかもしれないので調べていく。
今後の予定
- 平日に会社に行ってる間にもう何周か学習をしてみる。そして試験サンプルでの性能を見てみる。
- 指し手モデルを作り始める。
- 預金残高と相談する。