有趣的算法04--专家问题

By ten of hearts

← Back

今天, 我想要介绍一个充满不确定性博弈的问题: 在线学习(Online Learning).

想象一下, 你每天都要决定是否带伞, 或者每天都要决定买哪只股票. 你手头有 \(n\) 个”专家”, 他们每天都会给你一个建议. 有些专家可能很准, 有些可能是瞎猜, 而你并不知道那些专家比较可靠. 我们需要找到一个策略, 每天选择一个专家的建议听从, 并且让我们的选择尽可能正确.

这就是经典的专家问题(The Experts Problem). 今天我们将从最朴素的想法出发, 一步步推导出一个有明确错误率上界的”最佳策略”.

问题描述

让我们把问题形式化.

假设我们有 \(n\) 个专家和 \(T\) 天, 其中\(T\) 未必是已知的.

  1. 在第 \(t\in [T]\) 天, 每个专家 \(i\in [n]\) 都会给出一个预测.
  2. 我们需要选择听从其中某一个专家的建议, 第 \(t\) 天选择的专家记为 \(i_{t}\).
  3. 在每一天结束时, 根据结果, 每个专家 \(i\) 都会产生一个损失 \(f_i^t \in [0, 1]\).
  4. 对于我们选择了的专家 \(i_t\), 那么你当天的损失就是 \(f_{i_t}^t\).

我们的终极目标是最小化我们的总损失:

\[\sum_{t=1}^{T} f_{i_t}^t\]

为了方便讨论和思考, 这篇博客中我们默认损失是二元的:

\[f_{i_{t}}^{t} \in \left\{ 0, 1 \right\}\]

评价标准: 遗憾

怎么评价我们做得好不好呢?

想要保证每一天都选到那个当天表现最好的专家显然是不现实的 (当然除非你会算命).

期望总损失 \(\mathcal{F}_{\{\text{total}\}}\le \sum_{t=1}^T \min_{i \in [n]} f_i^t\) 是不现实的.

因此, 我们设定一个相对目标: 在 \(T\) 天结束后, 回头看, 如果我们当初一直死心塌地地跟着某一个表现最好的专家走, 我们的损失会是多少? 我们将我们的损失与这个”最佳专家”的损失之差, 称为遗憾(Regret):

\[R = \left( \sum_{t=1}^{T} f_{i_t}^t \right) - \left( \min_{i \in [n]} \sum_{t=1}^{T} f_i^t \right)\]

我们的目标是让 \(R\) 尽可能小. 最好是次线性的, 即当 \(T \to \infty\) 时, 平均每天的遗憾 \(\frac{R}{T} \to 0\).


算法

I: 盲从法

最简单的想法: 我们就死盯着第 1 个专家, 或者任意指定一个专家 \(u\), 每天都听他的.

\[\text{Algorithm}: i_t = 1, \forall t \in [T]\]

这个算法怎么样?

很遗憾, 它非常糟糕. 假设我们面对是一个对抗环境. 对手只要每天让你选的那个专家出错(\(f_{i_{t}}^t = 1\)), 而让另一个专家永远正确(\(f_{\text{best}}^t = 0\)).

对抗环境: 想象有一个无所不知的”对手”, 他知道你的算法是怎么运行的, 并且能够每天针对性地设置最坏的损失函数 \(f_i^t\), 专门让你的策略表现最差. 换句话说, 对手总是在挖坑让你跳! 这是一个最恶劣的假设, 但如果我们的算法能在这种情况下都表现不错, 那它在真实世界(运气好一点的场景)肯定也能跑得很好.

那么:

  • 我们的损失 = \(T\)
  • 最佳专家的损失 = \(0\)
  • Regret: \(R = T - 0 = T\).

这意味着我们每天都在犯错, 从来没有学到东西.

II: 少数服从多数

既然听一个人的不行, 那我们听大家的? 策略: 每天统计所有专家的预测, 选择大多数专家支持的那个结果.

这个算法怎么样? 还是很糟糕.

证明: 对手可以构造一种情况, 让那”大多数”专家(\(1, 2, \dots, n-1\))每天都错(\(f_{majority}^t = 1\)), 而总有一小撮人(\(n\))是对的. 结果依然是: \(f_{our}^t = 1\), 而 \(f_{n}^t = 0\)(存在某个专家一直是对的). \(\implies R = T\).

结论: 在对抗环境下, 任何确定性的算法都无法获得亚线性的遗憾. 也就是 \(R\) 总会正比于 \(T\).

