Tweet

Egaroucid Book詳説

オセロAI EgaroucidにおけるBook関連機能の使い方(作者の使い方)を解説します。あくまでも作者個人の使い方ですが、Egaroucidはここに書いてある手法でBookを使うことが想定されています。

このページは日本語のみです。また、読者としてはオセラー(人力のオセロプレイヤー)を想定しています。

最終更新: 2024/04/13 Egaroucid 7.0.0

目次
  1. Bookとは?
  2. Bookを学習してみる
  3. Bookファイルの構造

Bookとは?

Egaroucidにおいて、Bookとは「予め高い精度で計算しておいた評価値集」のことです。

オセロAIは終盤を高速に終局まで読み切ることができますが、序盤、中盤は終局まで読み切ることができません。そういった場合には評価関数を用いて、終局前の局面の状態から終局結果を予測したものを正しいであろう結果として用います。しかし、当然ながら評価関数は完璧なものではありません。2石損くらいの悪手は判定できないこともしばしばあります。そこで、序盤から中盤にかけて、長い時間をかけて様々な局面の評価値を予め計算しておくという手法をとります。

ここから、EgaroucidのBookに関する基本知識を解説します。EdaxのBookと設計思想は近いと思いますので、EdaxのBookについてよくご存知の方は軽く読めばご理解いただけるかもしれません。

Bookの構造

最初から詳しい話になってしまいますが、先に見せると良いと思ったので最初にBookの構造を解説します。

EgaroucidのBookでは、各ボードについて以下の情報が記録されています。

名前内容
ボード手番のプレイヤの石の配置、および相手の石の配置
評価値手番側の目線での評価値(「この盤面で最善手を打てばX石勝ちになる」という意味)
レベル評価値計算に使ったAIのレベル(先読み手数などがわかるように記録)
ライン数この局面から終局まででいくつの局面がBookに登録されているか(Book精度に関係)
リーフの評価値合法手でBookに登録されていない局面に繋がる手のうちの多分最善手の評価値(Book学習に使用)
リーフの手合法手でBookに登録されていない局面に繋がる手のうちの多分最善手
リーフのレベルリーフの評価値と手を計算したAIのレベル

Bookはボード情報に紐付ける形で、評価値などを保存しています。これらの情報の中でユーザが目にする機会が一番多いのが評価値です。これは単純にその局面がどちらにどれだけ有利かを表す値で、一番大事な情報です。この値を正確に効率的に計算(Book学習)するために、他の色々な情報が保存されています。

リーフに関する情報は後述のBook学習で使います。

Bookを用いたAIの着手

ある局面でAIが着手するとき、その局面から打てる手でBookに登録されている手が1つでもあれば、Book登録されている手の中から着手します。つまり、Bookに登録する手は必ず良い手である必要があります。最善以外の手だけをBookに登録すると、着手がめちゃくちゃになります。

実際にAIがBookを使うときには、各合法手を打ってみてからBookを検索し、登録されている(相手にとっての)評価値とその手をメモしておきます。全ての合法手を展開したら、相手にとっての評価値が一番小さい手(=自分にとっての評価値が一番大きい手)を最善手として使用します。合法手のうち1つでもBookに登録された局面があれば、Bookに登録された局面だけの中から着手を選びます。また、同じ評価値の手が複数ある場合には、最善手の中でランダムに打つ手を選びます。

ちなみに、Edaxではリンクという名前でこれら合法手(のうちBookに登録されている手)を上記のBookの構造に含めています。しかし、リンク情報はBookを何回か検索すればその場で生成できてしまうなど、個人的にはこれは冗長な情報かつBookの構造が煩雑になる気がしたので、Egaroucidでは不採用にしました。リンクを不採用にした副次的な効果として、Book容量がEdaxよりも小さく済むようになりました。

Bookの精度

