欢迎光临散文网 会员登陆 & 注册

关于Elo系统运作原理的简单探究,以及对Glicko、Glicko-2的完整说明

2023-02-14 18:56 作者:旅行者IX号  | 我要投稿

(截取自水平系统视频的废案)

(轻度数学含量警告!)


Elo

Elo评级系统于1960年由美国物理学家Arpad Elo发明,是的,Elo三个字母并不是什么简写,而就是发明者的姓。当时美国象棋联盟(USCF)在使用另一套水平系统来评判不同玩家的实力,但他们发现该系统并不准确,就请了同时是国际象棋大师和物理学家的Arpad Elo来做一套新的评级系统,于是在游戏中第一个精准的水平系统就这么诞生了。

(Fun Fact 1970-1980年间Elo系统是由Arpad Elo本人自己计算的)


接下来我会稍微探究一下Elo系统的数学原理,虽然我的数学也只是三脚猫的功夫,但我觉得大抵算是搞懂了(?)。不过如果你不太喜欢数学,可以跳到(跳点①)来跳过一些Elo相关的理论内容。


对于留下来的观众,我们先来看下Elo系统最基础的原理。

在开始任何运算之前,Arpad做出了一个很聪明的假设:他假设每个玩家的发挥,或者叫表现,都是呈钟形曲线分布的:玩家的表现大部分时候都位于一个平均值,有时候表现得好些,有时表现的坏些。也许你昨晚没睡好所以打得比较差,又或许生活中发生什么好事时你会变得很亢奋从而使你发挥超常,但更多时候你的表现还是接近于平均值的。不同玩家有不同的平均值,代表玩家的水平。另外在假设中大部分玩家钟形曲线的宽度,即表现的稳定性差不多。

当两个玩家对战时,他们在该局的表现相当于从两个钟形曲线下方各随机取一个点,两个点所对应的值更大的一方相当于在本局游戏中发挥更好,也就会获胜。

大象... 蟒蛇.......

在这样的模型下,两人的平均值相差越大,水平更高的玩家越能稳定地战胜水平更低的玩家。反之双方的平均值相差越小,胜率就会越趋近于50%。

事实上,如果我们假设两人的表现是都符合正态分布的,同时以分布的标准差为单位把两个分布的平均值的差表示出来,这个胜率是可以被准确计算出来的。两个独立的正态分布的随机变量的差值的随机变量依然会是呈正态分布的,新分布中高于零的部分的占比自然就是玩家A赢玩家B的胜率,这个值可以用正态函数的概率累计函数,即误差函数来计算出来。由此我们就可以只用双方分差作为参数计算出双方的胜率。

不过后来经过国际象棋联盟对实际数据的验证,相比正态分布,计算胜率时使用逻辑分布的累计分布函数——逻辑函数会更加贴切。而这也就催生网上最常见的Elo公式:(玩家的表现分布间的差值产生的新随机变量的分布更偏向于逻辑分布)

值得注意的是这里的10和400都是Arpad在设计时为了让分数更直观自己选的。这两个数字的含义是:分数相差400分的两位玩家,对战时胜率相差十倍(即90.9%和9.09%)。实际使用Elo系统时不同设计者完全可以(大部分时候也会)自己定义这两个数。另外整个玩家群体中所有分数的平均值也是由设计师自定义的,可以是0,也可以是2000、10000等等。

这里我再摆一组数据来帮助理解分差与预期胜率间的关系。与对手分数相同时胜率自然是50%,高100分时胜率为64%,高200分时胜率是76%,高300分时胜率是84%,高400分时胜率是91%……到高800分时胜率是99%。随着分差加大预测的胜率会逼近于100%但不会达到100,熟悉逻辑函数的朋友应该对这个规律并不陌生。

这个公式也就构成了Elo系统的基础:给定任意两人准确的分差,我们能通过这个公式算出他们间的胜率。或者反过来说,给定任意两人间足够多的对局样本,我们可以通过他们间的胜率计算出在系统下应该让他们之间相差多少分。


接下来的问题是:如果有胜率已知但分数未定的两名玩家A、B,我们怎样使他们间的分差回归到应有的值呢?这里就要靠Elo系统的分数更新公式了。在每局对局结束过后,Elo系统会根据我们对胜率的预测与实际的胜负结果来进行分数更新。赢的人加分,输的人减分。具体公式如下:

这里Ea是上面式子中预测出玩家A的胜率,Sa是在玩家A的角度上的对局结果(赢为1,平局为0.5,输为0),而K是一个人为设定的规定分数变化速度的系数:K越大,玩家的分数变化越快,但分数的上下抖动就会越剧烈。反之K越小,玩家分数变化越慢,但分数上下抖动幅度就越小。因此许多国象联盟在低分段中用大K值32,在高分段用小K值16。

用简单的语言描述下这个式子,就是用实际结果减去预期结果,乘上一个系数,然后加到原来的分数上。

不难看出,分数更新的值是与  预测结果 和 实际结果  间的差值呈正比的。如果预测大概率赢,实际赢了,那么Sa和Ea的差值较小,加分也就较小。预测小概率赢,实际赢了,Sa和Ea的差值较大,加分也就较大。反过来输的情况也是如此。越是意料之内的输,减分越小,越是意料之外的输,减分越大。

