TadaoYamaokaの日記

山岡忠夫Homeで公開しているプログラムの開発ネタを中心に書いていきます。

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でも使…

WindowsでPyTorchをC++(Visual C++)で動かす

WindowsでPyTorchをC++のサンプル(MNIST)をVisual Studio 2017でビルドして動かす手順のメモです。 LibTorchのインストール https://pytorch.orgのQUICK START LOCALLYから、Stable/Windows/LibTorch/C++/10.0(CUDAのバージョンが10.0の場合)を選んでlibtorc…

将棋AIの進捗 その32(MCTSの探索にAND/OR木を導入する)

Leela Chess Zeroの状況を定期的にウォッチしないとなと思って、issueを眺めていたら"Exact-Win Strategy for Overcoming AlphaZero" #799という投稿がされていた。 Leela Zeroのissue#2276にも同様の投稿がある。 ざっくり説明すると、子ノードが勝ちの場合…

AlphaStarについて

次回の技術書典に、参加している強化学習の勉強会のメンバで合同誌として頒布を行うべく執筆を行っている。 自分は、ネタとしてAlphaStarについて選んだのだが、書く内容がまとまらないのでブログにもアウトプットすることにする。 AlphaStartについて Googl…

Visual Studioを使わずにNuGetのパッケージを検索する

Microsoft系のプログラミング言語では、NuGetを使用するとパッケージインストールが楽にできる。 しかし、NuGetは基本的にVisual Studioから使うことが前提になっている。 .NET Coreは、Visual Studioを前提としていないため、Visual Studio使わずにNuGetの…

gRPCでC#とPythonを連携する

C#のプログラムから機械学習などの処理をPythonで実装したい場合がある。 C#とPythonの連携方法について調べたところいくつか方法があったが、gRPCが良さそうだったので試してみた。 調べた方法 Python for .NET C#とPythonを直接連携させるには、「Python f…

Visual Studio 2017に.NET Core 2.1を追加する

ほぼ自分用のメモです。Visual Studio 2017がサポートしている.NET Coreのバージョンは2.1.508だが、先により新しいバージョン2.1.801をインストールしていたため、アンインストールしてから、Visual Studio Installerから「.NET Core クロスプラットフォー…

BERTで日本語の単語埋め込みを試す

京都大学が公開している日本語のWikipediaから学習したBERTのモデルを使って、単語の埋め込みを試した。Googleが公開しているBERTのextract_features.pyを使って、Juman++v2を使って文を分かち書きして入力すると、文中の単語の埋め込みベクトルが得られる。…

Juman++v2をWindowsでビルドする

BERTの日本語Pretrainedモデルを試してみたくなったので、その準備として、Juman++v2のWindowsでのビルドを行った。 ほぼ公式通りなので、あまり記事にする意味はないが手順をメモしておく。Juman++v1はWindowsに対応していなかったが、v2は公式でWindowsに…

将棋AIの進捗 その31(cuDNNによるSENetの推論処理の実装)

dlshogiの10ブロックのWideResnetの自己対局による強化学習を続けていましたが、230サイクルほどでほぼ頭打ちになりました。訓練損失は下がり続けていますが、floodgateの棋譜に対する損失が上昇傾向になっており、技巧2のとの勝利も上がらないため、このモ…

【書籍】将棋AIで学ぶディープラーニングのJupyter Notebookを公開

【書籍】将棋AIで学ぶディープラーニングのJupyter NotebookをGoogle Colabで公開しました。 train_mnist.ipynb(第6章) python-dlshogi.ipynb(第7~12章) Google Colab上で学習を実行して、ssh経由で将棋所から実行できます。ssh経由で実行する方法は、Noteb…

Google Colabに鍵ペアを使用してsshでログインする

Google Colabは、基本的にJupyter Notebookから使用します。しかし、ngrokというサービスを使用することで、sshで接続する方法が知られています。 How can I ssh to google colaboratory VM? - Stack Overflow上記サイトの方法では、sshでログインする際にパ…

学習中と並列で自己対局