Bookに登録されている評価値は、Egaroucidによって予め計算しておいたものです。ですからそれなりに正確であろうと判断できますが、その値が厳密に正しいのかと言われれば、わからないとしか言えません。しかし、評価値がどれくらいしっかり計算されているのかという情報は得ることができます。例えば以下の指標がぱっと思いつくでしょう。

AIのレベルが高ければ、深くまで手を先読みしているので値は信頼できます。また、今の局面から先にたくさんの局面がBookに登録されていれば、その事実もある程度評価値の信頼性に関係します。

これら2つの指標はわかりやすいのですが、EgaroucidはうえのんEDAXというソフトの機能に着想を得て、Bookの精度を6段階で表示する仕組みを導入しました。AからFまでの6段階で評価値の精度を評価します。詳細は以下です。

精度状態判定基準
A値に狂いはほぼない2石損未満のbook進行の末端が全て完全読み
B高信頼2石損未満のBook進行のうち、1つ以上の末端が完全読みで、その他の末端は終局まで読み切り
C正確2石損未満のBook進行の末端が全て終局まで読み切り
Dそれなりに正確2石損未満のBook進行の末端の1つ以上が完全読み
Eまあ正確2石損未満のBook進行の末端の1つ以上が終局まで読み切り
F値が怪しい2石損未満のBook進行の末端に終局まで読み切った局面がない

ここで紹介した3つのBookの精度情報は画面に表示することができます。「表示 > 合法手への表示 > Book精度」をチェックしてみてください。

Book精度の表示は、後述のBook学習にて役に立つと思います。

標準付属Bookの仕様

Egaroucidはインストールした時点で作者が作ったBookが付属しています。標準Bookは自前で作りました(Egaroucid 6.5.2まではZebraのBookをもとにZebra作者の許可の上で値を再計算、追加学習したものでした)。

Bookの仕様は、Book>Book情報よりご覧ください。標準付属Bookは手元で学習したBookを、適当に小さくまとめてから公開したものです。

Bookを学習してみる

BookはEgaroucidのソフトを使って自前で学習させることができます。Edaxでいうbook deviateのような機能がEgaroucidには付属しています。

EgaroucidのBook学習では、Bookの構造のところで紹介した「リーフ」という概念を用います。リーフは「その局面の合法手のうち、Bookに登録されている手(局面)を除いたときの最善手(と思しき手)」です。Bookを学習する際には、学習の設定に合う局面全てのリーフを見て、学習設定の範囲を満たしそうであればその手を打った局面をBookに新たに登録します。

ここではBookの学習関連の設定として深さ、1手あたりの誤差、積算誤差、リーフ誤差の4種類が登場します。1手あたりの誤差は、最善(と思しき)手から何石損の手まで探索するか、積算誤差は、石損を繰り返していき、累計で何石損まで許容して探索するか、リーフ誤差は、登録された局面の値に対して何石損までのリーフを展開するか(1手あたりの誤差と近い概念)を表します。

ここでは、作者がEgaroucidのBookを学習させるときにどうやっているのかを解説します。Book学習はいくつか方法が考えられるので、3種類に分けて簡単に解説します。

開始局面を設定する

Egaroucidでは、Book学習を開始する局面を自由に設定できます。手動で打ったり各種入力機能を使って、学習したい局面を作ってください。Book精度の表示をするようにして、精度の悪い手を見つけてその手を開始局面とするのが良いと思います。

複数のレベルを利用して学習する

最初は低いレベルで浅く広くに学習をかけるのがおすすめです。それで有望そうな進行を見定めて、徐々にレベルを上げつつ探索範囲を絞っていくと高速に高精度なBookが作れると思います。

ここでは、各レベルの読み切り(ざっくり探索だが終局まで読む)タイミングおよび完全読み(終局まで完璧に読む)タイミングをうまく使うことが大事です。

例として、いくつか学習設定のサンプルを紹介します。パソコンのスペックによって微修正する必要があるとは思いますが、参考になれば幸いです。