III: 随机乱选

既然这帮专家也不一定靠谱, 那我就每天随机选一个专家听他的.

策略: 每天从 \(n\) 个专家中均匀随机选一个.

让我们看看期望损失:

\[\mathbb{E}\left[\sum_{t=1}^{T} f_{i_{t}}^{t}\right] = \sum_{t=1}^T \frac{1}{n} \sum_{i=1}^n f_i^t\]

最坏情况下, 最佳专家的损失是 0, 而其他所有专家的损失都是 1. 那么平均下来的损失是 \(\frac{n-1}{n}\).

\[R \le \frac{n-1}{n}T\]

虽然引入了随机性, 但这个遗憾值还是与 \(T\) 成正比, 并没有真正进行”学习”.

IV: 谁行听谁的

这是一个很符合直觉的策略: 利用历史记录! 我们记录每个专家过去的表现, 每一天都选择迄今为止损失最小的那个专家.

策略: 选择 \(i_t = \arg\min_i \sum_{\tau=1}^{t-1} f_i^\tau\).

这个算法怎么样呢? 实际上也不太好.

Claim: \(R \le \frac{n-1}{n}T\).

证明: 我们可以构造一个对抗场景. 假设只有 2 个专家 A 和 B.

  • Day 1: A 错, B 对 \(\to\) 我们选 B.
  • Day 2: B 错, A 对 \(\to\) 我们选 A.
  • Day 3: A 错, B 对 \(\to\) 我们选 B. …

这样, 我们选谁, 谁就错(\(f_{our}^t = 1\)), 而我们没选的那个人总是对的.

最终我们的损失是 \(T\), 而最佳专家的损失大概是 \(T/2\). 虽然比全错好一点, 但 Regret 依然是 \(O(T)\) 级别的.

我们能不能做得更好?


V: 乘法权重更新 (Multiplicative Weights Update, MWU)

我们要解决的核心矛盾是: 既要相信表现好的专家(像算法 IV), 又不能完全排除其他专家(像算法 III 那样保留随机性), 同时还要能快速适应变化.

MWU 算法横空出世. 它的核心思想是: 给每个专家赋予一个权重, 如果他犯错了, 就降低他的权重(惩罚他), 然后根据权重比例随机选择专家.

算法流程

  1. 初始化: 给每个专家 \(i\) 赋予初始权重 \(w_i^1 = 1\).
  2. 对于每一天 \(t = 1, \dots, T\):
    • 选择: 根据权重计算概率分布 \(p^t\), 其中选专家 \(i\) 的概率为:

      \[p_i^t = \frac{w_i^t}{\sum_{j=1}^n w_j^t}\]
    • 更新: 观察当天的损失向量 \(f^t\), 更新每个专家的权重:

      \[w_i^{t+1} = w_i^t \cdot (1 - \epsilon f_i^t)\]

      这里 \(\epsilon \in (0, 1)\) 是一个固定的参数, 类似于学习率.

直观理解:

这是一个”指数加权”的过程. 如果专家 \(i\) 错得厉害 (\(f_i^t \approx 1\)), 他的权重就会乘以 \((1-\epsilon)\), 快速衰减. 如果他全对, 权重不变.

理论分析

这个算法到底有多强? 我们有如下定理:

定理: 对于 \(\epsilon \in (0, \frac{1}{2})\), MWU 算法的期望遗憾满足:

\[\mathbb{E}[R] \le \epsilon T + \frac{\ln n}{\epsilon}\]

如果 \(T\) 已知, 我们可以取最优的 \(\epsilon = \sqrt{\frac{\ln n}{T}}\), 此时:

\[\mathbb{E}[R] \le 2\sqrt{T \ln n}\]

这意味着平均每日遗憾 \(\frac{R}{T} \propto \frac{1}{\sqrt{T}}\), 当 \(T \to \infty\) 时, 遗憾趋近于 \(0\)!

证明过程

为了证明这个定理, 我们需要使用势能函数法. 定义势能函数为所有权重的总和:

\[\Phi^t = \sum_{i=1}^n w_i^t\]

Step 1: 寻找 \(\Phi\) 的上界

如果在第 \(t\) 天产生了损失, 总权重 \(\Phi\) 会减小.

\[\begin{align*}\Phi^{t+1} &= \sum_{i=1}^n w_i^{t+1} = \sum_{i=1}^n w_i^t(1 - \epsilon f_i^t) \\ &= \sum_{i=1}^n w_i^t - \epsilon \sum_{i=1}^n w_i^t f_i^t\end{align*}\]

