TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

2019-01-01から1年間の記事一覧

AlphaStarの論文を読む その5(アーキテクチャ)

しばらく空きましたが、続きです。 アーキテクチャは長いので途中までです。 アーキテクチャ AlphaStarの方策は関数で、以前のすべての観測とアクションおよび𝑧(戦略統計を表す)を現在のステップの行動の確率分布にマッピングする 拡張データ表1 | エージ…

AlphaStarの論文を読む その4

続きです。前回までで論文の本文を紹介しました。 今回からMethodsを読んでいきます。本文と内容の重複もあります。 ほぼだらだらと訳しただけです。 ゲームとインターフェイス ゲーム環境 StarCraftは、SF世界で行われるリアルタイム戦略ゲーム 1998年にBli…

AlphaStarの論文を読む その3

続きです。本文の残りの部分です。 実験による評価 対戦条件 公式オンラインマッチメイキングシステムBattle.netの制限なし条件で評価した 3つのメインエージェントTerran、Protoss、Zergを評価 各エージェントは、訓練中に3つの異なるスナップショットで評…

AlphaStarの論文を読む その2

昨日の続きです。 人間のデータの重要性 StarCraftの主な課題の1つは、新しい戦略を発見すること 一度、地上ユニットの局所戦略を学んだ後、航空ユニットを単純に使用するとパフォーマンスが低下する 航空ユニットがその局所戦略を効果的に利用する、数千ス…

AlphaStarの論文を読む

Natureで発表されたAlphaStarの論文を読んでいきます。 無料で読めるPDFは、DeepMindのブログからダウンロードできます。PythonとTensorFlowによる疑似コードも公開されており、Supplementary Dataからダウンロードできます。Methodも含めると結構なボリュー…

cshogiをOpenAI Gymインターフェースに対応させてみた

強化学習の勉強をしていてアルゴリズムを実装して試してみたいが、CartPoleとか学習させても面白くないのでせっかくなので将棋で試せるようにしてみたくなった。ということで、cshogiをOpenAI Gymインターフェースに対応させてみた。 Gymインターフェース 公…

cshogiのバグ修正とdlshogi-zeroの更新

cshogiにいくつかバグがあったので修正した。 move16がデグレード やねうら王の教師局面に対応した際に、move16がデグレードしていた。 単純な編集ミスだったので修正した。 千日手が判定できないバグ board.is_draw()は、引数に遡る手数を受け取るが、デフ…

エントロピー正則化項の微分

以前に方策が決定論的にならないようにするために、損失にエントロピー正則化項を加えることを書いたが、誤差逆伝播する際の微分の式が誤っていたので訂正する。 方策がソフトマックス関数の場合のエントロピーの微分 エントロピーは以下の式で与えられる。 …

matplotlibでグラフをインタラクティブに変更して見やすくする

matplotlibで複数系列の時系列グラフなどを表示した場合、グラフの線が太く重なっている箇所の詳細が把握しにくい。 特にJupyter Notebookでブラウザで表示している場合は、コードで見栄えを調整する必要がある。Jupyter QtConsoleで、「%matplotlib qt」とI…

将棋AIの実験ノート:chain ruleで方策を定義する(続き)

(前回の続き)chain ruleで方策を定義したモデルと、現在のdlshogiの指し手を表現したモデルで、同じ局面を学習させて精度を比較した。elmoで生成した、1000万局面を訓練に、100万局面をテストに使用した。 chain rule 現在のdlshogiの指し手表現 test accu…

将棋AIの実験ノート:chain ruleで方策を定義する

現在dlshogiでは、方策ネットワークの出力は、移動先座標と移動方向(8方向+桂馬2方向+駒打ち7方向)の組み合わせで表現している。 これには、移動元を座標で表すと、分類するクラス数が多くなり精度に悪影響があるため、移動方向として表現することでクラ…

dlshogiのLinuxでのビルド/自己対局の実行方法

dlshogiのビルドや自己対局の実行方法について今まで文章化していなかったので、解説用のJupyter Notebookを作成した。 Google Colabで実行できる。colab.research.google.com dlshogiは学習に初期局面集や評価局面集を使っていたり、メモリを大量に消費する…

cshogiにやねうら王の教師局面の入出力機能追加

cshogiには、やねうら王の教師局面(PackedSfenValue)を読み込む機能を実装していたが、指し手を正しく扱えていなかった。 Twitterで報告いただいたので、対応を行った。教師データそのまま(バイナリ)とテキストに変換したもので局面の読み込みは100%で不一…

C#からLibTorchを使ってMNISTデータセットを学習する

C#からディープラーニングフレームワークを使用する方法について、以前にいくつかの方法を検討した。 gRPCでC#とPythonを連携する - TadaoYamaokaの開発日記 SocketでC#とPythonを連携する - TadaoYamaokaの開発日記 TensorFlowのC#バインディング - TadaoYa…

技術書典7

techbookfest.org本日開催される技術書典7で、「こ12D」で頒布される合同誌「強化学習トレンドまとめ」に寄稿を行いました。 私が寄稿したのは、AlphaStarについての簡単な記事です。私の記事よりも、他の方々の記事の方が見どころが多いです。 最新の強化学…

ML.NETからTensorFlowを使う

