コンピュータ将棋基礎情報研究所

コンピュータ将棋に関する基礎的な情報を収集し、分析し、発表する所です。英語名称はLaboratory for Fundamental Information on Computer Shogi (LFICS)。

カテゴリ: コラム

二者で行う勝負事には相性というものがあります。二者間の勝率の期待値は必ずしも両者の実力差のみに依って決まるものではなく、相性にも依存するというわけです。極端な場合には、「AはBに勝ち越し、BはCに勝ち越すが、AはCに負け越す」といったような実力だけでは説明できない“じゃんけん”のような状態が出現することもあります。

イロレーティングにおいては、相性という要素は考慮されていません。相性を調べるにはイロレーティングを超えた解析が必要になります。イロレーティングについては「イロレーティング 1:棋力ってなんだ?」「2:あなたのレートは……」の解説記事をご参照ください。

相性を考慮すると、AのBに対する勝率の期待値P(A, B)から計算されるレート差

\[dr(A, B) = 400 \log_{10}(\frac{P(A, B)}{1 - P(A, B)})\]

は、両者のレートR(A)、R(B)のレート差

\[dR(A, B) = R(A) - R(B)\]

とは異なっているはずです。その差

\[x(A, B) = dR(A, B) - dr(A, B)\]

を“相性によるレート補正”と定義しましょう。イロレーティングの立場から見ると、この相性による系統的なずれは系統誤差ということになります。

今回は、floodgate棋譜集(2012~2016年版)において、この“相性によるレート補正”の大きさがどの程度であるのかを見積もりたいと思います。

もし勝率の期待値や両者のレートが精確に分かっているのであれば、上の式をそのまま計算することで、補正値を精確に算出することができます。しかしながら、現実のfloodgate棋譜集においては勝率の期待値もレートもそれなりに大きな不確かさを有しており、補正値を精確に求めることはできません(※補正値の不確かさは、各々の不確かさの二乗和の平方根)。

そこで、今回、考えるのは、個々の補正値ではなく、補正値の分布のばらつきの大きさです。個々の補正値の不確かさが大きくても、全体の分布のばらつきについてなら、ある程度は精度良く見積もることができます。

一般的に分布のばらつきの大きさDの二乗は、

\[D^{2} = \sum_{a, b} w(a, b) [x(a, b)]^{2}\]

と書くことができます。ここで、aとbについての和はデータがある全ての組み合わせについての和です。また、重み関数w(a, b)は

\[\sum_{a, b} w(a, b) = 1\]

のように規格化されています。

もし重み関数が定数であるならば、Dは標準偏差に該当します。しかしながら、x(a, b)は、aとbの組み合わせ毎に異なる不確かさs(a, b)を有しているため、不確かさの大きなデータと小さなデータを対等に取り扱うことは合理的ではありません。

このような時、(古典的な)統計学では、Dの不確かさUを最小にするように重み関数を決定します(※詳細は記事の最後に付記)。結果的に、不確かさの大きなデータの重みは小さくなり、不確かさの小さなデータの重みは大きくなります。

実際に用いるデータは、30手以上の投了決着棋譜に限定し、それぞれの組み合わせにおいて30勝以上かつ30敗以上のデータのみを採用します。また、計算に使用するレートの数値は最尤法によるものです。具体的には「floodgate棋譜集レートの最尤法との比較一覧(2012~2016年版)」をご覧ください。

結果は以下の通りです。レート毎の分類は、各組合せの平均レートで行っています。

  • 全体:D±U = 33.2±1.4
  • レート2000~2500:D±U = 33.5±2.0
  • レート2500~3000:D±U = 31.3±2.2
  • レート3000~3500:D±U = 39.5±4.0

結果的に、相性によるレート補正値の分布のばらつきの大きさは大体33程度だということが分かります。また、レート3000以上に限定すると、やや不確かさは大きいですが、40程度に上昇しています。

(以下、加筆と修正[2017年2月16日])

さて、上記のように単純に不確かさUを最小化してしまうと、重み関数w(a, b)が補正値x(a, b)に依存してしまいます。これはあまり性質がよくないので、重み関数が補正値に依存しないように、重み関数内の補正値の二乗をDの二乗で置き換えるという方法も考えられます(※詳細は記事の最後に追記)。

そのように重み関数を定数化した時の結果は以下の通りです。

  • 全体:D±U = 47.3±1.6
  • レート2000~2500:D±U = 50.0±2.5
  • レート2500~3000:D±U = 43.1±2.5
  • レート3000~3500:D±U = 50.6±4.4

この方法においては、補正値の大きなずれに対する抑制がかからないため、ばらつきの大きさが大きめに出る傾向があり、全体でも50弱の数値になっています。また、不確かさを最小にした場合に比べて、当然ですが、不確かさも大きくなっています。

この2つの方法は、それぞれ別の量を測っていますので、どちらが正しいというわけではありません。ものすごく大雑把に捉えると、方法に依りますが、レート補正値の分布のばらつきの大きさは大体30~50程度であるということは言えるでしょう。

以上、今回は、floodgate棋譜集(2012~2016年版)における“相性によるレート補正”の分布のばらつきの大きさを統計学的に見積もりました。結果として、方法に依りますが、大体30~50程度という数値が得られました。

もし仮に分布が正規分布であるとするならば、ばらつきの大きさの2倍であるレート60~100以上の相性差となる相手は22人に1人となり、3倍のレート90~150以上の相性差となる相手は370人に1人となります。

この結果は、あくまでもfloodgateの参加者に限定されたものであり、また、floodgate棋譜集のレート推定における理論誤差を含んだものであるという点には注意が必要です。

-------------------

付記:重み関数の計算

補正値x(a, b)が不確かさs(a, b)を有するということは、補正値は平均x(a, b)、標準偏差s(a, b)の確率分布に従う確率的な量であると考えることができます。以下の計算では、この確率分布を正規分布であると仮定します(※元々、補正値は3つの量の和/差であるため、中心極限定理を鑑みると、この仮定はそんなには悪くはないはずです)。

確率的な期待値として、Dの二乗を書き直すと、

\[D^{2} = \sum_{a, b} w(a, b) < [X(a, b)]^{2} - [s(a, b)]^{2} >\]

となります。ここで、X(a, b)は補正値の確率変数を表し、アングルブラケットは期待値を表しています(※確率分布の重みを付けての積分)。実際に、期待値を計算してみると、

\[D^{2} = \sum_{a, b} w(a, b) [x(a, b)]^{2}\]

となっています。

Dの不確かさUの二乗は、Dの二乗の不確かさを

\[u^{2} = < [ \sum_{a, b} w(a, b) [ [X(a, b)]^{2} - [s(a, b)]^{2} - D^{2} ] ]^{2} >\]

とすると、

\[D + U \approx \sqrt{D^{2} + u^{2}} \approx D + \frac{u}{2 D}\]

ですので、

\[U^{2} = \frac{u^{2}}{4 D^{2}}\]

