コンピュータ将棋や囲碁の掲示板
TOP > 過去ログ > 記事閲覧
fld_nor.gif AobaZeroの重みファイルの利用についてのご質問
投稿日 : 2023/08/19(Sat) 07:55
投稿者 高木
AobaZero開発者の皆様

突然の投稿失礼します。
大阪大学大学院生命機能研究科で助教をしております、高木優と申します。

現在、私たちの研究でAobaZeroを利用したいと考えております。具体的には、任意の盤面を入力とした時の、AobaZeroの出力および中間層のアクティベーションパターンを抽出し、それらを研究に利用したいと考えています。新たに学習を行う予定はなく、公開頂いている重みを用いる予定です。その上で以下3点お伺いしたく思います:

1. 公開頂いているAobaZeroの重みを研究目的で利用させて頂いてもよろしいでしょうか?可能な場合、公式HP/GitHub以外に引用が必要な文献などございましたらご教示頂けますと幸いです。

2. 利便性を考えて、出力および中間層のアクティベーションパターン抽出はPyTorchで行いたいと思っています。ただそのためには、PyTorchで読み込み可能な形式へ重みを変換する必要があるかと思います。開発者の皆様は、過去に重みのPyTorchへの移植を行われたことはございますでしょうか?

3. 公開頂いている学習初期(w001)から後期(現在)のモデル間で比較をしたいと思っております。ただ、初期・中期・現在ではアーキテクチャなどが若干違うものになっていると理解しております。また、入力するための盤面エンコーディングや、方策の出力形式などもdlshogiとは異なると理解しております。上記の移植作業や研究で利用するにあたって、あるいは将来的に論文化するにあたって、アーキテクチャの詳細についての情報があると大変ありがたいのですが、何かまとめられたものなどございますでしょうか?

不躾なお願いとなってしまい大変恐縮ですが、ご回答いただけますと大変助かります。何かご質問などございましたらお聞きいただければ幸いです。
以上、どうぞよろしくお願いいたします。

高木 優
件名 Re: AobaZeroの重みファイルの利用についてのご質問
投稿日 : 2023/08/21(Mon) 20:53
投稿者 高木
参照先
山下様

早速にありがとうございます。
また、この度はどうもありがとうございました。大変助かりました。

高木
件名 Re: AobaZeroの重みファイルの利用についてのご質問
投稿日 : 2023/08/21(Mon) 20:46
投稿者 山下
参照先
1. はい。失礼しました、ご指摘の位置が正しいです。
2. 構造変更前はこちらになります。同じ30手目の局面でのw3459での実行結果です。
   http://www.yss-aya.com/w3459_in.txt
   http://www.yss-aya.com/w3459_out.txt
件名 Re: AobaZeroの重みファイルの利用についてのご質問
投稿日 : 2023/08/21(Mon) 18:09
投稿者 高木
参照先
山下様

極めて詳細なご説明、大変助かります。
やはりCaffeのまま進めるのが無難なのかもしれませんね・・・。
その上で大変申し訳ないのですが最後に以下2点、確認させて頂いてもよろしいでしょうか。

1.
>   出力は Policyが以下で
>  https://github.com/kobanium/aobazero/blob/develop/src/usi-engine/Network.cpp#L992
>   Valueが以下で取り出しています。
>  https://github.com/kobanium/aobazero/blob/develop/src/usi-engine/Network.cpp#L992
こちらに関して、Valueは以下のリンクということでよろしかったでしょうか?
https://github.com/kobanium/aobazero/blob/develop/src/usi-engine/Network.cpp#L1003

2.
>   構造変更後のNNへの入力と出力のサンプルは下のようになります。
>   http://www.yss-aya.com/moves30in.txt
>   http://www.yss-aya.com/moves30out.txt
こちら、ご用意いただけて大変助かります。ただ、もしよろしければ、同一局面における構造変更"前"の入出力サンプル(入力だけでも)も頂けたら大変ありがたく思います。すみませんが、ご教示いただけますと大変助かります。

以上、度々のご質問となり申し訳ありません。どうぞよろしくお願いいたします。

