背景
多臂老虎机的名称来源于赌场中的老虎机(slot machine),假设你面对一个具有多个拉杆(“臂”)的老虎机,每个臂的奖励分布不同,目标是通过不断试验,找到最优的策略,以最大化累积奖励。然而,由于你对各个臂的奖励一开始并不了解,因此需要在“探索(exploration)”和“利用(exploitation)”之间权衡。
问题介绍
问题定义
在多臂老虎机(multi-armed bandit,MAB)问题(见图 2-1)中,有一个拥有KKK根拉杆的老虎机,拉动每一根拉杆都对应一个关于奖励的概率分布RRR。我们每次拉动其中一根拉杆,就可以从该拉杆对应的奖励概率分布中获得一个奖励rrr。我们在各根拉杆的奖励概率分布未知的情况下,从头开始尝试,目标是在操作 TTT次拉杆后获得尽可能高的累积奖励。由于奖励的概率分布是未知的,因此我们需要在“探索拉杆的获奖概率”和“根据经验选择获奖最多的拉杆”中进行权衡。
形式化定义
- 设定:
- 有 KKK个老虎机,每个老虎机iii具有一个未知的奖励分布PiP_iPi
- 在每个时间步ttt,选择一个臂AtA_tAt,并获得奖励RtR_tRt,其中RtR_tRt服从PAtP_{A_t}PAt。
- 目标:
- 设计一个策略(Policy),最大化累积奖励:GT=∑t=1TRtG_T=\sum_{t=1}^{T}R_tGT=∑t=1TRt
累计懊悔
对于每一个动作aaa,我们定义其期望奖励为Q(a)=Er∼R(⋅∣a)[r]Q(a)=\mathbb{E}_{r \sim \mathcal{R}(\cdot \mid a)}[r]Q(a)=Er∼R(⋅∣a)[r]。于是,至少存在一根拉杆,它的期望奖励不小于拉动其他任意一根拉杆,我们将该最优期望奖励表示为Q∗=maxa∈AQ(a)Q^*=max_{a \in \mathcal{A}}Q(a)Q∗=maxa∈AQ(a)。为了更加直观、方便地观察拉动一根拉杆的期望奖励离最优拉杆期望奖励的差距,我们引入懊悔(regret)概念。懊悔定义为拉动当前拉杆的动作与最优拉杆的期望奖励差,即R(a)=Q∗−Q(a)R(a)=Q^*-Q(a)R(a)=Q∗−Q(a)。累积懊悔(cumulative regret)即操作 次拉杆后累积的懊悔总量,对于一次完整的步决策a1,a2,…,aT{a_1, a_2,\dots,a_T}a1,a2,…,aT,累积懊悔为σR=∑t=1TR(at)\sigma_R=\sum_{t=1}^{T}R(a_t)σR=∑t=1TR(at)。MAB 问题的目标为最大化累积奖励,等价于最小化累积懊悔。
估计期望奖励
在多臂老虎机问题中,每一根拉杆(或称为“臂”)都有一个未知的奖励分布,而我们希望通过反复拉动各个拉杆,逐步“学习”到它们的真实期望奖励。由于真实的期望奖励无法直接获得,我们只能根据每次拉杆所获得的实际奖励来估计它的期望奖励,这个估计值通常称为“估计期望奖励”或动作价值 Q(a)Q(a)Q(a)。
估计期望奖励 实质上是根据历史奖励数据对未知奖励分布的均值进行估计;
1. 基本定义
对于某一根拉杆 aaa:
-
真实期望奖励 定义为
Q∗(a)=E[r∣a] Q^*(a) = E[r \mid a] Q∗(a)=E[r∣a]
即如果反复拉动该拉杆,获得奖励的平均值(理论上)就是 Q∗(a)Q^*(a)Q∗(a)。 -
估计期望奖励 则是我们基于有限次试验所计算出的平均值,记作 Q(a)Q(a)Q(a)。最简单的估计方法是取样本平均:
Q(a)=∑i=1N(a)riN(a)Q(a) = \frac{\sum_{i=1}^{N(a)} r_i}{N(a)}Q(a)=N(a)∑i=1N(a)ri
其中 N(a)N(a)N(a) 表示拉动该拉杆的次数,rir_iri 是第 iii 次获得的奖励。
2. 增量式更新方法
为了避免每次更新都需要重新遍历所有历史奖励(这在计算上和存储上都不划算),通常使用增量式更新方法。设当前已有 nnn 次观测,其估计值为 QnQ_nQn,当第 n+1n+1n+1 次获得奖励 rn+1r_{n+1}rn+1 后,更新公式为:
Qn+1=Qn+1n+1(rn+1−Qn)
Q_{n+1} = Q_n + \frac{1}{n+1} \left( r_{n+1} - Q_n \right)
Qn+1=Qn+n+11(rn+1−Qn)
这个公式直观上可以理解为“旧的估计值加上一个调整项”,调整项的大小正比于新观测与当前估计值之间的差距,并且随着试验次数的增加,新数据的影响逐渐减小,从而保证在足够多次试验后,估计值会收敛于真实期望奖励。此方法不仅计算效率高(每次更新只需常数时间),而且节省存储空间,因为只需要记住当前的 QnQ_nQn 和 N(a)N(a)N(a) 即可。
此外,对于非平稳环境(即奖励分布可能随时间变化),可以采用固定学习率 α\alphaα(例如 0.1 或 0.01)进行更新:
Qn+1=Qn+α(rn+1−Qn)
Q_{n+1} = Q_n + \alpha \left( r_{n+1} - Q_n \right)
Qn+1=Qn+α(rn+1−Qn)
这样,新获得的奖励信息会始终保持一定的权重,帮助模型更快地适应环境变化。
ϵ\epsilonϵ-贪心算法
ϵ\epsilonϵ-贪心算法通过在每一步以 1−ϵ1-\epsilon1−ϵ 的概率利用当前最优估计、以 ϵ\epsilonϵ 的概率随机探索其他动作,平衡了探索与利用的关系。其核心是利用增量更新公式来高效更新每个动作的估计期望奖励,从而使得经过足够多次试验后,算法能够收敛于较优的策略。尽管简单,但合理的参数设置和可能的改进(如衰减ε或乐观初值)可以显著提升其表现。
核心思想
ε-贪心算法的核心在于如何在“利用”(exploitation)当前最有可能最优的动作和“探索”(exploration)尝试其他可能更优的动作之间取得平衡:
- 利用(Exploitation):以概率 1−ϵ1-\epsilon1−ϵ 选择当前估计值 Q(a)Q(a)Q(a) 最高的动作,即选择看似最优的老虎机。
- 探索(Exploration):以概率 ϵ\epsilonϵ 随机选择一个动作,从而获得新的信息,防止过早陷入局部最优。
这样,即使某个老虎机当前的 Q(a)Q(a)Q(a) 值较低,仍有一定概率被尝试,保证了算法能持续发现潜在的高奖励臂。
算法伪代码
下面是 ε-贪心算法在多臂老虎机问题中的伪代码示例:
# 初始化:对于每个动作 a,设定初始估计 Q(a)(例如可以设为0或乐观初值),记录选择次数 N(a)=0
for each time step t = 1,2,...,T:
generate a random number r in [0,1)
if r < ε:
# 探索阶段:随机选择一个动作
choose an action a uniformly at random
else:
# 利用阶段:选择当前估计值最大的动作
choose action a = argmax_{a} Q(a)
# 执行动作 a,获得奖励 r_t
r_t = bandit.step(a)
# 更新该动作的计数和估计值
N(a) = N(a) + 1
Q(a) = Q(a) + (1 / N(a)) * (r_t - Q(a))
在实现时,关键点在于:
- 控制探索概率 ϵ\epsilonϵ。通常,ϵ\epsilonϵ 可设为较小的常数(如0.1或0.01),也可以设计成随时间衰减的形式(例如 ϵt=1t\epsilon_t=\frac{1}{t}ϵt=t1),使得随着试验次数的增加,算法更多利用已获得的信息。
- 记录每个动作的选择次数 (N(a)) 用于计算步长。
优缺点与注意事项
优点
- 简单直观:实现简单,理解容易。
- 探索保障:通过固定或衰减的 (\epsilon) 保证了探索,不会因为过早利用而错过潜在更优的动作。
- 灵活性:可以结合乐观初值、固定学习率等技巧进一步改进算法表现。
缺点
- 参数敏感性:探索概率 (\epsilon) 的设定较为关键,过大则浪费机会,过小则可能陷入局部最优。
- 固定ε问题:如果 (\epsilon) 固定不变,算法在长期内可能产生线性累积懊悔;而采用衰减策略则可以获得次线性累积懊悔。
- 适用场景有限:在某些复杂环境下,简单的ε-贪心可能不够高效,需要更高级的探索策略(如UCB、汤普森采样等)。
上置信界算法
设想这样一种情况:对于一台双臂老虎机,其中第一根拉杆只被拉动过一次,得到的奖励为 ;第二根拉杆被拉动过很多次,我们对它的奖励分布已经有了大致的把握。这时你会怎么做?或许你会进一步尝试拉动第一根拉杆,从而更加确定其奖励分布。这种思路主要是基于不确定性,因为此时第一根拉杆只被拉动过一次,它的不确定性很高。一根拉杆的不确定性越大,它就越具有探索的价值,因为探索之后我们可能发现它的期望奖励很大。我们在此引入不确定性度量 ,它会随着一个动作被尝试次数的增加而减小。我们可以使用一种基于不确定性的策略来综合考虑现有的期望奖励估值和不确定性,其核心问题是如何估计不确定性。
在多臂老虎机问题中,每个拉杆(或臂)有一个未知的奖励分布,我们希望在有限次试验内最大化累计奖励。传统的贪婪策略或 ε-贪心策略在利用当前最优动作的同时,通过随机性来探索其它动作,但这种探索方式存在盲目性。而 UCB 算法则利用统计理论(例如 Hoeffding 不等式)构造一个“乐观”的奖励估计,即在每个动作的估计值上加上一个与其不确定性相关的上置信界,从而在决策时既考虑当前平均奖励,又考虑“未充分探索”的可能性。
上置信界(UCB,Upper Confidence Bound)算法是一种基于统计不确定性来平衡探索与利用的策略,它在多臂老虎机问题中非常经典。下面我详细介绍 UCB 算法的原理、公式推导、实现细节及优缺点。
上置信界算法利用统计不确定性为每个动作构造一个乐观的奖励估计,决策时选择“当前看起来最有希望”的动作。其关键公式为:
at=argmaxa[Qt(a)+clnt2 Nt(a)]
a_t = \arg\max_{a} \left[ Q_t(a) + c\sqrt{\frac{\ln t}{2\,N_t(a)}} \right]
at=argamax[Qt(a)+c2Nt(a)lnt]
这种方法既利用了已有的经验信息 Qt(a)Q_t(a)Qt(a),又根据试验次数Nt(a)N_t(a)Nt(a)动态调整探索程度,保证了算法在长期内能够收敛到最优策略。
核心思想
UCB 算法的基本思想是:
- 对于每个动作 aaa,我们记录其历史奖励的样本平均值 Qt(a)Q_t(a)Qt(a) 和被选择的次数 Nt(a)N_t(a)Nt(a)。
- 同时,通过 Hoeffding 不等式,我们可以证明,在一定置信水平下,真实均值 Q∗(a)Q^*(a)Q∗(a) 至多与 Qt(a)Q_t(a)Qt(a) 相差一个项:
Q∗(a)≤Qt(a)+lnt2 Nt(a) Q^*(a) \le Q_t(a) + \sqrt{\frac{\ln t}{2\,N_t(a)}} Q∗(a)≤Qt(a)+2Nt(a)lnt
其中 ttt 是总的试验次数。这里的 lnt2 Nt(a)\sqrt{\frac{\ln t}{2\,N_t(a)}}2Nt(a)lnt 就是对不确定性的一个度量:当一个动作很少被试验时,Nt(a)N_t(a)Nt(a) 较小,上界较大,说明我们对其真实值了解不足;而当 Nt(a)N_t(a)Nt(a) 增大时,该项减小,表示不确定性降低。 - 为了灵活控制探索程度,我们通常引入一个常数 ccc,最终 UCB 算法选择动作的准则为:
at=argmaxa[Qt(a)+clnt2 Nt(a)] a_t = \arg\max_{a} \left[ Q_t(a) + c\sqrt{\frac{\ln t}{2\,N_t(a)}} \right] at=argamax[Qt(a)+c2Nt(a)lnt]
这样,每个动作的“乐观”估计值由两部分组成:
- 利用部分:(Q_t(a)) 表示历史的平均奖励;
- 探索部分:(c\sqrt{\frac{\ln t}{2,N_t(a)}}) 表示对该动作不确定性的补偿,鼓励那些试验次数较少的动作。
算法实现细节
记录统计数据
-
Qt(a)Q_t(a)Qt(a):在时间 ttt 时刻,对动作 aaa 的估计奖励。通常通过样本平均更新:
Qt+1(a)=Qt(a)+1Nt(a)+1(r−Qt(a)) Q_{t+1}(a) = Q_t(a) + \frac{1}{N_t(a)+1}\left(r - Q_t(a)\right) Qt+1(a)=Qt(a)+Nt(a)+11(r−Qt(a))
其中 rrr 是本次试验获得的奖励。 -
Nt(a)N_t(a)Nt(a):动作 aaa 被选中的次数。
选择动作
在每个时间步 (t):
- 对于每个动作 (a),计算上置信界值:
UCBt(a)=Qt(a)+clnt2 Nt(a) UCB_t(a) = Q_t(a) + c\sqrt{\frac{\ln t}{2\,N_t(a)}} UCBt(a)=Qt(a)+c2Nt(a)lnt
注意:当 Nt(a)=0N_t(a)=0Nt(a)=0 时,为避免除零,通常会先确保每个动作至少被选取一次(例如初始化阶段先各选一次)。 - 选择具有最大 UCBt(a)UCB_t(a)UCBt(a) 的动作 ata_tat。
伪代码示例
# 初始化
for each action a in A:
Q[a] = initial_value # 可选 0 或乐观初值
N[a] = 0
for t in range(1, T+1):
# 如果存在未尝试过的动作,则先随机选取一个未尝试的动作
if exists a such that N[a] == 0:
select such an action a_t
else:
# 对每个动作计算 UCB 值
ucb_values = { a: Q[a] + c * sqrt( ln(t) / (2 * N[a]) ) for a in A }
a_t = argmax(ucb_values)
# 执行动作 a_t,观察奖励 r
r = bandit.step(a_t)
# 更新统计数据
N[a_t] += 1
Q[a_t] += (r - Q[a_t]) / N[a_t]
在这个伪代码中:
- 参数 ccc 控制探索力度,通常需要根据具体问题调节。
- ln(t)\ln(t)ln(t) 使得随着时间 ttt 增加,探索补偿项虽然减小,但足以确保在足够多的试验中不会忽略未充分尝试的动作。
优缺点与讨论
优点
- 理论保证:基于 Hoeffding 不等式,UCB 算法能证明其累积懊悔(regret)随着时间仅次线性增长,即随着试验次数增多,算法能逐步收敛于最优策略。
- 自动平衡:通过统计不确定性来调节探索,无需外部随机噪声,探索部分会随着动作被充分试验而自然减弱。
- 无参数依赖(部分):除了 ccc 之外,不需要调节其他探索参数。
缺点
- 参数选择敏感:探索系数 ccc 的设置会直接影响算法的探索力度,不同问题可能需要不同的 ccc 值。
- 计算复杂度:每次决策时需要计算所有动作的 UCB 值,对于动作数较多的情况可能计算量较大,但在大多数多臂老虎机问题中通常是可以接受的。
- 适用条件:该算法假设奖励在固定区间内(如[0,1]或经过归一化),否则 Hoeffding 不等式的应用可能不合适。
汤普森采样算法
汤普森采样(Thompson Sampling)是一种基于贝叶斯思想的探索与利用平衡策略,用于解决多臂老虎机问题。其核心思想是:对每个臂建立奖励概率分布的后验(posterior),然后在每个决策时刻从每个臂的后验中随机采样,选择采样值最高的臂。这种方法天然地将不确定性考虑在内:如果某个臂的数据较少,其后验分布较宽,采样时有较大概率获得一个较高的值,从而促使该臂被试探;而当数据充足后,后验会收敛到真实奖励的值,采样波动减小,进而更多利用已知较好的臂。
汤普森采样算法利用贝叶斯方法为每个臂建立后验分布,通过从后验中采样来决定下一步选择哪一臂,从而自然地平衡了探索与利用。对于伯努利问题,先验通常选为 Beta(1,1),每次根据成功或失败更新参数。该方法不仅理论上具有良好的累积懊悔保证,而且实现简单、直观,是多臂老虎机问题中非常有效的一种策略。
基本原理
假设我们的多臂老虎机问题中,每个臂的奖励服从某个已知形式的分布(例如,对于伯努利问题,奖励为0或1)。我们可以对每个臂使用贝叶斯方法建立一个后验分布。例如,对于伯努利奖励,我们常用 Beta 分布作为先验:
-
先验:对于每个臂 aaa,设其真实成功概率为 θa\theta_aθa,我们可以令先验分布为
θa∼Beta(α=1,β=1) \theta_a \sim \text{Beta}(\alpha=1, \beta=1) θa∼Beta(α=1,β=1)
这表示对每个臂在开始时我们一无所知(均匀分布)。 -
更新:当臂 aaa 被拉动一次,若获得奖励 rrr(r=1r=1r=1代表成功,r=0r=0r=0代表失败),我们更新该臂的后验参数。具体来说,如果先前的后验为 Beta(α,β)\text{Beta}(\alpha, \beta)Beta(α,β),则更新规则为:
- 如果 r=1r=1r=1:更新为 Beta(α+1,β)\text{Beta}(\alpha+1, \beta)Beta(α+1,β)
- 如果 r=0r=0r=0:更新为 Beta(α,β+1)\text{Beta}(\alpha, \beta+1)Beta(α,β+1)
这样,随着不断的试验,每个臂的后验分布会越来越精确地反映其真实成功概率。
决策机制
在每个决策时刻,汤普森采样算法对每个臂都做以下操作:
- 采样:从每个臂 aaa 当前的后验分布 Beta(αa,βa)\text{Beta}(\alpha_a, \beta_a)Beta(αa,βa) 中采样一个数值 θasample\theta_a^\text{sample}θasample。
- 选择:选择具有最高采样值的臂:
at=argmaxaθasample a_t = \arg\max_{a} \theta_a^\text{sample} at=argamaxθasample
这种采样机制使得:
- 如果某个臂数据较少,其后验分布较宽,可能会采样出一个较高的值,从而增加被选择的概率(探索)。
- 如果某个臂经过大量试验,其后验分布收敛,采样值波动较小,则更多依赖于其高平均值(利用)。
伪代码示例
下面是一段简单的伪代码,描述了如何在多臂老虎机问题中实现汤普森采样(针对伯努利奖励情况):
# 初始化:对每个臂a,设定初始参数α=1, β=1
for each arm a in A:
alpha[a] = 1
beta[a] = 1
for t in range(1, T+1):
sampled_values = dict()
# 对每个臂从Beta分布中采样
for a in A:
sampled_values[a] = sample_beta(alpha[a], beta[a])
# 选择采样值最大的臂
a_t = argmax(sampled_values)
# 拉动臂a_t,观察奖励 r (0或1)
r = bandit.step(a_t)
# 更新后验参数
if r == 1:
alpha[a_t] += 1
else:
beta[a_t] += 1
在这段代码中:
sample_beta(alpha, beta)
表示从 Beta(α,β)\text{Beta}(\alpha, \beta)Beta(α,β) 分布中采样一个值。- 每次试验后,根据得到的奖励更新对应臂的 α\alphaα 或 β\betaβ 参数。
优缺点分析
优点
- 自适应探索:采样机制天然平衡了探索与利用;当某个臂数据少时,宽松的后验分布使得它有较高的探索概率。
- 理论支持:汤普森采样在很多情形下能证明其累积懊悔(regret)是对数级别的,这在理论上是很优的。
- 实现简单:在常见场景(如伯努利奖励)下,算法实现相对简单。
缺点
- 分布假设依赖:算法依赖于对奖励分布的先验假设(如使用 Beta 分布),如果真实奖励分布与假设差距较大,效果可能受限。
- 计算开销:每个决策需要为所有臂进行采样;在臂数非常多的场景下可能增加计算负担,但通常在多臂老虎机问题中是可以接受的。