SPSP 理論編 3: 数式

再現実装が可能なレベルで定義を並べる。概念解説は 理論編・概念、検証は 理論編・評価。 Glicko2 内部更新の式は Glickman 公式論文 を参照。

0. 記法

1. 直対評価 (Glicko2)

1.1 状態量と更新

1 試合の更新式は Glickman 論文のとおり。期待勝率は

$$E(\rho_u, \rho_v) = \frac{1}{1 + 10^{-(\rho_u - \rho_v)/400}}$$

で計算し、実結果 $s \in \{0, 1\}$ とのズレ $s - E$ を、$\text{RD}$ と $\nu$ で重み付けしてレートに反映する。

1.2 復帰加算 (不参加期間による不確実性の膨張)

プレイヤー $u$ の最終出場時刻を $\tau_u$、現大会 $t$ の開始時刻を $t_{\text{start}}$ とおき、 不参加日数を $\delta_u = (t_{\text{start}} - \tau_u) / 86400$ で定義する。 試合更新の直前に sigmoid で滑らかに $\text{RD}$ を膨らませる:

$$\text{RD}'_u = \max\!\left(\text{RD}_u,\ \text{RD}_{\text{infl}} \cdot \sigma\!\left(\frac{\delta_u - D_{\text{mid}}}{D_{\text{scale}}}\right)\right)$$

