TadaoYamaokaの日記

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

将棋でディープラーニングする その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++に書き換えることでかなり高…

PythonからC++を呼び出してnumpyを使う

将棋でディープラーニングを試しているが、Pythonで入力データの加工を行うと処理速度が問題になっている。そこで、PythonからC++で作成したモジュールを呼び出して、その中でnumpyのオブジェクトの加工を行いたい。 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の処理で、誤差逆の後続に伝えるデルタの値に…

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

前回の日記で、RL policy networkの勾配を求める際に、対数尤度の偏微分に報酬に応じた重み(勝敗の報酬から状態価値を引いた値)を掛ける計算の実装が、Chainerでは難しいということを書いた。Chainerでは損失関数のbackwardを行うと、ミニバッチで1つの勾…

将棋でディープラーニングする その17(強化学習の実装)

前回の日記に書いたように方策ネットワークを使って自己対戦できるようになったので、AlphaGoの手法(RL policy network)で強化学習の実装を行った。教師ありで十分に訓練できていないので、今の時点で強化学習を行っても効果はでないと思われるが、実装方法…

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

教師ありで方策ネットワークを学習できたので、次に強化学習を試す予定であるが、強化学習を行うには自己対戦ができる必要がある。そこで、動作確認も兼ねてUSIエンジンとして動かせるようにした。 USIエンジン化 GUIとして将棋所を使用しようとしたが、USI…

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

前回まで棋譜を用いた教師あり学習で、将棋の方策ニューラルネットワークを学習した。今回から、強化学習で方策改善を行う。 強化学習の手法は、AlphaGoの論文と同じREINFORCE algorithm*1を試す。AlphaGoの論文の強化学習の手法は以下の通りである。 AlphaG…

将棋でディープラーニングする その14(floodgateの棋譜で学習)

前回までに調整したニューラルネットワークを、floodgateの棋譜を使って学習した。 floodgateの棋譜の入手 floodgateの棋譜は、コンピュータ将棋対局場の「情報収集」→「棋譜倉庫: 圧縮CSAファイル(7z形式)」から1年単位でアーカイブが入手できる。 とりあえ…

将棋でディープラーニングする その13(ハイパーパラメータの調整)

ディープラーニング将棋のニューラルネットワーク構成もだいぶ固まってきたので、そろそろ本格的に学習させてみたいが、その前にハイパーパラメータを調整を行った。ハイパーパラメータはベイズ推定など使って調整するのが本当は良いが、そんなに試行数もこ…

将棋でディープラーニングする その12(Wide ResNetを試す)

AlphaGoの論文ではSL policy networkは13層のCNNとなっているが、画像認識の分野では単純なDCNNよりGoogLeNet(Inception)やResidual Network(ResNet)が高い精度を上げている。 ResNetで層を増やすのが最も精度が上がるが、層が増えるほど学習時間も増える。R…

将棋でディープラーニングする その11(Kerasの実装)

将棋でのディープラーニングをChainerを使って検証していたが、Kerasでも試してみた。13層のDCNNを学習するには、少なくとも全パラメータ数の数倍の訓練データで学習する必要がある。 保存したmodelファイルをzipで解凍したファイルの合計サイズが約25MB(nu…

将棋でディープラーニングする その10(入力特徴から盤面の空の位置を削除)

GitHubに公開していたソースにバグがあり、Pull requestを頂きました。github.comバグの内容は、入力特徴である盤面の空の位置に先手の駒の位置が混ざっていました。 Pull requestをマージして測定し直しました。 train loss test accuracy 修正前 2.19 0.42…

将棋でディープラーニングする その9(王手を入力特徴に追加)

以前の日記に書いたがPonanza Chainerでは王手かどうかを入力特徴に入れているようだ。 そこで自分のニューラルネットワークにも王手を入力特徴に追加してみた。現在の局面が王手かどうかを判定し、2値画像1チャネルを入力チャネルに追加する。 王手かどうか…

将棋でディープラーニングする その8(出力に移動元を追加)

前回までのニューラルネットワークでは、差し手の移動先のみを出力して、移動元については考慮していなかった。 移動元をどのように出力するかは悩んでいたのでとりあえず移動先のみで検証を行った。移動元クラス数:盤のマス数(9×9)+持ち駒の種類(7) 移動先…

将棋でディープラーニングする その7(最適化手法の変更)

前回に続き、学習の改善を試します。 今回は、最適化手法を変えて収束性、精度を測定します。最適化手法は、はじめAdamではうまく学習できなかったためAdaGradとしていました。 Batch Normalizationを入れたことで、Adamを含めた他の手法でも学習できるよう…

elmoのアピール文書を読む

世界コンピュータ将棋選手権で優勝したelmoのアピール文書を読んでいますが、結構難しいです。 勝率が二項分布に従う場合、評価値はロジスティック分布に従う(※1)だろう、 ということでロジスティック回帰を適用しています(※2)。 この部分は、ある局面の勝敗…

将棋でディープラーニングする その6(BatchNormalizationを追加)

前回は、手番を入力特徴に加えても効果がないことを確認した。今回は、ニューラルネットワークの畳み込み層の後にBatch Normalizationを追加して精度への影響を確認する。Batch Normalizationを適用することで以下のメリットがある。 学習を速く進行させるこ…

将棋でディープラーニングする その5(入力特徴に手番を追加)

世界コンピュータ将棋選手権を参加者の生放送の方で見ていました。 開発者の話が聞けて、大変面白かったです。Ponanza Chainerの手法については、後日公開予定ということなので、公開されたら拝見させていただきたいと思います。 生放送でもだいぶ中身につい…

将棋でディープラーニングする その4(ネットワーク構成の変更)

本日から世界コンピュータ将棋選手権が始まりましたね。 一次予選を参加者の方の生放送で見ていました。今回からPonanza Chainer以外にもディープラーニングを取り入れて参加している方がちらほらいるようです。 こちらの方のアピール文章に、ネットワーク構…

fastTextでwikipediaを学習する

先日の日記でfastTextでWikipediaの要約を学習させたが、期待した結果にはならなかったので、全記事を使って学習し直した。 Wikipediaの学習済みモデルは、 fastTextの学習済みモデルを公開しました - Qiita こちらの方が配布されていますが、MeCabの辞書の…