数学杂谈 #15
本杂谈严格按照“是什么”,“为什么”,“怎么办”的板块组成。
RWMA
RWMA 是什么?
RWMA 的全称为 Randomized Weighted Majority Algorithm,翻译过来叫做“随机过半票决算法”。在 Wikipedia 上面,它的介绍是:
The Randomized Weighted Majority Algorithm can be used to combine multiple algorithms in which case RWMA can be expected to perform nearly as well as the best of the original algorithms in hindsight.
Furthermore, one can apply the Randomized Weighted Majority Algorithm in situations where experts are making choices that cannot be combined (or can't be combined easily).
第二段话可能比较玄幻,虽然第一句也是,它的意思是,我们可能无法“合并”选项,但是我们可以“选择”选项。“选择”之中引入“权重”和“随机性”,嘛,是不是就很有道理?
一个简单的模型是“猜判断题”。现在有 \(n\) 个人,共有 \(m\) 道判断题,判断的选项为 Yes
或者 No
。
由于某种原因,你得到了每个人每道题的答案,也就是 \(n\times m\) 个判断。你不了解任何关于判断题本身的信息,只能从别人的答案来猜。你可以按照任意顺序作答题目,并且可以在答完一道题目后立即获得该题正确答案。换言之,已经作答的题的正确答案可以帮助你决策。现在你该如何对于每一道题,猜出自己的答案,使得错误的题数(或者错误题数的期望)尽量小?
透过这个问题,我们简单了解一下这个算法。
顺便一说,你可以在 CF1510I 处提交这道题目的代码。
RWMA 怎么做的?
WMA 怎么做的?
要了解 RWMA,我们不妨先了解一下它的“后缀算法” WMA。
WMA 的想法是:我们完全根据已有的答案进行推断,而完全不加入自身因素(在这个问题中,自身因素实际上就是随机因素)。当然,在这样一个比较具体的模型之下,引入一些在日常生活中多次实验过有效的经验,不失为一种好方法。
假如我们只对一道题决策,并且没有参考信息,则我们通过民主投票方式决策答案:每个人向自己的选项投一票,最后我们选取票数较多的一个选项,作为我们最终的选项。有可能两边票数一样多,这个时候我们随便选一个也没什么。
现实情况下,如果我们要决策多道题,那么我们倾向于相信那些在已揭示的题目中表现较好的人的答案。这是一个很合理的想法,不过还比较模糊——“倾向”意味着表现更好的人有更高的话语权,我们不妨设置为表现越好,权重相对更大;而“表现好坏”可以被简单地量化为错题个数。
因此,我们可以引入一种相对更完备的决策方式:为每个人的票分配权重,则投完票后我们选取的是总权重相对较大的一个选项。初始时 \(n\) 个人权重为同一个正数,不妨为 1。
一种简洁而具体的权重描述方式为:如果一个人犯一次错,那么他的权重就会打个折,乘上 \(\beta\),所以犯过 \(x\) 个错的人的权重 \(w=\beta^x\);当然,\(\beta\in (0,1)\)。
实际上,容易想到的另一个函数模型是线性函数 \(w=kx+b\),但相比起来这个模型有若干个好处:
- 简洁,形式很常见,并且简单容易处理;之后的分析会因此受益;
- 符合单调性要求,并且可以保证权重非负。而后者是 \(w=kx+b\) 无法保证的;
- 观察函数图像,发现导数始终为负并且绝对值单调递减。这意味着在 \(n\) 比较小的情况下,错 10 个和错 15 个本质上没有区别,因为贡献差别不大。
这个非要说的话也和实际情况相近,因为对于我们来说,错的个数超过一定限度之后,这个人的选项的信用也就降到相当低,一般我们就不再考虑了。
总结一下,WMA 干的事情是:
- 将每个人的权重初始化为 1。
- 按某一顺序决策每道题:
2.1. 初始化两种选项的权重为 0。
2.2. 对于每一个人,让他所选的选项的权重加上他的权重。
2.3. 将权重较大的选项作为自己的选项并作答。如果两个选项权重相同,则随机选择一个;
2.4. 作答并获得正确答案。将选择错误的人的权重乘上 \(\beta\)。
假设 \(c\) 为在这 \(m\) 道题中,错误最少的人的错误次数。
可以分析得到 WMA 的错误上界为 \(O(\log n+c)\),在 \(\beta=\frac 1 2\) 时的参考数据为 \(2.4(\log_2n+c)\)。
RWMA 怎么做的?
WMA 虽然是一个很聪明的想法,但是它给出的上界仍然不令人满意:
例如 \(n=10,m=100\),而完成得最好的人也错了高达 \(c=20\) 道题目。
则当 \(\beta=0.5\) 时,我们得到的错误上界为 \(2.4(\log_210+20)\approx 56\)。
看起来略大于一半,挺好。问题是,如果我们随便乱选,那期望错误个数不是 \(50\) 个吗?
更好的消息是,随机决定答案的情况下,错误个数不超过 \(56\) 个的概率高达 \(90\%\) 😅。
WMA 的问题在于,我们太过于依赖别人的选择,而丢失了自己的选择权——在这里可以理解为随机因素。需要注意的是,算法中的随机因素并不是一项劣势;毕竟即便是纯随机算法,它的错题数也接近于正态分布,一般情况下我们的结果不会“太坏”。
从 WMA 到 RWMA 其实很简单。我们同样会采取其他人的“意见”,只不过这个意见并不会成为决定性的因素,而是会成为我们选择最终选项的参考,也即是权重。换言之,我们按照正比于选项权重的几率去选择某一选项,这一点想必是十分自然的。
这样,我们的算法在一些极端情况下表现得会好不少。事实上,我们可以说明,RWMA 的期望错误次数不超过 \(\frac{c\ln \beta^{-1}+\ln n}{1-\beta}\)。当 \(\beta=\frac 1 2\) 时得到约 \(1.39c+2\ln n\),将上面的 case 代入可以计算得到 \(1.39\times 20+2\ln 10\approx 32\),明显好了不少。
RWMA 为什么效果挺好?
我们尝试进行一个简单的分析。
首先假设我们已经“得知”了所有题目的正确答案,则可以得到第 \(t\) 道题的错误选项权重为 \(F_t\)。设离散随机变量 \(X\) 表示我们的错题数,则根据线性性容易此时的得到 \(E[X]=\sum_{t=1}^mF_t\)。
考虑所有人的权重之和 \(W\),在第 \(t\) 道题之后新的 \(W\),为 \((1-(1-\beta)F_t)W\)。初始时 \(W_0=n\),则最终的 \(W_f\) 为:
根据 \(W\) 的定义,最终一定有 \(W_f\ge \beta^c\),代入并将两边同时取对数:
为了处理掉 \(\ln(1-(1-\beta)F_t)\),我们最好把它化为单项式结构。比较好的方法是展开 \(\ln (1+x)\):
将这一堆再代入可得:
最后进行适当地移项得到:
所以我们就不太费劲地算出了 \(E[X]\) 的上界。
其实我主要是看了这个分析过程才想写关于 RWMA 的内容的,这个缩放比较行。
RWMA 的启示
-
随机化,走天下。 -
直觉很有效。人类的直觉多数情况下是有效经验的反映,尤其是面对这种最优化问题的时候。
-
保留自主选择的权力往往能赢得更好的结果,
不信请看 WC2022 T3 的随机化乱搞。