となり、この期待値を注意深く計算すると、

\[U^{2} = \frac{1}{2 D^{2}} \sum_{a, b} [w(a, b)]^{2} [s(a, b)]^{2} [ 2 [x(a, b)]^{2} + [s(a, b)]^{2} ]\]

となります。

これを、規格化条件の下、重み関数w(a, b)について最小化すると(※ラグランジュの未定乗数法)、

\[D^{2} = \sqrt{\frac{V(4)}{V(0)}}\]

が得られ、また、

\[U^{2} = \frac{1}{V(2) + \sqrt{V(0) V(4)}}\]

も得られます。ここで、

\[V(n) = \sum_{a, b} \frac{[x(a, b)]^{n}}{[s(a, b)]^{2} [ 2 [x(a, b)]^{2} + [s(a, b)]^{2} ]}\]

を導入しました。

この時、重み関数w(a, b)は、

\[w(a, b) = \frac{(1 - U^{2} V(2)) / V(0) + U^{2} [x(a, b)]^{2}}{[s(a, b)]^{2} [ 2 [x(a, b)]^{2} + [s(a, b)]^{2} ]}\]

となります。

-------------------

追記:重み関数の定数化(2017年2月16日)

重み関数が補正値に依存しないように、重み関数内の補正値の二乗をDの二乗で置き換えると、

\[w(a, b) = \frac{1}{v(0) [s(a, b)]^{2} [ 2 D^{2} + [s(a, b)]^{2} ]}\]

と書くことができます。ここで、

\[v(n) = \sum_{a, b} \frac{[x(a, b)]^{n}}{[s(a, b)]^{2} [ 2 D^{2} + [s(a, b)]^{2} ]}\]

です。

この重み関数を用いると、Dの大きさは、

\[D^{2} = \sum_{a, b} w(a, b) [x(a, b)]^{2} = \frac{v(2)}{v(0)}\]

をDについて解くことで求めることができます。

適当な最尤法を用いると、大体はこの方法に近くなります。

将棋のような二人で行う順番制のゲームでは、最初の手番をどちらにするかで“先手”と“後手”とに分かれます。一般的に、先手と後手では初期条件が違いますので、ゲームの結果にも影響があります。

通常は、先に行動して利益が得られる先手が有利だとされていますが、例外もあります。例えば、どうぶつしょうぎは後手必勝であり、初期局面がzugzwang(できればパスしたい局面)になっています(参照:『「どうぶつしょうぎ」 の完全解析』)。また、リバーシ(オセロ)では、初期局面での先手の合法手は対称性を考慮すると実質的に1つだけですが、その手が得かどうかは定かではありません。6×6では後手必勝が確定していますが、8×8以降は不明であり、棋譜集に依りますが、勝率的にも互角に近いようです(例えば、「オセまにあ」では、10000局で先手の勝率49.8%)。

チェスでは先手の勝率が高く、先手有利と言われています(「first-move advantage」という)。例えば、「A Visual Look at 2 Million Chess Games」では、先手勝率38.8%、後手勝率29.8%、引き分け31.4%であり、引き分けを除くと、先手勝率56.6%、後手勝率43.4%になります(※チェスでは引き分けを0.5勝0.5敗として勝ち点率を計算するのが通例ですが、ここでは他と合わせるために引き分けを無視した場合の数値を記しています)。他の棋譜集でも似たような数字ですが、コンピュータチェスでは引き分けと先手勝率が少し上がるようです。例えば、「CCRL 40/40」では、執筆時点(2017年1月)で先手勝率34.5%、後手勝率25.6%、引き分け39.9%であり、引き分けを除くと、先手勝率57.4%、後手勝率42.6%(レート差51.8)となっています。

この有利/不利が存在するため、チェスの公式戦等では、両者が先手・後手を交互にもち、2局をセットにして偶数回の対局を行うのが通例です。互いに機会を平等にすれば、乱数を入れずに公平性が確保できます。ただし、偶数回の対局では五分五分の結果が出ることがあり、状況によっては大会運営を悩ませることにもなります。

囲碁でも先手が有利だと言われており、先手と後手を公平にするために「コミ」と呼ばれるハンデをつけています(日本ルールでは6目半)。コミの大きさが適切であるかは議論の余地のあるところであり、特にコンピュータ囲碁においては技術の進化と共に今後、変わっていくかもしれません。

将棋では、やや先手有利というのが定説であり、入玉等の一部のルールにおいては先手有利を前提としているかのような取り決めも見られます。ただし、ほとんどのルールにおいては先手と後手を平等なものとして取り扱っており、大会の運営においても先手と後手の差が考慮されることは通常はありません。この辺りは、コンピュータ将棋の大会等においても議論になることがあり、現在のルールには“本音と建前”の乖離があるのかもしれません(※)。

※ もし、将棋でも先手と後手を公平にしようとするのであれば、チェスのように偶数局にしたり、入玉宣言の点数に「コミ」を出したりするというようなことも考えられますが、副作用もありますので熟慮が必要になります。また、乱数を含めた公平性ということであれば、「振り駒」で確保できているとも言えますが(記事の最後に付記)、“運”の要素をどのように認めるのかについても議論の余地がありそうです。

さて、コンピュータ将棋における先手有利というのは実際にどの程度の有利さなのでしょうか? 今回は、この点を検証してみたいと思います。

まずは、単純に勝率を見てみましょう。

棋士棋譜集(2015年11月版)では、先手の22256勝19634敗であり、勝率53.13%(標準誤差0.24%)となっています。これをイロレーティングのレート差に換算すると、21.8(標準誤差1.7)となります。棋士における先手勝率は、棋譜集に依りますが、大体この程度の数値になります。

floodgate棋譜集(2012~2016年版)における結果は以下の通りです。

  • 全体:57900勝51931敗、勝率52.72%±0.15%、レート差18.9±1.0。
  • 2012:14611勝13311敗、勝率52.33%±0.30%、レート差16.2±2.1。
  • 2013:19241勝17333敗、勝率52.61%±0.26%、レート差18.1±1.8。
  • 2014:11729勝10260敗、勝率53.34%±0.34%、レート差23.2±2.3。
  • 2015: 7087勝 6544敗、勝率51.99%±0.43%、レート差13.8±3.0。
  • 2016: 5232勝 4483敗、勝率53.85%±0.51%、レート差26.8±3.5。

また、対局者の平均レートを3000以上の対局に絞ると、以下のようになります。ここで、レートの数値は最尤法による推定値を用いています。また、2012年は数が少ないので(29勝20敗)、ここには記載していません。

  • 全体:13633勝11876敗、勝率53.44%±0.31%、レート差24.0±2.2。
  • 2013: 4875勝 4157敗、勝率53.97%±0.52%、レート差27.7±3.7。
  • 2014: 3097勝 2564敗、勝率54.71%±0.66%、レート差32.8±4.6。
  • 2015: 2719勝 2564敗、勝率51.47%±0.69%、レート差10.2±4.8。
  • 2016: 2913勝 2571敗、勝率53.12%±0.67%、レート差21.7±4.7。

