プロ級とは

昨日は職場の学園祭でゲームAIの展示をしておりました。

華やかな活動が多く我々のような展示は流し見程度かと思っていたのですが立ち寄られた方は思いの外しっかりと説明を聞いていただいていました。

 

過去の戦績なども披露してあったのですが,早口で説明しているとちょっと出木杉感があって笑ってしまう人が出ます。

予選順位(個人メモ) - 48's diary

 

ところで,最近以下のようなものが公開されたようです。これが今日の本題です。

Adversarial Policies in Go - Game Viewer

 

本文はあまり見ていないのですが冒頭でKataGoが探索無しでa top-100 European Go playerの強さであるとか,64visitsでthe best human Go playersの強さであるとか書かれています。

囲碁の欧州トップ100選手ですかよく分かりません。将棋だと3段4段クラスが欧州選手権に出られていたのでその辺りかなぁと推察します。(間違ってたら教えて下さい)

囲碁の人類トップはAlphaZeroなどで概ね有名になりましたよね。将棋は恐らく今は藤井さんでしょう。

 

で,先日たまたま二番絞りの探索無しってのを試して,一応高段者クラスの強さがありそうと確認しておりました。じゃあってことで,64visitsを計測しました。

Player Statistics

 

floodgateで2800強と言ったところ。

これ実は結構つらいのが上下にある100万局面制限のエンジンです。64局面制限では探索が桁違いに少ないので最終盤の詰めろや詰みの精度が相当異なります。

 

え~っとほぼ人類トップ級でいいんじゃないかと思っています。以前,プロ棋士の千田七段がfloodgateで2800くらいを記録したことがあると仰っていたので間違いないでしょう。プロ棋士だと一手指す間に脳内に何局面くらいイメージするものなのでしょうか?64局面より多いでしょうか少ないでしょうか?

ちなみに私は調子のよい局面で5手先7手先程度ですので分岐入れて十数局面でしょうか。(話題がそれますが昨晩丼王戦というものがありました)

www.youtube.com

 

ちなみに上記論文の主旨は完全に固定化された指し手に対して嵌め殺しを行うものです。そういえば私も2017年の最初に電王トーナメントに参加した際に技巧2相手にそういう定跡生成を行っておりました。勝率ですか?当時で先手番100%後手番96%(但し無敗)くらいです。

上記論文では対人では役に立たないと結論付けされていますが,私の定跡は電王トーナメント本番でもその後の世界選手権でも十分役に立ちました。敵対相手の探索アルゴリズムに依るところが大きそうです。

 

久しぶりに対面で説明をすると色々と思い出すものです。

---

追記:

 

Lishogiやってみました

一時期話題だったLishogiをはじめてみました。

lishogi.org • Free Online Shogi

 

個人的な棋力はヘロヘロなので基本観る将ですが、実はAI開発者なのでBotが戦います。

Bot登録にはLichess由来のツールがあるので簡単。

GitHub - TheYoBots/Lishogi-Bot: A bridge between Lishogi API and Lishogi USI Bots

 

のはずだったのですが、エンジンパスが働いていないようでツールのディレクトリにエンジン全部コピーして放り込むと動きました。

 

登録したのは二番絞りのポリシー指し(乱数多め)です。

floodgateでレート2100程度ですので生身の人間でも高段者なら勝てるはずです(適当)

softmaxの温度について - 48's diary

 

一手も探索しないエンジンの対人対戦は恐らく前例がないと思います。

通信遅延含めても1秒未満で返ってきます。

しばらく放置予定なので遊んでみてください。

Wi-Fi接続のノートPCですので落ちてたらごめんなさい。

---

追記:

序盤に乱数多め,終盤に従って徐々に減らしています。

毎回同じ手も面白みがないだろうというのと,終盤にポカが多いとさすがに興覚めだろうとの配慮です。

また,一手も読まないので千日手はもちろん連続王手の千日手などの反則手も出ることがあります。その点は御了承下さい。

ニューラルネットワークの出力を使わないのは投了時と宣言勝ち時のみです。

(これも学習させればよかったかな?)

電竜戦マイナビニュース杯について

将棋AI界隈に私が初参加したのが第5回の電王トーナメントである。

これはPC提供社が参加者全員分のPCを会場に準備して下さる非常に有り難い大会であった。事前準備はともかく当日同スペックの計算機で対戦できるので純粋にソフトウェアの争いであった。比べて,世界選手権や今の電竜戦は無制限の対局であるため予算を持ったチームが圧勝する展開が続いている。

 

この状況の打破を以前から様々に準備をしており多くの方に相談したりお願いをしたりと実は水面下で結構な準備をしていた。その結果今年度にハードウェア統一戦を電竜戦の枠内で行うことに決定した。

 

