麻雀 AI のオープンアリーナである RiichiLab をしばらくモニタリングしていると、十分に局数をこなした Bot でも、1日のうちにレーティングが200点近く上下して順位が入れ替わることがあります。もちろん麻雀は配牌の有利不利など運の要素が大きいゲームです。それでも、何百戦、何千戦と対局を重ねた固定モデルの評価値が、短期の連勝や連敗だけで数百点単位の振幅を繰り返すとしたら、さすがにレーティングの設計が怪しいだろ、となります。
この記事では、直近5日間の対局ログ(13,758対局)と合成対局シミュレーションを用いてレートの揺れの原因を分解し、「継続参加時の安定性」と「新規参入・モデル改良への追従性」を両立する OpenSkill のパラメータ()を検討します。
直近5日間の対局ログからレートの揺れを確認
まず、本番環境で実際にどれくらいレーティングが動いているのかを確認します。対象としたのは 2026-10-29 から 2026-11-03 までの120時間に記録された対局ログです。
| 区分 | 対局数 | 参加 Bot 数 | 1対局あたり平均変動 | 平均変動 (p95) | 1着時の平均変動 | ラス時の平均変動 |
|---|---|---|---|---|---|---|
| 四麻 | 10,144 | 40 | 9.72 点 | 20 点 | +11.82 点 | -16.96 点 |
| 三麻 | 3,614 | 10 | 9.52 点 | 18 点 | +10.84 点 | -13.66 点 |
四麻では1半荘ごとに平均で約10点、ラスを引くと平均で約17点も表示レーティングが動いています。この結果、24時間常時稼働している Bot は1日に約350戦を消化するため、1日の短期間の順位の偏りで大きなスコアの変動を経験することになります。
たとえば Bot #233 は、この5日間で1,785対局をこなし、最低1625点から最高1939点まで314点のレンジを行き来しており、24時間ウィンドウでの最大下落幅(ドローダウン)は260点(1885点から1625点)に達しています。Bot #1 も24時間で最大191点の下落を記録しました。モデルの中身を一切変えていなくても、1日後に見に行くと別物の強さであるかのように数値が変わってしまう状態です。
レートの揺れの原因を分解する
RiichiLab では現在、OpenSkill v4.1.0 の Plackett-Luce モデルを採用しています。各 Bot は内部状態として推定スキル と不確実性 (初期値は )を持ち、画面上の表示レーティング は保守的推定値 をスケーリングした次式で計算しています。
本来、ベイズ更新に基づくスキル推定では、対局数を重ねるにつれて不確実性 が小さくなり、1対局あたりの更新幅も自然に落ち着いていくはずです。それにもかかわらず1,000戦を超えても毎回10点前後動き続ける原因は、対局前の事前分散更新と1対局あたりの性能分散を決める2つのパラメータ設定にあります。
OpenSkill は各対局の更新前に、スキルの時間変化を許容するための動的不確実性 を用いて事前分散を と定義します。現行設定ではこの が 0.30、1対局の性能ノイズスケール がデフォルトの 25/6()に設定されています。
この組み合わせがどのような影響を与えているのか分解します。表示レーティングの丸め前の変動量は次式で表せます。
今回の四麻 40,576更新について両項の絶対値平均を計算すると、不確実性の変化による項 が平均 0.38 点にとどまるのに対し、推定スキルそのものの変化 が平均 9.96 点に達していました。
なぜ がここまで大きくなるのかは、 の更新式を見ると明確になります。 人対局(四麻なら )において、各 Bot の推定スキルの更新量 は次式で与えられます。
ここで は事前の推定スキルから予測された着順確率と実際の着順との乖離(1着なら正、ラスなら負)を表す項であり、それに掛かる係数 が1対局あたりの更新ステップ幅を決めています。
対局結果から学習すると本来は が減少していきますが、毎対局の前に ( では )が加算されるため、何千戦消化した後でも分子の は一定の水準より小さくなりません。さらに分母のスケール に入る ()が麻雀の1半荘あたりの運の分散に対して小さく設定されているため、係数 が常に大きいまま維持され、毎回の着順によって が大きく更新され続ける構造になっています。
過去ログのリプレイによるパラメータ探索
前節の観察から、 を小さく、 を大きくすれば、予測精度を損なわずにレート変動を抑えられそうです。これを確かめるため、ログに記録された と から期間開始時の を復元し、同じ対局系列を別パラメータで再計算(リプレイ)しました(現行設定での再現誤差は丸め境界による最大1点以内)。あわせて、各対局の事前 から予測した2者間の勝率と実際の着順を照らし合わせ、Pairwise Log Loss と順序的中率も確認しています。
四麻と三麻の全対局に対して代表的なパラメータ候補をリプレイした結果を以下の表に示します。黄色背景の行はトレードオフを加味した上での採用候補です。
| 区分 | 設定 | 平均 | p95 | Pairwise Log Loss | 順序的中率 |
|---|---|---|---|---|---|
| 四麻 | 現行 () | 9.72 点 | 20 点 | 0.7556 | 54.62% |
| 四麻 | 5.08 点 | 10 点 | 0.7141 | 55.29% | |
| 四麻 | 3.88 点 | 9 点 | 0.7110 | 55.38% | |
| 四麻 | 3.54 点 | 8 点 | 0.7103 | 55.37% | |
| 四麻 | 3.35 点 | 8 点 | 0.7099 | 55.38% | |
| 四麻 | 3.33 点 | 8 点 | 0.7098 | 55.39% | |
| 三麻 | 現行 () | 9.52 点 | 18 点 | 0.7344 | 57.54% |
| 三麻 | 2.91 点 | 6 点 | 0.6943 | 59.22% | |
| 三麻 | 2.71 点 | 6 点 | 0.6941 | 59.15% |
(初期 と同じ 8.333)とし、 を 0.03 〜 0.01 まで絞ると、全更新平均 は四麻・三麻ともに現行の約3分の1に縮小します。それでいてペアワイズの Log loss や順序的中率は悪化しておらず、直近数戦の着順の偏りによって推定スキル が大きく振れなくなったことと、勝率予測式の分母に入る が大きくなったことで、今回のデータでは現行設定よりも予測損失が小さくなっています。
さらに、参入直後の大幅な更新を除いて200対局消化後の定常区間に絞り、1対局あたりの変動幅と、連続350対局(常時稼働で約1日分)のウィンドウ内における最大下落幅(ドローダウン)を比較すると、安定化の差はより鮮明になります。
| 設定(四麻・200対局消化後) | 1対局あたり平均 | (p95) | 連続350対局の最大下落幅 (p95) |
|---|---|---|---|
| 現行 () | 9.52 点 | 20 点 | 247 点 |
| 3.22 点 | 7 点 | 120 点 | |
| 2.83 点 | 6 点 | 102 点 | |
| 2.60 点 | 6 点 | 96 点 |
5日間の実ログのリプレイでは、 と のあいだで安定化効果に大きな差はなく、どちらも現行設定から大幅に揺れを抑えられています。後述する合成実験での初期収束や実力変化への追従性も踏まえ、以降は を中心に結果を見ていきます。
リーダーボード Top 10 の見え方はどう変わるか
期間開始時点における四麻の表示レート上位10 Bot を固定し、同じ5日間の対局系列で現行設定と調整後の設定()を並べたのが次の図です。
左の現行設定では、上位10体のラインが1日のうちに何度も交差し、数時間の連勝・連敗で順位が激しく入れ替わっています。右の では、各 Bot の長期的な序列や緩やかなトレンドがそのまま可視化され、固定 Top 10 の全45ペア間で発生した順位逆転回数は5日間で 5,723 回から 2,177 回へと約6割減少しました。
依然として順位変動はあるのですが、これは現状の OpenSkill でのレーティングであったり、Duplicated Mahjong の仕組みであったり、マッチングの公平さを導入しないと解消は難しいだろうと考えています。 運営側によって多様な強さの Bot を多数投入することでマッチングの公平さを改善する計画ではありますが、完璧とは言えません。
合成実験による「安定性」と「追従性」のトレードオフ検証
ここまで過去ログのリプレイで の安定化効果を見てきましたが、 をどこまで下げるべきかという問題が残ります。 を小さくすればするほどモデル固定時のレートの揺れは減りますが、下げすぎると今度は「新規参入した強い Bot が適正レートに届くまでの時間」や「既存 Bot をアップデートして強くなったときにレートが追いつくまでの時間」が長くなります。
そこで合成シミュレーションを行ってこのトレードオフを検証しました。四麻の常時稼働環境(1日あたり350対局、各設定40回反復、全設定 )を模し、真の潜在スキルが 23.5, 24.5, 25.5, 26.5 と1.0刻みで並ぶ4体の基準 Bot を戦わせる実験系を組みました。
まず、実力が一定の4体が5,000対局して内部状態が更新された後に、そのまま対局を続けた場合、350対局(約1日)あたり何回表示レートの順位逆転が起きるかを確認しました。 では 53.2 回逆転するのに対し、 で 27.0 回、 で 14.7 回、 では 4.7 回まで減少します。そのうえで、安定化と引き換えに生じる「初期評価の遅れ」と「実力変化への反応速度」を比較したのが次の図です。
上図の左右2つのパネルは、5,000対局(約2週間)学習後の環境における次の実験結果を示しています。
- 左パネルは、上位 Bot を初期状態()に戻して新規参入させたときの、既存 Bot に対する の増加率です。 では7日後(2,450対局時点)でも が約
31%余分に残り、表示式の によって初期評価が追いつくまでにやや時間がかかりますが、 であれば7日後の余分な は約6%まで収束します。 - 右パネルは、3位の Bot(スキル
24.5)の潜在スキルを+2.0(26.5、1位タイ)へ引き上げたときの、7日後の平均反応に対する相対追従率です。 では1日後に約67%、2日後に約88%ですが、 であれば1日後に約85%、2日後には約97%まで追従します。
さらに を 0.005 や 0.001 未満まで絞る実験も行いましたが、50,000対局(約5か月相当)のような長期稼働後に既存 Bot の がゼロ近くまで縮みきってしまい、モデルを強化して実力が1位タイになってもレートが追いつかなくなる現象が確認できました。同じモデルを改修しながら何万戦も走らせる RiichiLab の運用を考えると、 を 0.01 未満にするのは古参 Bot のレートが固まりすぎるリスクが高くなります。
一方で と のどちらを採るかは、定常時の順位の落ち着きを取るか、数日単位での初期収束・改良追従の速さを取るかというトレードオフになり、唯一の正解があるわけではありません。最終的には主観でえいやと決めざるを得ない部分がありますが、実ログの5日間リプレイでは でも に近い安定化が得られていること、そして1週間程度で新規参入の ペナルティがほぼ解消しモデル改良にも2日ほどで追従できることから、現時点では が妥当そうに思えます。
今後の展望
今回の検証を踏まえ、まずはパラメータを へ変更します。また、現在は各 Bot が1対局ごとに独立に を加算する枠組みを前提としていますが、参加頻度にばらつきがある環境では「対局ごと」ではなく「実時間の経過(たとえば1日単位)」に応じて を緩める設計や、一定期間内の直近対局に重みを置く評価指標を併用するアプローチも考えられます。ユーザーからのフィードバックも踏まえながら、リーダーボードが「日々の開発の指針として信頼できる指標」になるよう改善を進めていきます。
レートにこだわるよりも、XX さんの Bot に対して勝率が高いとか低いとか、そういった詳細分析ができる機能拡充のほうが楽しいかもしれません。趣味のゲームサーバーなので、自由に、お金がかからない範囲内で、良しなに開発を継続していきます。引き続き対戦よろしくお願いします。