深さ32のBookを作る場合

28手完全読みが簡単にできるくらいのPCであれば、以下の設定あたりが良いと思います。作者はCore i9 13900Kでレベル19と27を使って学習させています。この設定だと、うまくやればBook精度の評価がAのBookが作れます。レベル21だと深さ30以降が読み切りなので、レベル27と合わせることで正確なbookが作れます。

レベル深さ1手あたり誤差積算誤差リーフ誤差備考
1931444深さ31だけ読み切り
1931440値が怪しい局面だけもう少し読む
2732002深さ32で完全読みを使って最善進行を正確にする

もう少し計算を高速にしたい場合、以下のような設定も使えると思います。28手を完全読みさせず、98%の読み切りを使うようにしています。この設定だとBook精度の評価は最大でCとなります。

レベル深さ1手あたり誤差積算誤差リーフ誤差備考
1731444深さ31まで中盤読みで浅く広くBookを作ってしまう(不正確)
2132112深さ32までレベル21で読み切ってしまう (深さ32だと精度98%で読み切り)

深さ40のBookを作る場合

初手など浅いところから深さ40のBookを作ろうとすると、容量が非常に大きくなる可能性があるのでご注意ください。

以下は終盤24手を完全読みにしてしまう設定です。

レベル深さ1手あたり誤差積算誤差リーフ誤差備考
830333深さ35まで中盤読みで浅く広くBookを作ってしまう(不正確)
936222深さ38まで中盤読みで浅く広くBookを作ってしまう(不正確)
2140111深さ36以降で完全読みを使って評価値を正確にする

Book修正を使う

Bookをただ学習しただけでは、+2の手の後に-4の手しかない、みたいなことが起こり得ます。このとき、前者の手を+4に変更した方が良いです。このように、手を打った後の局面の評価値を用いて今の局面の評価値を更新する作業を「Book修正」という名前で実装しています。Edaxだとbook fixに近いです。

Bookの構造の中でレベルの情報が含まれていましたが、Book修正では手を打った後の局面のレベルが今の局面のレベルより小さい場合には今の局面の評価値を更新しないようになっています。これは、低いレベルで作ったBookの評価値が高いレベルのBookに対して悪さをすることを防ぐためです。

Book修正を行うと、Bookの評価値を変更するため、前回完璧に終了した学習と同じ設定で再度Book学習をかけてもいくらかの局面を計算すると思います。基本的に、Book学習とBook修正を繰り返してBookの精度を高め、登録局面数を増やすことを想定しています。

なお、EdaxのBookを取り込んでからそのままBook修正を使うと、EdaxとEgaroucidの仕様の違いにより、評価値がおかしくなる場合があります。ご注意ください。EdaxのBookを取り込んだら、Book学習設定を全て解除してからしばらく低いレベルで学習をかけるとこの問題が緩和されると思います。

リーフ再計算を使う

Book構造にリーフという概念が出てきましたが、Book学習ではこのリーフの値を見ることによって、そのリーフ(まだBookに登録されていない局面)を新たにBookに登録するか判断します。つまり、リーフの評価値がデタラメだと学習がうまく進まないということです。そんな状態になったとき、リーフ再計算機能を使うと、学習設定の対象局面のリーフのうち、低いレベルで計算したリーフを自動で見つけて再計算してくれます。

Book削減を使う

ここまでの手法でBookを学習させると、Bookが大きくなりすぎて扱いにくくなるかもしれません。そういった場合には、Book削減機能で適度に不要な手を削除すると良いです。

まず、Bookを削減したい進行の開始局面を設定します。例えば進行数を見てうさぎ定石が多すぎたらうさぎ定石の局面に設定します。その状態でBookの設定(深さ、1手あたりの誤差、手筋の誤差)を設定してBook削減ボタンを押すと、条件に合う局面だけがBookに残ります。開始局面から到達できない局面にはこの操作は影響しません。