三台のPCが既にテスト中である。


 

一部のルールについては先月の討論会で議題に上げさせてもらったが概ね下準備した案が好意的に受け入れられたようだ。

 

www.youtube.com

 

重要な部分はPCのスペック

および対戦者の準備

それから具体的な対戦条件である

 

検討項目のうち大半は同意を得たが上位者同士の決勝が引き分けた場合などの詳細は今後の課題となっている。近いうちに明文化し公開したい。

 

ハードウェアスペックがどの程度のものかはこちらは自前のPCであるがベンチマーク計測したものがある。

Alder Lakeでやねうら王ベンチ(その2) - 48's diary

Alder Lakeでやねうら王ベンチ(その3) - 48's diary

f:id:the48:20220216141124p:plain

手前味噌となるが,floodgateのレート計測ベースで二番絞りの最新モデルとKristallweizenがRTX3090およびi9 12900Kで近い数字にあると分かる。

本設定は割とよく出来ていると自負している。

また,ちょっとした調整のヒントも上記リンクにあるので是非見て頂きたい。

 

今回のマイナビニュース杯は初の試みと言うことで(私が色々大変になるので)参加者を絞った大会となるが,電竜戦では予行演習なども準備しているので表彰対象とならない対戦も行っていく予定である。本ルールでは実行ファイルを送付頂ければ後は見ているだけなので,気楽に参加頂ければ幸いである。

オープンソースの囲碁ソフトRayをWindows環境でビルドする

GitHubの方にプルリクを送ろうと思っていたのですが,想像以上にVisualStudioでgitをうまく扱えないまま(あまり余暇もなく)二か月過ぎたのでこういう形で公開しておきます。

 

github.com

 

Rayは深層学習流行前の形の囲碁ソフトです。(間違っていたらコメント下さい)

AlphaGo以前と表現すると今は分かりやすいのだと思わます。

囲碁界隈は将棋ほど色々と出ていないようで未だに入門者のサンドバッグがGnuGoだったりするので,ちょうどRayを対戦相手にする準備をと考えておりました。

で,Windows環境でビルドする手順は以下のようになりました。

 

1.

includeパスを設定する。

Rayのフォルダ構成はソースとヘッダが別なのでそのままだとincludeされない。

CおよびC++では初歩である。

 

2.

UTF-8のソースを使えるようにする。MS文化圏ややこしいですね。

/utf-8 (ソースおよび実行文字セットを UTF-8 に設定する) | Microsoft Docs

 

プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。

[構成プロパティ]>[C/C++]>[コマンド ライン] プロパティ ページを選択します。

[その他のオプション] で、/utf-8 オプションを追加して優先エンコードを指定します。

 

3.

sprintf()関数のワーニングを抑える

昨今危なくて使わない関数ですね。

 

メニュー[プロジェクト]-[プロパティ]を選択。

プロパティページ画面の、[構成プロパティ]-[C/C++]-[プリプロセッサの定義]で編集を選択

プリプロセッサの定義画面で、「_CRT_SECURE_NO_WARNINGS」を入力

 

4.

VLAを修正する。

MinorizationMaximization.cpp の149,150行目

 train_thread_arg_t targ[threads];
 std::thread *handle[threads];

可変長配列 (Variable Length Array, VLAと略す)である。

少々大袈裟だが,こいつは知る人は知る怨霊である。ここでは詳しく語らない。

ここで大変困った顔になった。

選択肢は

  1. Visual Studioをやめる(msys2など)
  2. Visual Studioでclangを使う
  3. ソースに手を入れる

の三択であった。

ソースに手を入れるのは最終手段にしたかったのだが,よくソースを見てみるとこのMinorizationMaximizationを呼び出しているところはひとつだけでTRAIN_THREAD_NUMを引いていることが確認できたので,TRAIN_THREAD_NUMの固定配列に変更することで問題なく対応できた。

VLAは導入された世代で馴染んだ人はカジュアルに使ってしまうのだろうか。

 

ところで,今年の囲碁大会は例年とスケジュールが異なるらしい。

2022年CGFオープン 大会要項

第14回UEC杯コンピュータ囲碁大会

 

10月にCGFオープン,11月にUEC杯と近い。

Rayベースの改造で出てもいいらしいので興味ある人は是非どうぞ。

2022年8月近況

基本的には日記なのでたまにはこういうタイトルで書き始めてもいいかな。

 

8月はオープンセミナーがありました。

オープンセミナー2022@岡山

2008年から年一で一般向けにやっている講演会で今年15回目になります。

当初は雑多な勉強会として場を提供するというのが私のコンセプトでした。

