强化学习推荐系统:不同的探索策略——汤普森采样探索策略(4.4)
《强化学习推荐系统中的汤普森采样探索策略》介绍了推荐系统中强化学习的探索策略,重点阐述了汤普森采样方法。汤普森采样通过贝叶斯推断估计每个动作的最优概率,利用Beta分布作为先验分布,结合观测数据更新后验分布。该方法能有效平衡探索与利用,适用于二值奖励场景,通过参数调整动态优化策略。文章包含数学推导和Python实现代码,展示了该策略在5臂赌博机问题中的应用。
阅读《强化学习与大模型推荐系统》应具备一定的深度学习和推荐系统技术基础,适合于对大模型和强化学习推荐技术感兴趣的读者学习参考。
《强化学习与大模型推荐系统》全书下载地址:https://github.com/ByShui/Book_RL-LLM-In-RS。
强化学习推荐系统:不同的探索策略——汤普森采样探索策略(4.4)
一个优秀的探索策略要能够同时满足探索和利用的需求,以下代码构造了一个具有5个动作的策略评估环境,以此来对不同探索策略的累计遗憾值进行分析:
class Bandit:
def __init__(self, arm_count):
self.arm_count = arm_count
self.generate_arms()
def generate_arms(self):
self.arms = []
for _ in range(self.arm_count):
mean = np.random.normal(0, 1)
std_dev = np.random.uniform(0.5, 1.5)
self.arms.append((mean, std_dev))
def reward(self, arm):
mean, std_dev = self.arms[arm]
return np.random.normal(mean, std_dev)
def optimal_arm(self):
return np.argmax([mean for mean, _ in self.arms])
if __name__ == "__main__":
arm_count = 5
bandit = Bandit(arm_count)
具体来说,策略评估环境中设置了5个臂,摇动臂的奖励 reward a \text{reward}_a rewarda服从不同的正态分布: reward a = N ( μ , σ ) \text{reward}_a=\mathcal{N}(\mu,\sigma) rewarda=N(μ,σ)其中, μ \mu μ和 σ \sigma σ分别是正态分布的均值和方差,它们是随机生成的。定义拥有最大均值的动作是最优动作 a ∗ a_* a∗,最优价值 V ∗ V_* V∗从最优臂的价值分布中采样得到。
优化策略需要牺牲短期利益,因为需要通过探索搜集更多的信息以获得更优的动作,使得智能体最终能够获得更多回报。探索和利用是强化学习中的一对矛盾体,这意味着在学习过程中,智能体需要在已知和未知的情况下做出最优的决策。
其中,利用是指在已知情况下选择已知最优的策略来获得收益,而探索是指在未知情况下,为了获取更多的信息和收益,选择不同的策略进行尝试。
探索是指在不确定性的环境中,探索新的策略或动作来获得更高的奖励或效用,包含两个部分:一是尝试未知的行为,以期找到更好的策略并更新模型;二是平衡已知和未知的行为,以确保不会错过可能的好策略。
在推荐系统中,探索可以包括推荐新的项目、向用户提供个性化的推荐建议或者探索不同的推荐策略(如多臂机)。探索和利用需要平衡,以确保推荐系统具有长期的优化效果。
一个标准的强化学习算法包括探索和利用两个步骤——探索帮助智能体充分了解其状态空间,利用则帮助智能体找到最优的动作序列。
用来平衡探索和利用的方法包括:贪心探索策略、高斯探索策略、UCB探索策略、玻尔兹曼探索策略、汤普森采样探索策略和熵正则化探索策略等,本篇博客我们介绍一下汤普森采样探索策略。
贪心探索策略请查看:强化学习推荐系统:不同的探索策略——贪心探索策略(4.1)
高斯探索策略请查看:强化学习推荐系统:不同的探索策略——高斯探索策略(4.2)
UCB探索策略请查看:强化学习推荐系统:不同的探索策略——UCB探索策略(4.3)
汤普森采样探索策略
汤普森采样也是一种基于概率的探索策略,它通过智能体与环境的交互信息,来估计每一个动作是最优动作的概率,然后依据这个概率选择后续动作。它采用贝叶斯推断的方法,将每个臂的价值概率视为一个Beta分布,根据信息修正Beta分布的两个参数 α \alpha α和 β \beta β,并在选择臂时根据该分布进行概率采样。
贝叶斯推断以贝叶斯定理为核心,在推断之前,应根据不同的情况假设各个臂的价值分布情况,这些假设被称为先验分布(假设分布)。在实际应用中,我们应用先验分布来选择臂,然后结合多次臂价值的实际数据,不断更新臂价值的后验分布(实际分布)。贝叶斯推断的过程可以简单地表示为:
后验分布 ∝ 实际数据 + 先验分布 \text{后验分布}\propto \text{实际数据}+\text{先验分布} 后验分布∝实际数据+先验分布
它的数学形式表达为:
P ( θ ∣ data ) ∝ P ( data ∣ θ ) P ( θ ) = P ( data ∣ θ ) P ( θ ) P ( data ) \begin{aligned} P(\theta|\text{data})&\propto P(\text{data}|\theta)P(\theta) \\ & = \frac{P(\text{data}|\theta)P(\theta)}{P(\text{data})} \\ \end{aligned} P(θ∣data)∝P(data∣θ)P(θ)=P(data)P(data∣θ)P(θ)
其中, P ( θ ) P(\theta) P(θ)是以 θ \theta θ为随机变量的先验分布; P ( θ ∣ data ) P(\theta|\text{data}) P(θ∣data)为后验分布,它是在给定数据data的基础上关于臂价值的推断; P ( data ∣ θ ) P(\text{data}|\theta) P(data∣θ)称为似然,表示在给定分布参数的情况下,观测到数据data的可能性。 P ( data ) P(\text{data}) P(data)是边缘概率,也称为证据,它在实际应用中被视为归一化常数,不影响后验分布的形状。
当强化学习的奖励是“有奖励/无奖励”这样的二项式奖励时,Beta分布是二项分布的共轭先验,可以使用用Beta分布来假设先验分布,即:
P ( θ ) ∼ Beta ( θ ∣ α , β ) P(\theta) \sim \text{Beta}(\theta|\alpha,\beta) P(θ)∼Beta(θ∣α,β)
之所以选用Beta分布,是因为Beta分布有以下两个比较好的性质:
(1)它有两个超参数,通过调整参数可以让Beta分布近似地表示任何一种概率分布;
(2)当观察到二项式奖励时,如果先验分布是Beta分布,那么贝叶斯推断得到的后验分布依然是Beta分布,该性质称为共轭性,可以使计算和更新更加简易。
Beta分布是一种描述概率的概率分布,当我们不知道一个随机变量的具体概率分布是什么样时,可以将其概率分布定义为Beta分布,然后利用真实的采样数据去拟合出这个概率分布:
Beta ( θ ∣ α , β ) = θ α − 1 ( 1 − θ ) β − 1 B ( α , β ) \text{Beta}(\theta|\alpha,\beta)=\frac{\theta^{\alpha-1}(1-\theta)^{\beta-1}}{\text{B}(\alpha,\beta)} Beta(θ∣α,β)=B(α,β)θα−1(1−θ)β−1
其中,
α > 0 \alpha>0 α>0和 β > 0 \beta>0 β>0是Beta分布的两个可调参数,用于控制Beta分布的形状;
B ( α , β ) = ( Γ ( α ) Γ ( β ) ) / Γ ( α + β ) \text{B}(\alpha,\beta)=(\Gamma(\alpha)\Gamma(\beta))/\Gamma(\alpha+\beta) B(α,β)=(Γ(α)Γ(β))/Γ(α+β)是Beta函数,它将Beta分布的概率密度积分标准化为1,这里 Γ ( . ) \Gamma(.) Γ(.)的是Gamma函数, Γ ( α ) ≜ ∫ 0 ∞ θ α − 1 e − θ d θ \Gamma(\alpha)\triangleq\int^{\infty}_{0}\theta^{\alpha-1}\text{e}^{-\theta}\text{d}\theta Γ(α)≜∫0∞θα−1e−θdθ,它是阶乘在实数范围内的推广;
Beta分布的均值是 α / ( α + β ) \alpha/(\alpha+\beta) α/(α+β),方差是 α β / [ ( α + β ) 2 ( α + β + 1 ) ] \alpha\beta/[(\alpha+\beta)^2(\alpha+\beta+1)] αβ/[(α+β)2(α+β+1)]。