これらの結果をまとめると、先手の有利はレート差でおおよそ20程度、強豪同士では更にわずかに有利になるということが分かります。

次に、自己対局での勝率を見てみましょう。

探索深さ6の2015年のPonanzaでは、1700局で先手勝率51.82%(標準誤差1.21%)となるようです(参考:山本一成氏のツイッター)。これはレート差では、12.7(標準誤差8.4)となります。

手元にあるBonanza(6.0)、Apery(wcsc25_bmi2)、技巧(20160606)による結果では以下のようになっています。設定等は「手数と投了 5:自己対局における投了手数」をご参照ください。持ち時間は、1秒1000局、2秒1000局、4秒1000局、8秒1000局(技巧のみ無し)です。Bonanzaについては通常の定跡ファイルによる結果と宮本定跡を用いた結果があります。

  • Bonanza(通常定跡):2057勝1794敗、勝率53.41%±0.80%、レート差23.8±5.6。
  • Bonanza(宮本定跡):2091勝1795敗、勝率53.81%±0.80%、レート差26.5±5.6。
  • Apery:1873勝1852敗、勝率50.28%±0.82%、レート差2.0±5.7。
  • 技巧:1428勝1160敗、勝率55.18%±0.98%、レート差36.1±6.9。
  • 上記合計:7449勝6601敗、勝率53.02%±0.42%、レート差21.0±2.9。

結果を見ると、対局数があまり多くないこともありますが、レート差20の付近から大きくばらついています。自己対局の先手勝率はソフト毎にばらつきが大きいのかもしれません。

最後に、floodgate棋譜集(2012~2016年版)における先手と後手のレート差を最尤法で見積もってみましょう。

手法は以下の通りです。

  1. 各々の先手と後手を別者として、年度ごとにfloodgate棋譜集におけるレートを最尤法で推定する(棋譜数100、勝ち数5、負け数5以上の者に限定、手法の詳細は「最尤法によるレート推定と不確かさ」を参照)。
  2. 求めた推定値と標準不確かさから、さらに最尤法(最小二乗法)を用いて、先手と後手のレート差を推定する(詳細は記事の最後に付記)。

結果は以下の通りです。ここで、レートの分類は先手と後手の平均レートで行っており、標準不確かさは1000回のシミュレーション(モンテカルロ法)によって見積もっています。

  • 全体:レート差19.9±1.8。
  • レート2000~2500:レート差11.7±2.9。
  • レート2500~3000:レート差24.6±2.7。
  • レート3000~3500:レート差25.7±4.3。

この結果は勝率による結果と整合的になっています。勝率による結果と比べて不確かさが大きくなっているのは、棋譜採択の条件を絞っているためです。この結果から、勝率による単純な見積もりでも悪くないことが分かります。

詳細を眺めると、レート2500以下のソフトでは先手と後手のレート差が小さくなっており、これが全体のレート差を押し下げていることが見てとれます。レート2500以上のソフトに限ると、レート差はおおよそ25程度であるようです。

以上、今回は、コンピュータ将棋における先手の有利さを検証しました。勝率による見積もりにおいても、レート差による見積もりにおいても、レート2500以上のソフトにおいては先手と後手のレート差はおおよそ25程度であるということが分かりました。この数値はコンピュータチェスにおけるレート差50程度の約半分ということになります。

-------------------

付記:振り駒について

先手/後手を決める方法は各競技で様々なやり方があります。

例えば、リバーシでは、片方が手で隠した石の表の色をもう片方が当てる「伏石」という方法が使われます。また、チェスでは、片方が両手にそれぞれ隠した白と黒のポーンをもう片方が選んで色を決める「トス」という方法が使われ、囲碁では、片方が握った石の数が偶数か奇数かをもう片方が当てる「ニギリ」という方法が使われます。

将棋では、5枚の歩を落として表裏の枚数で先後を決める「振り駒」という方法が使われます。将棋の駒は落としても割れにくい素材でできているため、他のゲームよりも少し“荒っぽい”やり方になっており、この辺りも将棋の文化的な特徴の一つだと言えるでしょう。

「振り駒」が確率的に公平であるかどうかは難しい問題です。駒の表と裏とが対称であることを仮定するならば、五分五分になることが期待されるわけですが(先験的確率という)、これはあくまでも仮定の話であって現実ではありません。実際、例えば、コイン落としでは、コインの表と裏の重さが違うため、落とし方によっては大きく結果を偏らせることもできます。

プロの公式戦においては、真部一男九段の提案による調査により、1541局(2005年7月12日~2006年7月11日)で「歩」が50.36%(776局)であることが分かっています(※公式戦で振るのは記録係等の第三者)。この場合の標準誤差は1.27%ですので、結果は標準誤差の範囲内に収まっています。つまり、数%以上の大きな偏りがある可能性は少ないという結果です。ただし、この結果は「公式戦の振り駒の結果に大きな偏りが見られなかった」というだけのことであり、「大きな偏りの出る振り方が存在しない」ということまでは意味しません。

現実の駒が表裏非対称であり、また、持ち方や振り方の自由度がある以上は、何かしら大きな偏りを出す方法はあるのではないかという気はします。この辺のことは「振り駒」の研究よりも「まわり将棋」の研究の方が相応しいかもしれません。

-------------------

付記:先手と後手のレート差の最尤法(最小二乗法)による推定

参加者iの先手におけるレート推定値をr(i)、標準不確かさをs(i)とし、後手におけるレート推定値をR(i)、標準不確かさをS(i)とする時、参加者iの平均レート推定値がm(i)、先手と後手のレート差がdとなる確率Pの自然対数は、確率分布を正規分布と仮定すると、

\[\ln{P} = - \sum_{i} \left[ \frac{[ m(i) + d / 2 - r(i) ]^{2}}{2 s(i)^{2}} + \frac{[ m(i) - d / 2 - R(i) ]^{2}}{2 S(i)^{2}} \right]\]

となります。

最尤法(最小二乗法)では、この確率Pをm(i)とdについて最大化(最小二乗誤差を最小化)すればよいので、

\[\frac{\partial{\ln{P}}}{\partial{m(i)}} = 0\]

\[\frac{\partial{\ln{P}}}{\partial{d}} = 0\]

を解けばよいことになります。

実際に偏微分を計算して、解を求めると、

\[m(i) = \frac{S(i)^{2} r(i) + s(i)^{2} R(i)}{s(i)^{2} + S(i)^{2}} + \frac{s(i)^{2} - S(i)^{2}}{s(i)^{2} + S(i)^{2}} \frac{d}{2}\]

\[d = \left[ \sum_{i} \frac{1}{s(i)^{2} + S(i)^{2}} \right]^{-1} \sum_{i} \frac{r(i) - R(i)}{s(i)^{2} + S(i)^{2}}\]

という結果が得られます。

