変わりモノがいい!

変わりモノには価値がある・・・ハズ?

コンピュータ将棋の実践:学習処理の実装

それでは、開始!

さて、コンピュータ将棋を実装していくわけですが、どういうプログラム構成になるかをまずは考えてみましょう。 これはPythonだから、とか、ディープラーニングだから、難しい、なんてことはなく、プログラミング経験があれば普通にできることです。 えっ、そういう進め方で良いの?という意見もあると思いますが、表現が違うだけで全体構成から考えていくことに変わりはありませんのでご安心を。

f:id:ken2017:20200420113612j:plain

全体構成

それでは、今回実装するコンピュータ将棋のプログラムの全体構成を以下に示します。
過去の記事で、指し手を方策ネットワークを使って選び、勝率を価値ネットワークで予測すると書きました。 今回は、まず、方策ネットワークを使ったコンピュータ将棋を作っていきます。
進め方は、
まずは、方策ネットワークを作成し、学習を行い、
つぎに、学習した方策ネットワークを使って指し手を決めるコンピュータ将棋を作る
という手順です。

方策ネットワークの作成と学習

それでは、方策ネットワークの作成とその学習の進め方について見ていきましょう。
以下にその手順を示します。
1)方策ネットワークの実装
  方策ネットワークとして使用するニューラルネットワークとして、今回はCNNを
  使用します。 CNNを使って画像分類問題として将棋の指しての予測を行うこと
  とします。
   注)CNN:畳み込みニューラルネットワーク(画像分類問題で使われています)
  今回使う方策ネットワークは、入力層、13層のCNN、出力層から成っています。

     f:id:ken2017:20200420123736j:plain
  入力、出力に関する内容は以下の記事を参照ください。
  膨大な演算が必要ということが良く判ります。 

www.kawarimonogaii.com

  作成した方策ネットワークは、PolicyNetworkとしてクラス定義します。
2)学習処理の実装
 a)ライブラリのインポート
   処理に必要なライブラリをインポートします。
  numpy:多次元配列対応の数値演算用ライブラリです。
  chainer:ディープラーニング用フレームワークです。
  argparse:Python実行時のコマンドライン解析用モジュールです。
  random:乱数発生用ライブラリです。
  pickle:オブジェクトをファイルに保存したり、ファイルからオブジェクトを
      復元するためのライブラリです。
  os:OSに依存した機能を使うためのライブラリです。
  re:正規表現を行うためのライブラリです。
  logging:ログを出力するためのライブラリです。
 b)モデルの構築
  上で定義したPolicyNetworkクラスからモデルを作成し、そのモデルをGPUに
  転送します。
 c)最適化手法の設定
  勾配降下法で使用する最適化手法の設定を行います。
  今回は、最適化手法としてSGDを使用します。
  注)勾配降下法:訓練テストに対してコストが最小になるようにモデルパラメータ
    を少しづつ操作しモデルを訓練テストに対して適合したパラメータに収束させ
    る方法です。
  注)SGD:確率的勾配降下法(詳細は下記リンク先参照ください)

qiita.com

 d)棋譜の読み込み
  学習に使用する訓練データとテストデータの棋譜を読み込みます。
  今回使用する棋譜データは、3)棋譜の準備のところで書いていますが、8万件を
  超える棋譜データを使います。 8万件のデータを学習データとして使用すると
  大変な時間がかかるだろうなということは容易に想像できますよね。 ということ
  で、データの一部をランダムに選び出して利用するミニバッチ学習という方法で
  学習を行います。 それに対応するように棋譜データをミニバッチデータとして
  構成します。 ちなみに、ミニバッチ学習では、1回学習して、終わったら、また
  ランダムにデータを選び出して、また学習する、ということを繰り返します。
  これを制御するのが学習ループということになります。
  注)ミニバッチにおけるバッチサイズとは、例えば1000件のデータセットを200件
    ずつのサブセットに分ける場合、バッチサイズは200となります。
 e)学習ループの設定
  上に記載しましたように学習はミニバッチデータ単位に行います。 このために、
  学習処理は学習ループを構成して行います。
  学習をミニバッチ単位で行う場合、例えば1000件のデータセットをバッチサイズ
  200でミニバッチ化したとすると5回学習すればデータセットの中のデータは1回は
  学習に用いられることになります。(ここで、5回をエポック数と呼びます。)
  これで十分な結果が得られるならば良いのですが、これでは十分に学習することが
  できません。 従って、十分な学習を行うためには損失関数が収束するまで学習を
  繰り返す必要があります。 実際の学習処理の実行においては、バッチサイズや
  エポック数を変えてみて損失関数の収束具合を確認していきます。 
  参考としてエポック数の決め方に関する記事を添付します。 

qiita.com
3)棋譜の準備
  方策ネットワークを学習させるための棋譜を準備します。
  今回は、コンピュータ将棋の対局サイトであるfloodgateの棋譜を使用します。
  以下のURLからデータをダウンロードします。
  http://wdoor.c.u-tokyo.ac.jp/shogi/
  ここからデータとして一番新しい2016年のデータをダウンロードします。

    f:id:ken2017:20200420134528j:plain
  2016年のデータには8万件を超える棋譜データが入っています。
  この棋譜データから訓練データを作るわけですが、8万件のデータの中には手数が
  少ないデータやそもそも投了していないデータもあります。 良質の訓練データに
  するために、8万件の棋譜データに対してクリーニング処理を行います。
  クリーニングの条件は、以下とします。
  ・手数が50以上
  ・Ratingが2500以上
  ちなみに、知る人ぞ知る将棋倶楽部24での最高Ratingが2500ぐらいです。
  結構強いですね。
  棋譜データのクリーニングを行ったのちに、訓練データとテストデータに
  分割します。 この際、棋譜データに偏りが起きないようにシャッフルしてから
  分割するようにしましょう。
4)Python用の将棋ライブラリのインストール
  忘れていけないのが、将棋の本体プログラムです。 方策ネットワークは、次の
  一手を決めるプログラムであって将棋の本体プログラムではありません。
  今回は、Python用の将棋ライブラリとしてpython-shogiをインストールします。
  python-shogiは、棋譜の読み込みや局面の管理を行ってくれる便利な将棋ライブ
  ラリですが遅いという問題があるようです。 これが気になる人は、改善版の
  ライブラリも出ていますので、その活用を検討しても良いと思います。

以上で学習を行うための準備が整いました。 それでは学習を始めましょう。

学習処理の実行

以上書いてきました内容で作成したプログラムを動かしていきます。
プログラムが動いた結果は、次回報告としたいと思います。
理由は、動くかどうか判らないので・・・
早く結果の報告が出来れば良いな、と思っています。

では、また。

f:id:ken2017:20200420160116p:plain

(記事後記)

今回は、将棋AIで学ぶディープラーニング、という本を参考にして進めていますが、
開発環境の違いや使用しているPCの違いで色々と悩むことが発生しています。
悩みの中で大きなものは、
1)インストールできない
2) 動かない
3)動くけど遅い
というものがあり、1)2)はなんとか解決してきているのですが、3)ばかりはどうしようもなく手の施しようがない、という感じです。
ここまではなんとか我慢できているわけですが、GPUを使わないでディープラーニングを行うことは無謀なのかもしれません。
どうにもならないときには、ディープラーニングのプラットフォームの変更を行わざるをえないかも知れません。



 

 

 

プライバシーポリシー お問い合わせ