TadaoYamaokaの日記

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

コンピュータ将棋

AlphaGo Zeroの論文を読む その4(自己対局)

その3の続き 自己対局パイプライン 自己対局パイプラインは、3つの主要な部分から構成される。 最適化 評価 自己対局 これらは並行で実行される。 最適化 ミニバッチサイズ:2,048 (32バッチずつ別々のGPUで実行) ミニバッチデータは直近50万の自己対局のす…

AlphaGo Zeroの論文を読む その2(ネットワーク構成)

前回に続いてAlphaGo Zeroの論文についてです。 ネットワーク構成 入力特徴 19×19の2値画像を17枚 8枚は現在のプレイヤーの石の座標を示す2値画像、8手分 8枚は相手のプレイヤーの石の座標を示す2値画像、8手分 1枚は現在のプレイヤーの石の色を示す全て0か1…

技術書典3の告知

10/22(日)に秋葉原で開催される技術書典3にサークル参加します。 サークル名は「dlshogi」、配置は「か19」です。 頒布するのは、「ディープラーニングを使った将棋AIの作り方」です。 Policy Networkの作り方についての解説本になります。あと、お隣のサー…

将棋AIの進捗 その6(df-pn)

前回の日記で書いた通り、df-pnの実装を行いました。実装の参考にしたのは、以下の論文です。 CiNii 論文 - df-pnアルゴリズムの詰将棋を解くプログラムへの応用 コンピュータ詰碁の探索戦略の改良 上記の論文にはほぼ同じ疑似コードが掲載されていますが、A…

将棋AIの進捗 その5(王手の指し手生成)

前回の日記で、Aperyに王手の指し手生成がないという話を書いたが、仕方がないので自分で実装した。やねうら王には王手の指し手生成が実装されていたので、実装方法を参考にさせてもらった。 YaneuraOu/movegen.cpp at master · yaneurao/YaneuraOu · GitHub…

将棋AIの進捗 その4(詰みの探索)

前回の日記で、末端ノードで詰みの探索を行う予定と書いた通り、詰みの探索をするようにしました。ディープラーニングは詰みの探索が苦手なので、ディープラーニングと詰み探索を組み合わせるのは有効だと思っています。 Policy Network、Value Networkの計…

将棋AIの進捗 その3

以前の日記で、電王トーナメントに出るつもりと書いていましたが、申し込みをしました。 予選通過も厳しそうですがとりあえず頑張ります。 さて、前回からの進捗ですが、35億局面の学習が3エポック回したところで飽和しました。 一致率は、Policy Networkが4…

将棋AIの進捗 その2

elmo_for_learnを使ってdepth8で35億局面の生成ができたので、DNNの学習を開始しました。前に7.5億局面を学習したときは、4日と20.5時間かかったので、35億局面を学習するには22日15.6時間かかる見込みです。elmo_for_learnで生成した局面には重複局面が4%程…

将棋AIの進捗

検証しているディープラーニングを使った将棋AIは、学習データを増やさないと精度が上げられないため、elmo_for_leanを使ってひたすら学習データを生成中です。現在、ようやく20億局面くらい。 PCを占有されると困るので、10コアのPCを1台買ってしまいました…

将棋でディープラーニングする その39(ブートストラップ)

前回の日記で、ブートストラップについて少し書いたが、1000万局面では効果がわからなかったので、局面を増やして再度検証した。 ブートストラップ 前回も書いたが、本来の報酬(勝敗)とは別の推定量(探索結果の評価値)を用いてパラメータを更新する手法…

将棋でディープラーニングする その38(学習継続中)

前回の日記で、利きを入力特徴に加えることで精度が上がることを確認したので、利きを追加したモデルで、初期値から学習をやり直した。学習データには、elmo_for_learnで深さ8で生成した、1億5千万局面を使用した。以前に生成したときは、引き分けの局面も出…

将棋でディープラーニングする その37(利き数を入力特徴に追加)

モデルの精度を上げるために、入力特徴を追加して精度が上がるか検証しました。 AlphaGoでは盤面の情報に加えて呼吸点などの情報を入力特徴に加えることで、精度が向上している。 盤面の情報(4個の特徴)のみでは、test accuracyが47.6%だが、48個の特徴とす…

将棋でディープラーニングする その36(PUCTアルゴリズムの実装)

Ray+Rnのソースを元に、policy networkとvalue networkを使った、モンテカルロ木探索を実装しました。 実装方法 以前の日記で書いたPUCTアルゴリズム*1を実装した。以前に考察したように、将棋ではプレイアウトで終局までプレイしても精度が低いため、終局ま…

将棋でディープラーニングする その35(マルチタスク学習(補足))

試している将棋でのディープラーニングについて、PUCTの実装をRay+Rnのソースコードを参考に行っていますが、囲碁部分のコードを将棋に置き換えるのがわりと面倒で、完成にはもうしばらくかかりそうです。その間に、追加でモデル学習の実験を行いました。 今…

将棋でディープラーニングする その34(強化学習【成功】)

以前にRL policy networkをelmoの自己対戦でデータを使ってREINFORCE algorithmで学習させたが、うまく学習できなかった。昨日の日記でマルチタスク学習を実装したので、RL policy networkをバリューネットワークと同時に学習させることで、RL policy networ…