手動でBook評価値を変更・削除する

Egaroucidでは手動でBookの評価値を変更・削除する機能があります。どうしても評価値がおかしな値になってBook学習がうまくいかない場合や、予め人間が評価値を知っている局面がある場合に使えると思います。人間が手動で入力した評価値は、AIの全てのレベルよりも高い(正確である)という扱いになります。

「Book > Book操作 > 右クリックで編集」のチェックを入れて、適当な局面を設定してその合法手を右クリックします。すると画面右上に「評価値(手): 」という表示が出るので、ここで数字キーやテンキーを使って数字を入力します。その後同じマスをもう一回右クリックするかEnterを押すと値が反映されます。Escを押すか、入力された値がない状態でもう一度同じマスを右クリックするとBook編集モードを抜けられます。

Bookファイルの構造

Egaroucidのbookは独自フォーマットのバイナリファイル(リトルエンディアン)で保存されています。過去に使っていたフォーマットも含めて構造を説明します。一般ユーザにとって有益な情報とは言えませんが、Egaroucidの改造やBookの操作に役立つかもしれません。

egbk3フォーマット

拡張子は.egbk3です。

最新のフォーマットです。

項目データ量(バイト)内容
"EGAROUCID"9固定の文字列"EGAROUCID"
Bookのバージョン1egbk3フォーマットの場合は3で固定
登録局面数4bookに登録された局面の数
局面情報25*登録局面数登録されている局面のデータ(下記参照)

登録局面ごとに、以下のデータが保存されています。

項目データ量(バイト)内容
手番の石の配置864bitを使って64マスのそれぞれに手番の石があるかを格納します(MSBがa1)
相手の石の配置864bitを使って64マスのそれぞれに手番の石があるかを格納します(MSBがa1)
評価値1その局面の評価値
レベル1局面の評価値を計算したAIのレベル
ライン数4その局面の先にいくつの局面がbookに登録されているかを示す値
リーフの評価値1bookに未登録の手のうち、一番良さそうな手の評価値
リーフの手1bookに未登録の手のうち、一番良さそうな手
リーフのレベル1リーフ計算に用いたAIのレベル

egbk2フォーマット

拡張子は.egbk2です。Egaroucid 6.5.0まで使われていたものです。

項目データ量(バイト)内容
"EGAROUCID"9固定の文字列"EGAROUCID"
Bookのバージョン1egbk2フォーマットの場合は2で固定
登録局面数4bookに登録された局面の数
局面情報(22+2*リンク数)*登録局面数登録されている局面のデータ(下記参照)

登録局面ごとに、以下のデータが保存されています。

項目データ量(バイト)内容
手番の石の配置864bitを使って64マスのそれぞれに手番の石があるかを格納します(MSBがa1)
相手の石の配置864bitを使って64マスのそれぞれに手番の石があるかを格納します(MSBがa1)
評価値1その局面の評価値
レベル1局面の評価値を計算したAIのレベル
リンク数4その局面の合法手のうちbookに登録されている局面の数
リーフ情報2*リンク数登録されているリンクのデータ

リンクごとに、以下のデータが保存されています。

項目データ量(バイト)内容
リンクの評価値1合法手の評価値
リンクの手1登録されている合法手

egbkフォーマット

拡張子は.egbkです。Egaroucid 6.2.0まで使われていたものです。

項目データ量(バイト)内容
登録局面数4bookに登録された局面の数
局面情報17*登録局面数登録されている局面のデータ(下記参照)

登録局面ごとに、以下のデータが保存されています。

項目データ量(バイト)内容
手番の石の配置864bitを使って64マスのそれぞれに手番の石があるかを格納します(MSBがa1)
相手の石の配置864bitを使って64マスのそれぞれに手番の石があるかを格納します(MSBがa1)
評価値1その局面の評価値に64を足したもの