换成人话来说:赢比自己分高的人,加分多,赢比自己分低的人,加分少;输比自己分高的人,加分少,输比自己分低的人,加分多。相信在大家的理解里这应该也是一个很自然的规则。

另外值得注意的一点是,因为对局总要有人赢,即Ea(A赢的概率)和Eb(B赢的概率)之和必定为0,代入回上面的式子中,同一场对局后,双方加分的值和减分的值必定是相同的(假设k值相同)。赢的人加多少分,输的人就会减多少分。


那么为什么这个式子能让玩家的分数回归正确的值呢?其实原理也很简单

我们假设有两个玩家,他们的实力差距使得玩家A打玩家B刚好有75%的胜率,也就是每4把赢3把输1把。

在双方当前的分数都已位于他们实际分数上的情况下,系统能准确预测出他们之间的胜率0.75。这时玩家A每赢一把加K*(1(赢)-0.75) = 0.25K的分,而每输一把要减 K *(0(输)-0.75) = -0.75K.... 要减0.75k的分。赢三把的分数恰好抵消输一把的分数,双方的分数也就会维持在这个位置。

(这是个过度简化的说法,还要假设分数在四把都结束后才会计算,不过实际情况下如果每局结束就结算分,给定足够多的局数也依然会回归原来的分数)

而如果双方一开始分差比实际的差距小,那么系统对A胜率的预测就会偏小。比如系统预测出A赢B的概率是0.6而非0.75,那么赢三把加的分是1.2k,输一把减的分是0.6k,平均来说A逐渐加分,B逐渐减分,A和B的分差就会逐渐拉大,向正确值回归。反过来的道理也是一样的。也就是说在Elo系统下,双方的分差是会自动回归到真实值的。

而这个规律拓展到一大群玩家间的对局也是成立的。在玩家间发生大量的相互对战的过程中,所有玩家的分数也都会逐渐回归与玩家实力对应的数值。分数虚高的玩家会因为加分少减分多掉回去,而分数比实际值低的玩家会因为加分多减分少升回来。由此胜率计算公式和分数更新公式就做到了让玩家的分数自动回归所属的位置,这也就是Elo系统的运作原理。


(跳点①)


好的,那在这里总结一下Elo系统的运作模式:

· Elo系统通过赋给玩家虚拟的分数来表示玩家水平。

· 分数的意义是预测玩家间对战的胜率,两人对战时分数高的人胜率更高,分差越大胜率就越一边倒。

· 分数的调整在比赛结束后进行。玩家赢的局加分,输的局减分。加减分的量只由双方的分数差与比赛结果决定。高分打赢低分时,因为高分赢低分的概率本来就大,所以高分拿分少,低分掉分少,;低分打赢高分时,因为低分赢高分的概率小,所以低分拿分多,高分掉分也多。 跳过来的观众可以暂停思考几秒,这点应该是非常符合直觉的。

在这个原理中不难发现,Elo系统是具有自适应性的。即无论对方的实力如何,只要对方的分数是准确的,对局结果都不会对你的分数造成不公正的影响。比如你在2000分时遇到了一个4000分的人,你虽然几乎没有可能赢他,但也正因如此,输了之后你掉的分几乎可以忽略不计。又或者说你遭遇了一个很困难的对局,每五把这样的对局你才能赢一把,但其实赢得这一把加的分数是完全可以抵消输的四把所丢失的分数的。

不过说了这么多,现在除了各种棋类和一些职业体育赛事的排行,现在我们几乎已经看不到Elo的身影了。这主要是因为Elo系统中玩家分数向真实值的收敛速度大部分时候是非常缓慢,因此在电子游戏中大多用Elo系统的各种后继者代替了。(从这个角度来看,针对Elo的抱怨其实大多是在抱怨根本不存在的东西)


Glicko

接下来我们就来具体看下这些Elo的改进版。首先是由哈佛大学统计学教授Mark Glickman发明的Glicko系统。

Glicko系统的提出最主要的目的是解决新玩家与太久不玩的玩家的分数不可靠的问题。

设想这样一个场景:两个同样是1700分的玩家进行对战,但是一个五年都没上过线,而另一个一直在玩。显然,这两个1700分的可靠性是不同的,后者的1700分明显比前者更可靠。在直觉上来说,我们会认为这个五年没碰过游戏的玩家的分数应该被大幅调整,而另一方的分数只应该接受小幅调整。

但是在Elo系统下,我们只能对双方的分数进行同样幅度的调整,因为Elo中的加分与减分总是(其实是大部分时候)相等的,这两个玩家一个加多少分,另一个就得减多少分。这样的处理在这种场景下显然是不合理的。

Glicko系统就通过再Elo的基础上引入一个新的概念“Rating Deviation”,分数标准差,简称RD,来对玩家分数的“可靠性”进行衡量。

不过要往细节说的话就很复杂了,我在这里只说定性的结论。


玩家的RD代表我们有多确定玩家的分数能正确代表玩家实力。RD越高,我们越不确定玩家的分数能代表他的实力,即分数越不可靠;RD越低,我们就越确定,即分数越可靠。