将棋でディープラーニングする その33(マルチタスク学習)

SL policy networkとValue networkは、12層までは同じ構成で、出力の数層のみが異なるため、12層まで同じネットワークでそこから2つの出力を行うようにして、SL policy networkとValue networkを同時に学習することを試してみた。複数のタスクを同時に学習す…

将棋でディープラーニングする その32(転移学習)

以前の日記で、バリューネットワークを学習した際、SL policy networkからバリューネットワークに転移学習が可能であることに言及した。転移学習するには、12層まではネットワーク構造が同じであるため、SL policy networkからバリューネットワークにパラメ…

将棋でディープラーニングする その31(DNNのスループット)

方策ネットワークを対局中に用いた場合のスループットを計測した。PUCTアルゴリズムで並列で探索をする場合、複数スレッドからGPUを使用するため、複数スレッドから使用する場合を考慮する。まず、それぞれのスレッドからDNNを実行した場合について計測した…

将棋でディープラーニングする その30(探索アルゴリズム)

まだ方策ネットワークもバリューネットワークも精度が低いが、精度を上げるのは一旦保留して、対局時の方法について検討する。以前に考察したように、将棋は読みが重要なゲームであるため、探索を用いず方策ネットワークのみで指しても強くならないと思われ…

将棋でディープラーニングする その29(強化学習【修正版】)

以前にRL policy networkを学習する際の報酬に応じた勾配の実装方法について記述したが、計算方法に誤りがあった。softmax_cross_entroyを修正して、backwardの際の勾配に重みを掛けていたが、lossを計算する際に重みが掛けられていないため、間違ったlossを…

将棋でディープラーニングする その28(学習の高速化その2)

学習の高速化のため先日作成したPythonから使えるC++の将棋ライブラリ(cppshogi)に、RL policy networkも対応させました。以前は将棋ライブラリとしてpython-shogiを使用していましたが、全てcppshogiに置き換えました。 これによって、学習がかなり高速化…

将棋でディープラーニングする その27(対局できるようにする)

以前の対局できるバージョンは、別プロセスのUSIエンジンを補助的に使用して詰みの探索を行っていたが、Pythonから呼び出せるC++のモジュールに変更した。elmo_for_learnのソースを流用してPythonから使用できるようにした。 cppshogiというモジュールにして…

将棋でディープラーニングする その26(学習の高速化)

前回の日記で書いたC++でミニバッチデータを作成する処理を組み込んで、バリューネットワークの学習の速度が改善されたか確認を行った。 測定条件 学習データはelmo_for_learnで生成した100万局面 ミニバッチサイズ32 1エポック 測定結果 Python(変更前) 0:3…

将棋でディープラーニングする その25(C++でミニバッチ作成)

先日の日記で、elmoの教師データを使用してバリューネットワークの学習を行ったところ、elmoの教師データはハフマン符号で圧縮されているため、デコードする処理に時間がかかるという問題があることがわかった。そこで、デコード部分をC++で実装することで高…

将棋でディープラーニングする その24(歩の持ち駒の上限)

前回の日記でバリューネットワークの学習時間を見積もったところ、elmoと同じ50億局面を学習するには3.5ヶ月かかる見積もりになったので、高速化を行う必要性を感じている。ミニバッチデータの加工をPythonで行っている部分をC++に書き換えることでかなり高…

将棋でディープラーニングする その23(バリューネットワークの実装)

前々回の日記に書いたバリューネットワークの実装を行った。elmoで生成した教師データのフォーマットで教師データを読み込むようにした。前々回の日記で書いたAlphaGoの手法を参考にして、ネットワーク構成は、SL policy networkの出力層に全結合層を繋げてt…

将棋でディープラーニングする その22(評価値と勝率の関係)

前回の日記で書いたようにバリューネットワークの学習データとして、elmoの教師データを使用する予定である。elmoの教師データは自己対戦の勝敗だけでなく、深さ6で探索した評価値も同時に出力される。 そこで、学習がうまくいっているかの検証用として、elm…

将棋でディープラーニングする その21(elmoの学習データ)

バリューネットワークを実装する前に、検証に使用する学習データの仕様を決めておきたい。バリューネットワークの入力は、局面と勝敗のセットになる。AlphaGoの論文ではRL policy networkで終局まで打った際の勝敗データを使用しているが、私の検証しているR…

将棋でディープラーニングする その20(バリューネットワーク)

週末は電王戦の第2局を観戦していました。 人間のプロとコンピュータの対局はこれで最後となりましたが、コンピュータ同士の電王戦は継続されるということで、今後も楽しみです。検証しているディープラーニングによるコンピュータ将棋ですが、入力層のフィ…

将棋でディープラーニングする その19(報酬に応じた勾配 その2)

※この記事の内容は誤りがありますので、こちらの日記を参照してください。前回の日記でChainerでミニバッチの要素を1件ずつ処理することで報酬に応じた勾配の計算を実装したが、softmax_cross_entropyのbackwardの処理で、誤差逆の後続に伝えるデルタの値に…