GA将?開発日記~王理のその先へ~

ネタ勢最強を目指して絶賛開発中。

学習ルーチンの分散コンピューティング化に必要な事

  • サーバ・クライアントのプログラムの修正・実装
    • サーバ(Java:通信周りを実装)
    • サーバ(C++:パラメータ更新周りを修正)
    • クライアント(JavaGUIと通信周りを実装)
    • クライアント(C++:自己対局&勾配計算周りを修正)
  • ランキングのデータ集計&HTML化プログラムの実装
  • クライアントでスレッド数の上限を撤廃する&必要なオブジェクトをスレッド数分だけ生成する様に修正(現在は最大スレッド数をハードコーディングしているので)
  • レンタルサーバの選定・契約
  • インストールマニュアル等のドキュメント作成

「強くてニューゲーム」の可能性を検証してみた@コンピュータ将棋界

 面白そうな話題なので、細々と検証してみる事にしました。
 

1990年編

www.eonet.ne.jp

 1990年のPCは、上記サイトによると高々20MHz程のCPUと2MB程のRAMしか無いので、現状のコンピュータ将棋*1を対局させる事すら無理そうです。

 ましてや、機械学習で評価関数パラメータを学習するのは、夢のまた夢かと思います。

 この時代だと、「現在の知識は全く活かせない」という可能性が非常に高いです。

2000年編

ハードウェア構成

 確か、IntelAMDが「1GHzレース」を展開中だった時代だと記憶しています。あと、この頃はコンシューマ向けのPentium II/IIIでもデュアルCPU構成が可能だったので、安価に構築可能でした。

 コンシューマ向けですと、2020年2月にRyzen Threadripper 3990X(64コア128スレッド・ベースクロック2.9GHz)が出る予定ですので、CPUパワーは現状から2桁程度落ちる計算でしょうか。

 メモリに関しては128MBのSDRAMが売っていた記憶があるので、512MB位の容量は個人でも確保出来そうな感じです。三駒関係だと「対局は可能だけど、学習するのは無理そう」かと思います。

探索ルーチン

 私がコンピュータ将棋を実装し始める前なので書籍等から得た知識ですが、この頃は選択的探索が主流だった様です。

 ただし、激指さんが実現確率探索を実装したのが2001年選手権バージョンからで、2002年には優勝していますので、実現確率探索に関する知識は活かせるかと思います。「劇的に強くなる」かは分かりませんが、数年のアドバンテージは得られそうですね。

 ついでに、当初の実現確率探索は「指し手をグループに分類して、グループごとの遷移確率を採用する」方式だったのが、後に「指し手の遷移確率を、ロジスティック回帰を用いて学習する」様に変更されたので、変更後の方式を実装すれば当時のソフトと比較して強くなる可能性は高いかもしれません。

評価関数

 上記の通り、三駒関係の評価関数は主記憶の容量の問題で学習不可能だと思います。なので、「任意の二駒関係」が上限かと思います。

 ただ、二駒関係ならメモリ専有量が減る&学習の収束が速くなるので、2000年でも実用レベルかもしれません。

機械学習

 Bonanza Methodならある程度容易に並列化出来るので、ハイエンドPCを多数並べて学習させれば実用可能範囲かと思います。あるいは、1台のPCで学習を回して、収束するまでじっくり数ヶ月~1年程度待つとか。(参考までに、Bonanzaさんの選手権デビューは2006年。)

 自己対局等での強化学習は、Bonanza Method以上にマシンパワーを要求します。多分、同じ棋力になるまでに必要な計算量は1~2桁は上がるんじゃないかという印象です。なので、こっちは「知識はあっても、ハードウェアの制限で実現不可能」かと。

