いう材料が利用可能かご紹介します。Zeroは、MCTS、ニューラルネットワーク、強化学習という組み合わせで、0から人類を遥かに超えて学習するAIです。「莫大な演算力があれば」の話ですが。演算のほとんどはニューラルネットワーク部分に費やされます。実は、前回、ご紹介したAZ.jsのメインの部分であるMCTSのコードは、ぶっちゃけそんなに頑張ってチューンする必要は最初はないのです。探索エンジンというと、CやC++で書かないとスピードが出なくて意味がないという印象を持たれている方も居られるかも知れません。私も以前はそうでした。AlphaGo方式が主流になって、MCTSはボトルネックとは言えなくなったので、ニューラルネットワークを速く計算することがAIを強くするために重要な部分となりました。ニューラルネットワークそのものとも言えるウェイトをいかに入手するかについてです。ウェイトというのはニューラルネットワークの中の係数データです。性能の高いウェイトを生成するのに上記の「莫大な演算力」が必要になります。Zeroの追実験を行っています。Hashに紐づけされているリンクをクリックするとウェイトをダウンロードすることができます。Zeroの追実験を行った結果が公開されています。pretrained-go-19x19-v1.binが最新版のウェイトです。Zeroクローンです。Zeroの追実験を行っています。リンク先はウェイトファイルの置き場なので、プロジェクト本体はgithubを参照ください。山口さんが開発された囲碁AIです。最初のAlphaGo論文ベースのものかと思います。Rayに松崎さんがニューラルネットワークを追加されたものです。皆さん、相当のリソースを費やされているはずで、公開に感謝致します。ウェイトを入手したら今度はそれを動かしたいプラットフォーム上で動かすべくフレームワークを探します。WebGPUがあります。これは元々グラフィックス用のAPIですが、昨今のニューラルネットワークがGPU上で計算されていることから容易に推測できるようにこれらのAPIを使ってJavaScriptよりも速くニューラルネットワークの計算をすることができます。そのためのフレームワークがWebDNNです。API、パソコンの場合色々ありますが、TensorFlowがメジャーですか。ZeroのウェイトをWebDNNで動かすために変換するには、AZ.js内にスクリプトを用意しています。独自フォーマットをTensorFlowで読み込むTensorFlowモデルをWebDNNフォーマットに変換ということをしています。TensorFlowをインストールして変換するということになります。なんだか人のお役に立ちそうにない文章になりましたが、今日はこの辺で。コンピュータ碁1日遅れですが、一人アドベントカレンダーを始めます。(ご協力いただける方、お声がけください)題して「囲碁AIアプリの作り方」です。念のため、「囲碁AIの作り方」ではありません。囲碁AI自体を作りたい方はAlphaGo論文などを読んで頑張ってください。言っても、アプリのコアになるのは囲碁AIです。初日の今日は、お手製AI、「AZ.js」のご紹介です。以下のURLからAZ.jsで遊んでみてください。OpenGoと同じニューラルネットワークを搭載しています。OpenGoと同じ強さを発揮するはずです。(その時間が問題なのですが)探索アルゴリズムはPyaqをJavaScriptに移植したものです。AZ.jsのコードは以下で見ることが出来ます。github.com中身はほぼPyaqですが、多少コードを整理してドキュメンテーションも充実させてあります。Pyaqは自己対戦から学習するところまで含めてコードが用意されていますが、AZ.jsはエンジンのみです。ニューラルネットワークの学習部分にも取り組みたければPyaq、エンジンだけみたいという人はAZ.jsという感じでおすすめします。拙作「囲碁の師匠」のAIエンジンもこのAZ.jsをSwiftに移植することから開発を始めました。Zero論文の素直な実装です。シングルスレッド版なので、マルチスレッドにするにはスレッドの言語的な部分とともにアルゴリズム上バーチャルロスを導入する必要が出てきます。同じアルゴリズムで並列に走らせると、スレッドが同じノードを探索してしまうのでそれを避ける工夫がバーチャルロスです。探索中の枝は仮にちょっと分が悪い枝に見せることで他のスレッドに別の枝を探索させます。他にもAlphaGoの論文では明らかにされていない部分がいくつかあって、そういう部分を見つけて工夫してみるのも面白いと思います。Zero界隈でFPUと呼ばれる部分に独自の工夫を入れました。MCTSを使ったアルゴリズムは元局面がバリュー以上に悪くて一手進めると評価を落とすような局面に出会うと、候補手すべてを探索し始めます。Lizzieをお使いの方は、画面全体が勝率表示で埋まる現象を見たことがあるかと思います。思ったよりよくないからと言って、生きている石の内側まで探索するのもなんなんで、そういう現象を抑えるようなFPUを実装しました。意図した局面でも探索の効率を上げることが出来たので「強くなった」と思うのですが、こういう局面の効率を上げても仕方がないようで、勝率はあまり変わらないようです^^;囲碁AIを動かしたい環境(例えばAndoroidとか)がある方は、まずAZ.jsをその環境に適した言語(AndroidならKotlinとか)に移植してみるといかもしれません。Gatewayのタイムアウトである29秒以内に完了しなかったです。Lambdaはメモリを増やすとCPUパワーも増える仕様なので、256MBに増やしたところ、estimateできました。メモリ最大の3GB設定で使うといいと思います。Lambdaを使ってみました。Lambdaはサーバーレスアーキテクチャのサービスで、課金が処理の時間だけにかかるサービスです。自動でスケールするらしいので、頻度はそれほどでもなく、ただ処理に比較的時間がかかるようなサービスを提供したい時に最適です。モバイルの囲碁アプリに整地機能を入れるとき、GnuGoをアプリに載せるのは大変なので、ウェブAPIとして実装している方多いのではないでしょうか?GnuGoは正確に整地しようとすると結構計算に時間がかかります。使われる機能ではない反面たまたま同時にリクエストを受ける可能性も十分あり、必要な際には複数インスタンスが起動してなおかつ処理時間だけ課金されるサーバーレスサービスがうってつけになります。無料枠があるので、趣味でアプリを作っている方も気楽に使えます。1局面30秒使うとして、メモリ3GBなら4,444リクエストが無料です。前置きはこのぐらいにして、以下が作ったパッケージです。Lambda上で動くGnuGoが同梱されています。APIを提供するサービスです。APIに、以下のようなJSONをpostしてください。"..."}というJSONが返されます。Z80アセンブラに触れる・PC98互換機にてTurbo-Cで数値計算。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。