読み書きプログラミング

日常のプログラミングで気づいたことを綴っています

囲碁AIアプリの作り方2

今日はニューラルネットワーク周りのご紹介です。
前回同様、技術的な話ではないです。どういう材料が利用可能かご紹介します。

AlphaGo Zeroは、MCTSニューラルネットワーク強化学習という組み合わせで、0から人類を遥かに超えて学習するAIです。
「莫大な演算力があれば」の話ですが。

演算のほとんどはニューラルネットワーク部分に費やされます。
なので実は、前回、ご紹介したAZ.jsのメインの部分であるMCTSのコードは、ぶっちゃけそんなに頑張ってチューンする必要は最初はないのです。
探索エンジンというと、CやC++で書かないとスピードが出なくて意味がないという印象を持たれている方も居られるかも知れません。
私も以前はそうでした。
でも、AlphaGo方式が主流になって、MCTSボトルネックとは言えなくなったので、ニューラルネットワークを速く計算することがAIを強くするために重要な部分となりました。


まず、ニューラルネットワークそのものとも言えるウェイトをいかに入手するかについてです。
ウェイトというのはニューラルネットワークの中の係数データです。
性能の高いウェイトを生成するのに上記の「莫大な演算力」が必要になります。
幸いに、フリーでいくつかのウェイトが公開されているのでご紹介します

  • Leela Zero: 世界中の協力者のコンピュータを借りてAlphaGo Zeroの追実験を行っています。Hashに紐づけされているリンクをクリックするとウェイトをダウンロードすることができます。
  • ELF OpenGo: FacebookAlphaGo Zeroの追実験を行った結果が公開されています。pretrained-go-19x19-v1.binが最新版のウェイトです。
  • PhoenixGo: Tencentが作ったAlphaGo Zeroクローンです。
  • Minigo: Googleが(DeepMindとは別に)AlphaGo Zeroの追実験を行っています。リンク先はウェイトファイルの置き場なので、プロジェクト本体はgithubを参照ください。
  • AQ: 山口さんが開発された囲碁AIです。最初のAlphaGo論文ベースのものかと思います。
  • Ray: 小林さんが開発されたMCTS碁 Rayに松崎さんがニューラルネットワークを追加されたものです。

皆さん、相当のリソースを費やされているはずで、公開に感謝致します。


さて、ウェイトを入手したら今度はそれを動かしたいプラットフォーム上で動かすべくフレームワークを探します。

例えば、AZ.jsの場合、言語はJavaScriptですが、ブラウザで利用可能な演算力としてWebGL, WebGPUがあります。これは元々グラフィックス用のAPIですが、昨今のニューラルネットワークGPU上で計算されていることから容易に推測できるようにこれらのAPIを使ってJavaScriptよりも速くニューラルネットワークの計算をすることができます。

そのためのフレームワークがWebDNNです。

github.com


その他のプラットフォームの例としては、iOSなら Core ML、AndroidならNeural Networks API、パソコンの場合色々ありますが、TensorFlowがメジャーですか。


Leela ZeroのウェイトをWebDNNで動かすために変換するには、AZ.js内にスクリプトを用意しています。
Leela Zeroのウェイトは独自のテキストフォーマットなので、

  1. 独自フォーマットをTensorFlowで読み込む
  2. TensorFlowモデルをWebDNNフォーマットに変換

ということをしています。なので、TensorFlowをインストールして変換するということになります。

なんだか人のお役に立ちそうにない文章になりましたが、今日はこの辺で。