📑 本页目录(点开跳转)
07 · 探索与利用
⏱ 28 分钟 | ⭐ 推荐系统那一章的理论底座
🎯 一句话
试新的可能更好,但也可能更差;用熟的稳,但可能永远错过更好的。 这一章讲怎么在两者之间做到数学上最优。
🎰 一、把问题剥到最简:多臂老虎机
K 台老虎机,每台的真实中奖率未知
你有 T 次机会,想让总收益最大
⭐ 这就是 MDP 去掉「状态」之后剩下的东西
→ 没有状态转移,纯粹的探索利用问题
衡量指标:遗憾(Regret)
$$\text{Regret}(T) = T\cdot\mu^* - \sum_{t=1}^{T}\mathbb{E}[r_t]$$
💡 人话:「如果我一开始就知道哪台最好」和「我实际拿到的」之间的差距。
目标:让 Regret 增长得【尽可能慢】
❌ 纯利用:可能一直卡在次优臂 → Regret 线性增长 O(T) 💀
❌ 纯随机:一直在试 → Regret 也是线性 O(T) 💀
✅ 好算法:Regret 只有 O(log T) ⭐
→ log T 意味着:跑得越久,平均每次的损失越小
🔑 理论下界:任何算法的 Regret 至少是 Ω(log T)。 所以达到 O(log T) 的算法就是渐近最优的 —— 这不是"够好",是"到顶了"。
🎲 二、ε-贪心:最简单的办法
以 ε 概率随机选一个(探索)
以 1−ε 概率选当前最好的(利用)
| ✅ | ❌ |
|---|---|
| 一行代码 | Regret 是线性的(ε 固定时永远在浪费 ε 比例的机会)⭐ |
| 什么场景都能用 | 探索是均匀的 —— 明显很差的臂也照试不误 💀 |
改进:ε 衰减
eps = max(eps_min, eps_start * (decay ** episode)) # 或 eps = 1/t
💡 实践中 ε-贪心仍然大量使用(DQN 就用它), 因为在高维问题上,理论上更优的方法往往难以实现。 但在老虎机这种简单场景,它明显不如下面两个。
📈 三、UCB:给不确定性一个奖金 ⭐
$$a_t = \arg\max_a\Big[\underbrace{\hat\mu_a}_{\text{当前估计}} + \underbrace{c\sqrt{\tfrac{\ln t}{N_a}}}_{\text{不确定性奖金}}\Big]$$
💡 人话翻译:
选「估计值 + 不确定性」最大的那个 —— 不是选最好的,是选最有可能是最好的。
N_a 小(试得少)→ 奖金大 → 更容易被选中 ⭐
N_a 大(试得多)→ 奖金小 → 靠真实表现说话
⭐ 这就是第 1 章那句「不确定性本身就是探索的理由」的公式版
回到第 1 章那个餐厅例子:
A 店:试过 10 次,均值 7 分
B 店:试过 1 次,得了 6 分
现在是第 t = 11 次,取 c = 2
UCB(A) = 7 + 2·√(ln11 / 10) = 7 + 2·√0.2398 = 7 + 0.98 = 7.98
UCB(B) = 6 + 2·√(ln11 / 1) = 6 + 2·√2.398 = 6 + 3.10 = 9.10 ⭐
→ 选 B!因为它的不确定性太大,值得再试
✅ UCB 的 Regret 是 O(log T) —— 达到理论下界,渐近最优。 而且它是确定性的(不需要随机数),可复现性好。
⚠️ c 怎么定:c 越大越爱探索。理论建议 c=√2,实践常用 1~2。 奖励范围不是 [0,1] 时必须先归一化,否则 c 的含义完全变了。
🎯 四、Thompson Sampling:从后验里抽一个 ⭐⭐
① 对每个臂维护一个【概率分布】,表示"我认为它的中奖率是多少"
② 每次决策时,从每个分布里【随机抽一个数】
③ 选抽出来最大的那个
④ 观察结果,更新那个臂的分布
伯努利奖励下用 Beta 分布(数学上最漂亮的部分):
臂 a 的先验:Beta(1, 1) ← 均匀分布,什么都不知道
每次拉臂后更新:
中奖 → Beta(α+1, β)
没中 → Beta(α, β+1)
⭐ 就是数一下赢了几次、输了几次,这叫【共轭先验】
import numpy as np
class ThompsonSampling:
def __init__(self, k):
self.alpha = np.ones(k) # 赢的次数 + 1
self.beta_ = np.ones(k) # 输的次数 + 1
def select(self):
# ⭐ 核心就这一行:从每个臂的后验里抽样,选最大的
return int(np.argmax(np.random.beta(self.alpha, self.beta_)))
def update(self, a, reward):
self.alpha[a] += reward
self.beta_[a] += 1 - reward
💡 为什么它这么优雅:
不确定性大的臂,它的分布"胖" → 抽出大值的概率就高 → 自然被探索。 试的次数多了,分布收窄 → 抽样结果趋近真实均值 → 自然转向利用。
⭐ 探索和利用不是两个模式在切换,是同一个动作的自然结果。
UCB vs Thompson Sampling
| UCB | Thompson Sampling | |
|---|---|---|
| 原理 | 乐观面对不确定性 | 按后验概率采样 |
| Regret | O(log T) | O(log T) |
| 实践表现 | 好 | 通常更好 ⭐ |
| 是否随机 | 确定性 | 随机 |
| 并行/延迟反馈 | 较差 | 天然友好 ⭐⭐ |
🔑 最后一行是工业界选它的真正原因: 推荐系统里,你同时给一万个用户发了推荐,反馈几分钟后才回来。 UCB 在这段时间里会给所有人推同一个东西(因为它是确定性的); Thompson Sampling 天然给每个人抽不同的样,探索自动分散开。
🔗 推荐算法第 13 章用的就是它 —— 那一章告诉你怎么用,这一章告诉你为什么它是对的。
🧊 五、有状态时的探索:难得多
老虎机没有状态,所以简单。真实 MDP 里探索要难一个数量级:
问题:有些状态要走 20 步才能到达
→ 随机探索几乎不可能走到那里 💀
经典难题:Montezuma's Revenge(雅达利游戏)
→ 需要"拿钥匙→开门→下楼梯"一长串正确动作才有奖励
→ 纯 ε-贪心:训练几亿帧,得分 0
三类解法:
| 思路 | 做法 | 代表 |
|---|---|---|
| 内在奖励 ⭐ | 给"没见过的状态"额外加分,把好奇心变成奖励 | RND、ICM |
| 计数式探索 | 记录每个状态访问次数,少的给奖金(UCB 的 MDP 版) | Pseudo-count |
| 参数空间噪声 | 不是给动作加噪声,而是给网络权重加噪声 | NoisyNet ⭐ |
💡 第三个思路很聪明:给动作加随机噪声,效果是"每步都可能手抖"; 给权重加噪声,效果是"这一整局我是一个略微不同的智能体" —— 后者产生的探索行为是连贯的,能走出很长的新路径。
🤖 六、这一章在 RLHF 里的样子
语言模型生成时的 temperature / top-p,就是探索利用!
temperature = 0 → 纯利用(每次都选概率最高的 token)
temperature 高 → 更多探索
⭐ RLHF 训练时必须保持一定随机性,否则:
· 采不到多样的回答 → 奖励模型只能看到一种风格
· 策略迅速塌缩到单一模式(mode collapse)
⚠️ 上面这句「top-p 就是探索利用」是个结论,但这一章从头到尾没说 top-p 到底是什么。 🔗 补上那一半:全景导论 06b · 解码策略。 那一章讲的正是这里的对偶面——top-k 是「候选池固定大小」,top-p 是「候选池按累积概率动态伸缩」, 所以模型很确定时 top-p 自动收成近乎 greedy(利用),模型犹豫时自动放宽(探索): ⭐ 它比 temperature 更像一个「自适应的 ε」,这是把这一章的老虎机直觉搬到 LLM 上时最该知道的一件事。 那边还写了 temperature / top-k / top-p 三个旋钮同时开时的作用顺序,以及复读机该用 repetition penalty 还是调 top-p。
🔗 这解释了全景导论里那个现象: RLHF 训久了模型会变得"无聊"、回答趋同 —— 那正是探索不足导致的策略塌缩。KL 惩罚(第 11、12 章)是用来把模型拴在 SFT 附近的。
⚠️ 但别指望那个 KL 惩罚能拦住 mode collapse ——这是最容易搞反的一处。 RLHF 罚的是反向 KL:$\text{KL}(\pi_\theta\,\|\,\pi_{SFT})$,$\pi_\theta$ 在分子。 展开看就明白它在罚什么:$\pi_{SFT}$ 概率接近 0 而 $\pi_\theta$ 还给了概率的地方,$\log$ 里的比值爆炸 → 罚得极重; 反过来,$\pi_{SFT}$ 概率很高而 $\pi_\theta$ 已经塌到 0 的地方,整项被前面的 $\pi_\theta$ 乘成 0 → 一分钱不罚。 而 mode collapse 恰恰是后一种:模型没有跑出去,它是缩回来了——把 SFT 的其他峰全丢掉,只钻进一个。 ⭐ 所以「反向 KL 是 mode-seeking 的」不是学术八股,它就是「RLHF 训久了变无聊」的数学解释: 你用来防塌缩的那一项,本身就偏爱塌缩。真要对抗它得靠别的(保温度、熵正则、限制训练轮数)。 🔗 数学原理 01b · KL 散度 是这个「前向铺开 / 反向找峰」的正式出处—— KL 在这套教程里被引用了六次(这里、第 11、12、13 章,蒸馏,变分推断),那一章是它唯一被定义的地方。
🔗 七、和站内其他章的关系
| 相关的地方 | 这里的位置 |
|---|---|
| 第 1 章的餐厅例子 | 这里给了它三个公式解 |
| 推荐算法 13 Thompson Sampling | 本章是它的理论解释 ⭐ |
| 第 6 章 ε-贪心 | 这里说明它为什么不够好 |
| 全景导论 06b · 解码策略 | LLM 的 temperature / top-k / top-p 是探索利用的生成版 ⭐。这一章讲「为什么要探索」,那一章讲这三个旋钮各自怎么调、同时开时谁先生效 |
| 数学原理 01b · KL 散度 | 第六节那个「反向 KL 罚不到 mode collapse」的正式解释。前向 KL 铺开、反向 KL 找峰 |
| A/B 测试 | 老虎机是它的"自适应"版本 |
✅ 检查点
- 遗憾(Regret)是什么?好算法的 Regret 是什么量级?理论下界呢?
- ε-贪心有哪两个缺点?
- UCB 的公式在做什么?用餐厅例子算一遍。
- Thompson Sampling 怎么工作?为什么说它的探索利用"不是两个模式在切换"?
- 工业界为什么常选 Thompson Sampling 而不是 UCB?
- 为什么有状态的 MDP 里探索难得多?
- 参数空间噪声比动作噪声好在哪?
- LLM 的 temperature 和这一章什么关系?RLHF 训久了变无聊是为什么?
👀 答案
- Regret = 「一开始就知道最优臂能拿到的」减去「实际拿到的」。好算法是 O(log T);理论下界是 Ω(log T),所以 O(log T) 是渐近最优。
- ①Regret 线性增长(ε 固定时永远浪费 ε 比例的机会)②探索是均匀的——明显很差的臂也照试不误。
- 选「估计值 + 不确定性奖金」最大的,即不是选最好的,是选最有可能是最好的。餐厅:UCB(A)=7+2√(ln11/10)=7.98,UCB(B)=6+2√(ln11/1)=9.10 → 选 B。
- 每个臂维护一个后验分布,每次从各分布抽一个数,选最大的。因为不确定性大的臂分布"胖",抽出大值的概率高就被探索;试多了分布收窄就自然转向利用——同一个动作的自然结果,不是两个模式切换。
- 并行/延迟反馈友好。推荐里同时给一万人发推荐、反馈几分钟后才回来,UCB 是确定性的会给所有人推同一个,Thompson 天然给每人抽不同的样,探索自动分散。
- 因为有些状态要走 20 步才到,随机探索几乎不可能走到。如 Montezuma's Revenge 需要"拿钥匙→开门→下楼梯"一长串正确动作才有奖励,纯 ε-贪心训几亿帧得分 0。
- 动作噪声 = "每步都可能手抖";权重噪声 = "这一整局我是个略微不同的智能体",产生的探索行为是连贯的,能走出很长的新路径。
- temperature 就是探索利用:temperature=0 是纯利用。RLHF 训久了变无聊是探索不足导致的策略塌缩(mode collapse)。⚠️ KL 惩罚拦不住它——KL 惩罚管的是「别跑出 SFT 的范围」,而 mode collapse 是缩回来不是跑出去。RLHF 用的是反向 KL($\pi_\theta$ 在分子),$\pi_\theta$ 已经塌到 0 的地方整项被乘成 0,一分钱不罚。⭐ 你用来防塌缩的那一项,本身就偏爱塌缩。真要对抗得靠保温度、熵正则、限制训练轮数。
🛑 可以停在这里
⚡ 走神救援
多臂老虎机 = MDP 去掉状态。指标是遗憾 Regret,好算法 O(log T),理论下界也是 Ω(log T) 所以这就是到顶。ε-贪心:一行代码但Regret线性且探索均匀(很差的臂也照试)。⭐UCB = 估计值 +
c√(ln t / N_a)不确定性奖金 —— 不是选最好的,是选最有可能是最好的(餐厅例子:试1次的B店 UCB=9.10 > 试10次的A店 7.98)。⭐⭐Thompson Sampling = 每个臂维护后验分布(伯努利用 Beta,就是数赢几次输几次),每次从各分布抽一个数选最大的;优雅在于不确定性大的臂分布"胖",抽出大值概率高就被探索 —— 探索和利用不是两个模式切换,是同一个动作的自然结果。⭐工业界选它的真正原因是并行/延迟反馈友好:同时给一万人推荐时,UCB是确定性的会给所有人推同一个,Thompson天然分散。有状态时探索难一个数量级(Montezuma需要一长串正确动作,ε-贪心训几亿帧得0分)→ 内在奖励/计数探索/参数空间噪声(给权重加噪声="这局我是个略不同的智能体",探索连贯能走很长新路径)。⭐LLM的temperature就是探索利用,RLHF训久了变无聊=探索不足导致策略塌缩,KL惩罚就是对抗它的。
下一节 👉 08-DQN.md ⭐