TadaoYamaokaの日記

山岡忠夫Homeで公開しているプログラムの開発ネタを中心に書いていきます。

コンピュータ将棋

将棋AIの実験ノート(引き分け有無の比較)

教師データ引き分けを加えた場合と、加えない場合の精度の比較を行った。 引き分けの学習には、ChainerのカスタムFunctionを使用した。測定方法は前回の正則化の効果の測定と同じ。 測定方法 10ブロック、192フィルタのモデル PolicyとValueのマルチタスク学…

将棋AIの実験ノート(正則化の影響の再測定)

先日、将棋AIのモデルにおけるエントロピー正則化とL2正則化の効果を測定したが、正しく測定できていなかったので再測定した。前回の測定結果のtest accuacyが低いので、原因を調べていたら、ChainerのV5から追加されたstatic_graphを使っていたことが原因だ…

強化学習におけるバッチサイズとエントロピー正則化

※ほぼ自分用の実験ノートです。世界コンピュータ将棋選手権の少し前から、自己対局におけるノードの再利用とバッチサイズの変更(1024→2048)を行った。 250万局面の生成と学習を8サイクル行ったところ、技巧2に対して勝率が上がったため、大会には最新のモデ…

Multi Ponderについて

今年の世界コンピュータ将棋選手権はMulti Ponderを採用しているチームが多く関心も高かったようです。dlshogiでも、Multi Ponderの考え方を取り入れていました。 Multi Ponderは、どの手にどれだけのリソースを配分すると誤差を最小化できるかという問題と…

第29回世界コンピュータ将棋選手権の感想

dlshogiは、前回に続いて1次予選を通過し、2次予選まで進むことができました。 2次予選は、2勝できればよいと考えていましたが、結果は4勝5敗と善戦できました。 ただし、1勝は相手チームのサーバダウンによるものなので、実質は3勝と思っています。 順位は2…

将棋AIの進捗 その29(自己対局におけるノードの再利用)

先日の記事に書いたが、AlphaZeroは自己対局時にノードの再利用を行っている。 dlshogiでは、先手が探索した結果を後手が利用することになるため(逆も同様)、先手と後手の探索のバランスが崩れるため、ノード再利用を行わず各手番でハッシュをクリアしてい…

将棋AIの進捗 その28(探索時のノイズの効果)

世界コンピュータ選手権まで残り1ヵ月もなくなったので、強化学習で強くするのはあまり望めないので探索部の調整を行っている。以前のdlshogiでは、Policyの読み漏れによって、受けを間違えて数手先で詰まされる状況がよく起きていたため、Policyにノイズを…

PythonでAlphaZero Shogiを実装する その4

AlphaZeroでは、訓練と自己対局は並列で行われ、チェックポイントで自己対局で使用するネットワークが最新のネットワークに更新される。 チェックポイントは、ミニバッチサイズ4,096で、1,000ステップ間隔だが、チェックポイントの間に何ゲーム行われるかを…

【告知】技術書典6で「ディープラーニングを使った将棋AIの作り方~強化学習編~」という本を頒布します

日記で何回かふれていますが、改めて、技術書典6で「ディープラーニングを使った将棋AIの作り方~強化学習編~」という本を頒布します。 techbookfest.orgシリーズ3冊目になります。今回は、AlphaZero Shogiの仕組みの解説と、AlphaZero Shogiを忠実にコピー…

将棋AIの進捗 その28(弱点の克服)

前回、自己対局の報酬を詰み探索の結果に変更したことで、valueの精度向上したことを書いた。詰み探索結果を報酬にしたのは、評価値が2000近くある局面から、詰みが見つかり一気に負ける局面があるためだが、そのような局面をより積極的に是正することにした…

PythonでAlphaZero Shogiを実装する その3

技術書典6の本を執筆しながらAlphaZero Shogiを実装したPythonプログラムの修正も行っている。 プログラムの方はほぼ完成しているが、自己対局を数時間実行すると途中で評価済みのはずのノードが未評価になっているため例外になる問題が発生している。 原因…

PythonでAlphaZero Shogiを実装する その2

前回の日記の時点で、自己対局と学習を実装したが、学習したモデルを使って対局できるUSIエンジンを実装した。 dlshogi-zero/mcts_player.py at master · TadaoYamaoka/dlshogi-zero · GitHub 将棋ライブラリにcshogiを使用して、探索方法をdlshogiと同じ方…

PythonでAlphaZero Shogiを実装する

次の技術書典のネタとしてPythonでAlphaZero Shogiの完全コピーを実装しています。github.com自己対局と学習がようやく動くようになりました。入力特徴と出力ラベルと探索の仕様はAlphaZero Shogiと完全に一致させました。 入力特徴 先手の駒 14 後手の駒 14…

将棋AIの進捗 その27(やねうら王に初勝利)

前回記事にした自己対局の終了判定にdf-pnによる詰み探索を加えて、学習を進めた結果、valueの精度が1%近く向上しました(floodgateのR3500以上の棋譜との一致率)。 横軸の80サイクルから詰み探索を加えています。どれくらいの棋力になったか、やねうら王 2…

AlphaZero方式における入力の正規化