この結果は、特に、先手と後手のレート差dについて、不確かさによる重みを付けた先手と後手のレート推定値の差の平均となっていることから、妥当なものであると考えられます。また、相対差を取っていますので、レート推定値の絶対値に対する誤差はdには直接的に影響しないようになっています。

-------------------

追記:先手と後手のレート差の分布のばらつきの大きさ(2017年2月16日)

上述の付記の最尤法(最小二乗法)による推定手法は、重み関数を不確かさについて最小化する統計学的手法と結果的に一致しています。

さらに、同様の手法により、先手と後手のレート差の分布のばらつきの大きさも見積もってみましょう。手法の詳細は「ソフトの相性:ふたりの距離の統計的概算」の記事と同じです。

結果は以下の通りです。レート毎に分類した結果も示します。

  • 全体:23.6±1.8(最小不確かさ)、28.4±2.0(重み関数定数化)
  • レート2000~2500:20.9±2.7(最小不確かさ)、26.7±3.1(重み関数定数化)
  • レート2500~3000:23.0±2.8(最小不確かさ)、26.3±3.0(重み関数定数化)
  • レート3000~3500:29.4±4.7(最小不確かさ)、32.3±4.9(重み関数定数化)

結果を見る限り、どうやら先手の有利さはソフトによってばらつきが大きいようです。

手数と投了 7:floodgateにおける投了手数 改」では、floodgate棋譜集における投了手数の詳細を解析し、平均手数(読みの類似度)とレートとの関係を論じました。ここでは、さらに詳細に対局者毎に関係を整理してみたいと思います。

具体的には、floodgate棋譜集(2012~2016年版)から30手以上230手以下の投了決着棋譜に限定し、さらにレート差200以内で勝ち数と負け数が共に50以上ある対局者の組み合わせを選出しました。floodgate棋譜集については以下をご参照ください。

各組合せにおける平均手数Tから、読みの類似度Yを

\[Y = \frac{T - M}{M}\]

と定義します。ここで、Mは平均手数の平均に対応する量ですが、以下では、

\[M = 130\]

としています。また、平均手数Tは、勝ち棋譜と負け棋譜で別々に算出して、その算術平均を取ることで勝率補正を行っています(参照:「floodgateにおける手数とレート差:棋士との違いは?」)。この定義では、Yの値が正で大きい程、読みが類似しているということになり、負の値になると平均よりも読みが異なっているということになります。

誤差の目安としては、1局の標準偏差を約30手とすると、対局数nの標準誤差SEは

\[\text{SE} = \frac{30}{z \sqrt{n}} \approx \frac{0.23}{\sqrt{n}} \]

程度と見積もれます。100局なら0.023程度で、1000局なら0.007程度です。ただし、平均手数は投了設定に依存するため、読みの類似度としては投了設定が系統誤差を生むことがあり、注意が必要になります。

該当する対局者の組み合わせ毎に、対局者の平均レートと読みの類似度Yとの関係を表示したのが下図です。棋譜集の年毎に点の色を変えています。また、オレンジ色の線と点は、それぞれレート500刻み区間の平均値を表しています。

mr-ruijido

上図を見ると、対局者毎に分けて表示を行っても、全体的な傾向としては、「手数と投了 7:floodgateにおける投了手数 改」の記事の結果と同様の構造を示していることが分かります。

さらに、詳細な対局者リストを記事の最後に付記します。

リストを眺めると、2013年版の「amatyan」と「Titanda_L」の組み合わせは突出して類似度が高く、同じソフトを動かしていたのではないかと推測されます。その他の類似度の高い組み合わせは、名前を見る限り、別のソフト同士の組み合わせが多く、平均手数が長いからと言って必ずしも同一ソフトとは認定できないことが分かります。

一方で、類似度の低い組み合わせを見ると、名前から同じソフトだと思われる組み合わせはほとんど見つからず、平均手数が短い場合には同一ソフトではないだろうということは言えるかもしれません。

ただし、所々に解釈が難しい結果があります。

例えば、2012年の「gps_l (171) - gps_ (277)」は名前からしてgps同士の対局ですが、類似度は-0.072とやや低くなっています。対局数も多いので偶然とも考えづらく、「gps_」は従来のgpsとは異なる動作をしていたのではないかと考えられます。勝敗毎に類似度の内訳を見てみると、「gps_」が負けた時に-0.116と非常に低い値になっているため(※レート上位者が負ける時は本来は手数が伸びる傾向がある)、「gps_」の投了設定が低くなっていたか、予想外の進行で負けるような何かがプログラムにあったのだと思われます。

また、2013年の「gps_l (148) - bona6.0_norm (176)」は-0.097、2014年の「gps_l (128) - bonanza6.0 (365)」は-0.130と低い類似度になっていますが、一方で、2013年の「gps_l (493) - Bonanza6.0-Opteron250-2c (1032)」は+0.071、2014年の「gps_l (113) - Bonanza6.0-Opteron250-2c (229)」は+0.058と正の類似度になっており、もしどちらも「gps_l」とBonanza6.0との対局だとすると、整合的ではありません。これも勝敗毎の内訳を見てみると、Bonanza6.0側が勝った場合には大きな差はなく、負けた場合にのみ平均40手程度の大きな差がついています。もしかすると「bona6.0_norm」「bonanza6.0」の投了設定が非常に低く設定されていたのかもしれません。

また、2013年の「BlunderXX_4c (231) - BlunderXX_Q6700_2c 348)」は同じソフト同士の対局だと思われますが、類似度は+0.003と高くありません。こちらは勝敗毎の内訳を見ても不自然なところはないため、BlunderXX自体の自己対局における平均手数が短いか、両者共に投了設定を低くしていたかのどちらかだと思われます。

この辺は、平均手数しか見ていないことの限界でしょう。

以上、今回は、floodgate棋譜集(2012~2016年版)から、平均手数(読みの類似度)とレートとの関係を対局者毎に整理しました。結果として、投了設定等の系統誤差により機能していないと思われるデータも散見されるものの、全体的には平均手数から読みの類似度が推測できることが確認できました。

-------------------

付記:floodgateにおける読みの類似度リスト(2012~2016年版)

読みの類似度: 低レート対局者 (勝利数) - 高レート対局者 (勝利数)

2012年

  • 平均レート2500以下
