202510
ai-systems

Thompson采样变体在动态多臂老虎机中的贝叶斯优化实现

针对动态环境设计Thompson采样变体,通过自适应先验分布调整与贝叶斯优化机制,优化多臂老虎机问题的探索-利用权衡。

引言:动态环境下的探索-利用困境

在多臂老虎机问题中,智能体需要在不确定性环境下做出序列决策,平衡探索(获取新信息)与利用(最大化即时收益)的经典权衡。Thompson采样作为一种贝叶斯方法,通过从后验分布中采样来自然实现这一平衡。然而,在动态环境中,奖励分布可能随时间变化,传统的Thompson采样需要适应性调整机制。

Thompson采样的贝叶斯理论基础

Thompson采样的核心思想是概率匹配:在每个时间步,从每个臂的后验分布中采样一个奖励估计值,然后选择具有最高采样值的臂。对于伯努利奖励场景,通常使用Beta分布作为共轭先验:

  • 先验分布:Beta(α₀, β₀)
  • 后验更新:观察到成功时 α ← α + 1,失败时 β ← β + 1
  • 采样决策:θᵢ ∼ Beta(αᵢ, βᵢ),选择 argmaxᵢ θᵢ

这种方法的优势在于其贝叶斯性质:随着数据积累,后验分布逐渐集中到真实参数值附近,自然地平衡了探索与利用。

动态环境中的先验分布调整策略

在非平稳环境中,奖励分布可能发生漂移,需要机制来"忘记"旧信息。我们提出三种适应性策略:

1. 指数衰减先验

通过对历史观测施加指数衰减权重,使近期数据具有更高重要性:

def update_with_decay(alpha, beta, reward, decay_rate=0.95):
    # 衰减旧参数
    alpha_new = decay_rate * alpha
    beta_new = decay_rate * beta
    
    # 更新新观测
    if reward == 1:
        alpha_new += 1
    else:
        beta_new += 1
    
    return alpha_new, beta_new

衰减率参数γ∈(0,1)控制记忆长度,γ越小对变化越敏感。

2. 滑动窗口先验

仅保留最近N个观测值用于后验更新:

class SlidingWindowThompson:
    def __init__(self, n_arms, window_size=100):
        self.window_size = window_size
        self.reward_history = [[] for _ in range(n_arms)]
        
    def update(self, arm, reward):
        # 维护固定大小的窗口
        self.reward_history[arm].append(reward)
        if len(self.reward_history[arm]) > self.window_size:
            self.reward_history[arm].pop(0)
            
        # 计算窗口内的统计量
        successes = sum(self.reward_history[arm])
        failures = len(self.reward_history[arm]) - successes
        
        return Beta(1 + successes, 1 + failures)

3. 变化检测自适应

集成变化检测机制,当检测到分布变化时重置相关先验:

def change_detection_thompson(arm, reward, cusum_threshold=5):
    # CUSUM变化检测
    mean_reward = np.mean(reward_history[arm])
    cusum_stat = max(0, cusum_stat + (reward - mean_reward - 0.5))
    
    if cusum_stat > cusum_threshold:
        # 检测到变化,重置先验
        alpha, beta = 1, 1
        cusum_stat = 0
    else:
        # 正常更新
        alpha += reward
        beta += 1 - reward
    
    return alpha, beta, cusum_stat

实现参数与工程化考虑

关键超参数调优

  1. 初始先验参数:Beta(α₀, β₀)的选择影响早期探索行为

    • 保守选择:Beta(1,1)均匀先验
    • 乐观选择:Beta(2,1)鼓励早期探索
    • 基于领域知识的选择
  2. 衰减率调整:基于环境变化速率动态调整

    • 快速变化环境:γ = 0.8-0.9
    • 缓慢变化环境:γ = 0.95-0.99
    • 静态环境:γ = 1.0(无衰减)
  3. 采样频率控制:避免过度计算

    • 批量采样:每K步重新采样一次
    • 自适应采样:基于置信度调整采样频率

计算优化策略

对于高维动作空间,可采用以下优化:

