サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
掃除・片付け
tadaoyamaoka.hatenablog.com
接待水匠にインスパイアされて接待dlshogiを作ってみた。 何番煎じだというネタですが、接待将棋プログラムが一応動くようになりました!https://t.co/BLvfTF2rOe MultiPVで思考し、手番から見た評価値が100以上の指し手のうち、最も100に近いものを選択する単純な仕組み。 皆様とも指したいですね…誰か犠牲者、もとい対局相手になっていただけませんか!— たややん@水匠(将棋AI) (@tayayan_ts) 2021年10月2日 仕組み MultiPVを使うのではなく、モンテカルロ木探索(PUCT)で、勝率の期待値が接待係数に近づくように探索を行う。 接待係数(USIオプションSettai)は、1から99の整数で、50の場合に互角になるように指して、0に近いと負けるように指す。100に近いと最善手に近づく。 利点 MultiPVは探索した中で上位の手から選ぶが、この
ほぼ個人用メモです。 コンピュータ囲碁やコンピュータチェスの開発者のやり取りは、Discordのチャンネルで行われていて有用な情報が多い。 Computer Go Community Leela Chess Zero 今までWidnowsやスマホのDiscordのアプリで眺めていたが、英語だと読む速度が遅くてつらい。 (最近は英語のサイトはほとんどChromeの翻訳で読んでいるので、ますます英語を読む速度が遅くなっている。) ブラウザ版のDiscordならChromeの翻訳で、訳して読めるのではと思って試してみた。 Discordを翻訳する方法 PCのChromeからだと、ブラウザで開くことができる(スマホだとできない)。 ブラウザで見ることはできるのだが、右クリックができないため、Chromeの翻訳機能を呼び出すことができない。 そこで、 Google Chrome™の右クリックを有効に
dlshogi(第2回世界将棋AI電竜戦エキシビジョンバージョン)のWindows版ビルド済みファイルを公開します。 ダウンロード Release 第2回世界将棋AI電竜戦エキシビジョンバージョン · TadaoYamaoka/DeepLearningShogi · GitHub のAssetsからダウンロードしてください。 モデルファイル モデルファイルは別のzipファイル(model-dr2_exhi.zip)になっています。 ダウンロード前に、下記のライセンスを参照してください。 ダウンロードしたモデルファイルを使用するにはエンジン設定で、モデルファイルのパスの設定が必要です。 DNN_Modelに解凍したモデルファイル(model-dr2_exhi.onnx)のパスを設定してください。 モデルファイルのニューラルネットワークは15ブロックのResNetになっているため、以前のバージ
明日8/15(日) 17:00から、私の開発した「dlshogi」と電竜戦TSEC優勝ソフト「水匠」との長時間マッチを行います。 対局の様子は、YouTubeとニコニコ動画で生配信されます。 先手、後手入れ替えて計2局行います。 第1局は、阿部健治郎七段と佐々木勇気七段のダブル解説、そしてゲスト解説に渡辺明名人をお呼びしています。 予告動画 電竜戦長時間マッチ「水匠 vs dlshogi」第1局 youtu.be 電竜戦長時間マッチ「水匠 vs dlshogi」第2局 youtu.be ニコニコ生放送 live.nicovideo.jp ソフトの特徴 従来型将棋AI 「水匠」は、第2回電竜戦TSECで優勝した現在最強の将棋AIです。 探索部 やねうら王ライブラリを使用しており、探索はαβ法を基本として、チェスのStockfishを参考に開発されています。 αβ法ベースの探索は、非常に長い歴
開発しているPythonの高速な将棋ライブラリcshogiに、ブラウザでUSIエンジン同士の対局が行える機能を追加した。 python -m cshogi.web.app --engine1 E:\game\shogi\gikou2_win\gikou.exe --engine2 E:\game\shogi\apery_wcsc28\bin\apery_wcsc28_bmi2.exe --byoyomi 1000 --port 8000のように実行して、ブラウザから「http://localhost:8000/」にアクセスして、USIエンジン同士の対局を観戦することができる。 これだけだと、将棋所のような便利なネイティブアプリがあるのでわざわざこの機能を使う必要はないが、Google Colab上で実行することができる。 Google Colabで実行 USIエンジン同士の対局 # csh
Discordで、評価値と勝率を変換する際の以下のシグモイド関数の係数aは、dlshogiはelmo_for_learnの自己対局から求めた756.0864962951762という値を使用しているが、floodgateの棋譜などを学習する場合はもっと低い値になるので補正すべきというやり取りがあった。 floodgateの棋譜から調査 R3800以上の棋譜 実際にどれくらいの値なのか2019年~2020年のR3800以上のfloodgateの棋譜から調べてみたところ、 a = 236.94908509 という結果であった。 R2000以上の棋譜 R2000以上とすると、 a = 398.66185164 という結果であった。 調査に使用したスクリプト:csa_score_value_fit.py · GitHub Discordでのやり取りの通り、係数aは小さい値になった。 また、レーティン
ここ数週間、探索部の細かい改良をしては測定していた。 小さなレーティング差を計測するには多くの対局数が必要になるので、一つの改良の確認に時間がかかるのがつらいところである。 1手1秒と1手3秒で結果が異なることもあるため、長時間思考で強くしたいため1手3秒での測定を基本にしている。 測定は、変更前後の自己対局と、水匠2 2スレッド1000万ノードとの対局(dlshogiは1GPU3スレッド)で確認している。 水匠2との対局は、対局数が少ないと誤差が大きくでるので、500対局以上でないと信用できない。 以下に、行った変更と測定結果をまとめておく。 1.ノード管理の変更 以前に、メモリ節約のために子ノードへのポインタと統計情報を、ノードに訪問するまで初期化しない対応を行ったが、弱くなったため不採用とした。 これを、子ノードへのポインタのみ親ノードで配列で管理し初期化のタイミングを遅らせて、統計
本日開催されたコンピュータ将棋の大会「電竜戦」で、チームdlshogiのGCTが決勝リーグで優勝しました! コンピュータ将棋の大会でディープラーニングを使用したソフトが優勝するのは初です。 2017年からdlshogiの開発を始めてやっと優勝までたどり着きました。 GCTについて 元々GCTは、加納さんがdlshogiを使用して開発したソフトです。 探索部分はdlshogiで、モデルの学習に使うデータをdlshogiとは別のもので行っています。 今大会では、私とチームで参加して、dlshogiの強化学習のデータや、学習方法、定跡作成方法など共有して、加納さんが主体でモデルの学習・定跡作成をしています。 今回の成果は、私のdlshogi単体では成し遂げたられなかったので、GCTが優勝してくれたことに感謝しています。 チームの経緯 加納さんとは将棋AI開発前からの知り合いで、以前から気楽に情報
前回考察した将棋AIへのMulti-Head Self-Attentionの適用を試してみた。 実装を簡単するために、dlshogiで使用している入力特徴量と出力をそのまま使用した。 入力特徴量 各駒の配置 持ち駒の枚数 駒の種類ごとの利き マスごとの効き数 ※王手の特徴量は除いた これらを、位置ごとの特徴としてMulti-Head Self-Attentionに入力する。 位置は、盤上の81マスと、持ち駒の種類と枚数ごと×2(先後)として、各位置を自然言語処理の各単語のようにして扱う。 各位置には、その位置での上記の特徴量を表すベクトルを入力する。 14の駒の種類は先後で分けて、効きも先後に分けた駒ごと、効き数は3つまで、合計62次元となる。 ヘッド数で割り切れる必要があるため、パディングして64次元とする。 例えば、以下の局面の、 5五の位置の特徴ベクトルは、 となる。 持ち駒の位置は
dlshogiはCUDAに対応したNvidiaのGPUが必須になっているが、AMDのGPUやCPUのみでも動かせるようにしたいと思っている。 Microsoftがオープンソースで公開しているONNX Runtimeを使うと、様々なデバイスでONNXモデルの推論を行うことができる。 TensorRT対応で、ONNXのモデルを読み込めるようになったので、ONNX Runtimeに対応すれば同じモデルを使いまわせる。 ONNX Runtimeは、PythonやC#など複数の言語のインターフェースが提供されている。 dlshogiに組み込むにはC++のインターフェースが必要だが、C++も提供されている。 推論に使うデバイスは、CPUやCUDA、TensorRT、DirectX、MKL-DNNなど複数のデバイスを切り替えられるようになっている。 DirectXに対応すれば、AMDのGPUでも高速に推
TensorRTがdlshogiのDNNの推論においても効果があることがわかったので、TensorRTをdlshogiに組み込んだ。 Tensorコアを搭載したGPUでは、以前のcuDNN版に比べて推論が大幅に高速化される。 実装 ONNXから読み込んだネットワークのビルドには数十秒近く時間がかかるため、ONNXファイルと同じディレクトリに、ビルド済みのネットワークをシリアライズしキャッシュすることにした。 GPUごとバッチサイズごとに最適化が行われるため、拡張子に、「.<バッチサイズ>.serialized」を付与して保存を行う。 次回以降は、キャッシュしたファイルがある場合は、キャッシュを使用することで高速に起動できる。 NPS測定 floodgateの棋譜からサンプリングした100局面で探索を行い、NPSを測定した。 cuDNN(FP16)版と比較した結果は以下の通り。 局面によって
dlshogiの今の10ブロックの192フィルタのモデルは、2018年6月から学習を開始して、何度かモデルの精度が飽和して強くならなくなったが、そのたびに新しい手動を導入して現在まで継続して強くできている。 201サイクル目からはリーグ戦を導入して、218サイクル目からはQの初期値を変更したことで、精度が大幅に向上した。 レート3500以上のfloodgateの棋譜との一致率と、USIエンジン(elmo(WCSC28))との勝率は以下のようになっている。 floodgateの棋譜との一致率 USIエンジンとの勝率 USIエンジンとの勝率は、250サイクルまでは1手500msで対局していたが、勝率が56%くらいで停滞していたので、251サイクルから1手600ms、255サイクルから800msに変更している。 それ以降は、valueの一致率が下がり続けている。 Apery(WCSC28)との1
MuZeroの論文を読んでいきます。 基本的にだらだら訳していくだけです。 途中で感想を書いていきます。 概要 プランニング能力を備えたエージェントを構築することは、人工知能の追求における主な課題の1つである。 ツリーベースのプランニング方法は、完全なシミュレーターが利用できるチェスや囲碁などの挑戦的なドメインで大成功を収めている。 ただし、実際の問題では、環境を支配するダイナミクスはしばしば複雑で未知である。 この研究では、ツリーベースの探索と学習モデルを組み合わせることにより、基礎となるダイナミクスの知識がなくても、挑戦的で視覚的に複雑な領域で超人的なパフォーマンスを実現するMuZeroアルゴリズムを紹介する。 MuZeroは、反復的に適用されたときに、プランニングに最も直接関係する量(報酬、行動選択方策、および価値関数)を予測するモデルを学習する。 モデルベースのプランニングアプロー
Natureで発表されたAlphaStarの論文を読んでいきます。 無料で読めるPDFは、DeepMindのブログからダウンロードできます。 PythonとTensorFlowによる疑似コードも公開されており、Supplementary Dataからダウンロードできます。 Methodも含めると結構なボリュームがあるので、少しずつ記事にしていこうと思います。 理解できていない部分もあるので、勉強もかねて調べながら書いていきます。 ところどころ感想を挟んでいきます。 たぶん、まとまりのない内容になると思います。 概要 多くの実際のアプリケーションでは、複雑な環境でのエージェントが必要 StarCraftは、複雑さとマルチエージェントの課題という点で実世界との関連性があり、人工知能の重要な研究課題となる 以前の研究では、ゲームを単純化したり、手作りのサブシステムにしたりしてAIに有利であったに
以前に作成したPython向けの高速な将棋ライブラリ「cshogi」に、盤面をSVGで表示する機能を追加した。 Jupyter Notebookで実行すると、以下のように盤面が画像で表示されるので視認しやすくなる。 from cshogi import * board = Board() board 歩香桂銀金角飛王と成香成桂成銀馬龍歩香桂銀金角飛王と成香成桂成銀馬龍987654321一二三四五六七八九手先☗手後☖ 直前の指し手も表示できる。 move = board.push_usi(b'7g7f') board.to_svg(move) 歩香桂銀金角飛王と成香成桂成銀馬龍歩香桂銀金角飛王と成香成桂成銀馬龍987654321一二三四五六七八九手先☗手後☖ 持ち駒がある場合は以下のように表示される。 board.set_sfen(b'8l/1+B+P1G4/1K+B1+P1+Pp1/4Pp
技術書典6の本を執筆しながらAlphaZero Shogiを実装したPythonプログラムの修正も行っている。 プログラムの方はほぼ完成しているが、自己対局を数時間実行すると途中で評価済みのはずのノードが未評価になっているため例外になる問題が発生している。 原因を探すために、デバッガで動かしたいが、再現性が低いため、デバッガだと実行速度が1/10くらいになるため長時間実行しても再現しない。 Pythonで再現性の低いコードのデバッグ C++のプログラムであれば、例外発生時点でデバッガをアタッチできるが、Pythonの場合後からPythonデバッガをアタッチできない。 調べたところ、Pythonでは以下のような方法で、途中からデバッガを起動できることがわかった。 import pdb; pdb.set_trace() ※公式マニュアルに書かれていた。 例外が起きる位置で、発生条件をif文でチ
AlphaZero方式の強化学習では、指し手の確率分布を教師データとするため、局面の合法手の数の分だけ確率の値を保存しておく必要がある。 将棋の合法手の最大数は593であることが証明されているが、実際の対局ではそのような局面は現れない。 教師データを保存する容量を抑えるために、できれば実際に現れる局面の最大数に制限したい。 可変長フォーマットにするという案もあるが、機械学習でシャッフルやランダムサンプリングするため、固定長フォーマットにしておきたい。 そこで、実際の棋譜で合法手の数の統計量を調べてみた。 調査方法 以下のようなスクリプトでmatplotlibでヒストグラム表示と、Pandasで統計量を出力した。CSAファイルの解析にはcshogiを利用した。 import numpy as np import matplotlib.pyplot as plt import pandas a
python-shogiは、Pythonで扱える非常に役立つ将棋ライブラリですが、速度が遅いのが用途によっては欠点になります。 公式サイトにも記述されていますが、速度よりもシンプルに抽象的に扱えることが目的となっています。 しかし、機械学習の用途に使用しようとする速度の遅さがネックになります。 そこでPythonからもできるだけ高速に動作する将棋ライブラリを作成することにしました。 python-shogiの内部では、盤面はビットボードで表現されていますが、Pythonのビット演算は非常に遅くボトルネックとなっています。 ビット演算部分をC++で開発して、Pythonから呼び出せるようにすることで速度の改善が見込まれます。 C++で将棋ライブラリを一から作成するのもロマンがありますが、ほとんど既存のライブラリをまねるだけになるため、C++部分にAperyのソースコードを使用させてもらい、A
Science誌に掲載された論文は、新しい対局条件での結果と棋譜の公開がメインで技術的な内容は、昨年のarXivで公開された論文とほとんど差分はありませんでした。 DeepMindのページのリンクからダウンロードできるOpen Access versionのMethodsでは、技術的な内容が追加されており、興味深い内容も記載されていました。 Prior Work on Computer Chess and Shogi TD Gammonwasについて追加されています。 Domain Knowledge 引き分けの条件がチェスと将棋では512手、囲碁では722手であることが追加されています。 定跡と終盤データベースを使用していないことが追加されています。 Search MCTSのアルゴリズムの説明が追加されています。 以前のAlphaGoからPUCTの定数が変更されており、親ノードの訪問回数
入力層、隠れ層、出力層で構成される単純なニューラルネットワークで、 誤差逆伝播を計算します。 隠れ層の活性化関数はsigmoid、 出力層の活性化関数はsoftmaxとします。 誤差関数(損失関数)は、交差エントロピーを使用します。 それぞれの式は以下の通りです。 sigmoid: softmax: softmaxの交差エントロピー: ここで、は各層の入力ベクトル、は教師データのベクトル、は出力層の出力ベクトルとします。 ネットワークのパラメータの行列は、 1層目を、 2層目をで表します。 行列の成分の添え字は、jが出力側のベクトル成分、iが入力側のベクトル成分を表します。 上付きの数字nは、何番目の層かを表します。 順伝播 順伝播は、入力から出力を以下の式で計算します。 出力は、出力層の活性化関数にsoftmaxを使用しているので、ベクトルの各成分がクラスを表し、値がそのクラスに属する確
4/22(日)に秋葉原で開催される技術書典4で、「ディープラーニングを使った将棋AIの作り方2~大規模学習、高速化編~」という本を出します。 場所は「き15」になります。 書籍「将棋AIで学ぶディープラーニング」の第13章の補足的な内容です。 頒布は紙の本のみです。 マイナビ出版様(い08)のところで書籍の割引販売もされるようですので、よろしければそちらもお願いいたします。
将棋AIをAWSで動かそうとLinux対応しましたが、Linuxでマルチスレッドの性能がでないため、いろいろ実験してみました。 検証している将棋AIではGPUの計算が終わったら、待機中の複数の探索スレッドに通知する処理を行っています。 それを、以下のような処理で実装していましたが、Linux(Ubuntu 16.04)ではWindowsの1/10以下の探索速度になってしまいます。 探索スレッド側 while (uct_node[child_index].evaled == 0) this_thread::sleep_for(chrono::milliseconds(0)); GPUスレッド側 uct_node[index].evaled = 1; 探索スレッド数は255です。evaled はatomicです。 探索速度(シミュレーション/秒)の比較は、以下の通りです。 Windows 63
AWSのp3.8xlargeインスタンスを試験的に借りてGPUを増やした場合の性能を測定しました。 Linuxだとマルチスレッドの性能がでないので、OSはWindowsです。 p3.8xlargeのマシンスペックは以下の通りです。 Tesla V100 GPUs 4 vCPUs 32 Main Memory 244GiB 各GPUに割り当てる探索スレッド255として、GPUを増やしながら平手初期局面での探索速度(シミュレーション/秒)を測定しました。 GPU枚数 探索速度(シミュレーション/秒) 1 6344 2 7545 3 7757 4 8168 GPUを増やすほど、探索速度が上がっていますが線形には伸びていません。 スレッド数 GPU4枚で、GPUあたりの探索スレッドを変えて測定しました。 スレッド数 探索速度(シミュレーション/秒) 255 8168 192 8790 168 89
自己対局による強化学習の検証をはじめた。 強化学習の手法は、以前の日記で書いた通りで、Alpha Zeroの手法を参考にして、1手800シミュレーションで自己対局を行う。 自己対局→学習のサイクルを繰り返してモデルを成長させる。 1回のサイクルで、どれだけの自己対局を行うかは、AlphaZeroの論文には記載がないが、AlphaGo Zeroの論文には、 In each iteration, αθ* plays 25,000 games of self-play, using 1,600 simulations of MCTS to select each move. と記載されている。 平均手数は200手とすると、1回のサイクルで500万局面を生成している。 ただし、モデルの学習は、 Each mini-batch of data is sampled uniformly at rand
「将棋AIで学ぶディープラーニング」という本を出版します。 昨年10月に技術書典3で「ディープラーニングを使った将棋AIの作り方」という技術系同人誌を出したことをきっかけに書籍化のお話をいただきました。 技術書典で出した本は、方策ネットワークを使った将棋AIの作り方でしたが、書籍の方では、将棋AIの作成を通してディープラーニングを学べるというコンセプトで執筆しています。 実際に動かせるコードを作ってみるというのが技術を学ぶために有効な方法だと思います。 私自身、AlphaGoのクローンと、ディープラーニングを使った将棋AIを作ったことでディープラーニングについて理解を深めることができたと思っています。 ディープラーニングを使って学習させた将棋AIを実際に動かしてみることで、ディープラーニングを体験して欲しいという想いで書きました。 内容は、3部構成で、 1部ではコンピュータ将棋の概要につい
DeepMindからarXivに投稿された論文「Learning to Search with MCTSnets」についてです。 Redditの投稿が簡潔に要約しています。 Learning to Search with MCTSnets : cbaduk AlphaGo ZeroのPUCTアルゴリズムは、PolicyとValueと訪問回数を使って、固定の計算式で算出した値から手を選択していますが、埋め込み、シミュレーション、バックアップ、および読み出しという4つのニューラルネットワークを使用してアクションを選択します。 埋め込みネットワークは、状態sからノードの訪問回数の統計情報を埋め込みベクトルとして出力します。埋め込みベクトルとは、ある次元で構成される情報の各次元の成分を異なる次元のベクトルとして分散表現したものです。(Word2Vecで単語の埋め込みベクトルとか行うやつです。) シ
TensorFlowは公式でWindowsに対応しているが、C++のAPIはLinuxとMacでしかサポートされていない。 https://www.tensorflow.org/install/install_c dllをダウンロードして、defを作成してリンクする方法もあるようだが、CPUでしか使えない。 visual studioでtensorflow - Qiita WindowsでGPUを有効にしてC++からTensorFlowを使うには、自分でビルドする必要がある。 ビルドは以前の日記に書いたCMakeを使う方法でできる。 最新版に対応した手順は、ここを参照する。 https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/cmake/README.md 以下に手順を示す。 関連ツール・ライブラリ
STLのvectorのemplace_backを使うと要素の追加時にコンストラクタで初期化できる。 しかし、コンストラクタとデストラクタで副作用のある処理をしている場合、注意が必要だ。 以下のようなコードはうまく動作しない。 #include <iostream> #include <vector> using namespace std; class A { public: A(const size_t size_) : size(size_), a(new int[size_]) { cout << "create " << size << endl; } ~A() { cout << "delete " << size << endl; delete[] a; } private: size_t size; int* a; }; int main() { vector<A> vec;
電王トーナメントのときに将棋所のログ出力が同期処理で非常に遅いこと知らずに時間切れ負けを起こしてしまった。 その後、速度優先でログ出力を行わないように修正したが、ログ出力がないと探索の状況がわからず不便である。 そこでログをファイルに出力するようにして、「tail -f」などで監視できるようにしたい。 マルチレッドで同期してログ出力すると速度低下していまうため、速度低下しないようにしたい。 自分で作るのも大変なのでオープンソースのライブラリがあれば、それを利用したい。 以前にGoogleのglogを試したことがあるがビルドが大変だったので、ヘッダーのみのライブラリがよい。 また、WindowsでもLinuxでも使用できるものがよい。 要件を満たすライブラリがないか調べたところ、spdlogというライブラリを見つけた。 spdlog/include/spdlog at master · ga
次のページ
このページを最初にブックマークしてみませんか?
『TadaoYamaokaの開発日記』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く