+0.121:         gps_normal ( 51) -                simk_test ( 82)
+0.107:               mcts (269) -               gps_normal (327)
+0.098:         gps_normal (195) - sakurapyon-2012-0.015kpp (281)
+0.066:         gps_normal (125) -                     mumu (172)
+0.061:         Kakinoki-Z (358) -               gps_normal (510)
+0.060:         gps_normal ( 57) - sakurapyon-2012-0.022kpp (134)
+0.057:         gps_normal (195) -            Kakinoki-Test (183)
+0.054:                YSS ( 55) -                    bingo ( 53)
+0.046:         gps_normal ( 67) -               kuma2_test (119)
+0.041:      Kakinoki-Test ( 51) -                simk_test ( 56)
+0.021:               mumu ( 55) -                    bingo ( 58)
+0.020:         Kakinoki-Z ( 78) -                     mumu ( 68)
+0.019:              bingo (147) -                    gps_l (524)
+0.016:         Kakinoki-Z (142) -            Kakinoki-Test (159)
+0.012:         gps_normal (203) -                    bingo (408)
+0.003:              bingo (210) -             BlunderXX_4c (248)
-0.003:      Kakinoki-Test ( 65) -                    bingo (108)
-0.005:       BlunderXX_4c (676) -                    gps_l (589)
-0.028:         Kakinoki-Z ( 55) -               kuma2_test ( 95)
-0.073:         gps_normal ( 51) -          Sunfish1.20_X6t ( 69)
  • 平均レート2500~3000
+0.127:      co-danaka-kun ( 61) -           ponanza-990XEE ( 75)
+0.009:          Titanda_L ( 69) -             PuppetMaster (135)
+0.002:   BlunderXX-2820QM ( 64) -                Titanda_L ( 53)
-0.027:          Titanda_L (136) -         Keep_firmness1.4 (168)
-0.050:          Titanda_L (112) -         Keep_firmness1.3 (136)
-0.054:              gps_l (102) -                     Keep (130)
-0.055:   BlunderXX-2820QM ( 50) -         Keep_firmness1.3 ( 78)
-0.057: Gekisashi_X5590_1c ( 50) -         Keep_firmness1.3 ( 94)
-0.059:              gps_l (215) -                  Bonanza (454)
-0.069: Gekisashi_X5590_1c ( 63) -                Titanda_L ( 73)
-0.072:              gps_l (171) -                     gps_ (277)
-0.073: Gekisashi_X5590_1c ( 88) -              bona_Sinobu (113)
-0.133:              gps_l (203) -                     poor (352)
-0.148:       BlunderXX_4c (114) -                     gps_ (122)
-0.186:               poor (154) -                  Bonanza (204)
-0.210:       BlunderXX_4c ( 57) -                     poor (180)

2013年

  • 平均レート2500以下
+0.133:                   gps_normal (141) -                      rgm_008 (128)
+0.112:                      vps_mc2 (106) -                   gps_normal (119)
+0.102:                   gps_normal (328) -             Sunfish3-trial24 (427)
+0.079:                      rgm_009 ( 65) -                   gps_normal ( 79)
+0.070:                   gps_normal (278) -                   Kakinoki-Z (318)
+0.053:                   gps_normal (453) -               sakurapyon_dti (727)
+0.053:                   gps_normal (138) -              sakurapyon_2013 (301)
+0.036:               sakurapyon_dti (157) -                sakurapyon_4G (659)
+0.030:                   gps_normal (300) -                sakurapyon_4G (922)
+0.025:              sakurapyon_test ( 91) -                   gps_normal (200)
-0.002:             Sunfish3-trial24 ( 67) -                sakurapyon_4G (292)
-0.009:                   Kakinoki-Z ( 70) -              sakurapyon_2013 ( 89)
-0.012:             Sunfish3-trial24 ( 55) -              sakurapyon_2013 (176)
-0.015:             Sunfish3-trial24 (252) -               sakurapyon_dti (269)
-0.024:                      rgm_008 ( 62) -                sakurapyon_4G (148)
-0.044:                      vps_mc2 ( 75) -               sakurapyon_dti (123)
  • 平均レート2500~3000
+0.071:                        gps_l (493) -    Bonanza6.0-Opteron250-2c (1032)
+0.068:                        ponyo (117) -    Bonanza6.0-Opteron250-2c ( 177)
+0.032:     Bonanza6.0-Opteron250-2c (461) -          BlunderXX_Q6700_2c ( 766)
+0.032:     Bonanza6.0-Opteron250-2c (226) -                BlunderXX_4c ( 289)
+0.017:                        gps_l (138) -                       ponyo ( 213)
+0.007:                        kato2 ( 65) -    Bonanza6.0-Opteron250-2c (  87)
+0.003:                 BlunderXX_4c (231) -          BlunderXX_Q6700_2c ( 348)
+0.002:                        gps_l (179) -                BlunderXX_4c ( 400)
-0.019:                        ponyo ( 65) -          BlunderXX_Q6700_2c ( 122)
-0.020:                        ponyo (126) -                BlunderXX_4c ( 181)
-0.022:                        gps_l (130) -                       kato2 ( 169)
-0.025:           BlunderXX_Q6700_2c (142) -          Gekisashi_X5590_1c ( 277)
-0.059:     Bonanza6.0-Opteron250-2c ( 71) -                      Flummi ( 113)
-0.077:                        kato2 ( 93) -          BlunderXX_Q6700_2c ( 211)
-0.078:                        kato2 ( 67) -                BlunderXX_4c (  79)
-0.097:                        gps_l (148) -                bona6.0_norm ( 176)
  • 平均レート3000以上
+0.219:                      amatyan ( 59) -                    Titanda_L (103)
+0.156:                    Titanda_L (151) -               ponanza-990XEE (411)
+0.111:                      amatyan ( 52) - NineDayFever_XeonE5-2690_16c (129)
+0.107:                   jidaiokure ( 53) -                    Titanda_L ( 76)
+0.098:           Gekisashi_X5590_7c (103) -               ponanza-990XEE (100)
+0.085:                 PuppetMaster (137) -               ponanza-990XEE (120)
+0.083:                    Titanda_L (254) - NineDayFever_XeonE5-2690_16c (566)
+0.067:               gps_f_testbook ( 73) -                 PuppetMaster ( 90)
+0.067: NineDayFever_XeonE5-2690_16c (172) -               ponanza-990XEE (217)
+0.019:                 PuppetMaster (120) -               maybe_tomorrow (161)
+0.014:            tsutsukana_1303p3 ( 52) - NineDayFever_XeonE5-2690_16c ( 73)
+0.003:                 PuppetMaster (206) -           Gekisashi_X5590_7c (252)
-0.005:           Gekisashi_X5590_1c (192) -                 PuppetMaster (430)
-0.006: NineDayFever_XeonE5-2690_16c ( 92) -                gpsfish_x5680 ( 90)
-0.070:             BlunderXX-WCSC23 ( 64) -                gpsfish_x5680 (103)

2014年

  • 平均レート2500以下
+0.103:               gps_normal (121) -             Bonanza_6.0_RPi ( 204)
+0.065:               gps_normal (842) -                  Kakinoki-Z (1183)
+0.059:               gps_normal (233) -              sakurapyon_vps ( 672)
+0.046:               gps_normal (152) -               sakurapyon_4G ( 458)
+0.034:               gps_normal (121) -      bonanza_on_RaspberryPi ( 153)
+0.020:               Kakinoki-Z (279) -              sakurapyon_vps ( 384)
+0.008:               Kakinoki-Z (116) -               sakurapyon_4G ( 246)
-0.016:          Bonanza_6.0_RPi (105) -                  Kakinoki-Z ( 129)
-0.032:          Bonanza_6.0_RPi ( 67) -              sakurapyon_vps ( 125)
  • 平均レート2500~3000