上图所示是一个经典的Beta分布的概率密度函数。图中横轴 θ \theta θ表示概率,取值范围是(0,1),纵轴表示概率密度。而参数 α \alpha α和 β \beta β可以控制图形的形状和位置,使得Beta分布呈现不同形态,从而表示各式各样的先验分布。
为了应用汤普森采样探索策略,我们将臂的奖励转换为二值,用1表示奖励大于0,用0表示奖励不大于0),此时臂的奖励就是一个二项伯努利分布,其似然函数为:
P ( data ∣ θ ) ∝ ∏ i = 1 N θ x i ( 1 − θ ) 1 − x i = θ z ( 1 − θ ) N − z \begin{aligned} P(\text{data}|\theta)&\propto\prod_{i=1}^{N}\theta^{x_i}(1-\theta)^{1-x_i} \\ & = \theta^{z}(1-\theta)^{N-z} \\ \end{aligned} P(data∣θ)∝i=1∏Nθxi(1−θ)1−xi=θz(1−θ)N−z
其中, θ \theta θ就是臂的价值。将该二项分布设为MAB的先验分布,即 P ( θ ) ∝ θ α − 1 ( 1 − θ ) β − 1 P(\theta)\propto\theta^{\alpha-1}(1-\theta)^{\beta-1} P(θ)∝θα−1(1−θ)β−1,推导出后验分布为:
P ( θ ∣ data ) ∝ P ( data ∣ θ ) P ( θ ) = θ z + α − 1 ( 1 − θ ) N − z + β − 1 \begin{aligned} P(\theta|\text{data})&\propto P(\text{data}|\theta)P(\theta) \\ & = \theta^{z+\alpha-1}(1-\theta)^{N-z+\beta-1} \\ \end{aligned} P(θ∣data)∝P(data∣θ)P(θ)=θz+α−1(1−θ)N−z+β−1
设 a = α + z a=\alpha+z a=α+z、 b = N − z + β b=N-z+\beta b=N−z+β,可以发现这个后验概率也服从Beta分布,只需要用Beta函数将后验概率标准化即可:
P ( θ ∣ data ) = θ a − 1 ( 1 − θ ) b − 1 B ( a , b ) P(\theta|\text{data})=\frac{\theta^{a-1}(1-\theta)^{b-1}}{\text{B}(a,b)} P(θ∣data)=B(a,b)θa−1(1−θ)b−1
即:
P ( θ ∣ data ) ∼ Beta ( a , b ) = Beta ( α + 正向奖励 , β + 非正向奖励 ) \begin{aligned} P(\theta|\text{data})&\sim \text{Beta}(a,b) \\ & = \text{Beta}(\alpha+\text{正向奖励},\beta+\text{非正向奖励}) \\ \end{aligned} P(θ∣data)∼Beta(a,b)=Beta(α+正向奖励,β+非正向奖励)
其中,正向奖励用于在奖励大于0时对 α \alpha α进行修正,非正向奖励用于在奖励不大于0时对 β \beta β进行修正。Beta分布在这里被初始化为均匀分布Beta(1,1),表示对臂的价值 θ \theta θ完全无知,若修正后的Beta分布为Beta(2,2)则表示认为臂的价值 θ \theta θ接近0.5( 在0.5处的概率密度最大)。可见,通过多次试验获取的附加信息可以对先验概率进行修正,以获得更准确的后验概率,以上就是汤普森采样探索策略的数学推理。
如下代码实现了汤普森采样探索策略:
def thompson_sampling(bandit, T):
arm_count = bandit.arm_count
alpha = np.ones(arm_count)
beta = np.ones(arm_count)
cumulative_regret = [0]
for t in range(1, T+1):
theta = np.random.beta(alpha, beta)
arm = np.argmax(theta)
reward = bandit.reward(arm)
if reward > 0:
alpha[arm] += 1
else:
beta[arm] += 1
optimal_reward = bandit.reward(bandit.optimal_arm())
cumulative_regret.append(
cumulative_regret[-1] + (optimal_reward - reward))
return cumulative_regret
if __name__ == "__main__":
arm_count = 5
T = 1000
bandit = Bandit(arm_count)
cumulative_regret_thompson_sampling = thompson_sampling(bandit, T)
以上代码定义了thompson_sampling()方法,它仅接收两个参数:
- bandit(一个多臂机实例);
- T(试验轮次,即在多臂机上探索/利用的轮次)。
在每轮试验中,汤普森采样探索策略通过Beta分布估计每一个臂是最优臂的概率,然后依据这个概率进行采样。需要注意的是,汤普森采样探索策略的效果受初始概率分布(对应 α \alpha α和 β \beta β)的影响,因此,在实际应用中需要合理地选择初始概率分布。

上面这张图展示了汤普森采样探索策略中Beta分布的概率密度演变的过程,我们用5个时间步来说明汤普森采样探索策略具体是如何发挥作用的,其中, P P P指的是对应臂是最优臂的概率。在每个时刻,Beta分布估计每一个臂是最优臂的概率,从而得到一个概率分布,然后依据概率分布采样臂,再根据臂的奖励调整超参数,逐步收敛到实际的概率分布。
更多推荐
所有评论(0)