TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

DeepLearning

将棋AIの実験ノート:Attention Branch Network

以前に、Mask-Attentionについて記事にしたが、同様の手法にAttention Branch Network(ABN)がある。 ABNは、Attention Branchの損失も計算して訓練する点がMask-Attentionと異なる。 ここでは、ABNをdlshogiのネットワークに適用して、AIが注視している座標…

エントロピー正則化項の微分

以前に方策が決定論的にならないようにするために、損失にエントロピー正則化項を加えることを書いたが、誤差逆伝播する際の微分の式が誤っていたので訂正する。 方策がソフトマックス関数の場合のエントロピーの微分 エントロピーは以下の式で与えられる。 …

将棋AIの進捗 その30(NNキャッシュ)

先日、Leela Chess Zeroのソースを流用して、LRUキャッシュを実装したが、これを自己対局プログラムに組み込んだ。はじめ、LRUキャッシュを1つにしてすべての探索スレッドで共有するようにしたが、ゲーム木の展開済みノードのNN計算結果が、他のスレッドの探…

将棋AIの実験ノート(入力特徴量の数値の表現方法)

AlphaZeroでは入力特徴量として持ち駒の枚数、手数をそのまま数値として与えている。一方、Alpha Goでは、呼吸点などの数は、ont-hotエンコーディングして与えている。 例)上限が3で2の場合、010。dlshogiでは、持ち駒の枚数、利きの数を、数値の分だけ1に…

将棋AIの実験ノート(自己対局時のノード再利用)

以前に自己対局時にノードを再利用することで一時的に精度が上がったが、その後学習を続けるとpolicyのテスト損失が上昇する現象が起きた。ノード再利用とバッチサイズの変更(1024→2048)を同時に行ったので、どちらが原因で発生したのかわからなかったため、…

将棋AIの実験ノート(初期値とシャッフルの影響)

各種条件を変更して比較実験を行っているが、初期値とシャッフルにランダム性があるので、測定結果は毎回ばらつきがある。 ランダムシードを固定すると結果が同じになるが、そのシード値での比較にしかならないので、固定しないで測定している。 複数回測定…

将棋AIの実験ノート(重みの初期値)

dlshogiでは、ニューラネットワークの重みの初期化はChainerのデフォルト(LeCunNormal)を使用している。 モデルをSEResnetに変える予定なので、どの初期化が良いか実験してみた。すべてデフォルトの場合と、活性化関数がReLUの場合はHeNormalが良いとされて…

将棋AIの実験ノート(入力特徴に手番は必要か)

dlshogiでは入力特徴に手番を加えていない。 将棋では先手と後手で同一局面の価値は変わらないためだ。 ある局面が与えられば、先手か後手かによらず最善手は同じはずである。一方、AlphaZeroでは、手番が入力特徴に加えられている。 局面を180度回転せずに…

将棋AIのモデルでSENetを試す その2

前回将棋AIのモデルでSENetを組み込むと精度が上がることが確かめられた。 今回は、SENetなしで層を増やした場合と比較を行ってみた。 また、SENetのreduction rateを16から8、4にした場合とも比較を行った。測定方法は前回と同じ。 比較条件 SENetなしでブ…

将棋AIのモデルでSENetを試す

先日Chainerで実装したSENetを将棋AIのモデルで試してみた。dlshogiで使用している10ブロック、192フィルタのWideResNetにSENetを組み込んで、SENet有無による精度を比較した。 SENetの実装 DeepLearningShogi/policy_value_network.py at 7820661597f380b17…

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

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

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

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

ChainerでSENetを実装する

ILSVRC 2017で優勝したSqueeze-and-Excitation Networks (SENet)を、こちらのPyTorchの実装を参考にChainerで実装した。GitHub - TadaoYamaoka/senet.chainer 実装したのは、SE-ResNet20/Cifar10のみ。 結果 通常のResNet >python cifar.py --batch_size 64 …

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

将棋AI用モデルの学習で正則化の有無による精度への影響を測定した。 測定方法 10ブロック、192フィルタのモデル PolicyとValueのマルチタスク学習 Aperyで生成した1.4億局面をシャッフルして2500万局面分を学習 Momentum SGD(lr=0.01) 初期モデルから学習 …

2値分類で中間の値も学習する(続き)

昨日書いた2値分類で中間の値も学習するコードは、損失の計算で計算グラフを構築して、backward()時の微分はChainerに任せていた。しかし、交差エントロピーの微分は、以下のように引き算で表すことができるため、計算グラフを構築しなくてもよい。 交差エン…

2値分類で中間の値も学習する

実験している将棋AIの学習では、今まで価値ネットワークの出力の活性化関数をシグモイドとして、勝ちと負けの2値で分類していた。 しかし、先日の世界コンピュータ将棋選手権に参加して、引き分けや千日手が結果を左右するゲームが多かったため、引き分けも…

ロジットを使ってエントロピーを計算する

方策勾配で強化学習を行う際に、方策が決定論的になっていないか監視するために、ログにエントロピーを出力するようにしたい。エントロピーは、 で計算できるが、確率がほぼ0の場合、が-infになるため、この式のままでは計算できない。の最小値をクリップし…

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

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

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

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

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

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

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

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

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

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

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

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

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

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

畳み込み層とBatchNormalizationのレイヤー融合をChainerで試してみた

畳み込み層のフィルタは行列で表すことができる。 BatchNormalizationも、入力の要素ごとに適用するスカラーの式だが、カーネルサイズ1×1の畳み込みで表すことができる。推論のフェーズでは、BatchNormalizationの平均と分散は、学習時の統計情報を使うこと…

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

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

NHWC vs NCHW on Google Colab

畳み込みの入力データの形式には、NHWCとNCHW があるが、どちらがTPUに最適か実験してみた。TensorFlowのデフォルトはNHWCで、ChainerのデフォルトはNCHWになっている。cuDNNはNCHWに最適化されている。 https://www.tensorflow.org/guide/performance/overv…

Google ColabでTPUを使ってみる

ほぼ自分用のメモです。Google Colabで、Kerasを使ってTPUでMNISTの学習を試してみた。TPUを有効にするには、「ランタイムのタイプを変更」からハードウェアアクセラレータを「TPU」に変更する必要がある。KerasでTPUでMNISTを学習するには以下のように記述…

Kerasでクラス分類モデルの出力をlogitsにする

Google ColabでTPUを使うには、今のところフレームワークにTesorFlow(Keras)を使う必要がある。 Kerasで将棋AI用のモデル定義を行っていて、ChainerではできてKerasでは簡単にできない問題にぶつかった。Kerasでクラス分類のモデルを定義して学習する際、通…

AlphaZeroの論文

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