
1. 贝叶斯统计与Beta分布基础当你第一次听说贝叶斯统计时可能会觉得这是个高深莫测的数学概念。但其实它的核心思想非常简单用数据来更新我们的认知。想象你是个美食评论家每尝一道新菜就会调整你对这家餐厅的评价——这就是贝叶斯思维在日常生活中的体现。在推荐系统中我们需要不断评估每个推荐选项的效果。Beta分布在这里扮演着关键角色它是定义在0到1区间上的概率分布特别适合用来描述成功概率这样的参数。比如一个广告的点击率是5%这个数字本身就可以用Beta分布来建模。Beta分布有两个形状参数α和βα可以理解为观察到的成功次数加1β则是失败次数加1 这两个参数就像天平的砝码控制着分布曲线的形状。当α增大时曲线会向右接近1的方向偏移β增大时则向左移动。我常跟团队开玩笑说这就像在调音台推子——α推高音β推低音。为什么选择Beta分布因为它有一个绝妙的性质当你的数据服从伯努利分布比如点击or不点击时用Beta分布作为先验得到的后验仍然是Beta分布。这种共轭先验的特性让数学计算变得异常简单只需要做加法就能更新认知后验参数 先验参数 观测数据举个例子假设我们新上线一个推荐位开始时对它一无所知设α1β1均匀分布。当观察到10次点击和90次未点击后后验分布就变成Beta(11,91)。这时点击率的期望值就从最初的50%更新为11/(1191)≈10.8%。# Beta分布参数更新示例 import numpy as np from scipy.stats import beta # 初始状态均匀分布 alpha, beta_ 1, 1 print(f初始期望点击率{alpha/(alphabeta_):.1%}) # 观察到10次点击90次未点击 alpha 10 beta_ 90 print(f更新后期望点击率{alpha/(alphabeta_):.1%}) # 绘制分布曲线 x np.linspace(0, 1, 100) plt.plot(x, beta.pdf(x, alpha, beta_)) plt.title(更新后的Beta分布) plt.show()2. 汤普森采样的核心机制汤普森采样就像是一位聪明的赌场经理面对一排老虎机推荐选项它用独特的策略决定每次拉哪台机器。与UCB算法不同汤普森采样不计算置信区间上界而是玩概率游戏——从每个选项的Beta分布中随机抽取一个值然后选择抽到最大值的那个选项。这种做法的精妙之处在于对于表现好且数据充足的选项其Beta分布又高又窄抽到较大值的概率高利用对于数据不足的选项虽然均值可能不高但分布很宽偶尔也能抽到较大值探索实际案例在某电商平台的推荐系统优化中我们对比了三种算法纯随机探索点击率2.1%UCB算法点击率3.7%汤普森采样点击率4.2%为什么汤普森采样表现更好因为它更聪明地分配探索资源。当一个新商品上架时虽然初始点击率估计不高但宽泛的Beta分布让它仍有被展示的机会。而表现稳定的老商品则能保持较高的展示概率。算法流程的具体实现步骤初始化为每个选项设置α1β1每次请求时从每个选项的Beta(α,β)分布采样选择采样值最大的选项展示观察用户反馈点击/不点击更新选中选项的参数点击α 1未点击β 1# 汤普森采样实现 class ThompsonSampling: def __init__(self, n_arms): self.alpha np.ones(n_arms) self.beta np.ones(n_arms) def select_arm(self): samples [np.random.beta(a, b) for a,b in zip(self.alpha, self.beta)] return np.argmax(samples) def update(self, arm, reward): self.alpha[arm] reward self.beta[arm] (1 - reward) # 模拟运行 n_arms 3 true_ctr [0.3, 0.5, 0.7] # 每个选项的真实点击率 ts ThompsonSampling(n_arms) for _ in range(1000): arm ts.select_arm() reward int(np.random.random() true_ctr[arm]) ts.update(arm, reward)3. 动态平衡探索与利用推荐系统面临的根本矛盾是应该继续展示已知效果好的内容利用还是尝试可能更好的新内容探索汤普森采样通过概率机制优雅地解决了这个问题。探索阶段的特点新选项的Beta分布像平坦的沙丘采样值波动大有更多曝光机会系统积极收集数据快速缩小置信区间利用阶段的特点成熟选项的Beta分布像陡峭的山峰采样值集中在均值附近表现优异的选项获得大部分流量在实际项目中我发现这种动态平衡有几个实用技巧冷启动处理对新选项可以设置更高的初始α给予更多初始曝光衰减机制对长期运行的系统可以定期衰减α,β防止算法僵化批量更新小流量场景可以累积一批数据再更新减少计算开销对比不同算法的探索方式算法探索机制优点缺点ε-greedy固定概率随机探索实现简单探索效率低UCB置信区间宽度决定探索理论保证强计算复杂汤普森采样概率匹配探索自适应性强结果有随机性一个有趣的发现在A/B测试框架下我们需要预先分配流量比例如50/50而汤普森采样会自动将更多流量分配给表现好的变体。在某个新闻推荐项目中这使得整体点击率提升了23%同时测试周期缩短了40%。4. 推荐系统中的实战应用在真实推荐系统中实施汤普森采样时会遇到一些教科书上没讲的挑战。去年我们为视频平台改造推荐系统时就遇到了三个典型问题问题1非平稳环境用户偏好会随时间变化比如节假日效应。解决方案是引入衰减因子定期将α和β向初始值回缩def decay_params(alpha, beta, decay0.99): return decay*alpha (1-decay), decay*beta (1-decay)问题2位置偏置位于页面顶部的item天然更容易被点击。我们的处理方法是训练位置偏置模型估计每个位置的bias_factor将观测点击率除以bias_factor得到无偏估计用调整后的值更新Beta参数问题3用户分群新老用户的行为差异很大。最终我们为每个用户群体维护独立的Beta参数# 分层汤普森采样 class SegmentedTS: def __init__(self, n_arms, n_segments): self.models [ThompsonSampling(n_arms) for _ in range(n_segments)] def select_arm(self, segment_id): return self.models[segment_id].select_arm() def update(self, segment_id, arm, reward): self.models[segment_id].update(arm, reward)实施效果评估指标短期指标点击率、转化率中期指标用户留存、活跃度长期指标内容生态健康度如长尾覆盖率在电商场景的A/B测试结果指标原算法汤普森采样提升CTR3.2%4.1%28%转化率1.8%2.3%27%新商品曝光量12%23%92%这些提升主要来自算法更智能的流量分配——给优质商品更多曝光同时保持对新品的适度探索。