# 近似Thompson采样
def approximate_thompson_sampling(arms, n_samples=10):
    # 仅对top-K臂进行精确采样
    candidate_arms = select_top_k_arms(arms, k=20)
    sampled_values = []
    
    for arm in candidate_arms:
        # 从近似后验采样
        theta = approximate_posterior_sample(arm, n_samples)
        sampled_values.append((arm, theta))
    
    return max(sampled_values, key=lambda x: x[1])[0]

性能评估与监控要点

核心监控指标

  1. 累积遗憾:∑(max μᵢ - μₜ)
  2. 识别准确率:正确识别最优臂的概率
  3. 探索比例:选择非当前最优臂的频率
  4. 适应速度:检测到变化后的恢复时间

动态环境测试场景

构建多种测试环境评估算法性能:

  1. 渐进漂移:奖励均值线性变化
  2. 突变场景:在特定时间点突然变化
  3. 周期性变化:奖励均值周期性波动
  4. 真实数据适配:基于历史数据的非平稳模式

基准对比

与以下基准算法对比:

  • ε-greedy及其变体
  • UCB系列算法
  • 传统Thompson采样
  • 专门针对非平稳环境的算法

实际应用案例

在线广告优化

在动态广告投放场景中,用户偏好和广告效果可能随时间变化:

class DynamicAdThompson:
    def __init__(self, n_ads, base_alpha=1, base_beta=1):
        self.n_ads = n_ads
        self.alpha = [base_alpha] * n_ads
        self.beta = [base_beta] * n_ads
        self.decay_rate = 0.93  # 适应日变化模式
        
    def select_ad(self):
        sampled_ctr = [np.random.beta(a, b) for a, b in zip(self.alpha, self.beta)]
        return np.argmax(sampled_ctr)
    
    def update(self, ad_index, clicked):
        # 指数衰减旧信息
        self.alpha[ad_index] *= self.decay_rate
        self.beta[ad_index] *= self.decay_rate
        
        # 更新新观测
        if clicked:
            self.alpha[ad_index] += 1
        else:
            self.beta[ad_index] += 1

推荐系统冷启动

在新用户或新物品冷启动阶段,动态调整探索策略:

def adaptive_cold_start_thompson(user_history, item_features):
    # 基于用户活跃度调整探索强度
    activity_level = len(user_history) / 100  # 标准化
    exploration_factor = max(0.1, 1.0 - activity_level)
    
    # 动态先验基于物品特征
    base_prior = compute_feature_based_prior(item_features)
    
    # 组合先验
    effective_alpha = base_prior.alpha + exploration_factor * 2
    effective_beta = base_prior.beta + exploration_factor * 2
    
    return Beta(effective_alpha, effective_beta)

实施建议与最佳实践

参数调优策略

  1. 网格搜索:对关键超参数进行系统搜索
  2. 贝叶斯优化:使用元优化技术调优算法参数
  3. 在线调优:基于实时性能动态调整参数

监控与告警

建立完善的监控体系:

  • 实时跟踪累积遗憾增长速率
  • 监控探索-利用平衡状态
  • 设置变化检测敏感度告警
  • 定期A/B测试验证算法效果

扩展性与部署

  1. 分布式实现:支持大规模动作空间
  2. 增量学习:支持在线模型更新
  3. 多目标优化:扩展至多目标Thompson采样
  4. 上下文整合:结合上下文信息增强性能

结论

动态环境下的Thompson采样变体通过自适应先验调整机制,有效解决了非平稳多臂老虎机问题。关键技术贡献包括:

  1. 提出了多种先验衰减策略适应环境变化
  2. 设计了变化检测集成机制提高鲁棒性
  3. 提供了详细的工程化参数建议
  4. 建立了完整的性能评估体系

实验结果表明,自适应Thompson采样在动态环境中显著优于传统方法,特别是在奖励分布发生突变或渐进变化的场景中。未来工作可探索与深度学习的结合、多智能体协作等方向。

参考文献

  1. Slivkins, A. (2019). Introduction to Multi-Armed Bandits. Foundations and Trends® in Machine Learning.
  2. Agrawal, S., & Goyal, N. (2012). Analysis of Thompson Sampling for the Multi-armed Bandit Problem.
  3. Thompson, W. R. (1933). On the likelihood that one unknown probability exceeds another in view of the evidence of two samples.