高木
件名 Re: AobaZeroの重みファイルの利用についてのご質問
投稿日 : 2023/08/20(Sun) 19:04
投稿者 山下
参照先
3. w000000004312.txt
   は独自形式となっています。
   *.caffemodel を変換したものです。

   export LD_LIBRARY_PATH=/home/yss/caffe_cpu/build/lib:
   export PYTHONPATH=/home/yss/caffe_cpu/python:$PYTHONPATH
   python ep_del_bn_scale_factor_version_short_auto.py /home/yss/shogi/learn/snapshots/_iter_226320.caffemodel
   mv binary.txt w000000004312.txt
   xz -9 -z -k w000000004312.txt

   変換用スクリプトはこちらです。
   https://github.com/kobanium/aobazero/tree/develop/learn/extract

   混乱しやすい点は *.caffemodel には Batch Normalizationの推論時の平均値を割る定数が含まれている点で、
   学習回数が多い場合は、ほぼすべて 999.982 になります。
   この数値はw*.txtには含まず、読み込み時に定数で変換しています。
   https://github.com/kobanium/aobazero/blob/develop/learn/extract/ep_del_bn_scale_factor_version_short_auto.py#L167
   https://github.com/kobanium/aobazero/blob/develop/src/usi-engine/Network.cpp#L170

   w000000004312.txt を *.caffemodel への変更も可能です。
   https://github.com/kobanium/aobazero/blob/develop/learn/yss_dcnn.cpp#L5040
   のコメントを外して直後に
   solver->Snapshot(); return;
   を実行します。

   Caffeはもう開発を停止しているので私は下を使ってます(RTX 3090で動作させる場合)
   r39のcaffeをこちらに
   https://github.com/BVLC/caffe/pull/7000
   $ git clone -b fixes_for_cudnn8_bvlc_master https://github.com/artyom-beilis/caffe.git caffe_artyom
   $ protoc src/caffe/proto/caffe.proto --cpp_out=.
   $ mkdir include/caffe/proto
   $ mv src/caffe/proto/caffe.pb.h include/caffe/proto
   makefile.config は 動いてるのに合わせる。

自分で書いていて思ったのですが時代遅れになってしまったCaffeを使ってるせいで
現在のPyTorchなどの環境で動かすのはかなり面倒かもしれません・・・。
件名 Re: AobaZeroの重みファイルの利用についてのご質問
投稿日 : 2023/08/20(Sun) 19:02
投稿者 山下
参照先
1. はい。他に40bが含まれています。
   w001  - w448  64x15b
   w449  - w3459 256x20b
   w3460 - w3702 256x40b
   w3703 - w3880 256x20b ... w449  - w3459 と同一
   w3881 -       256x20b (NNの入力を変更、Swishに)
   それぞれのcaffemodelは下のようなものです(64x15bは見つかりませんでした)。
   http://www.yss-aya.com/_iter_15552000_w3702.caffemodel.tar.bz2 aoba_zero_256x20b_mb128.prototxt    が対応
   http://www.yss-aya.com/_iter_3552000_w3880.caffemodel.bz2      aoba_zero_256x40b_mb64.prototxt     が対応
   http://www.yss-aya.com/_iter_226320_w4312.caffemodel.bz2       aoba_256x20b_swish_predict.prototxt が対応

2. はい。ネットワークの入力はすべて 9x9 x362 です。w3881 以降では入力の内容は変わってますが
   入力のサイズは 9x9x362 です(一部全部0で埋まっている面があります)。

   AobaZeroとの違い(w3381以降はAoba駒落ちと同じ入力で、さらにReLuをSwishに変更してます)。
   http://www.yss-aya.com/komaochi/diff.html

   構造変更後のNNへの入力と出力のサンプルは下のようになります。
   http://www.yss-aya.com/moves30in.txt
   http://www.yss-aya.com/moves30out.txt

   下の棋譜の30手目で、31手目を探索させた場合のRootの入力です。
   http://wdoor.c.u-tokyo.ac.jp/shogi/view/2023/01/11/wdoor+floodgate-300-10F+coduck_pi2_600MHz_1c+AobaZero_w4213_n_p800+20230111110007.csa
   position startpos moves 7g7f 8c8d 2h6h 1c1d 5i4h 1d1e 4h3h 5a4b 6g6f 7a6b 3h2h 3c3d 7i7h 8d8e 8h7g 6a5b 3i3h 3a3b 6i5h 4b3a 4g4f 2c2d 7h6g 5c5d 6h8h 2b3c 8g8f 8e8f 7g8f 6c6d
   下の行を if (1) にすると出力されます。
   https://github.com/kobanium/aobazero/blob/develop/src/usi-engine/bona/yss_net.cpp#L736

   出力は Policyが以下で
   https://github.com/kobanium/aobazero/blob/develop/src/usi-engine/Network.cpp#L992
   Valueが以下で取り出しています。
   https://github.com/kobanium/aobazero/blob/develop/src/usi-engine/Network.cpp#L992
   元はLeelaZeroのコードです。