在Glicko中,每场比赛结束后,玩家分数的更新除了受输赢结果、双方分数影响外,也会被RD所影响。RD越大,分数加减越大;RD越小,分数加减越小。也就是对我们很能信任的分数进行小幅调整,对我们很不确定的分数进行大幅调整。

RD本身的变化受两个场景所影响:

1.每场对局结束后RD会根据对局情况缩小一点,代表对局进行的越多,我们对这名玩家的分数的准确性越有信心。但是缩小后的RD不会低于一个人为设定的最小值,保证玩家始终能有一定幅度的分数加减。

2.每个「时间段」结束后所有玩家的RD会上涨一次,代表分数的可靠性会随时间衰减,这样玩家越久不玩RD便会越高。这里时间段的长度是可以根据需要自由设置的,几周到一年都可以。RD的上涨同样也不会高于最大值,而这个最大值等同于一个新玩家的初始RD,即一个我们完全不知道水平如何的玩家的RD。

这样一来系统就能对新玩家和退坑的老玩家进行合适的响应了。很多游戏中存在“新号上分快”的现象也正是由此而来的。新号的RD处于最大值,因此分数更新的幅度自然是最大的,上分和掉分的幅度都会很大,在进行的对局变多以后RD才会逐渐衰减下来。上面提到的Elo系统对玩家实际分数的逼近速度过慢的缺点也就由此解决了。


Glicko-2

不过Glicko系统也并非是完美的,稍微观察下两条决定RD变化的规则就不难发现问题:这样的设计是建立在“玩家的水平在短时间内不会产生大幅变动”的假设下的,而在大部分情况下这个假设确实成立。但考虑游戏的实际情况,玩家通过线下练习、观看攻略、或是自己琢磨策略等途径是可能实现短时间内的提高的。又或者在账号转移、玩家发生意外等情况下,玩家水平也可能突然降低。而Glicko系统则难以对这样的情况进行响应。

Glickman就针对这个问题对Glicko系统再次进行了改进,做出了Glicko-2系统。Glicko-2系统比Glicko还要复杂,老实说我也并不确定自己完全搞懂了,在这里也就只能给些过度简化后的结论。如果你想深入了解Glicko-2可以看看Glickman自己写的文档:。

Glicko-2系统引入了另一个新变量“易变性”(Rating Volatility),符号σ,来衡量玩家的对局表现有多不符合系统预期。

如果一个玩家的表现一直符合预期,打同水平的人输输赢赢,打分数高的人输多赢少,那么它的σ就会较低。而如果一个玩家不断地稳定赢过同分和分更高的对手,那他的σ就会较高。当然,稳定地输给同分或分更低的对手时σ也会变高。(甚至一边赢高分一边输低分也会使sigma变大)

σ在每局结束后会根据双方分数、RD与对局胜负进行更新。

在σ更新后RD会根据σ的大小进行增加,σ的值越大,RD增加的值就越大。而RD是决定分数加减的幅度的。也就是说对于σ大,即表现很不符合预期,在猛赢或猛输的玩家,我们会让他的加减分幅度变得更大,代表着我们认为现有的分数不能准确反应他的实力了。如果你在游戏中发现大量连胜后加分很猛,那很有可能就是σ在发挥作用了。

当然,在这之后RD依然会根据对局情况再进行缩小,这里和Glicko1是一样的。



那么到了Glicko-2这一代,一个功能完备,且收敛速度很快的Elo类水平系统就算完成了。对于跳到这里来的观众,是的,Glicko-2是Elo的改进版的改进版,以及早就没人在用Elo了。

现在绝大部分成熟的电子游戏使用的就是高度类似于Glicko-2的水平评估系统,CS-GO、Splatoon 2等游戏被证实使用的就是Glicko-2,而像英雄联盟、星际争霸、守望先锋等游戏也基本可以确定至少是在用类似Glicko-2的某种变种。

对于只关心“上分”的玩家,我们来小结一下到Glicko-2这一代为止,玩家分数的加减会受哪些因素影响。

0.分数是加还是减由对局结果决定,胜者加分,输者减分,加减分的大小由后几条决定。

1.你的分数与你对手的分数。对手的分越高,你赢的时候加分越多,输的时候减分越少。反之对手的分越低,你赢的时候加分越少,输地时候减分越多。

2.你进行游戏得有多频繁。新玩家或很久没玩的玩家在对局过后加减分的幅度会很大,而经常玩的玩家对局后的加减分较小。

3.你最近的胜负情况。如果你在连续赢较强的对手或连续输给较弱的对手(甚至一段时间内又赢较强的对手又输给较弱的对手也应该包括在内),你加减分的幅度就会比较大。

不过需要注意的是这里的分数是指你的真实分数,即代表(游戏能评估出的最准确的)你真实实力的分数。很多游戏不会把真实分数给你看,你能看到的只有和分数有一定关联性的“段位”。


关于Elo系统运作原理的简单探究,以及对Glicko、Glicko-2的完整说明的评论 (共 条)

分享到微博请遵守国家法律