もちろん面白いことをやってる人を発掘して皆に聞いてもらうのが主目的です。

当初は私も色々なネタを話しましたが,若い人がどんどんアイデアを出すようになってからは完全に裏方で受付をしたり弁当を発注したりLANのアクセスポイントを立てたりですね。展示会場の準備などもした年もありました。

昨今はコロナ禍でオンライン化しており,配信技術等がない私はもはや困ったときに過去の例で何をしたか語る長老の役割でした。半分隠居ですね。

今年の講師陣も皆が頭を悩ませながら面白い話を集めてくださいました。動画公開されていると思いますので是非見てやってください。今年もすごく面白い話ばかりです。

 

 

また,個人的に雑に作っているスクラッチエンジンを手入れしてました。

スクラッチ勢の行方(その2) - 48's diary

今回弄っていたのは詰将棋エンジンで,以前は5手詰や7手詰くらいまでを秒殺するくらいには完成していたものを更に手入れしました。

現状では13手詰,15手詰くらいを実用的な速度で解きます。加えてUSIプロトコルにエラーが出ない程度には対応しました。とはいえ,ここから先は真面目に(計画的に)アルゴリズムを考えたりメモリ利用を意識してやらないと辛そうです。

現状twitterで流れてくるようなものはほぼ対応できるので個人的には満足の域です。

クラッチ勢で参考にするものがなくてもチビチビ改良していれば何とかなるものです。

 

それから比較的遊んでいるPCで計測を進めておりました。

といってもfloodgateに放り込む程度の雑な感じです。

 

二番絞りの精度の話(2022年版) - 48's diary

softmaxの温度について - 48's diary

非GPU勢DL組 - 48's diary

非GPU勢DL組その2 - 48's diary

今年の二番絞りが昨年より意外によくなってる点は上記の通りですが,非GPUでも昨年そこそこ行けた感の部分も計測してみました。

二番絞りの3b_8tが3ブロック評価関数のCPU8スレッドで,40b_8tが40ブロック評価関数のCPU8スレッドです。ええ,GPU無しです。

3ブロックは手持ち最軽量なのでCPUでも数千npsを誇ります。しかしながら,終盤は酷いもので技巧と争うのがやっとのようです。

40ブロックは以前のネタでもありましたが,1スレッドで11npsがやっとのところなので8スレッドでその8倍出ない感じですね。一瞬90近い数字を見ることができたくらいです。これが3600台ですね。3700近い数字を見たこともありますが落ち着くのはこんなところです。私がコンピュータ将棋を始めたころのトップ集団(技巧やelmo)が8スレッドでこの辺でした。昨年はGTX1060があれば技巧と競るかもとか言う話ですから隔世の感ですね。

 

おまけに上位陣も掲載しておきます。

nibanshibori_v05_RTX3060が今年の二番絞りの別バージョンです。

選手権バージョンとあまり変わりませんね。

安く手に入れたノートPCでこのレベルは立派です。プロ棋戦の棋譜解析でも問題なさそうなレベルですね。

 

最後に12900Kのテストです。

前ネタ的にはここら辺ですね。

Alder Lakeでやねうら王ベンチ(その2) - 48's diary

Alder Lakeでやねうら王ベンチ(その3) - 48's diary

ハイパースレッディング考察2022 - 48's diary

某所の12900Kの連続運転テストが主眼でしたので,適当に水匠のやねうら王配布バイナリで16スレッドと24スレッドで放り込みました。16スレッドはPコアEコア全部に1スレッドずつになります。

suisho5_12900K_16t ,suisho5_12900K_24tですが,大差ないというオチになります。

以前放り込んだKristallweizen_12900Kの長期レートが4181でほぼ同じくらいです。

水匠5の計測はお初でした。シングルバイナリ配布なのでユーザも多く利便性は高いですね。

 

昔話(MP3エンコード編)

その昔,MS-DOSからシリアルポート経由でモデムを通じ,一般のアナログ電話回線を用いることで通信を行っていた時代があった。
PCの画面とは黒く分厚いブラウン管に浮かび上がる白く固定サイズの25行の文字列である。
ネットワークのコミュニケーションはホストと言われるマシンに電話回線で接続することにより行われていたが,主流であったホストは時間課金制または短時間無料といったものであった。

 
その中で私はMPEGと言うものを知った。
DVDで使われるMPEG2でもハンディビデオで主流のMPEG4でもなくその前の規格である。(うろ覚えだが流行らなかったフォーマットのVideoCDだっけ?)
オーディオ部分を取り出すことでMP3と言うのがその数年後流行るが,当時のi486ではリアルタイム再生は困難であった。
そこで私はMP2を主流に扱うことにした。手持ちのハードウェアでリアルタイム再生が可能であったからである。
音質はAMラジオが上手にチューニングされた程度といったところである。
これでもエンコードにはリアルタイムの10倍程度の時間を要した。
3分強の歌謡曲は1MB強のファイルへ変貌し,辛うじて一枚のフロッピーディスクに収容することが出来た。

 

