TadaoYamaokaの開発日記

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

DeepLearning

将棋でディープラーニングする その43(ValueNetの出力をtanhにする2)

前回、Value Networkの出力をtanhにした場合とsigmoidにした場合で比較を行ったが、マルチタスク学習を行っているため、はっきりした結果がわからなかった。今回は、Value Networkのみの学習で比較を行った。 以下の2パターンで比較した。 出力関数 損失関数…

tanh vs sigmoid

AlphaGoのValue Networkの出力にはtanhが使用されている。 一方、将棋AIでは評価関数から勝率に変換する際、sigmoidが使われている。tanhとsigmoidのどちらがよいか、dlshogiの学習で検証してみたが、Policy NetworkとValue Networkのマルチタスク学習を行っ…

将棋でディープラーニングする その42(ValueNetの出力をtanhにする)

将棋AIでは、評価関数をsigmoid関数で[0,1]の範囲で勝率にすることが行われている。 elmoの損失関数には、勝率の交差エントロピーと、浅い探索と深い探索の評価値から求めた勝率の交差エントロピーの和が使われている。一方、AlphaGoでは報酬に[-1,1]が使用…

将棋でディープラーニングする その41(モーメントありSGD)

AlphaGo Zeroのニューラルネットワークの学習の最適化に使用されているモーメントありSGDを将棋AIで試してみた。以前に、最適化手法を比較した際、Adamのような学習率を自動で調整する手法よりSGDの方が学習効率が高かった。 AlphaGo FanバージョンでもSGDが…

将棋でディープラーニングする その40(入力特徴に履歴追加)

その39からずいぶん期間が空きましたが、AlphaGo Zeroの論文を読んで試したいことができたので、AlphaGo Zeroの論文の方法が将棋AIに応用が可能か少しずつ試していこうと思います。AlphaGo Zeroの特徴については、別の記事に記載していますので、参照してく…

将棋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の処理で、誤差逆の後続に伝えるデルタの値に…

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

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

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

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