タグ

ブックマーク / tadaoyamaoka.hatenablog.com (11)

  • cshogiのビルド済みパッケージ - TadaoYamaokaの開発日記

    cshogi(Pythonの高速な将棋ライブラリ)をインストールするには、CythonとC++コンパイラが必要で、コンパイルに時間がかかっていた。 Google Colabでインストールを実行すると1分近く待つ場合があった。 そこで、待ち時間をなくしてすぐに試せるように、ビルド済みパッケージを用意した。 最終的にはPyPIに登録したいと思っているが、ひとまずGitHubのReleaseにwheelファイルを置いて、そこから取得するようにした。 OSの種類とPythonのバージョンごとに用意する必要があるため、Google Colabに合わせてPython3.6でビルドした。 ついでに、Python3.7用とWindows(Python3.7のみ)用ファイルもアップロードしておいた*1。 Release v0.0.1 · TadaoYamaoka/cshogi · GitHub インストール

    cshogiのビルド済みパッケージ - TadaoYamaokaの開発日記
  • PythonでAlphaZero Shogiを実装する - TadaoYamaokaの開発日記

    次の技術書典のネタとしてPythonAlphaZero Shogiの完全コピーを実装しています。 github.com 自己対局と学習がようやく動くようになりました。 入力特徴と出力ラベルと探索の仕様はAlphaZero Shogiと完全に一致させました。 入力特徴 先手の駒 14 後手の駒 14 繰り返し数 3 先手の持ち駒の数 7 後手の持ち駒の数 7 手番 1 手数1 履歴8局面 出力ラベル 移動方向×移動距離 64 桂馬の動き 2 移動方向×移動距離(成り) 64 桂馬の動き(成り) 2 駒打ち 7 高速化 Pythonで作成する目的は、にする上で強化学習の仕組みを理解できるように実装するためです。 それでも、そこそこの速度で動かないと少し試すにも時間がかかりすぎるので、分かりやすさを損なわない程度に、できる限り高速化も行っています。 cshogi Pythonで速度を出すため

    PythonでAlphaZero Shogiを実装する - TadaoYamaokaの開発日記
  • AlphaZero方式における入力の正規化 - TadaoYamaokaの開発日記

    前回AlphaZero方式で訓練データを作成する際のデータの格納方式をSQLiteに決めたので、テストのためにfloodgateの棋譜から訓練データの作成して、学習を行ってみた。 floodgateの棋譜から訓練データ作成 cshogiを使って2018年分のfloodgateのCSAファイルから訓練データを作成した。 AlphaZeroの論文の通り履歴局面は8手まで含めた。 棋譜には指し手の確率分布はないため、唯一の指し手の確率を1として生成した。 局面の繰り返し数は1までとした(速度の都合による。AlphaZeroでは4まで)。 検証データとして2019年分の棋譜から同様にデータを作成した。 訓練 AlphaZeroのモデルをスケールダウンしたResNet10ブロック、192フィルタのモデルで訓練を行った。 入力特徴量 入力特徴量は、局面の繰り返し数が1までである点以外はAlphaZer

    AlphaZero方式における入力の正規化 - TadaoYamaokaの開発日記
  • 将棋の合法手の数の統計 - TadaoYamaokaの開発日記

    AlphaZero方式の強化学習では、指し手の確率分布を教師データとするため、局面の合法手の数の分だけ確率の値を保存しておく必要がある。 将棋の合法手の最大数は593であることが証明されているが、実際の対局ではそのような局面は現れない。 教師データを保存する容量を抑えるために、できれば実際に現れる局面の最大数に制限したい。 可変長フォーマットにするという案もあるが、機械学習でシャッフルやランダムサンプリングするため、固定長フォーマットにしておきたい。 そこで、実際の棋譜で合法手の数の統計量を調べてみた。 調査方法 以下のようなスクリプトでmatplotlibでヒストグラム表示と、Pandasで統計量を出力した。CSAファイルの解析にはcshogiを利用した。 import numpy as np import matplotlib.pyplot as plt import pandas a

    将棋の合法手の数の統計 - TadaoYamaokaの開発日記
  • Google ColabでAlphaZero Shogiのモデルを教師あり学習する - TadaoYamaokaの開発日記

    Google ColabAlphaZero Shogiのモデルを論文に通り定義して、テストのために教師ありで学習してみました。 TPUでも学習して学習時間の比較もしてみました。 教師データには、elmoで生成したhcpe形式のデータを使用し、入力特徴量と正解ラベルの加工には、先日作成したPython将棋ライブラリ(cshogi)を使用しました。 モデルの定義 AlphaZeroの論文の通り、ResNetで、policyとvalueの2つの出力を持つネットワークを定義します。 ブロック数とフィルタ数、全結合層のユニット数はパラメータにしています。 policyの出力の畳み込みの後の位置ごとのバイアスはカスタムレイヤーを定義しています。 import tensorflow as tf from tensorflow.keras.models import Model from tensor

    Google ColabでAlphaZero Shogiのモデルを教師あり学習する - TadaoYamaokaの開発日記
  • 将棋AIの進捗 その26(自己対局による強化学習の経過2) - TadaoYamaokaの開発日記

    前回から時間が空いたが、自己対局による強化学習を続けている。 10ブロック、192フィルタのモデルの自己対局による学習が、79サイクル※回したところで飽和気味になったため、10ブロックのモデルからパラメータを転移して15ブロックのモデルで強化学習を行うことにした。 ※1サイクルで、250万局面を生成(55サイクルまでは500万局面にしていた) 自己対局の速度比較 10ブロックの自己対局では43.1局面/秒で生成できていたが、15ブロックにしたことで37.30局面/秒になり、局面の生成速度は、79.6%に低下した。 250万局面の生成時間は、10ブロックは17時間12分、15ブロックは19時間56分となった。 モデル学習速度 10ブロックでは、250万局面×過去10サイクルの学習に、2時間45分だったところ、15ブロックでは、4時間4分となり、学習速度は、1.47倍になった。 自己対局とモデ

    将棋AIの進捗 その26(自己対局による強化学習の経過2) - TadaoYamaokaの開発日記
  • optunaを使ってみる - TadaoYamaokaの日記

    昨日試したhyperoptと同じことをoptunaで試してみた。 探索する関数の形 hyperoptで試したものと同じ、2つの説明変数で、極大値が複数ある関数 Z = 10**(-(X-0.1)**2)*10**(-Y**2)*np.sin(5*X)*np.sin(3*Y) optunaによる最適化 optunaでは以下のようにしてパラメータの最適化を行う。 import numpy as np import optuna def objective(trial): x = trial.suggest_uniform('x', -1, 1) y = trial.suggest_uniform('y', -1, 1) return -10**(-(x-0.1)**2)*10**(-y**2)*np.sin(5*x)*np.sin(3*y) study = optuna.create_stud

    optunaを使ってみる - TadaoYamaokaの日記
  • 将棋AIの進捗 その25(自己対局による強化学習の経過) - TadaoYamaokaの開発日記

    前回からだいぶ期間が空きましたが、自己対局による強化学習で、教師ありで収束するまで学習したモデルより有意に強くすることができました。前回は、19イテレーションでほぼ互角の強さでしたが、38イテレーションまで自己対局を行うことで有意に強くなりました。 自己対局における探索延長 強化学習の方法は前回までの方法とほとんど同じですが、途中から探索延長を行うように変更しました。 探索延長は、固定回数シミュレーションの結果、1番目に訪問回数が多い手が2番目に訪問回数が多い手の1.2倍未満の訪問回数のときに、シミュレーション回数を1.5倍にするという実装です。 シミュレーション回数を増やすことで、生成される教師データの精度をあげることができますが、計算時間が増えてしまいます。 結果がわかりきった局面に対してもシミュレーション回数を増やすと無駄があるので、探索延長を行うことでより計算効率を上げることができ

    将棋AIの進捗 その25(自己対局による強化学習の経過) - TadaoYamaokaの開発日記
  • AlphaZero Chess/Shogiの論文を読む その2(AlphaGo Zeroとの差分) - TadaoYamaokaの開発日記

    AlphaZero Chee/Shogiの論文についての続きです。 今回はAlphaGo Zeroとの差分について書きます。 AlphaGo Zeroの論文については、以前に書いた記事を参照ください。 ネットワーク構成 ニューラルネットワークの構成は、AlphaGo Zeroと同じ、PolicyとValueを同時出力する20ブロックのResNetです。 前回書いた通り入力特徴と出力ラベルが異なります。 探索アルゴリズム 基的にはAlphaGo Zeroと同じ、モンテカルロ木探索にPolicyとValueを使ったPUCTアルゴリズムです。 以下の点が異なります。 AlphaGo Zeroでは探索のハイパーパラメータは、ベイジアン最適化で調整したが、チェス、将棋ゲーム固有の調整は行わず同じパラメータを使用 AlphaGo Zeroはニューラルネットワークに対称、回転の8局面からランダムに選

    AlphaZero Chess/Shogiの論文を読む その2(AlphaGo Zeroとの差分) - TadaoYamaokaの開発日記
  • 将棋AIの進捗 その14(自己対局による強化学習) - TadaoYamaokaの開発日記

    自己対局による強化学習の検証をはじめた。 強化学習の手法は、以前の日記で書いた通りで、Alpha Zeroの手法を参考にして、1手800シミュレーションで自己対局を行う。 自己対局→学習のサイクルを繰り返してモデルを成長させる。 1回のサイクルで、どれだけの自己対局を行うかは、AlphaZeroの論文には記載がないが、AlphaGo Zeroの論文には、 In each iteration, αθ* plays 25,000 games of self-play, using 1,600 simulations of MCTS to select each move. と記載されている。 平均手数は200手とすると、1回のサイクルで500万局面を生成している。 ただし、モデルの学習は、 Each mini-batch of data is sampled uniformly at rand

    将棋AIの進捗 その14(自己対局による強化学習) - TadaoYamaokaの開発日記
  • 将棋でディープラーニングする その39(ブートストラップ) - TadaoYamaokaの開発日記

    前回の日記で、ブートストラップについて少し書いたが、1000万局面では効果がわからなかったので、局面を増やして再度検証した。 ブートストラップ 前回も書いたが、来の報酬(勝敗)とは別の推定量(探索結果の評価値)を用いてパラメータを更新する手法をブートストラップという。 elmo_for_learnで生成したデータには、局面の探索結果の評価値が含まれているので、バリューネットワークの値をその評価値に近づけるように学習することで、学習の効率を上げることができると思われる。 経験的にブートストラップ手法は、非ブートストラップ手法より性能が良いことが知られている。 ブートストラップ項を加えた損失関数 elmoと同様に、ブートストラップ項の損失には、2確率変数の交差エントロピーを使用する。 バリューネットワークの値を、探索結果の評価値をシグモイド関数で勝率に変換した値をとした場合、交差エントロピー

  • 1