並列探索&合議

 当時のハイエンドPCでも、高々2コア2スレッド構成ですので、並列探索の場合にLazySMPはあまり有効に動かなそうです。YBWCで十分かと。

 合議に関しては、単にLAN等で接続された複数のPCがあればOKなので、2000年当時でも実用可能な技術です。文殊さん(2009年選手権デビュー)方式の多数決合議よりも、後で提案された楽観的合議の方がクライアント数を増やした場合の伸びしろが大きい*2ので、こっちを採用すれば10年程度のアドバンテージは有るかと。

結論:わたしのかんがえたさいきょうのコンピュータ将棋ぷろぐらむ@2000年

 ここではPentim IIIデュアルCPU程度のハードウェア*3を前提に考えてみます。

  1. 探索ルーチン:ロジスティック回帰を用いた実現確率探索。YBWCで並列化する。
  2. 評価関数:二駒関係ベース。
  3. 学習ルーチン:Bonanza Method。

 具体的にどの程度強くなるかですが、「ソフトウェアの技術革新によって、年間200程度Eloレーティングが向上する」と仮定すると、5~10年程度のアドバンテージが有るので、+1000~2000程の向上になるはずです。

 ついでに、コストパフォーマンスとかは一切考慮せず、金に物を言わせてハードウェアを揃えた場合を考えてみます。具体的には、上記のPCを64台揃えた場合。1台30万円なら2000万円前後ですね。

 この場合、楽観的合議を実装して更にレーティングが+数百、と言った所でしょうか。夢は有るんですが、コスパ的には微妙ですね。

 まぁ、当時のハイエンドPC1台でも当時の最強ソフトに対してレーティング+1000は固いと思うので、選手権に出れば無双出来るかと思われます。

*1:例えばBonanza型の三駒関係の評価関数を仮定しています

*2:確か、32クライアントか64クライアントまでは棋力が向上する、って論文があった筈

*3:当時、個人で購入可能な上限

学習ルーチンの分散コンピューティング化を検討中

 GA将?の学習ルーチンは、ミニバッチサイズ(1回のパラメータ更新に使用する、自己対局の棋譜の数)を大きくすると、学習が安定する傾向があります。

 ただ、私のPC(Core i7 5960X)では、マシンパワーの関係上ミニバッチサイズは500~1000程度が限界です。

 という訳で、マシンパワーを提供してくださる方がみえれば、その力をお借りしてミニバッチサイズを2~3桁上げれないかと検討中です。

 当面は5五将棋モードで学習する予定ですが、将来的には本将棋でも同様の事をしてみようと検討しています。

 動作環境は下記の通りです。

  • OS:Windows 8.1/10 x64(エディション問わず)
  • CPU:POPCNT命令をサポートしたCPU(Intel製であれば、Core iシリーズ以降)
  • RAM:4GB以上(実行するスレッド数に応じて増加します。)
  • その他:Javaの実行環境(JRE*1のインストール必須)

 学習の流れとしては、下記の様な感じで考えています。

  1. 初期パラメータファイルを、各クライアントにネットワーク経由で配布。
  2. 10分程度、各クライアントが自己対局を実施。
  3. 全クライアントから、パラメータ更新に必要なデータをサーバに送付。
  4. サーバ上でパラメータ更新。
  5. 全クライアントに、最新のパラメータファイルを配布。
  6. 2.に戻る。

 金銭的なお礼は出来ませんが、5.で配布したパラメータファイルはユーザ様がGA将?相手に対局する為に使用可能にしてはどうかと思います。(UEC杯で上位入賞が狙えそうなパラメータファイルを、早期に入手可能になります。)

 また、ユーザ様の提供してくださったマシンパワーを、GA将?のウェブサイトでランキング形式で公開してみようと検討中です。(こちらに関しては、現在検討中ですので、場合によっては非公開とさせて頂く可能性もあります。)

 https://twitter.com/MoriokaYuichi/status/1213718758335795200 でアンケート実施中です。ご興味がありましたら、投票をお願いします m(_,_)m

*1:フリーソフトで有ります

ログの可視化ツールを大幅アップデート

