8×8オセロで試したこととその結果
8×8オセロで試したこととその結果について簡単にまとめていこうと思います.
今回はコードはありません.
深層学習の失敗例
- 局面の入力が悪かった
黒を1枚目 白を2枚目の画像として入力を与えて学習をさせたところ,ある局面でおかしな行動を取る方策ネットワークができてしまいました.
行動価値を詳しく見てみると白の手番にもかかわらず黒の行動価値を返していたのです.
入力が悪く手番の情報が抜け落ちていたためにこのようなことが起きてしまいました.
また,黒を1枚目 白を2枚目の画像として入力を与えて黒が勝つ確率を予想させる価値ネットワークを学習をさせた場合はさらにひどい精度になってしまいました.
将棋の終盤を考えるまでもなく当然ですが,1手差で先手が勝つような場合に手番の情報が抜けていたら正確に予想できるわけがありません.
- AIの作りが悪かった
価値ネットワークの学習の際に「現在の局面を持っているプレイヤーが勝つ確率」ではなく「先手が勝つ確率」にしたら精度がだいぶ落ちてしまいました.
なぜ,このような結果になってしまったのかはよくわかりませんが,入力や正解データの与え方で学習の進みやすさが大きく変わってしまうことがあるのが難しいところです.
方策ネットワークに関して試したこと
- 勝ったプレイヤーの手だけを学習データとする
「将棋AIで学ぶディープラーニング」で将棋AIを作る際に「レートが一定以上のプレイヤーの対局のみ抽出する」という棋譜クリーニング作業を行っていました.
今回のオセロに関してはレートの情報が無かったので「勝ったプレイヤーの手だけを抽出する」という方法で学習をさせてみました.(負けた場合は致命的に悪い手を打っている可能性があるため)
精度が大幅に落ちることはありませんでしたが,学習に使うデータが減った分は落ちてしまいました.
- 2回転 転置 転置の2回転を学習データに追加する
局面を回転・転置して実際に現れる局面を学習データに加えてみました.
効果は絶大で従来のものよりも大幅に強くなりました.
- 水増ししたデータに対してリーク対策を行う
局面に回転や転置を施したものは実質的には同じ局面です.
理想を言えば,ニューラルネットワークは回転・転置を施したもの全てに対して実質的に同じ手を打つようになってほしいです.
実質的に同じような手を打てるように学習が進むと仮定した場合,回転前のデータを訓練データ 2回転後のデータをvalidation用のデータとすると,
訓練データの損失を減らせば減らすほどvalidationデータの損失も減っていくことになるearly_stoppingが働かずに過学習を引き起こすこととなります.
そのためデータの分割の際にリーク対策を行って学習をさせてみました.
特に性能に変化はありませんでした. そこまで都合よく回転・転置に対して学習ができていたわけではなかったようです.
価値ネットワークに関して試したこと
- 引き分けを取り除く
引き分けを取り除き損失関数をbinary_cross_entropyとした
- sparce_cross_entropyを使う
- 28手目以降のみを学習データとして学習させる
学習し終えた価値ネットワークを確かめたところ当然と言えば当然ですが,終盤に関しては高い精度で学習できているのですが,序盤の予測精度がひどかったです.
序盤の学習をやめて,中・終盤以降のみに特化させればある程度の精度が出るかと期待しましたが,全てを使って学習した場合と比べても中・終盤の予測精度は上がりませんでした.
全てのデータを使い学習したもののほうが序盤も予測できるため完全に劣化バージョンとなってしまいました.
- 2回転 転置 転置の2回転を学習データに追加する
方策ネットワークと同様効果はあったのですが,強くはなりませんでした.
リーク対策に関しても同様です.
マルチタスク学習に関して試したこと
- 合法手のリストも同時に学習させる
合法手のリストも同時に学習させれば精度が良くなるかと試してみましたが,良くなりませんでした.
方策ネットワークの行動価値を見てみると合法手に対してはどれもある程度高く,それ以外が極端に低いことが多いので,
マルチタスク学習をさせるまでもなく合法手の情報は学習できているためかもしれません.
方策ネットワークの勝率比較
単純にそのままデータを使って学習した場合 勝ったプレイヤーのデータだけで学習した場合 2回転を追加した場合 2回転・転置・転置の2回転を追加した場合 リーク対策をした場合の勝率をまとめる.
ε-greedy戦略を取りε=0.2として先手500回 後手500回対戦させる.
今後試したいこと
- 手番・ターン数の偏りを減らす
今回の学習に使用したデータの分割は何の工夫もなく全体からランダムで分割したものです.
これを訓練データとvalidationデータ間で手番・ターン数の比率に偏りが出ないようにすれば,もう少し精度が良くなるような気がします(?)
- 対局データを増やす
使っていない対局データを増やせば強くなる可能性があります.
対局データを増やしたときにどの程度強くなるのかを試してみたいです.
- モンテカルロ木探索などを利用してより強いAIを作る
今回作ったAIは探索を一切行っていません.
探索を行えるようにしたときどの程度強くなるのかを試したいです.
探索などと併用したAIに関しては試せていませんが,ここまでで深層学習による8×8のオセロAIの実装に関しては終了です.
次回は6×6のオセロAIを深層強化学習で実装します.