注意到 \(p_i^t = \frac{w_i^t}{\Phi^t}\), 所以 \(w_i^t = p_i^t \Phi^t\). 代入上式:

\[\Phi^{t+1} = \Phi^t (1 - \epsilon \sum_{i=1}^n p_i^t f_i^t) = \Phi^t (1 - \epsilon \langle p^t, f^t \rangle)\]

其中 \(\langle p^t, f^t \rangle\) 正是我们在第 \(t\) 天的期望损失:

\[\mathbb{E}\left[f_{i_{t}}^{t}\right] = \sum_{i=1}^{n}p_{i}^{t}f_{i}^{t} = \langle p^t, f^t \rangle\]

利用高中常用的不等式 \(1 - x \le e^{-x}\), 我们有:

\[\Phi^{t+1} = \Phi^t (1 - \epsilon \langle p^t, f^t \rangle) \le \Phi^t e^{-\epsilon \langle p^t, f^t \rangle}\]

递推 \(T\) 次, 得到上界:

\[\Phi^{T+1} \le \Phi^1 \prod_{t=1}^T e^{-\epsilon \langle p^t, f^t \rangle} = n \cdot e^{-\epsilon \sum_{t=1}^T \langle p^t, f^t \rangle}\]

Step 2: 寻找 \(\Phi\) 的下界

总权重一定大于等于任何一个单一专家的权重. 假设最佳专家是 \(k\).

\[\Phi^{T+1} \ge w_k^{T+1} = w_{k}^{1} \cdot \prod_{t=1}^T (1 - \epsilon f_k^t) = \prod_{t=1}^T (1 - \epsilon f_k^t)\]

利用泰勒展开近似 \(\ln(1-x) \ge -x - x^2 \implies 1 - x \geq \exp(-x - x^{2})\) (\(x < \frac{1}{2}\)), 或者更严格的不等式, 我们可以推导出:

\[\Phi^{T+1} \ge \prod_{t=1}^T \exp(-\epsilon f_k^t - \epsilon^2 (f_k^t)^2) = \exp(-\epsilon \sum_{t=1}^{T} f_k^t - \epsilon^2 \sum_{t=1}^{T} (f_k^t)^2)\]

Step 3: 联立求解

结合 Step 1 和 Step 2 的结果:

\[\exp(-\epsilon \sum_{t=1}^{T} f_k^t - \epsilon^2 \sum_{t=1}^{T} (f_k^t)^2) \le \Phi^{T+1} \le n \cdot \exp(-\epsilon \sum_{t=1}^{T} \langle p^t, f^t \rangle)\]

两边取自然对数 \(\ln\):

\[-\epsilon \sum_{t=1}^{T} f_k^t - \epsilon^2 \sum_{t=1}^{T} (f_k^t)^2 \le \ln n - \epsilon \sum_{t=1}^{T} \langle p^t, f^t \rangle\]

移项整理得到:

\[\epsilon \left( \underbrace{\sum_{t=1}^{T} \langle p^t, f^t \rangle - \sum_{t=1}^{T} f_k^t}_{R} \right) \le \ln n + \epsilon^2 \sum_{t=1}^{T} (f_k^t)^2\]

由于 \(f \in [0,1]\), 所以 \((f_k^t)^2 \le f_k^t \le 1\), 粗略放缩 \(\sum_{t=1}^{T} (f_k^t)^2 \le T\). 两边同时除以 \(\epsilon\):

\[R \le \frac{\ln n}{\epsilon} + \epsilon T\]

证毕.


写在最后

MWU 算法不仅仅是用来解决专家问题的, 它是一个非常强大的元算法.

  • 零和博弈: 你可以用 MWU 来逼近纳什均衡.
  • 线性规划: 它可以用来快速求解近似解.
  • Adaboost: 著名的集成学习算法 Adaboost 本质上就是 MWU 的一种特殊形式.

除此以外, 现代大模型中, 在线学习也是一个十分重要的问题. 虽然目前大模型在线学习的领域并没有类似 MWU 的算法广为流传, 但是也许我们也能从 MWU 中汲取灵感, 并且对现有的在线学习或 TTS 方法有所创新.

更为重要的是, 我们也许能从传统算法的宝库中汲取灵感, 有的时候力大砖飞地训练方法并不是唯一的解法, 传统算法在深度学习的时代依然是十分重要的.

希望这篇文章能让你有所收获, 有所启发. 欢迎大家私信交流!

Tags: learning cs

← Back