ただし $\delta_u \le D_{\text{grace}}$ なら何もしない ($\text{RD}'_u = \text{RD}_u$)。$\max$ なので $\text{RD}$ は下がらない。

復帰加算カーブ: RD 上限の sigmoid 増加 (RD_infl = 128, D_mid = 540 日, D_scale = 180 日) grace 64 128 0 RD' (上限) 0 300 540 (1.5y) 780 1080 (3y) 不参加日数 δ RD' = 64 (上限の半分)

1.3 表示用 Elo 換算と正規化レート

Glicko2 のレートはそのものが Elo 空間 (1500 基準) なので、サイト表示は内部レートをそのまま使う:

$$\text{Elo}^{\text{bt}}_u = \rho_u$$

順位評価で使う正規化レート $r_u$ は、全プレイヤーの最大値が 2500 になるようシフトする:

$$r_u = \rho_u - \bigl(\max_v \rho_v - 2500\bigr)$$

直対評価で値を持たないプレイヤーは $r_u = 1500$ で扱う。

シフト量 $\max_v \rho_v - 2500$ は評価基準日時点のグローバル最大で固定し、過去大会の素点計算でも同じ値を使う。

2. レベルシステム

2.1 LV ごとの対象大会フィルタ

Lv $k$ の大会フィルタ $F_k(t) \in \{0,1\}$:

Lv条件 $F_k(t) = 1 \iff$
1$n_t \ge 5$
2$n_t \ge 9$
3$n_t \ge 25 \ \land\ w_t = 1 \ \land\ \lnot\,\text{制限・下位クラス}$
4$n_t \ge 33 \ \land\ w_t = 1 \ \land\ \lnot\,\text{制限・下位クラス}$
5$n_t \ge 49 \ \land\ w_t = 1 \ \land\ \lnot\,\text{制限・下位クラス}$

各プレイヤーの現 Lv を $\ell_u \in \{1,\dots,5\}$ と書く ($\ell_u$ の決まり方は §2.3)。

2.2 LVゲート学習 (直対評価)

試合 $(u_w, u_l)$ について、勝者・敗者それぞれ独立に学習可否を判定する:

$$\text{update}(u, t) = F_{\ell_u}(t)$$

勝者・敗者で独立に判定するので、片方だけ更新される試合もある。 例: Lv1 のプレイヤーは閾値を満たす全大会で更新される一方、Lv5 のプレイヤーは $F_5(t) = 1$ の大会以外では据え置きとなる。

2.3 5 層カスケードと Lv の決定

大会 $t$ で Lv $k$ の母集団 $L_k$ に属するプレイヤー $u$ の集計対象大会も $F_k$ で決まる。Lv $k$ における順位評価スコアを

$$S^{\text{rank}}_k(u) \quad (\text{§3 で定義})$$

とし、$u$ の Lv $k$ 内での順位評価ランクを $R^{\text{rank}}_k(u)$、直対評価ランクを $R^{\text{bt}}_k(u)$ とする。各 Lv 段の昇格判定にはこの 2 つの平均

$$\text{ens}_k(u) = \frac{R^{\text{rank}}_k(u) + R^{\text{bt}}_k(u)}{2}$$

を使う。$\text{ens}_k(u)$ の値が小さい (= 順位が上の) プレイヤーから上位 $N_{k+1}$ 名を次の母集団に残す:

$$L_{k+1} = \{\,u \in L_k \,:\, \text{ens}_k(u) \le N_{k+1}\,\}$$

同値は直対評価ランク $R^{\text{bt}}_k(u)$ が上のほうを優先。母集団サイズ:

$k$$L_k$$N_{k+1}$
1全プレイヤー$N_2 = 2048$
2Lv1 上位 2048$N_3 = 1024$
3Lv2 上位 1024$N_4 = 512$
4Lv3 上位 512$N_5 = 256$
5Lv4 上位 256(なし)

プレイヤー $u$ の最終 Lv は到達した最大の $k$:

$$\ell_u = \max\{\,k \,:\, u \in L_k\,\}$$

実装上、5 段カスケードは評価ターゲット時刻ごとに過去大会全部を使って再計算される。各時刻における Lv は時系列で確定し、未来の大会に依存しない。 Lv 決定用の直対評価ランクは Glicko2 BT ではなく OpenSkill BradleyTerry ($\sigma$ floor $= 3.0$、$\mu$-compensation あり) を別途学習して使う。最終的な BT 表示と総合評価ランクは §1 の Glicko2 で計算される。

2.4 DQ 判定

大会 $t$ におけるプレイヤー $u$ の DQ 判定 $\text{DQ}(u, t)$ は明示的判定と暗黙的判定の論理和で決まる。

$$\text{DQ}(u, t) = \text{DQ}^{\text{exp}}(u, t) \,\lor\, \text{DQ}^{\text{imp}}(u, t)$$

明示的 DQ: start.gg 側で dq=True となっている試合の敗者集合を $D_t$ とすると

$$\text{DQ}^{\text{exp}}(u, t) = (u \in D_t)$$

暗黙的 DQ: 試合データはあるのに本人の試合が記録ゼロ (= no-show)。$w_{u,t}$ を $u$ の勝ち数、$\ell_{u,t}$ を負け数、$M_t$ を大会 $t$ の総試合数とすると

$$\text{DQ}^{\text{imp}}(u, t) = \bigl(M_t > 0\bigr) \land \bigl(p^t_u > 2\bigr) \land \bigl(w_{u,t} = 0\bigr) \land \bigl(\ell_{u,t} = 0\bigr)$$

DQ 認定された試合・順位は直対評価の学習と順位評価の集計から除外される。

暗黙的 DQ が保守的 ($w = 0 \land \ell = 0$) なのは、データ欠損で誤検出を生まないため。メイン + クラスブラケット構成の大会では $D_t$ をメイン側・クラス側で分けて保持し、親イベントエントリとクラスエントリに別々に適用する。

3. 順位評価

3.1 順位 → 勝ち上がりラウンド数

大会 $t$ をダブルエリミの敗者復活ブラケットに当てはめ、最終順位 $p^t_u$ から勝ち上がりラウンド数 $\text{rw}^t_u$ を機械的に決める。 たとえば $n_t = 8$ なら順位ごとの $\text{rw}$ は:

順位 $p$12345〜67〜8
$\text{rw}(p)$543210

一般に、参加者数 $n$ における順位 $p$ の階段関数を $\text{tier}(p)$ とすると ($n$ には陽に依存しない)

$$\text{rw}^t_u = \max\bigl(0,\ \text{tier}(1) - \text{tier}(p^t_u)\bigr) \quad \text{かつ} \quad \text{rw}^t_u \le \text{tier}(1) = \text{placement\_to\_tier}(n_t)$$

$\text{tier}(\cdot)$ は順位を敗者復活ラウンド段に対応させる階段関数:

順位 $p$12345〜67〜89〜1213〜1617〜2425〜3233〜4849〜6465〜96
$\text{tier}(p)$0123456789101112

$p \ge 5$ の階段幅は 2 つの tier ごとに倍になる ($\text{tier } 4{+}2k, 4{+}2k{+}1$ がサイズ $2^{k+1}$)。シングルエリミ・スイス・リーグなど DE 以外の大会も最終順位だけ与えればこの表で換算できる。

3.2 ラウンドの参加者集合 (シードで仮想配置)

大会 $t$ の参加者をシード番号順に並べ、各人の正規化レートを $\{r_i\}_{i=1}^{n_t}$ とする ($i$ はシード位置)。 仮想ダブルエリミの敗者復活ブラケットのラウンド $j$ に居るシード集合を $R_j(t)$ と書く。 実際の進行は見ず、シードどおりに勝ち上がった場合の構造で固定する。

自己強化を防ぐため、ラウンド集合の構築前にその大会の出場者のうち最もレートの高い 1 名 $u^\star_t = \arg\max_u r_u$ を除外する:

$$\tilde R_j(t) = \{\,i \in R_j(t) \,:\, i \ne u^\star_t\,\}$$

除外は場の難しさを構成する側のみで、$u^\star_t$ 自身もポイント取得対象に残る。

3.3 勝つことの価値とラウンドの難しさ

Lv ごとの基準値 $\text{base}_k$ から見て、レート $r$ の相手に勝つことの価値を Elo の勝率式で測る:

$$g_k(r) = 1 - \frac{1}{1 + 10^{(r - \text{base}_k)/400}}$$

勝つことの「情報量」を取り、ラウンド $j$ に居る全相手で平均したものを ラウンドの難しさ $m^t_{k,j}$ と定義する:

$$m^t_{k,j} = \varepsilon + \frac{1}{|\tilde R_j(t)|} \sum_{i \in \tilde R_j(t)} \bigl[-\log_2\!\bigl(1 - g_k(\max(r_i, \text{floor}_k))\bigr)\bigr]$$

$\tilde R_j(t)$ が空のラウンドは $m^t_{k,j} = \varepsilon$。

勝つことの価値: $-\log_2(1 - g)$ ・横軸は base からの相手レート差 0 1 2 3 4 勝つ価値 -800 -400 0 +400 +800 相手レート - base 同レート: 価値 = 1 +400: ~3.46 下に張り付く: 低レート相手は寄与が小

3.4 大会素点

プレイヤー $u$ の大会 $t$ における Lv $k$ 素点 $P^t_{k,u}$ は、勝ち上がったラウンド分の難しさの和に大会規模の重みを掛けたもの:

$$P^t_{k,u} = \left( \sum_{j=1}^{\text{rw}^t_u} m^t_{k,j} \right) \cdot s(n_t), \qquad s(n) = \sqrt{\log_2 n}$$

大会規模補正 $s(n)$ は 8 人で約 $1.7$、32 人で約 $2.2$、128 人で約 $2.6$、512 人で約 $3.0$、2000 人で約 $3.3$。

3.5 集計 (時間減衰と位置減衰)

時間減衰 ($\approx$ 月 4%):

$$\alpha(d) = 0.96^{d/30}$$

プレイヤー $u$ の Lv $k$ 集計対象大会 (= $u \in L_k$ かつ $F_k(t) = 1$ の大会) を、時間減衰後ポイント $P^t_{k,u} \cdot \alpha(d_t)$ の降順に並べ、$i$ 番目の大会の位置減衰を

$$\pi_k(i) = \begin{cases} 1 & i \le N_k^{\text{top}} \\ (pd)^{\,i - N_k^{\text{top}} + 1} & i > N_k^{\text{top}} \end{cases}$$

とおく ($pd = 0.3$、$N_k^{\text{top}}$ は Lv1 が 1、Lv2〜5 が 3)。$u$ の Lv $k$ 順位評価スコアは

$$S^{\text{rank}}_k(u) = \sum_{i} P^{t_i}_{k,u} \cdot \alpha(d_{t_i}) \cdot \pi_k(i)$$

表示用 Elo 風数値は

$$\text{Elo}^{\text{rank}}_u = S^{\text{rank}}_{\ell_u}(u) \cdot 17.5$$

順位への影響はない。

3.6 Lv ごとのパラメータ

Lv$\text{base}_k$$\text{floor}_k$$N_k^{\text{top}}$$pd$
1170035010.3
2190070030.3
3190070030.3
4190070030.3
5190070030.3

4. 総合評価

最終 Lv $\ell_u$ 内での順位評価ランクを $R^{\text{rank}}(u)$、直対評価ランクを $R^{\text{bt}}(u)$ とする。総合評価の平均順位:

$$\bar R(u) = \frac{R^{\text{rank}}(u) + R^{\text{bt}}(u)}{2}$$

最終ランクは $(-\ell_u,\ \bar R(u),\ R^{\text{bt}}(u))$ の辞書式昇順、すなわち

  1. Lv が高いほど上位
  2. 同 Lv 内では $\bar R(u)$ が小さい (= 平均順位が上) ほど上位
  3. 同値タイブレークは $R^{\text{bt}}(u)$ が上のほうを優先

どちらか片方しかレートを持たないプレイヤーは、欠けた側のランクを「その Lv の総プレイヤー数 + 1」で穴埋めする。

5. (付録) パラメータ一覧

定数意味
直対評価 (Glicko2)
$\rho_0$$1500$初期レート
$\text{RD}_0$$350$初期不確実性
$\nu_0$$0.06$初期変動性
$\tau$$0.5$系統定数 (変動性の制約)
$\text{RD}_{\text{infl}}$$128$復帰加算の上限
$D_{\text{mid}}$$540$ 日復帰加算 sigmoid の中央
$D_{\text{scale}}$$180$ 日復帰加算 sigmoid の幅
$D_{\text{grace}}$$30$ 日復帰加算の猶予日数
表示 Elo$\rho_u$ (オフセットなし)Glicko2 内部レートをそのまま表示
対象大会フィルタ $F_k$
$F_1$$n_t \ge 5$Lv1 学習・集計対象
$F_2$$n_t \ge 9$Lv2 学習・集計対象
$F_3$$n_t \ge 25$ かつ 休日 かつ ¬制限・下位クラスLv3 学習・集計対象
$F_4$$n_t \ge 33$ かつ 休日 かつ ¬制限・下位クラスLv4 学習・集計対象
$F_5$$n_t \ge 49$ かつ 休日 かつ ¬制限・下位クラスLv5 学習・集計対象
カスケード
$N_2$$2048$Lv1 上位 2048 を Lv2 母集団へ
$N_3$$1024$Lv2 上位 1024 を Lv3 母集団へ
$N_4$$512$Lv3 上位 512 を Lv4 母集団へ
$N_5$$256$Lv4 上位 256 を Lv5 母集団へ
順位評価
Lv1 パラメータ$(\text{base},\text{floor},N^{\text{top}},pd) = (1700, 350, 1, 0.3)$$(\text{base}, \text{floor}, N^{\text{top}}, pd)$
Lv2〜5 パラメータ$(1900, 700, 3, 0.3)$同上
大会規模補正$s(n) = \sqrt{\log_2 n}$素点に乗じる規模重み
$\varepsilon$$0.01$ラウンド難しさの零回避
時間減衰$\alpha(d) = 0.96^{d/30}$月約 4% 減衰
表示 Elo 倍率$17.5$$\text{Elo}^{\text{rank}}_u = S^{\text{rank}} \cdot 17.5$ (順位に影響なし)
自己強化除去$\arg\max_u r_u$ を $\tilde R_j$ から除外場の難しさ構成側のみ適用