前回、C#からTensorFlowが使えるTensorFlow.NETというライブラリを試したが、まだ実装されていない機能があるので、他にTensorFlowをフルで使えるライブラリを探すことにした。TensorFlowSharpが十分な機能が実装されているので、.NET Coreへポーティングす…

TensorFlowのC#バインディング

TensorFlowのC#バインディングとして、検索するとTensorFlowSharpが見つかるが、更新が止まっているようで.NET Coreには対応していない(ビルドすれば可能そう)。 TensorFlow.NET 他のライブラリを探したところ、TensorFlow.NETというライブラリを見つけた…

将棋AIで学ぶディープラーニングのJupyter NotebookをColab上で実行できるようにアップデート

先日、【書籍】将棋AIで学ぶディープラーニングのJupyter Notebookを公開しましたが、Lesserkaiとの対局はローカルPCで将棋所を動かす必要があったため、試すハードルが少し高くなっていました。 そこで、先日USIエンジン同士の対局を実装したcshogiを使って…

ref localでC#のコードを高速化する

C#

.NET Frameworkと.NET CoreでDictionaryの性能が異なる。ランダムな整数をキーとして、AddとTryGetValueを5000000回行った結果10回の平均時間(ms)は以下の通りである。 バージョン Add TryGetValue .NET Framework 4.6 681.8 268.5 .NET Core 2.1 585.9 266.…

cshogiのビルド済みパッケージ

cshogi(Pythonの高速な将棋ライブラリ)をインストールするには、CythonとC++コンパイラが必要で、コンパイルに時間がかかっていた。 Google Colabでインストールを実行すると1分近く待つ場合があった。そこで、待ち時間をなくしてすぐに試せるように、ビル…

Google ColabでUSIエンジン同士の対局を行う

Pythonの高速な将棋ライブラリcshogiにUSIエンジン同士の対局機能を追加した。先日、cshogiにJupyter Notebook上で盤面をSVGで表示できるようにしたが、その機能を使って対局中の盤面を表示するようにしている。 これによって、Google Colab上で、USIエンジ…

Pythonのタプルのリストから列を抽出する

Pythonで、タプルのリストから列を抽出する3種類の方法を比較してみた。次のような要素が2つのタプルのリストからそれぞれの列を抽出する場合を考える。 抽出前 [('a', 1), ('b', 2), ('c', 3), ('d', 4)] 抽出後 (['a', 'b', 'c', 'd'], [1, 2, 3, 4]) 方法…

.NET Coreでログ出力する方法

「C# ログ出力」で検索するとlog4netの情報が見つかるが、.NET Coreのアプリの場合、設定ファイルのlog4net.configを読み込むことができなかった。 NLogを使うと、あっさり解決できたのでメモを残しておく。内容はほぼチュートリアル通り。 NLogをパッケージ…

Prioritized Experience Replayのsum-treeの実装

つくりながら学ぶ!深層強化学習のPrioritized Experience Replayの実装は、説明をシンプルにするためReplay Memoryを線形で探索する実装が紹介されていた。 つまり、各transitionのTD誤差を優先度として、0からReplay Memoryの優先度の合計の間で、ランダム…

Pythonで将棋の盤面をSVGで表示する

以前に作成したPython向けの高速な将棋ライブラリ「cshogi」に、盤面をSVGで表示する機能を追加した。Jupyter Notebookで実行すると、以下のように盤面が画像で表示されるので視認しやすくなる。 from cshogi import * board = Board() board 歩香桂銀金角飛…

Windows上でPyTorchを使って強化学習を試す

以前はOpenAI GymはWindowsに対応してなかったが、以下のようにpipからインストールするだけで動くようになっている。 atariも問題なく動く。 pip install gym pip install gym[atari]ただし、env.render()で描画するとウィンドウの位置変更などができないと…

将棋AIの進捗 その33(末端ノードでの詰み探索)

dlshogiでは末端ノードで短手数(7手)の詰み探索を実施しているが、終盤ではゲーム木中に詰みの局面が多くなり、王手の合法手も多くなるため、探索速度が大幅に低下することがあった。 先日、MCTSにAND/OR木を組み込む実装を行ったことで、MCTSで詰み探索を行…

迷路を方策勾配法で解く

最近買った「つくりながら学ぶ!深層強化学習」という強化学習の本で、迷路を方策勾配法で解くという内容が記載されていたが、数式展開がなく自分で式を導出するのに苦労したのでメモを残しておく。 この本の迷路の問題の内容は、Webにも掲載されている。 第…

SocketでC#とPythonを連携する

先日、gRPCでC#とPythonを連携する方法について書いたが、Pythonで受信したProtobufのデータを処理すると実行速度に問題があることがわかった。 速度が必要なケースでは、Protobufの使用はあきらめた方がよさそうだ。今回は、シンプルにSocket通信でデータを…

LinuxでC#からC++で作成した共有ライブラリを呼び出す

cmakeでC++の共有ライブラリプロジェクトを作成する CMakeLists.txt cmake_minimum_required(VERSION 3.8) project(SampleDll) enable_language(CXX) add_library(SampleDll SHARED sample_dll.cpp ) sample_dll.cppに、C++で処理を記述する。 Windowsでも使…