オセロAI EgaroucidにおけるBook関連機能の使い方(作者の使い方)を解説します。あくまでも作者個人の使い方ですが、Egaroucidはここに書いてある手法でBookを使うことが想定されています。
このページは日本語のみです。また、読者としてはオセラー(人力のオセロプレイヤー)を想定しています。
最終更新: 2024/08/13 Egaroucid 7.3.0
Egaroucidにおいて、Bookとは「予め高い精度で計算しておいた評価値集」のことです。
オセロAIは終盤を高速に終局まで読み切ることができますが、序盤、中盤は終局まで読み切ることができません。そういった場合には評価関数を用いて、終局前の局面の状態から終局結果を予測したものを正しいであろう結果として用います。しかし、当然ながら評価関数は完璧なものではありません。2石損くらいの悪手は判定できないこともしばしばあります。そこで、序盤から中盤にかけて、長い時間をかけて様々な局面の評価値を予め計算しておくという手法をとります。
ここから、EgaroucidのBookに関する基本知識を解説します。EdaxのBookと設計思想は近いと思いますので、EdaxのBookについてよくご存知の方は軽く読めばご理解いただけるかもしれません。
最初から詳しい話になってしまいますが、先に見せると良いと思ったので最初にBookの構造を解説します。
EgaroucidのBookでは、各ボードについて以下の情報が記録されています。
名前 | 内容 |
---|---|
ボード | 手番のプレイヤの石の配置、および相手の石の配置 |
評価値 | 手番側の目線での評価値(「この盤面で最善手を打てばX石勝ちになる」という意味) |
レベル | 評価値計算に使ったAIのレベル(先読み手数などがわかるように記録) |
ライン数 | この局面から終局まででいくつの局面がBookに登録されているか(Book精度に関係) |
リーフの評価値 | 合法手でBookに登録されていない局面に繋がる手のうちの多分最善手の評価値(Book学習に使用) |
リーフの手 | 合法手でBookに登録されていない局面に繋がる手のうちの多分最善手 |
リーフのレベル | リーフの評価値と手を計算したAIのレベル |
Bookはボード情報に紐付ける形で、評価値などを保存しています。これらの情報の中でユーザが目にする機会が一番多いのが評価値です。これは単純にその局面がどちらにどれだけ有利かを表す値で、一番大事な情報です。この値を正確に効率的に計算(Book学習)するために、他の色々な情報が保存されています。
リーフに関する情報は後述のBook学習で使います。
ある局面でAIが着手するとき、その局面から打てる手でBookに登録されている手が1つでもあれば、Book登録されている手の中から着手します。つまり、Bookに登録する手は必ず良い手である必要があります。最善以外の手だけをBookに登録すると、着手がめちゃくちゃになります。
実際にAIがBookを使うときには、各合法手を打ってみてからBookを検索し、登録されている(相手にとっての)評価値とその手をメモしておきます。全ての合法手を展開したら、相手にとっての評価値が一番小さい手(=自分にとっての評価値が一番大きい手)を最善手として使用します。合法手のうち1つでもBookに登録された局面があれば、Bookに登録された局面だけの中から着手を選びます。また、同じ評価値の手が複数ある場合には、最善手の中でランダムに打つ手を選びます。
ちなみに、Edaxではリンクという名前でこれら合法手(のうちBookに登録されている手)を上記のBookの構造に含めています。しかし、リンク情報はBookを何回か検索すればその場で生成できてしまうなど、個人的にはこれは冗長な情報かつBookの構造が煩雑になる気がしたので、Egaroucidでは不採用にしました。リンクを不採用にした副次的な効果として、Book容量がEdaxよりも小さく済むようになりました。
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進行の末端に終局まで読み切った局面がない |
Egaroucid 7.3.0以降では、精度Aについてさらに細かくAAからAFまでで精度を評価します。AAからAFは、2石損以下の手を打ち続けたときのBook末端の状況で判定を行います。
ここで紹介した3つのBookの精度情報は画面に表示することができます。「表示 > 合法手への表示 > Book精度」をチェックしてみてください。
Book精度の表示は、後述のBook学習にて役に立つと思います。
Egaroucidはインストールした時点で作者が作ったBookが付属しています。標準Bookは自前で作りました(Egaroucid 6.5.2まではZebraのBookをもとにZebra作者の許可の上で値を再計算、追加学習したものでした)。
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が作れると思います。
ここでは、各レベルの読み切り(ざっくり探索だが終局まで読む)タイミングおよび完全読み(終局まで完璧に読む)タイミングをうまく使うことが大事です。
例として、いくつか学習設定のサンプルを紹介します。パソコンのスペックによって微修正する必要があるとは思いますが、参考になれば幸いです。
28手完全読みが簡単にできるくらいのPCであれば、以下の設定あたりが良いと思います。作者はCore i9 13900Kでレベル19と27を使って学習させています。この設定だと、うまくやればBook精度の評価がAのBookが作れます。レベル21だと深さ30以降が読み切りなので、レベル27と合わせることで正確なbookが作れます。
レベル | 深さ | 1手あたり誤差 | 積算誤差 | リーフ誤差 | 備考 |
---|---|---|---|---|---|
19 | 31 | 4 | 4 | 4 | 深さ31だけ読み切り |
19 | 31 | 4 | 4 | 0 | 値が怪しい局面だけもう少し読む |
27 | 32 | 0 | 0 | 2 | 深さ32で完全読みを使って最善進行を正確にする |
もう少し計算を高速にしたい場合、以下のような設定も使えると思います。28手を完全読みさせず、98%の読み切りを使うようにしています。この設定だとBook精度の評価は最大でCとなります。
レベル | 深さ | 1手あたり誤差 | 積算誤差 | リーフ誤差 | 備考 |
---|---|---|---|---|---|
17 | 31 | 4 | 4 | 4 | 深さ31まで中盤読みで浅く広くBookを作ってしまう(不正確) |
21 | 32 | 1 | 1 | 2 | 深さ32までレベル21で読み切ってしまう (深さ32だと精度98%で読み切り) |
初手など浅いところから深さ40のBookを作ろうとすると、容量が非常に大きくなる可能性があるのでご注意ください。
以下は終盤24手を完全読みにしてしまう設定です。
レベル | 深さ | 1手あたり誤差 | 積算誤差 | リーフ誤差 | 備考 |
---|---|---|---|---|---|
8 | 30 | 3 | 3 | 3 | 深さ35まで中盤読みで浅く広くBookを作ってしまう(不正確) |
9 | 36 | 2 | 2 | 2 | 深さ38まで中盤読みで浅く広くBookを作ってしまう(不正確) |
21 | 40 | 1 | 1 | 1 | 深さ36以降で完全読みを使って評価値を正確にする |
Bookをただ学習しただけでは、+2の手の後に-4の手しかない、みたいなことが起こり得ます。このとき、前者の手を+4に変更した方が良いです。このように、手を打った後の局面の評価値を用いて今の局面の評価値を更新する作業を「Book修正」という名前で実装しています。Edaxだとbook fix
に近いです。
Bookの構造の中でレベルの情報が含まれていましたが、Book修正では手を打った後の局面のレベルが今の局面のレベルより小さい場合でも、手を打つ前の局面の値を修正します。また、Edaxではリーフの情報も含めて修正を行っていますが、Egaroucidのbook修正ではリーフ情報を無視します。
Book修正を行うと、Bookの評価値を変更するため、前回完璧に終了した学習と同じ設定で再度Book学習をかけてもいくらかの局面を計算すると思います。基本的に、Book学習とBook修正を繰り返してBookの精度を高め、登録局面数を増やすことを想定しています。
なお、EdaxのBookを取り込んでからそのままBook修正を使うと、EdaxとEgaroucidの仕様の違いにより、評価値がおかしくなる場合があります。ご注意ください。EdaxのBookを取り込んだら、Book学習設定を全て解除してからしばらく低いレベルで学習をかけるとこの問題が緩和されると思います。
Book構造にリーフという概念が出てきましたが、Book学習ではこのリーフの値を見ることによって、そのリーフ(まだBookに登録されていない局面)を新たにBookに登録するか判断します。つまり、リーフの評価値がデタラメだと学習がうまく進まないということです。そんな状態になったとき、リーフ再計算機能を使うと、学習設定の対象局面のリーフのうち、低いレベルで計算したリーフを自動で見つけて再計算してくれます。
ここまでの手法でBookを学習させると、Bookが大きくなりすぎて扱いにくくなるかもしれません。そういった場合には、Book削減機能で適度に不要な手を削除すると良いです。
まず、Bookを削減したい進行の開始局面を設定します。例えば進行数を見てうさぎ定石が多すぎたらうさぎ定石の局面に設定します。その状態でBookの設定(深さ、1手あたりの誤差、手筋の誤差)を設定してBook削減ボタンを押すと、条件に合う局面だけがBookに残ります。開始局面から到達できない局面にはこの操作は影響しません。
Egaroucidでは手動でBookの評価値を変更・削除する機能があります。どうしても評価値がおかしな値になってBook学習がうまくいかない場合や、予め人間が評価値を知っている局面がある場合に使えると思います。人間が手動で入力した評価値は、AIの全てのレベルよりも高い(正確である)という扱いになります。
「Book > Book操作 > 右クリックで編集」のチェックを入れて、適当な局面を設定してその合法手を右クリックします。すると画面右上に「評価値(手): 」という表示が出るので、ここで数字キーやテンキーを使って数字を入力します。その後同じマスをもう一回右クリックするかEnterを押すと値が反映されます。Escを押すか、入力された値がない状態でもう一度同じマスを右クリックするとBook編集モードを抜けられます。
Egaroucidのbookは独自フォーマットのバイナリファイル(リトルエンディアン)で保存されています。過去に使っていたフォーマットも含めて構造を説明します。一般ユーザにとって有益な情報とは言えませんが、Egaroucidの改造やBookの操作に役立つかもしれません。
拡張子は.egbk3
です。
最新のフォーマットです。
項目 | データ量(バイト) | 内容 |
---|---|---|
"EGAROUCID" | 9 | 固定の文字列"EGAROUCID" |
Bookのバージョン | 1 | egbk3フォーマットの場合は3で固定 |
登録局面数 | 4 | bookに登録された局面の数 |
局面情報 | 25*登録局面数 | 登録されている局面のデータ(下記参照) |
登録局面ごとに、以下のデータが保存されています。
項目 | データ量(バイト) | 内容 |
---|---|---|
手番の石の配置 | 8 | 64bitを使って64マスのそれぞれに手番の石があるかを格納します(MSBがa1) |
相手の石の配置 | 8 | 64bitを使って64マスのそれぞれに手番の石があるかを格納します(MSBがa1) |
評価値 | 1 | その局面の評価値 |
レベル | 1 | 局面の評価値を計算したAIのレベル |
ライン数 | 4 | その局面の先にいくつの局面がbookに登録されているかを示す値 |
リーフの評価値 | 1 | bookに未登録の手のうち、一番良さそうな手の評価値 |
リーフの手 | 1 | bookに未登録の手のうち、一番良さそうな手 |
リーフのレベル | 1 | リーフ計算に用いたAIのレベル |
拡張子は.egbk2
です。Egaroucid 6.5.0まで使われていたものです。
項目 | データ量(バイト) | 内容 |
---|---|---|
"EGAROUCID" | 9 | 固定の文字列"EGAROUCID" |
Bookのバージョン | 1 | egbk2フォーマットの場合は2で固定 |
登録局面数 | 4 | bookに登録された局面の数 |
局面情報 | (22+2*リンク数)*登録局面数 | 登録されている局面のデータ(下記参照) |
登録局面ごとに、以下のデータが保存されています。
項目 | データ量(バイト) | 内容 |
---|---|---|
手番の石の配置 | 8 | 64bitを使って64マスのそれぞれに手番の石があるかを格納します(MSBがa1) |
相手の石の配置 | 8 | 64bitを使って64マスのそれぞれに手番の石があるかを格納します(MSBがa1) |
評価値 | 1 | その局面の評価値 |
レベル | 1 | 局面の評価値を計算したAIのレベル |
リンク数 | 4 | その局面の合法手のうちbookに登録されている局面の数 |
リーフ情報 | 2*リンク数 | 登録されているリンクのデータ |
リンクごとに、以下のデータが保存されています。
項目 | データ量(バイト) | 内容 |
---|---|---|
リンクの評価値 | 1 | 合法手の評価値 |
リンクの手 | 1 | 登録されている合法手 |
拡張子は.egbk
です。Egaroucid 6.2.0まで使われていたものです。
項目 | データ量(バイト) | 内容 |
---|---|---|
登録局面数 | 4 | bookに登録された局面の数 |
局面情報 | 17*登録局面数 | 登録されている局面のデータ(下記参照) |
登録局面ごとに、以下のデータが保存されています。
項目 | データ量(バイト) | 内容 |
---|---|---|
手番の石の配置 | 8 | 64bitを使って64マスのそれぞれに手番の石があるかを格納します(MSBがa1) |
相手の石の配置 | 8 | 64bitを使って64マスのそれぞれに手番の石があるかを格納します(MSBがa1) |
評価値 | 1 | その局面の評価値に64を足したもの |