件名 Re: AobaZeroの重みファイルの利用についてのご質問
投稿日 : 2023/08/20(Sun) 12:36
投稿者 高木
参照先
山下様

お返事どうもありがとうございます、大変参考になります。何度も大変恐れ入りますが、お返事踏まえて追加で以下3点確認させていただきたく思います:

1.ネットワーク構造について、https://github.com/kobanium/aobazero/tree/release/learnに*.prototxtがありますが、各prototxtと各論文の対応は以下の理解でよろしかったでしょうか? 
(http://www.yss-aya.com/aobazero/ の"ネットワークの重み"の記載も参考にしております)
一つ目の論文(http://www.yss-aya.com/20191118csa_aobazero.pdf) :  https://github.com/kobanium/aobazero/blob/release/learn/aoba_zero_64x15b.prototxt -> w001 ~ w448まで?
二つ目の論文(http://www.yss-aya.com/20210309aoba.pdf) : https://github.com/kobanium/aobazero/blob/release/learn/aoba_zero_256x20b.prototxt -> w449 ~ w3298まで?
構造変更後(  http://www.yss-aya.com/bbs_log/bbs2022.html#bbs13) : https://github.com/kobanium/aobazero/blob/release/learn/aoba_256x20b_swish_mb128.prototxt -> w3811以降?

2. 今回は学習まで行う予定はないため、移植までせずともPythonのCaffeで特徴を抽出するのも選択肢かと考えております。ここで、論文(20210309aoba.pdf)およびコードから、少なくとも構造変更までのネットワークの入力は9x9x362のものと理解しております(構造変更後は利きの情報も?)。ただ、構造変更前は362の各次元が具体的にどの駒に対応しているのか、あるいは構造構造後の入力形式はそもそもどんな入力がどういった形式で追加されているか、など理解できていない部分があります。もしよろしければ、入力データ形式をイメージするために参考になるコードの箇所(あるいは例となる盤面->入力入力のペアなど)をご教示頂けると大変ありがたく思います。

3. 配布頂いている重みファイルは*.txt.xz形式のところ、これは解凍後の.txtファイルが*.caffemodelファイルに対応すると考えていいでしょうか?

コードについての理解が足りておらず、質問ばかりで申し訳ありません。どうぞよろしくお願いいたします。

高木
件名 Re: AobaZeroの重みファイルの利用についてのご質問
投稿日 : 2023/08/19(Sat) 23:51
投稿者 山下
参照先
高木 様、

1. はい。ご自由にご利用いただければ、と思います。引用はGitHubだけで大丈夫です。
2. PyTorchに移植はしたことがありません。
3. 初期の構造はこちらで
   http://www.yss-aya.com/20191118csa_aobazero.pdf
   http://www.yss-aya.com/20210309aoba.pdf
   入力の変更後は下になります。
   AobaZeroのネットワークの構造を変更しました
   http://www.yss-aya.com/bbs_log/bbs2022.html#bbs13

   ソース上では下記になります。USE_POLICY2187 が定義されてるのが構造変更後の場合です。
    https://github.com/kobanium/aobazero/blob/release/src/usi-engine/bona/yss_net.cpp#L464

   ネットワークの重みはw4014.txt 以降、需要の少なさとディスク容量軽減のためアップしていません。
   すべては難しいですが合計で100程度でしたらご指定いただければアップいたします。

- WEB PATIO -