+0.068:     GPSShogi_AMD_C-60_2c ( 95) -                        gps_l ( 67)
+0.058:                    gps_l (113) -     Bonanza6.0-Opteron250-2c (229)
-0.033:                    gps_l (179) -                        kato2 (471)
-0.068: Bonanza6.0-Opteron250-2c ( 69) -                      Flummi2 (168)
-0.087:        gpsfish_normal_1c ( 62) -                     KeepTheF ( 96)
-0.093:                  flummi2 ( 79) -                        kato2 (136)
-0.099:                    gps_l ( 64) -                      flummi2 (217)
-0.107:                    gps_l (123) -                       Flummi (272)
-0.128:                    kato2 ( 81) -                      Flummi2 (112)
-0.130:                    gps_l (128) -                   bonanza6.0 (365)
  • 平均レート3000以上
+0.160:        AWAKE_i7_2620M_2c (121) -        gpsfish_XeonX5680_12c ( 97)
+0.132:    gpsfish_XeonX5680_12c ( 69) -               ponanza-990XEE (128)
+0.130:                Titanda_L ( 70) -               Apery_2700K_4c ( 77)
+0.128:                Titanda_L (253) -        gpsfish_XeonX5680_12c (870)
+0.105:            ponax_i7_3770 ( 54) -        gpsfish_XeonX5680_12c ( 66)
+0.089:    gpsfish_XeonX5680_12c ( 77) - NineDayFever_XeonE5-2690_16c (277)
+0.052:                CrazyKing (135) -        gpsfish_XeonX5680_12c (220)
+0.039:                Titanda_L (101) -                    CrazyKing (142)
-0.035:                CrazyKing ( 60) - NineDayFever_XeonE5-2690_16c (158)

2015年

  • 平均レート2500以下
+0.060:                      acop ( 69) -                       ddd ( 58)
  • 平均レート2500~3000
+0.051:                NewMorning (123) -                  Kingfish (136)
-0.059:                     kato2 ( 90) -         gpsfish_normal_1c (238)
-0.060:         gpsfish_normal_1c ( 61) -                   suzuran ( 65)
-0.069:                NewMorning (322) -         gpsfish_normal_1c (683)
-0.071:                  Kingfish (182) -         gpsfish_normal_1c (298)
-0.110:                     gps_l ( 87) -                   flummi2 (233)
-0.120:                   flummi2 ( 51) -                     kato2 ( 72)
  • 平均レート3000以上
+0.134:                     stap5 ( 63) - gpsfish_XeonX5680_12c_bid (130)
+0.113: gpsfish_XeonX5680_12c_bid ( 87) -                      ycas ( 78)
+0.104:             tanuki-_5500U ( 97) - gpsfish_XeonX5680_12c_bid (157)
+0.099:                 Titanda_L ( 64) -     gpsfish_XeonX5680_12c (109)
+0.093: gpsfish_XeonX5680_12c_bid ( 58) -                      AUJK ( 61)
+0.092:                 Titanda_L ( 54) -              gpsfish_mini ( 65)
+0.081: gpsfish_XeonX5680_12c_bid ( 68) -             Apery_i7-5820 (136)
+0.077:            Apery_20151016 ( 53) - gpsfish_XeonX5680_12c_bid ( 60)

2016年

  • 平均レート2500以下
+0.008:                     gps_l ( 50) -                   aggressor (104)
  • 平均レート2500~3000
+0.019:         gpsfish_normal_1c (170) -        Gc_Test_Cortex-A7_2c (249)
+0.006:                 Starbound ( 59) - Apery32_tmmod_3735F-4thread (109)
-0.013:                 Ydebug185 ( 72) -           gpsfish_normal_1c ( 60)
-0.017:         gpsfish_normal_1c (200) -                   Starbound (207)
-0.097:         gpsfish_normal_1c (103) - Apery32_tmmod_3735F-4thread (151)
  • 平均レート3000以上
+0.116:    nanoTwig_FX9590_4.7GHz ( 94) -   gpsfish_XeonX5680_12c_bid (177)
+0.111: gpsfish_XeonX5680_12c_bid ( 72) -                        ANSM (164)

前回の記事「評価値という数値 1:一歩百点?」では、評価値が本来は順序尺度であることを指摘し、なぜ将棋の評価値が比率尺度として取り扱われているのかを説明しました。今回は、将棋の評価値を別の形で表現する方法について考えてみたいと思います。

コンピュータ囲碁においては、評価値は0~100%までの“勝率”で表現されます。囲碁では「駒得/駒損」のような分かりやすい指標がなく、また、目数の期待値を用いた従来的な形勢判断もコンピュータ囲碁では有効ではなかったため、勝率の予測値がそのまま評価値となりました。“勝率”は「ゲームの特性」や「評価関数の設計」に依存しない表現であるため、評価値の普遍的な表現方法の一つだと言えます。

コンピュータ将棋においても、評価値を“勝率”に換算して表そうという考え方があります。形式的には、評価値をVとすると、値域が[0, 1]である単調増加関数fを用いて、

\[P = f(V)\]

と変換することで、“勝率”Pに換算することができます。

ここで、“勝率”とは何を意味しているのでしょうか? この定義がはっきりしないと、関数fを具体的に定めることができません。

“勝率”の定義については、おおよそ以下のような考え方があります。

  1. シミュレーションによる勝率。
  2. 棋譜集における勝率。
  3. 自己対局による勝率。
  4. ある関数fによる換算値を“勝率”と定義して、意味は後で検証する。

1つ目の考え方は、モンテカルロ囲碁などで採用されている考え方です。定義はシミュレーションの手法に依存しますので、シミュレーションを1つの評価関数とした時の評価値と考えるのが妥当かも知れません。形勢判断の精確性もシミュレーションの精確性に依存します。将棋では、現在はモンテカルロ法は有効ではないされているため、この考え方は非常に少数です。

2つ目の考え方は、棋譜集内の局面の評価値と勝敗結果を結び付けたものであり、最も一般的な手法です。例えば、「勝率に基づく評価関数の評価と最適化」の論文では、将棋倶楽部24の棋譜9万局を用いて(ただし、勝敗判定には対局者自身の投了の他に簡単な詰め判定も併用)、当時のGPS将棋の静的評価値と勝率との関係を算出しています。この手法は棋譜集に大きく依存し、精確性を追求するには高品質な棋譜が大量に必要となります。

3つ目の考え方は、2つ目の考え方の亜種であり、棋譜集の代わりに自己対局の棋譜を用いるというものです。評価値は基本的に自分自身で使うためのものであるため、短時間の自己対局の勝率を用いるのは合理的です。また、自己完結した手法であるため、きれいな結果も得られるようです(参照:Ponanzaによる結果)。この手法は探索局面数/深さに依存します。また、現実的な対局時間よりも遥かに少ない時間での自己対局の場合には、実質的には1つ目のシミュレーションによる勝率に近くなっていると考えられます。