qiita.com

 上記サイトを参考に、ログファイルの更新を監視してグラフ作成&Webサイトにアップロードする様にしてみました。(更新ごとだと10秒に1回とかになっちゃうんで、前回処理から一定時間以上は待つ作りになっています。)

 
qiita.com


 それから、ログファイルコピー→グラフ作成→アップロードって流れは学習ルーチン変えても共通なので、抽象クラス*1を作って、継承先でグラフ作成だけオーバーライドする様に変更。これで、ツールのメンテが大分楽になりました。

 最後に、描画したグラフ&HTMLファイルと、元になるCSVファイルを自動バックアップする機能も追加。これは、on_created()の中で日時のディレクトリを作っといて、処理のたびにコピーするだけなので割りかし簡単でした。

 てな事をやって、使える言語が4つになりました。

  • Java:コアの部分はほぼほぼ書ける。ただし最新事情には疎い。
  • C++:コンピュータ将棋なら一通り書ける。GUIとかは作れない。
  • Python:ほんのチョットだけ、簡単なツールをググりながら作れるレベル。
  • Perl:20年近く前に卒論でちょっと書いた。かなり忘れた。

 うん、我ながらビミョーなラインナップ&スキルレベルですね。何したいのか良く分かんない。

*1:って呼び方で合ってるのかな、Pythonの場合?

方策πのエントロピーにもとづく内発的報酬

 が、もうちょっとで定式化出来そうな気がする。

動機

 自己対局を通じた、コンピュータ将棋/コンピュータ5五将棋の評価関数の強化学習において、より良い報酬を設計したい。

大雑把な考え方

 方策πのエントロピーが、行動選択の前後でどう変化したかをベースに、(勝敗にもとづく)基本報酬とは別にエントロピー変化に応じた内発的報酬をエージェントに与える。

方針

  • エントロピーが減少した → ほぼ一本道のルートに入った → 学習が進んでいる局面だと判断し、(追加で学習する価値が低いので)内発的報酬を少な目にする。
  • エントロピーが増加した → どう指せば良いか良く分からないルートに入った → 学習する価値が高いと判断し、内発的報酬を多目にする。

計算式(案)

 r_b(s,s')が局面sからs'へ遷移した際の内発的報酬、H(s)は局面sのエントロピー

案1:単純に差分を取る。

  r_b(s_t,s_{t+1}) = H(s_{t+1}) - H(s_t)

案2:比率を取る。

  r_b(s_t,s_{t+1}) = \frac{H(s_{t+1})}{H(s_t)}

使い方

 局面s_tからs_{t+1}へ遷移した際に、上記r_b(s_t,s_{t+1})を即時与える。

あけましておめでとうございます。

 新年ももう2日になってしまいましたが、今年もよろしくおねがいします。

 昨年を振り返ると、3月のUEC5五将棋大会で準優勝したのがピークで、以降はGA将の開発はほぼ進展無しでした。

 昨年末に一つちょっとしたアイデアを思い付いて、現在は三目並べモードでの予備実験が終わった所です。詳細は後日書きますが、上手く行けばそれなりに棋力向上してくれそうです。

 んで、Twitterで呟きましたが、今年はコンピュータ5五将棋大会で1回は優勝したいですね。

 3月にあるはずのUEC杯は参加が厳しそうなので、GPW杯(多分あるはず)を目標に開発していこうと思います。

 という訳で、改めてよろしくおねがいします&ご期待ください!

GAN、お勉強中

 とりあえずこの本買って、コードを写経してみました。

 んで、1Epochと100Epochで生成される画像の質にどの程度差が出るのか検証。こういう↓結果になりました。

1Epoch


100Epoch

 初期はほぼデタラメですが、100Epochだと何となくそれらしい画像が出来ていますね。

 GeForce GTX 960使うと1時間で30Epoch程度進むので、今度は500Epoch程度やらせてみますか。

 んで、それと並行して将棋の局面を生成する為のネットワーク構造も検討してみます。