その数年後,比較的普及したレベルのPCでMP3がリアルタイム再生可能となる。
また,専用のデコーダハードウェアが開発され安価な再生機が量産された。
当時でもエンコードにはリアルタイムより数倍長い程度の時間を要しており,世間のPCの多くの時間を費やした。
エンコードベンチマークサイトでは様々な条件でその速度を競っており,私も身近なものを使い一度だけトップランクを記録したことがある。
しかしながら,不正扱いとしてすぐに削除された。理由は分からないが当時のハンドルネームに実績がなかったからであろう。
すぐに午後のコーダと言う優秀なエンコーダがトップを取り自分も争わずそれを使うことになった。
SIMD演算との出会いであり敗北である。

 

近い時期にスパコンFFTを実装するコンペがあったのでエントリーしたことがある。邪悪であるが本題以外で様々なベンチマークを計測するのが主目的であったので結局下から2,3番くらいで敗退した気がする。トップは専門分野の大学院生でそれを修正したものが実際のスパコン用のライブラリに採用されるらしいとの話を後に聞いた。こういうのも良い経験である。出来れば表彰の場に行きたかったが当時情報系の学会とは何の縁もなかった。

 

随分前に下書きしたものだがちょっとした切っ掛けで思い出したので加筆して晒す。

当時動画系はライセンスがうるさくて自作ソフトも捨てハンドルネームで流通させた気がするがあまりに古くて覚えていない。誰かが記録を取っていれば思い出すかも。

softmaxの温度について

前回,二番絞りが恐ろしく高精度になってる話をしました。

ニューラルネットの出力だけで高段者クラスの将棋が出来てしまいます。まさに「ソフトウェア2.0」感ですね。

 

bleu48.hatenablog.com

 

ところで,ニューラルネットの出力では多クラス分類モデルを使いますので,指し手の候補数ある数値が最大となる指し手を選択します。

多クラス分類ではSoftmax出力として総和が1となるように処理するのが一般的ですが,この際温度0に対応するのが、ポリシー(最大値)指しでした。

これでfloodgateレーティング2355ですね。

 

温度1にしてSoftmax確率分布を得て、この確率分布に比例した乱択モデルをfloodgateに流したところ、相当弱くなったはずですが一応レーティングが付いて1800~1900くらいになっています。(長期レートだと約2000)

温度0だと常に同じ局面で同じ手になるため同様の挙動のエンジンとは全く同一棋譜を量産することになるのでこういった試みをしてみました。

 

弱体化しても案外将棋になるもんですね。

floodgateにこんな棋譜がありました。

coduck_oci_1c vs. nibanshibori_policy_probability (2022-07-30 08:00)

coduckが頓死するんですが,9手詰めしている方は一手も探索してないんですよ。

 

さらに温度を変更し,簡単に手元集計してみました。

vs LesserKai 1.5.0で20戦集計します。

温度0:20-0

温度1:18-2

温度2:16-4

温度2.2:10-10

温度2.5:4-16

温度3:3-17

温度5:0-20

 

ということで、適当に調整するとLesserKaiと互角まで弱体化することが可能です。

この,温度2.2をfloodgateに放り込んでみました。

Player Statistics

様々な報告でLesserKaiのレートが700程度であるとされていますが,本レートは1300ほど出ています。周辺の対戦相手にもよるのかもしれませんね。

 

参考に,山下さんがSoftmax温度を変更することでAobaZeroの弱体化について計測されています。

温度2.2でレートが1000ほど下がるってのは定量的に合っているようです。

コンピュータ将棋や囲碁の掲示板 過去ログ2021年版

---

追記08/16

最初だけ少し乱択にしておけば適当に散るって話をしていたので,ちょっとテストしてみた。

nibanshibori_pp_vtが短期レート2118,長期レート2156

nibanshibori_pp_vt2が短期レート2360,長期レート2381

前者は温度10/手数で,後者は1/手数。

前者の初手付近はほぼフラットな乱択で戦型と言える駒組でないが,後者は初手78飛など振り飛車込みでそこそこ多彩な駒組を見せている。

いずれにしても探索していないので深い探索をしているものには負けるのだが,それにしてもレートが高い気がする。特にvt2は乱数入れてないやつよりちょっと上のレート付いてるのが面白い。ほぼ誤差にしても弱くなっていないと言うことだろう。

何故か丁度相性が悪くなっている相手が居るみたい。