著者:山岡 忠夫[やまおか・ただお] エンジニア。
著者:加納 邦彦[かのう・くにひこ] エンジニア。
カバー:海江田 暁[かいえだ・さとる] (Dada House)
図版制作:島村 龍胆[しまむら・りんどう]
編集担当:山口 正樹[やまぐち・まさき]
cover illustration:Tanya Shatseva / Shutterstock.com
cover photo:DRN Studio / Shutterstock.com
シリーズ:Compass Programming
NDC:007.64 情報学.情報科学 >> データ処理.情報処理 >> プログラミング
NDC:796 諸芸.娯楽 >> 将棋
件名:プログラミング(コンピュータ)
件名:将棋
件名:深層学習
【書籍の宣伝】強い将棋ソフトの創りかた - TadaoYamaokaの開発日記
【目次】
はじめに [iii-iv]
本書の読み方 [v-vii]
本書の構成
対象読者
読み進め方
ソースコード
目次 [viii-x]
Part 1 導入編
第1章 コンピュータ将棋について
1.1 コンピュータ将棋の歴史
1.2 コンピュータ将棋とディープラーニング
1.3 コンピュータ将棋の大会
1.3.1 コンピュータ将棋の大会について
1.3.2 大会への参加方法
世界コンピュータ将棋選手権
世界将棋AI電竜戦
1.3.3 コンピュータ将棋連続対局場所(floodgate)
Part 2 理論編
第2章 コンピュータ将棋のアルゴリズム
2.1 従来のアルゴリズム 011
2.1.1 ゲーム木
2.1.2 ミニマックス法
2.1.3 評価関数
2.1.4 αβ法
2.1.5 評価関数の機械学習
2.1.6 強化学習
2.2 コンピュータ囲碁のアルゴリズム 017
2.2.1 コンピュータ囲碁の課題
2.2.2 モンテカルロ法
2.2.3 モンテカルロ木探索
1. 選択
2. 展開
3. プレイアウト
4. バックアップ
2.2.4 マルチアームドバンディッド問題
マルチアームドバンディッド問題
UCB1アルゴリズム
2.2.5 UCTアルゴリズム
1. 選択
2. 展開
3. プレイアウト
4. バックアップ
優先順位の制御
並列化
(1) ルート並列化
(2) ツリー並列化
Virtual Loss
2.3 AlphaGoの手法 025
2.3.1 方策ネットワーク
2.3.2 価値ネットワーク
2.3.3 AlphaGoの探索アルゴリズム
1. 選択
2. 評価
3. バックアップ
4. 展開
2.3.4 AlphaGo Zeroの手法
2.3.5 AlphaZero
Tips ディープラーニングはαβ法で使えないのか 031
2.4 ディープラーニングの将棋AIへの応用 030
2.5 まとめ 031
第3章 ディープラーニングの基本
3.1 ニューラルネットワーク 033
3.1.1 パーセプトロン
3.1.2 多層パーセプトロン
3.1.3 活性化関数
出力層の活性化関数
中間層の活性化関数
3.1.4 順伝播
3.2 ニューラルネットワークの学習 039
3.2.1 損失関数
3.2.2 誤差逆伝播
勾配降下法
誤差逆伝播法
活性化関数と損失関数の微分
3.2.3 確率的勾配降下法[Stochastic Gradient Decent]
3.2.4 最適化手法
Momentum SGD
3.2.5 ミニバッチ学習の手順
3.2.6 正規化
3.2.7 重みの初期値
3.2.8 過学習について
正則化
dropout
3.3 Batch Normalization 045
3.4 分類問題と回帰問題 045
3.4.1 分類問題
2値分類問題
多クラス分類問題
3.4.2 回帰問題
3.5 畳み込みニューラルネットワーク 048
3.5.1 畳み込み演算
ゼロパディング
バイアス
ストライド
畳み込み層
3.5.2 プーリング層
3.5.3 畳み込みニューラルネットワーク
3.6 まとめ 053
Part 3 実装編
第4章 ディープラーニングフレームワーク
4.1 ディープラーニングフレームワークについて 057
4.2 GPU 058
4.3 Google Colab[Google Colaboratory] 058
4.3.1 Google Colabの基本的な使い方
1. ノートブックの新規作成
2. コードセルの実行
3. コードセル追加
4. セルのコピー
5. ランタイムタイプをGPUに変更
6. ランタイムの仕様の変更
7. セッションの管理
8. ヘルプ
4.3.2 GitHub上のノートブックの開き方
4.4 PyTorchの基本 073
4.4.1 インポート
4.4.2 ハイパーパラメータ
4.4.3 データセット
4.4.4 データローダ
4.4.5 デバイス
4.4.6 ニューラルネットワークの定義
4.4.7 モデルのインスタンス化とデバイスへの転送
4.4.8 損失関数
4.4.9 オプティマイザ
4.4.10 訓練ループ
4.4.11 実行結果
4.4.12 推論
4.5 まとめ 084
第5章 Pythonで将棋AIを創る
5.1 将棋ライブラリcshogi 085
5.1.1 インストール
5.1.2 パッケージインポート
5.1.3 基本的な使い方
盤面作成
合法手生成
手を指す
5.1.4 座標系
5.1.5 駒
駒の種類を表す定数
先手後手を区別する駒を表す定数
持ち駒を表す定数
5.1.6 指し手
5.1.7 メソッド・プロパティ一覧
Boardクラス
指し手を変換するヘルパー関数
CSA.Parseクラス
5.2 ソースコードとモジュールインストール 095
5.2.1 ソースコード
5.2.2 パッケージインストール
5.3 ディープラーニングの将棋AIへの応用 096
5.3.1 方策ネットワーク(policy network)
入力
出力
移動元の考慮
出力ラベル数
5.3.2 価値ネットワーク(value network)
入力
出力
5.3.3 マルチタスク学習
5.3.4 ニューラルネットワークの構成
入力層
中間層
5.3.5 出力層
方策ネットワークの出力量
価値ネットワークの出力量
5.4 将棋AIモデルの実装 107
5.4.1 入力特徴量の実装
5.4.2 方策ネットワークの出力ラベルの実装
5.4.3 価値ネットワークの出力ラベルの実装
5.4.4 ニューラルネットワークの実装
5.5 モデルの学習 113
5.5.1 訓練データの準備
dloodgateの棋譜
CSA形式の棋譜からhcpe形式[HuffmanCodedPosAndEval]に変換
5.5.2 訓練の実装
コマンド引数
デバイス初期化
ニューラルネットワークの初期化
オプティマイザ
損失関数
チェックポイント読み込み
データ読み込み
正解率
チェックポイント保存
訓練
5.5.3 訓練の実行
5.5.4 チェックポイントをローカルにダウンロード
5.6 まとめ 130
第6章 対局プログラムの実装
6.1 GUIソフト 131
6.2 USIプロトコル 132
6.2.1 座標系
6.2.2 usiコマンド
6.2.3 isreadyコマンド
6.2.4 usinewgameコマンド
6.2.5 positionコマンド
(1) 開始局面からの指し手
(2) SFEN形式
6.2.6 goコマンド
6.2.7 ponder
6.2.8 quitコマンド
6.3 USIエンジンの基本処理 139
6.4 ゲーム木 142
6.4.1 UctNodeクラスの実装
6.4.2 NodeTreeクラスの実装
6.5 モンテカルロ木探索の実装 147
6.5.1 コンストラクタ
6.5.2 usiメソッド
6.5.3 setoptionメソッド
6.5.4 isreadyメソッド
6.5.5 positionメソッド
6.5.6 set_limitsメソッド
6.5.7 goメソッド
6.5.8 searchメソッド
6.5.9 uct_searchメソッド
6.5.10 select_max_ucb_childメソッド
6.5.11 get_bestmove_and_print_pvメソッド
6.5.12 check_interruptionメソッド
ノード数チェック
探索打ち切り
探索延長
6.5.13 queue_nodeメソッド
6.5.14 evalメソッド
6.5.15 inferメソッド
6.6 起動処理 172
6.7 テスト 173
6.8 Colabで対局 176
6.8.1 人間プレイヤーとの対局
6.8.2 USIエンジンとの対局
6.8.3 dlshogiのモデルと対局
6.9 PCで対局 182
6.9.1 GPU
6.9.2 Python
ダウンロードしてインストールする方法
6.9.3 PyTorchの環境構築
6.9.4 パッケージインストール
6.9.5 バッチファイル作成
6.9.6 コマンドラインからテスト
6.9.7 モデルファイルの配置
6.9.8 将棋所のインストール
6.9.9 将棋所にエンジン登録
6.9.10 対局
6.10 まとめ 190
第7章 GCT電竜を超える強い将棋AIを創る
7.1 GCT電竜 191
7.1.1 世界将棋AI電竜戦とは
7.1.2 GCT電竜の紹介
開発の経緯と動機
dlshogiライブラリとモデルの関係
Colabの使用について
7.1.3 使用した棋譜
事前学習
floogate
教師データの条件
elmo_for_learn
AobaZeroの棋譜
dlshogiの強化学習
7.1.4 公開したGCTの成果物
Column dlshogiとGCT 197
7.2 dlshogiライブラリ 198
7.2.1 学習部
パッケージインストール
コマンド
オプション引数
ファイル形式
チェックポイントとモデルファイル
ONNX形式への変換
7.2.2 探索部
推論ライブラリ
探索部の特徴
7.2.3 入力特徴量
7.2.4 ニューラルネットワークの構成
入力層
中間層
活性化関数
7.2.5 学習テクニック
指し手のみの学習と方策の分布の学習
平均化
ブートストラップ
オプティマイザ
学習率スケジューラ
Stochastic Weight Averating(SWA)
Automatic Mixed Precision(AMP)
7.2.6 ユーティリティ
Column dlshogiが影響を受けたソフトウェア 210
7.3 dlshogiライブラリを使用したモデルの学習 211
7.3.1 ノートブックの処理時間
7.3.2 本書で使用する棋譜
7.3.3 ノートブックの実行
ランタイムタイプの実行
CUDAバージョンの確認
タイムゾーンの変更
共有アイテムのショートカット作成
Google Driveのマウント
作業ディレクトリの作成
シンボリックリンクの作成
データの確認
学習
ログの可視化
学習済みファイルのコピー
ONNX形式のモデルに変換
7.4 対局 226
7.4.1 USIオプション設定
7.4.2 ColabRTのインストール
TensorRTのインストール
dlshogiのビルド
onnxモデルの準備
USIエンジン同士の対局
7.4.3 PCでの対局
dlshogiのインストール
GPU
インストール
CUDA
cuDNN
TensorRT
将棋所で水匠4改と対局
dlshogiのダウンロード
水匠4改のダウンロード
対局
7.4.4 floodgateに放流
7.5 まとめ 256
Part4 発展 編
第8章 さらに強くするために
8.1 強化学習 259
8.1.1 初期局面集
8.1.2 ランダムによる多様性確保
8.1.3 並列実行
8.1.4 詰み探索
8.1.5 USIエンジンとのリーグ戦
8.1.6 自己対局
ビルド
引数
自己対局実行
8.2 定跡作成 265
8.2.1 ビルド
8.2.2 相手番定跡作成
8.2.3 定跡作成実行
8.3 探索パラメータの最適化 268
8.3.1 dlshogiのビルド
8.3.2 基準USIエンジンとしてのやねうら王のビルド
8.3.3 パッケージインストール
8.3.4 optunaのstudy作成
8.3.5 最適化実行
8.4 棋力計測 274
8.4.1 互角局面集
8.4.2 仮説検定
8.4.3 連続対局の方法
8.5 まとめ 280
参考文献 [281]
INDEX:索引 [282-284]
著者について [285]
【メモランダム】
・著者それぞれがインタビューを受けた記事。コンピュータ将棋開発への情熱が伝わる。
最強CPU将棋ソフト『水匠』VS最強GPU将棋ソフト『dlshogi』長時間マッチ観戦記 第二譜『dlshogi』山岡忠夫の信念 | 文春オンライン
最強CPU将棋ソフト『水匠』VS最強GPU将棋ソフト『dlshogi』長時間マッチ観戦記 第三譜『GCT』加納邦彦の自信 | ニコニコニュース オリジナル
【関連記事】
『速習 強化学習――基礎理論とアルゴリズム』(Csaba Szepesvári著 小山田創哲ほか訳 共立出版 2017//2010)
『これからの強化学習』(牧野貴樹編 森北出版 2016)
『Java将棋のアルゴリズム――アルゴリズムの強化手法を探る』(池泰弘 工学社 2016//2007)
『先を読む頭脳』(羽生善治,松原仁,伊藤毅志 新潮文庫 2009//2006)
『頭脳対決!棋士vs.コンピュータ』(田中徹,難波美帆 新潮文庫 2013//2011)
『強いAI・弱いAI ―― 研究者に聞く人工知能の実像』(鳥海不二夫 丸善出版 2017)
『「次の一手」はどう決まるか――棋士の直観と脳科学』(中谷裕教,伊藤毅志,勝又清和,川妻庸男,大熊健司 勁草書房 2018)