TadaoYamaokaの日記

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

ディープラーニングを使った将棋AIの作り方

後でちゃんと書く予定とりあえず以前の記事をリンク tadaoyamaoka.hatenablog.com

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

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

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

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

WindowsでChainerをGPUを使って動かす(v2.0対応)

Windowsで安定して使用できるv1.24を使用していましたが、Chainer v2.0でパフォーマンスが向上するということなので、アップデートしました。v1.24用のコードに一部修正が発生しましたが、軽微な修正で対応できました。 環境準備 以前の日記を参照してくださ…

将棋でディープラーニングする その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からバリューネットワークにパラメ…

ChainerをC++から使う

ディープラーニングを使った将棋プログラムを試しているが、将棋プログラムは速度が必要なため、開発言語はC++が適している。 しかし、使用しているディープラーニングフレームワークのChainerはPythonにしか対応していない。CaffeやCNTK、TensorFlowなどC++…

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

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

Ray+Rnのソースを調べる

将棋プログラムでPUCTアルゴリズムを試すため、囲碁プログラムのRayを元にCNTKを使って、ディープラーニングに対応させたRnのソースを調べています。 RnはPUCTアルゴリズムを実装しているので、参考になります。以下、Windowsでビルドして、ソースをステップ…

将棋でディープラーニングする その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の辞書の…

doc2vecでWikipediaを学習する

先日の日記でTF-IDFでFAQに回答することを試したが、TF-IDFでは質問文の類似度を単語の頻度に重み付けをして測っている。 そのため、単語が完全に一致している必要があり、同じ意味の単語でも異なる単語として認識してしまう。word2vecを使用すると単語をベ…

英語の論文を翻訳する際のTips

機械学習を勉強している際に必ずぶち当たるのが英語の壁である。 有用な論文のほとんどは英語で書かれているのだ。無料で読める論文は arXiv.org e-Print archive で公開されていることが多い。例えば、以下の論文などを無料で読むことができる。 <物体検出…

TF-IDFを使ってFAQに回答する

とある理由からBotについて調べています。最近はAIを使ったBotもありますが、古典的な方法として、あらかじめ質問と回答を用意しておき、ユーザが入力した質問と類似度の高い質問を選んで回答する方法があります。TF-IDFがその代表的なアルゴリズムになりま…

64bitのWindowsにMeCabをインストールする

MeCabの公式のサイトではWindows用は32bitのインストーラしか提供されていないため、64bitのWindowsで64bitのPythonから使おうとすると使用できない。64bit向けには、32bitのインストーラでインストールした後、個別にビルドしたファイルで実行ファイルとラ…

AIで質問の回答を選ぶ

ディープラーニングを使って自然言語の質問に、自然言語の選択肢から回答することを試します。例えば、 Which of the following is the primary advantage of sexual reproduction when compared to asexual reproduction? という質問文に、 (A) There is a …

WindowsでKerasを使う

とある理由でKerasを使い始めました。 備忘録を兼ねてWindowsでバックエンドにTensorFlowを使用してKerasを使う方法について書きます。 環境 Windows 10 Home 64bit Python 3.5.2(Anaconda 4.2.0 (64-bit)) Tensorflow-gpu (1.0.1) Keras (2.0.3) TensorFlow…