以上の3つの考え方は、評価値が表している形勢判断について、検証的な視点が暗黙的に盛り込まれています。実際に、詳細な定義を行えば、関数fを統計的に推定することもできますし、評価値と勝率の整合性を確認することもできます(関数が単調にならなかったり、滑らかにならなかったりすると非整合的)。さらに発展させて、整合性がよくなるように強化学習を行ったり、学習時の教師局面の精査を行ったりすることも可能です。

一方で、4つ目の考え方は、評価値に完全に従属したものであり、自然科学でよく使われる手法です。定義と検証を分離することで理論の整備がしやすくなります。例えば、Ponanzaは、学習時に

\[P = f(V) = \frac{1}{1 + e^{- V / 600}}\]

という仮定をしているようです(参照)。この関数はシグモイド関数と呼ばれるもので、自然科学一般でよく使われます(これを見て「フェルミ分布」と言うのは物理学だけでしょう)。

さて、一般論として、関数f(V)はどのような形になるべきなのでしょうか?

例えば、酔歩模型ではどうなるのかを見てみましょう。酔歩模型については「将棋は酔歩ではない?:酔歩模型と手数分布」の記事をご参照ください。

棋士棋譜集(2015年11月版)とfloodgate棋譜集(2012~2015年版)で調整された変数を用いて、シミュレーションした結果を下図に示します。棋士棋譜集(黒点)とfloodgate棋譜集(青点)共に、各点1000万回の結果です。

random_walk_syouritu

結果を見ると、変数の詳細には関係なく、ほぼ比例関係になっています。変形評価値が±1のところで跳んでいるのは模型の問題です(ギリギリでも引き返して逆転する可能性があるため)。

つまり、細かいことに目をつむると、変形評価値

\[X = F(V)\]

と勝率Pとの間には、

\[P \approx \frac{1 + X}{2} = \frac{1 + F(V)}{2}\]

という近似関係式が成立していることになります。

変形評価値は、例えば、

\[X \approx \text{tanh}(\frac{V}{2 u})\]

というような関数でした。この場合、勝率は

\[P \approx \frac{1}{1 + e^{- V / u}}\]

となり、シグモイド関数になります。ここで、uは評価値のスケールを決める変数です。上記のPonanzaの例では600点(おそらくセンチポーンで)でした。

具体的に、シグモイド関数というのは下図のような関数です。

fig1

酔歩模型に依れば、評価値と勝率との関係はおおよそ上図のようになると考えられます。この結果は記事の最初に紹介した様々な結果とおおよそ整合的です。

シグモイド関数はイロレーティングでも使われています(参照:「イロレーティングにおけるレート差と勝率との関係」)。イロレーティングにおける勝率Pとレート差dRとの関係式は

\[P = \frac{1}{1 + 10^{- dR / 400}}\]

です。

上記の式をまとめると、評価値Vとレート差dRとの間には

\[dR \approx 173.7 \frac{V}{u}\]

という比例関係の近似式が導けます。例えば、u = 600の場合には、比例係数は0.29程度になります。

もし評価値とレート差との間の対応がつくと、棋力差、局面の形勢、持ち時間、平均誤差等が全てレートに統一的に換算できることになります。そうなると、勝敗以外の大量の情報を総括的に活用できるようになりますので、序盤、中盤、終盤、残り時間などの様々な状況ごとにレートを詳細に推定したり、評価値だけではなく全体のレート差を最適化するような指し回しをしたりするようなことも可能になるかもしれません。

以上、今回は、将棋の評価値を“勝率”やレート差で表現することを考えました。酔歩模型に依れば、評価値はレート差とおおよそ比例関係になることが示されます。レート差への換算係数は、“勝率”の定義やソフトの詳細に依存しますが、思いっきり大雑把には0.3程度になりそうです。この辺の詳細な研究は今後の課題だと言えるでしょう。

コンピュータ将棋では局面の形勢を「評価値」という数値で表現します。将棋ソフトの指し手は評価値に基づいて決定され、また、検討や解析における形勢も評価値の“点数”として表示されます。今や評価値は、将棋ソフトの利用者にとって、とても身近な量になっていると言えるでしょう。

もし将棋が完全解析できたとするならば、局面は勝ち・負け・引き分けの3つの値(ゲーム値)に分類できるはずです。しかしながら、現実には完全解析は不可能なため、局面を評価するのにゲーム値の推測値が用いられることになります。これが評価値です。先を全て見通すことができないということが前提となっているため、評価値には未確定な未来への展望が織り込まれています。

評価値がゲーム値の近似値であるのならば、一見すると、ゲーム値に近い極端な値の評価関数が優れているように思えます。極論的には、ゲーム値と同じく評価値も-1、0、+1の3種類でいいのではないかと考えられるわけです。ところが、そのような評価関数では、探索を深くしても弱くなるという問題(探索の病理)が発生し、うまくいかないということが知られています。評価値はゲーム値の近似値というよりは、何らかの期待値の推測値であるわけです。

多くの将棋ソフトでは、一歩の価値を100点程度(歩を取る場合には、相手-100点、自分+100点で200点差)として、評価値は-32768から+32767の間の整数で表されます。これは16ビットの符号付き整数の範囲であり、探索の病理を避けるのに十分なだけの値の細やかさを確保しつつ、なるべく記憶容量を節約したいという実装になっています。

さて、この評価値ですが、尺度として見ると、かなり“奇妙”な量になっています。特に「一歩100点」という表現は、評価値の説明の常套句でありながら、よく考えてみると“奇妙”な表現であることに気付きます。今回は、この評価値という数値の“奇妙さ”について、少し考えてみたいと思います。

一般的に定量的な尺度には、順序尺度、間隔尺度、比率尺度があります。順序尺度は数値で大小の比較ができる量で、例えば、地震の震度です。震度は数値が大きいほど、揺れの強さが大きくなります。間隔尺度は、順序尺度に加えて、数値の間の間隔が等しく、単位(物差し)で測れる量です。例えば、長さや重さは間隔尺度ですが、震度は単位で測るものではないので、間隔尺度ではありません。比率尺度は、間隔尺度に加えて、原点の零が定まっており、数値の比にも意味のある量です。

本来、将棋の形勢を表す量は、順序尺度であって、間隔尺度や比率尺度ではないはずです。人間でもコンピュータでも複数の局面を比較して(人間の場合には局面以外の情報も加味することがありますが)優劣の順序を付けることが形勢判断の肝であり、実際、探索で指し手を決めるのは順序尺度で事足ります。もちろん、順序尺度の性質を有しているという点では間隔尺度や比率尺度でも構わないですし、また、その方が枝刈り等が効率的になるというような利点があるかもしれませんが、間隔尺度や比率尺度である必要はないわけです。