前回AlphaZero方式で訓練データを作成する際のデータの格納方式をSQLiteに決めたので、テストのためにfloodgateの棋譜から訓練データの作成して、学習を行ってみた。 floodgateの棋譜から訓練データ作成 cshogiを使って2018年分のfloodgateのCSAファイルから…

SQLiteによる教師データの管理

先日AlphaZero方式で教師データを生成する際に、データを固定サイズにすることを検討した。 しかし、指し手の確率分布を保存するには、合法手500手近くの領域が必要となるため、1回の訓練ステップ全てのデータをメモリに載せるのは厳しいことがわかった。 Al…

レイヤー融合を将棋AIの推論で試してみる

先日試したレイヤー融合をdlshogiのニューラルネットワークで試してみた。dlshogiはWideResNetを採用しているので、conv->bnのレイヤー融合を適用できるのは、残差ブロックの2つ目の畳み込み層とBatchNormになる。 推論比較 レイヤー融合前後で推論時間を比…

将棋の合法手の数の統計

AlphaZero方式の強化学習では、指し手の確率分布を教師データとするため、局面の合法手の数の分だけ確率の値を保存しておく必要がある。 将棋の合法手の最大数は593であることが証明されているが、実際の対局ではそのような局面は現れない。 教師データを保…

Google ColabでAlphaZero Shogiのモデルを教師あり学習する

Google ColabでAlphaZero Shogiのモデルを論文に通り定義して、テストのために教師ありで学習してみました。 TPUでも学習して学習時間の比較もしてみました。教師データには、elmoで生成したhcpe形式のデータを使用し、入力特徴量と正解ラベルの加工には、先…

高速なPythonの将棋ライブラリを作る

python-shogiは、Pythonで扱える非常に役立つ将棋ライブラリですが、速度が遅いのが用途によっては欠点になります。 公式サイトにも記述されていますが、速度よりもシンプルに抽象的に扱えることが目的となっています。しかし、機械学習の用途に使用しようと…

将棋AIの進捗 その26(自己対局による強化学習の経過2)

前回から時間が空いたが、自己対局による強化学習を続けている。10ブロック、192フィルタのモデルの自己対局による学習が、79サイクル※回したところで飽和気味になったため、10ブロックのモデルからパラメータを転移して15ブロックのモデルで強化学習を行う…

optunaで探索パラメータの最適化

optunaを使って将棋プログラムの探索パラメータの最適化を行うツールを作成した。 Pythonで実装しており、任意のUSIエンジンの間で指定した回数対局を行い、勝率が最大となるように探索パラメータを最適化する。DeepLearningShogi/mcts_params_optimizer.py …

AlphaZeroの論文

Science誌に掲載された論文は、新しい対局条件での結果と棋譜の公開がメインで技術的な内容は、昨年のarXivで公開された論文とほとんど差分はありませんでした。 DeepMindのページのリンクからダウンロードできるOpen Access versionのMethodsでは、技術的な…

将棋でディープラーニングする その53(価値ネットワークの精度向上)

作成している将棋AIは、現在自己対局による強化学習を続けています。 floodgateの棋譜との一致率は徐々に上がっており、少しずつですが強くなっています。 48サイクル回したところで、GeForce 1080を1枚搭載したノートPCで、GPSFishに1手3秒で勝ち越すように…

将棋AIの進捗 その25(自己対局による強化学習の経過)

前回からだいぶ期間が空きましたが、自己対局による強化学習で、教師ありで収束するまで学習したモデルより有意に強くすることができました。前回は、19イテレーションでほぼ互角の強さでしたが、38イテレーションまで自己対局を行うことで有意に強くなりま…

AlphaZeroの価値関数の目標をQ値にすると改善する

この記事で、AlphaZeroの再実装を試した際に、価値関数の学習目標をゲームの結果からQ値に変更することで、エラー率が低下するという報告がされています。 medium.comゲームの結果とQ値の平均を目標とするとさらにエラー率が低下し、ゲームの結果からQ値に段…

将棋AIの進捗 その24(自己対局による強化学習)

これまではAperyの初期局面集にfloodgateの棋譜を加えたものを初期局面集として自己対局を行っていたが、中終盤のバリエーションを増やすため、 やねうら王教師局面からAperyの初期局面集を作成(評価値200以内局面を抽出) 初期局面集から詰みの局面を除く と…

詰み探索の高速化

前回までに作成したdf-pnによる詰み探索を自己対局に組み込んでみたが、探索速度が遅くあまり実用にならなかった。これまでは、モンテカルロ木探索の先端ノードで全探索の7手詰めを行っていたが、それと同じ時間になるようにdf-pnの探索ノード数を調整すると…

王手生成の最大数

詰み探索のMovePickerには最大合法手分の配列を確保していたが、王手生成に限れば最大合法手分よりもサイズを減らすことができる。 そこで、スタックサイズを節約するため、配列のサイズを王手生成の最大数に合わせることにした。 合法手の最大数 合法手の最…

優越関係を利用した証明数と反証数の初期化

局面Aが局面Bを優越する場合、Aの証明数はBの証明数以上になる性質がある。 そのことを利用すると、Aの証明数は、AとAに優越されるすべての局面の証明数の最大値をAの証明数とすることができる。 反証数についても同様に優越関係を利用できる。これをそのま…