Glicko-2 레이팅 직접 구현
여러 명이 실시간으로 겨루는 추론 대결 게임을 만들면서 순위 시스템이 필요했습니다. Elo 가 가장 유명하지만 Glicko-2 를 골랐습니다. Chess.com, Lichess, CS2 가 쓰는 방식입니다.
Elo와의 차이 — 추정의 불확실성
Elo 는 점수 하나만 다뤄서 이기면 오르고 지면 내리는데, “이 점수를 얼마나 믿을 수 있는가” 를 표현할 방법이 없습니다.
새로 가입한 사람의 1500점과, 100판 한 사람의 1500점은 같은 1500 이 아닙니다. 앞은 아직 실력을 모르는 1500 이고, 뒤는 확실한 1500 입니다. Elo 는 이 둘을 구분 못 합니다.
Glicko-2 는 값을 세 개 다룹니다.
- rating — 실력 추정치
- RD(rating deviation) — 그 추정을 얼마나 믿을 수 있는지 (불확실성)
- volatility — 실력이 얼마나 들쭉날쭉한지
RD 가 크면 “아직 잘 모름” 이라 한 판에 점수가 크게 움직이고, RD 가 작으면 “확실함” 이라 조금만 움직입니다. 오래 안 하면 RD 가 다시 커집니다 — 오래 쉰 사람의 실력은 다시 불확실해지기 때문입니다.
구현 — 논문의 계산 단계 그대로
Glicko-2 는 공식 논문에 계산 순서가 단계별로 정리돼 있습니다. 그걸 코드로 옮깁니다. 먼저 값을 Glicko-2 스케일로 바꿉니다.
const TAU = 0.5 // 시스템 변동성 제약 (낮을수록 안정적)
function toGlicko2Scale(r: number, rd: number) {
return { mu: (r - 1500) / 173.7178, phi: rd / 173.7178 }
}
1500 과 173.7178 은 Glicko-1 점수(익숙한 1500 기준)와 내부 계산 스케일을
오가는 상수입니다. 사용자에게는 1500 대 점수를 보여주고, 계산은 내부 스케일에서
합니다.
핵심은 상대별 가중치 g(phi) 와 기대 승률 E 입니다.
function g(phi: number): number {
return 1 / Math.sqrt(1 + (3 * phi * phi) / (Math.PI * Math.PI))
}
function E(mu: number, mu_j: number, phi_j: number): number {
return 1 / (1 + Math.exp(-g(phi_j) * (mu - mu_j)))
}
E 는 “내 실력 mu 로 상대 mu_j 를 이길 기대 확률” 입니다. 실제 결과가 이
기대보다 좋으면 점수가 오르고, 나쁘면 내립니다. 상대의 RD 가 크면(phi_j 큼)
g 가 그 판의 영향을 줄입니다 — 불확실한 상대와의 결과는 덜 신뢰하는 겁니다.
미참여 시 커지는 RD
놓치기 쉬운 게 하나 있는데, 이번 판에 아무 게임도 안 한 플레이어도 RD 는 갱신해야 합니다.
if (opponents.length === 0) {
// 게임을 안 했으면 RD를 350 쪽으로 키워 불확실성을 반영
const { mu, phi } = toGlicko2Scale(player.rating, player.rd)
const phi_star = Math.min(
Math.sqrt(phi * phi + player.volatility * player.volatility),
350 / 173.7178,
)
const { rating, rd } = fromGlicko2Scale(mu, phi_star)
return { rating, rd, volatility: player.volatility }
}
시간이 지날수록 “이 사람이 지금도 그 실력일까?” 의 확신이 줄어듭니다. 350 이 RD 의 상한이라, 아주 오래 쉰 사람은 신규 가입자에 가까운 불확실성으로 돌아갑니다.
왜 Glicko-2였나
이 게임은 판수가 사람마다 크게 달라서, 어떤 사람은 첫날 50판을 하고 어떤 사람은 일주일에 두 판을 합니다. Elo 로는 이 둘의 점수를 똑같이 취급해서, 적게 한 사람의 점수가 실제 실력을 반영하는지 알 수 없습니다.
Glicko-2 는 RD 로 이걸 구분합니다. 리더보드에 점수만 보여주는 게 아니라, “이 점수가 얼마나 확실한지” 까지 안에 들고 있습니다. 매칭할 때도 RD 를 참고하면 “실력이 비슷하고 둘 다 확실한” 상대를 붙일 수 있습니다.
레이팅 시스템은 겉보기엔 점수 계산이지만, 실제로는 “우리가 이 숫자를 얼마나 믿는가” 를 다루는 문제였습니다. Glicko-2 는 그 신뢰도를 1급 시민으로 올린 설계입니다.
댓글 0