先日の日記で、学習中にも自己対局を行うようにしたことを書いたが、現在dlshogiでは自己対局で生成した局面は過去10サイクル分をすべて学習に使うようにしている。 (AlphaZeroのようにサンプリングしないですべての局面を使うのは、Actor-Criticで敗着とな…

WindowsでプロセスにSIGINTを送る

将棋AIの自己対局のプログラムで途中で中断(Ctrl+C)した場合に、それまでに生成した局面を安全にファイルに書き出すためにSIGINTをハンドリングしている。 ただし、今までは、基本的に途中で中断しないで、生成する局面の数を引数として、自己対局完了→学習…

VSCodeでMarkdownの編集

今までMarkdownをテキストエディタで手書きしていましたが、Visual Studio Codeは標準でMarkdownのプレビューに対応しているので、Markdownのエディタとして使い始めた。 拡張機能をインストールすると表のフォーマットも自動で行ってくれる。「Markdown Ext…

【Android開発】実行時のパーミッションリクエスト

先日バージョンアップしたボーカル音程モニターで、起動できないというレビュー(評価★1)が多く付いたので、一旦リバートしました。 段階的な公開で10%にしていたので影響は抑えられましたが、テスト不足と反省しています。手元のテスト機では動作しており…

WSLでOpenAI Gymを動かしてVSCodeでデバッグする

OpenAI Gymのサンプルコードを調べたくてWSLで環境構築した際のメモです。OpenAI GymはWindowsには対応していないため、Windowsで動かすにはWSL上のLinuxで動かす必要があります。 また、PythonコードをGUIでデバッグしたい場合、Visual Studio Codeでデバッ…

将棋AIの進捗 その30(NNキャッシュ)

先日、Leela Chess Zeroのソースを流用して、LRUキャッシュを実装したが、これを自己対局プログラムに組み込んだ。はじめ、LRUキャッシュを1つにしてすべての探索スレッドで共有するようにしたが、ゲーム木の展開済みノードのNN計算結果が、他のスレッドの探…

NNの計算結果をキャッシュする

自己対局でノードの再利用しないようにしたが、NNの計算結果は再利用した方が効率がよいため、キャッシュの仕組みを導入したい。並列で実行しているゲームすべてについて1ゲーム分のNNの結果を保持するにはメモリ容量が不足するため、使用されなくなった局面…

将棋AIの実験ノート(入力特徴量の数値の表現方法)

AlphaZeroでは入力特徴量として持ち駒の枚数、手数をそのまま数値として与えている。一方、Alpha Goでは、呼吸点などの数は、ont-hotエンコーディングして与えている。 例)上限が3で2の場合、010。dlshogiでは、持ち駒の枚数、利きの数を、数値の分だけ1に…

将棋AIの実験ノート(自己対局時のノード再利用)

以前に自己対局時にノードを再利用することで一時的に精度が上がったが、その後学習を続けるとpolicyのテスト損失が上昇する現象が起きた。ノード再利用とバッチサイズの変更(1024→2048)を同時に行ったので、どちらが原因で発生したのかわからなかったため、…

将棋AIの実験ノート(初期値とシャッフルの影響)

各種条件を変更して比較実験を行っているが、初期値とシャッフルにランダム性があるので、測定結果は毎回ばらつきがある。 ランダムシードを固定すると結果が同じになるが、そのシード値での比較にしかならないので、固定しないで測定している。 複数回測定…

Jupyter Qt ConsoleでPandasを見やすくする

個人的な備忘録です。Pythonを対話的に使う際、Jupyter Qt Consoleを主に使っている。 デフォルトだとウィンドウサイズの幅が81文字分しかないため、Pandasでhead()やdescribe()をすると、途中で改行されて見づらい。 Jupyter Qt Consoleのウィンドウの幅を…

将棋AIの実験ノート(重みの初期値)

dlshogiでは、ニューラネットワークの重みの初期化はChainerのデフォルト(LeCunNormal)を使用している。 モデルをSEResnetに変える予定なので、どの初期化が良いか実験してみた。すべてデフォルトの場合と、活性化関数がReLUの場合はHeNormalが良いとされて…

将棋AIの実験ノート(入力特徴に手番は必要か)

dlshogiでは入力特徴に手番を加えていない。 将棋では先手と後手で同一局面の価値は変わらないためだ。 ある局面が与えられば、先手か後手かによらず最善手は同じはずである。一方、AlphaZeroでは、手番が入力特徴に加えられている。 局面を180度回転せずに…