一方で、「一歩100点」という表現は、歩1枚を単位とするということを意味していますから、評価値が間隔尺度であることを暗に示唆しています。また、本来なら初期局面を評価値の原点に選んでも問題ないはずですが、実際にはそうなっておらず、評価値の原点は、その評価関数が互角と考える局面になっており、これは評価値が比率尺度であることを示唆していると考えられます。

つまり、本来は順序尺度で十分な量が、評価値では比率尺度に拡張されているわけです。

この“奇妙”な飛躍が人々に違和感を感じさせます。例えば、「歩1枚で100点なので、500点の局面は歩5枚分です」というような比率尺度に基づいた説明は、内容的には正しくても、人々を納得させることは困難でしょう。通常、人間は比率尺度で形勢を判断しないからです。

それでは、コンピュータ将棋の評価値(大元を辿れば、コンピュータチェスの評価値)はなぜ歩兵(ポーン)を単位とした比率尺度になっているのでしょうか?

理由は大きく2つあると考えられます。1つはチェスや将棋のゲームの特性に基づくものであり、もう1つは評価関数の設計に基づくものです。

チェスや将棋は「駒得/駒損」が基本となるゲームです。そのため、最も価値が低い歩兵を1点として他の駒の価値を点数化することは、コンピュータが発達する以前から、自然と行われてきました。実際に、「駒得/駒損」の評価だけでもかなり強いソフトを作ることができますし、子供に将棋を教える際にも最初に駒の機能と価値を教えることになります。

この「駒得/駒損」という考え方がチェスや将棋の評価値の背景になっています。実際、このゲームの特性から、コンピュータチェスでは歩兵を1点とし、さらに細かい表現ができるように100倍した単位(センチポーン)が標準となりました。それが将棋に輸入されて「一歩100点」となったわけです。

さらに、チェスや将棋の評価関数は、評価項目ごとの点数の足し算(線形和)が基本になっています。例えば、歩(100点)3枚と銀(400点)1枚なら合計は700点になるというわけです(駒の位置関係等も同様)。習甦などの一部のソフトは非線形な評価関数(つまり線形和ではない一般の関数)を採用していますが、ボナンザ系や激指(実現確率探索)系など、ほとんどのソフトは線形和を採用しています。これは取り扱いが簡単であることに加えて、実際にそれで上手く行っているという経験的な理由に依っています。

評価関数が線形和であるのならば、評価値が比率尺度になるのは自然なことになります。「500点の局面は歩5枚分」という説明も内部の仕組みとして実は正しかったということになるわけです。

しかしながら、これら「ゲームの特性」や「評価関数の設計」に依存する表現は、あまり美しくないと感じられる方もいるかもしれません。実際に、現在でも非線形な評価関数のソフトは存在しますし、将来、それが主流になる時代が来ないとも限りません。また、大体「一歩100点」と言っても、ソフト毎に微妙に異なりますし、一歩の価値をどう見るかも高度な棋力になってくるとばらついてきて、評価関数の規格化がソフトやバージョンで大きく変わるということも発生しています。去年のPonanzaは評価値が高めに出ていたが、今年の評価値は何故か低めに出るなんてことも起こるわけです。

いずれにしても、「評価値は本来は比率尺度ではない」というのは注意が必要なことですし、比率尺度としての評価値に対しても、できるだけ「ゲームの特性」や「評価関数の設計」に依存しないようにするのには意味があります。例えば、評価関数の規格化は「多数の標準局面を標準的な手法で評価して、その統計平均を標準値に合わせるようにする」というような形で統一すれば、ソフトやバージョン毎のばらつきを減らせるかもしれません。また、標準規格化への換算係数をGUI側で設定できるようにして、評価値の出力の際にGUI側で換算することにすれば、ソフト開発側の負担も軽減できるかと思われます。

コンピュータ将棋においては、評価値は暗黙に比率尺度として取り扱われています。本ブログの記事でも同様です。評価値を比率尺度として取り扱う以上は、“標準化”が課題になるのは避けられないことでしょう。

以上、今回は、評価値という数値の“奇妙さ”について考えました。「評価値は本来は比率尺度ではない」ということを鑑みると、何らかの変数変換を行えば、別の評価値表現が可能になります。例えば、囲碁では評価値を“勝率”として表現していますが、これは将棋でもできることです。次回は、その辺の話を書きたいと思います。

-------------------

追記:USIプロトコルにおける評価値情報について(2017年1月3日)

「うさぴょんの育ての親」様のコメントで気付いたのですが、評価値の話を書いているのにUSI(Universal Shogi Interface)のことに触れなかったのは手抜かりでした。追記します。

GUIソフト(将棋所やShogiGUI等)と思考エンジンとの通信に標準的に使われているのが、USIプロトコルです。ソフトによっては元のプロトコルを一部拡張して用いていることもあります。将棋所のサイトに詳細な説明があります。

USIでは、評価値の通信は「info score」で行います。上記のサイトでは、以下のように説明されています。

エンジンによる現在の評価値を返します。score cpで評価値を返す場合、歩1枚の価値を100とした値を返すことになります。(cpというのは、centi pawnの略です。)この値は、エンジンの側から見た値となり、エンジンが有利ならプラス、エンジンが不利ならマイナスの値になります。エンジンが50点有利と判断しているならscore cp 50となります。

つまり、「info score cp 50」と送ると、「1歩100点の単位で50点有利」という意味になるということです。これは、元のUCI(Universal Chess Interface)の仕様をそのまま引き継いでいます。

通常、GUIソフトはこの点数をそのまま表示しますので、USIの仕様通りであれば、1歩100点の単位で表示されるはずです。ただし、非USIソフトやUSIであっても仕様通りの実装になっていないソフトの場合には必ずしもその限りではありません。

さらに、「info score mate」というものもあります(通称mate)。これは詰みに関するもので、以下のように説明されています。

エンジンが詰みを発見した場合は、score mateによって詰み手数を返すことができます。詰み手数に入れる数字は、エンジンの勝ちならプラス、エンジンの負けならマイナスになります。エンジンが6手後に詰まされて負けると判断した場合はscore mate -6となります。

つまり、勝ち/負けが確定した時、評価値は最大値/最小値になるわけですが、それでは「詰み手数」の情報が入らないため、別の通信手段を用意しているというわけです。ちなみに、この場合の「詰み手数」というのは、王手だけに限らず、片方の合法手がなくなるまでの手数であり、また、思考エンジンによっては必ずしも最短手数とは限りません。元のUCIでは先後の応手のセット数(move = 2手)で数えますが、USIでは手数で数えます。この辺はチェスと将棋の慣習的な違いに依ります。

この勝敗確定時の場合分けは、理論的には明解なものですが、実装的には手間がかかるものであるため、思考エンジンによっては採用していない場合があります。3万点程度の十分に大きい最大値を決めておいて、そこから「詰み手数」分を引いた値を評価値とするというのもよく行われることです。この場合の評価値は、比率尺度ではなく、順序尺度になります。

このページのトップヘ