在现代技术领域算法决策优化已成为核心竞争力。Meta通过广告位置优化提升点击率,Netflix利用缩略图优化提升用户参与度,亚马逊依靠产品推荐系统提升销售额——这些优化的背后都采用了基于Beta分布的汤普森采样算法

在各类决策系统中,探索与利用的平衡是一个根本性挑战。例如推荐系统是继续使用已验证有效的选项,还是尝试潜在更优的新选项?汤普森采样通过Beta分布提供了解决这一难题的数学框架。

贝叶斯推理基础

在深入Beta分布和汤普森采样之前,需要先理解贝叶斯推理的核心概念。

贝叶斯推理是一种统计推理方法,其核心是运用贝叶斯定理来根据新的观测数据不断更新假设的概率分布。

贝叶斯定理的基本形式为:

后验概率 ∝ 似然度 × 先验概率

其中:

  • 先验概率:表示在获取新数据前对参数的初始概率估计
  • 似然度:代表在给定参数条件下观测到当前数据的概率
  • 后验概率:结合新数据后对参数的更新估计

共轭先验分布

在贝叶斯统计中,如果后验分布与先验分布属于同一分布族,则称该先验分布为似然函数的共轭先验。这一性质使得概率更新的计算大为简化。

Beta分布是二项分布和伯努利分布的共轭先验。当先验采用Beta分布,似然函数为二项分布或伯努利分布时,后验分布仍然是Beta分布。这种共轭性质使得在线学习过程中的概率更新变得高效可行。

Beta分布的数学基础

Beta分布是定义在[0,1]区间上的连续概率分布,特别适合对概率和比例进行建模。

核心参数

Beta分布由两个形状参数控制:

  • α (alpha):可理解为观测到的成功次数加1
  • β (beta):可理解为观测到的失败次数加1

这两个参数决定了分布的形状特征:

  • α值增大会使分布向1偏移,表示成功概率增加
  • β值增大会使分布向0偏移,表示失败概率增加

分布特征

Beta分布的形状由α和β的相对大小决定:

  • α > β:分布偏向1,表示成功概率较高
  • β > α:分布偏向0,表示失败概率较高
  • α = β:分布关于0.5对称

打开网易新闻 查看精彩图片

概率密度函数

Beta分布的PDF虽然涉及复杂的伽玛函数,但其形状完全由α和β两个参数决定,这使得它在实际应用中便于操作和理解。

Beta分布的统计特性

理解Beta分布的均值和方差对于评估概率估计的可靠性至关重要。这些统计量为决策系统提供了重要的定量依据。

均值(期望值)

Beta分布的均值计算公式为:

μ = α / (α + β)

此均值反映了基于当前观测数据对成功概率的最优估计。

方差

Beta分布的方差计算公式为:

σ² = [α × β] / [(α + β)² × (α + β + 1)]

方差表征了对均值估计的不确定性程度。较小的方差意味着对概率估计具有更高的置信度。

统计特性的应用意义

随着观测数据的累积(即α和β之和增大),方差会逐渐减小,这反映了随着数据量增加,对参数估计的不确定性降低。这一特性在实际决策系统中具有重要意义,它提供了估计可靠性的量化指标。

汤普森采样的工作机制

汤普森采样是一种解决探索-利用权衡问题的概率算法。它通过从概率分布中采样来做出决策,既保证了对已知良好选项的利用,又维持了对潜在更优选项的探索。

算法流程

初始化阶段

为确保公平起点,系统对每个选项进行如下初始化:

  • 赋予一次虚拟成功和一次虚拟失败
  • 初始状态下α = β = 1,表示完全不确定性
  • 为每个选项维护成功(α)和失败(β)计数

决策过程

1、预测生成

  • 基于每个选项的历史数据(α, β值)
  • 从对应的Beta分布中进行随机采样
  • 采样值反映了当前对该选项效果的估计

2、选项选择

  • 选择采样值最高的选项
  • 这种选择机制自然地平衡了探索和利用

3、结果观察

  • 记录选中选项的实际效果(成功=1,失败=0)

4、参数更新

  • 根据观察结果更新相应选项的α或β值
  • 成功则α加1,失败则β加1

5、迭代执行

  • 不断重复上述过程
  • 系统逐步学习各选项的真实效果

打开网易新闻 查看精彩图片

通过这个过程,汤普森采样算法能够:

  • 自适应地调整各选项的选择概率
  • 在探索新选项和利用已知好选项之间取得平衡
  • 随着数据累积,逐步收敛到最优策略

这种算法设计既保证了理论上的收敛性,又具有实际系统中所需的计算效率。下面我们通过具体示例详细说明这一机制的运作过程。

汤普森采样实例分析

通过具体实例来理解汤普森采样的实际运作机制。考虑一个包含三个备选项(A、B、C)的决策系统。

初始状态设置:
每个选项的初始参数均为:

  • α = 1(初始虚拟成功)
  • β = 1(初始虚拟失败)
    这种设置体现了系统对所有选项的无偏初始化。

第一轮决策

采样过程生成以下值:

  • 选项A:0.6
  • 选项B:0.3
  • 选项C:0.8

系统选择采样值最高的选项C。实际投放后获得正向反馈(成功),随后更新选项C的参数为:α = 2,β = 1。

第二轮决策

新一轮采样生成:

  • 选项A:0.4
  • 选项B:0.7
  • 选项C:0.9

系统再次选择选项C。这次获得负向反馈(失败),更新参数为:α = 2,β = 2。

长期行为特征

随着决策次数增加,系统呈现出以下特性:

  • 表现较好的选项获得更多选择机会
  • 系统保持对低展示量选项的周期性探索
  • 在利用已知优势选项和发现潜在更优选项之间形成动态平衡

复杂场景应用分析

考虑一个运行一段时间后的实际场景:

选项A的状态:

  • 成功次数:10
  • 失败次数:5
  • 当前成功率:0.67(10/15)

选项B的状态:

  • 成功次数:2
  • 失败次数:2
  • 当前成功率:0.50(2/4)

这种情况下的系统行为展现了汤普森采样的核心优势:

  • 即使选项A具有更好的历史表现,选项B仍有被选中的机会
  • 系统认识到选项B的数据量较小,其真实性能仍具有较大不确定性
  • 保持适度探索以防止过早收敛到次优解

概率计算基础

成功率计算

基本计算公式:

成功率 = 成功次数 / (成功次数 + 失败次数)

实例计算:
对于8次成功、2次失败的情况:
成功率 = 8 / (8 + 2) = 0.80 = 80%

Beta分布参数设置

参数计算规则:

α = 观测到的成功次数 + 1
β = 观测到的失败次数 + 1

例如,对于8次成功、2次失败的情况:

  • α = 8 + 1 = 9
  • β = 2 + 1 = 3

这种参数设置方式(加1平滑)确保了分布的良好性质,避免了极端情况下的退化现象。

系统实现示例

初始状态示例,新选项的参数设置:

起始参数:
α = 1(无先验成功)
β = 1(无先验失败)
初始成功率估计 = 1/(1+1) = 0.50

首次成功后的更新:

新α = 2(原始值1 + 成功次数1)
β保持不变 = 1
更新后成功率 = 2/(2+1) = 0.67

此实现方式保证了系统在起始阶段的探索性,同时能够快速响应初始反馈。

多选项场景的实践分析

下面通过一个完整的多选项决策过程,详细说明系统的动态行为特征。

三个选项的演进过程

对于选项A的完整记录:

第一次投放(成功):
α = 2 (1+1), β = 1
估计成功率:2/3 ≈ 0.67
第二次投放(成功):
α = 3, β = 1
估计成功率:3/4 = 0.75
第三次投放(失败):
α = 3, β = 2
估计成功率:3/5 = 0.60

这个序列展示了系统如何根据反馈动态调整其对选项A性能的估计。注意成功率的变化反映了系统对新信息的敏感性。

选项B的记录:

第一次投放(失败):
α = 1, β = 2
估计成功率:1/3 ≈ 0.33
第二次投放(成功):
α = 2, β = 2
估计成功率:2/4 = 0.50

选项B的数据展示了系统如何从不利的早期结果中恢复,保持对潜在改善的探索可能。

选项C的初始状态:

尚未获得投放机会:
α = 1, β = 1
估计成功率:1/2 = 0.50

保持原始参数设置,等待探索机会。这种状态对于新引入的选项是典型的。

不确定性分析

考虑两个数据量差异显著的选项:

大数据量选项A:

15次成功,5次失败
α = 16 (15+1)
β = 6 (5+1)
成功率:16/22 ≈ 0.73 (73%)
数据基础:21次观测
估计可信度:高

小数据量选项B:

3次成功,1次失败
α = 4 (3+1)
β = 2 (1+1)
成功率:4/6 ≈ 0.67 (67%)
数据基础:4次观测
估计可信度:低

这两个选项虽然成功率相近,但由于观测量的差异,系统对它们的处理策略会有明显不同。选项B会获得相对更多的探索机会,这反映了系统在置信度较低时倾向于收集更多信息。

决策系统的实际应用

在实际运行中,系统需要同时处理多个选项:

选项A:10次成功,5次失败
α = 11, β = 6
成功率 = 11/17 ≈ 0.65 (65%)
选项B:2次成功,2次失败
α = 3, β = 3
成功率 = 3/6 = 0.50 (50%)
选项C:1次成功,4次失败
α = 2, β = 5
成功率 = 2/7 ≈ 0.29 (29%)

在某一轮次的采样中可能出现:

选项A采样值:0.70(接近其实际成功率0.65)
选项B采样值:0.85(由于不确定性产生较高值)
选项C采样值:0.25(接近其实际成功率0.29)

此轮选择B的决策表明,系统在利用已知信息的同时,仍然保持对数据较少选项的适度探索。这种行为有助于防止系统过早地固化在可能的次优解上。

实验效果的长期评估

通过对1000次投放的跟踪分析:

选项A结果:
80次成功,920次失败
α = 81, β = 921
最终成功率:81/1002 ≈ 0.081 (8.1%)
选项B结果:
150次成功,850次失败
α = 151, β = 851
最终成功率:151/1002 ≈ 0.151 (15.1%)

这个长期实验数据揭示了选项B(15.1%)相对于选项A(8.1%)具有显著的性能优势。这种结果验证了系统在探索过程中成功识别出更优选项的能力。

汤普森采样的完整实现与分析

下面我们将通过Python代码展示汤普森采样算法的完整实现过程。代码包含了必要的初始化、采样、更新等核心功能,并提供了可视化分析工具。

# 导入必要的数据处理和可视化库
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import beta
# 设定真实点击率(CTR)
# 在实际应用中这些值是未知的,这里仅用于仿真
true_ctrs = {
'A': 0.04, # 方案A的真实CTR为4%
'B': 0.06 # 方案B的真实CTR为6%
}
# 初始化每个方案的状态参数
# 包含:alpha(成功计数+1)、beta(失败计数+1)
# clicks(总点击数)、impressions(总展示次数)
campaigns = {
'A': {'alpha': 1, 'beta': 1, 'clicks': 0, 'impressions': 0},
'B': {'alpha': 1, 'beta': 1, 'clicks': 0, 'impressions': 0}
}
# 仿真参数设置
total_emails = 10000 # 总投放次数
selection_history = [] # 记录每次选择的方案
estimated_ctrs_history = {'A': [], 'B': []} # 记录CTR估计值的历史
# 主仿真循环
for i in range(total_emails):
# 第1步:从每个方案的Beta分布中采样
sampled_theta = {}
for campaign in campaigns:
alpha = campaigns[campaign]['alpha']
beta_param = campaigns[campaign]['beta']
# 基于当前参数从Beta分布中采样
# 这个采样值代表对真实CTR的当前估计
sampled_theta[campaign] = np.random.beta(alpha, beta_param)
# 第2步:选择采样值最高的方案
# 这是汤普森采样的核心决策机制
selected_campaign = max(sampled_theta, key=sampled_theta.get)
selection_history.append(selected_campaign)
campaigns[selected_campaign]['impressions'] += 1
# 第3步:模拟用户交互
# 在实际系统中,这里会是真实的用户反馈
# 这里使用真实CTR进行仿真
success = np.random.rand() < true_ctrs[selected_campaign]
# 第4步:根据反馈更新参数
if success:
campaigns[selected_campaign]['clicks'] += 1
campaigns[selected_campaign]['alpha'] += 1 # 增加成功计数
else:
campaigns[selected_campaign]['beta'] += 1 # 增加失败计数
# 第5步:记录当前的CTR估计值
for campaign in campaigns:
alpha = campaigns[campaign]['alpha']
beta_param = campaigns[campaign]['beta']
estimated_ctr = alpha / (alpha + beta_param)
estimated_ctrs_history[campaign].append(estimated_ctr)
# 输出最终结果分析
print("\n=== 最终结果 ===")
print("\n最终CTR估计值:")
for campaign in campaigns:
estimated_ctr = campaigns[campaign]['alpha'] / (campaigns[campaign]['alpha'] + campaigns[campaign]['beta'])
print(f"方案 {campaign}: {estimated_ctr:.4f}")
print("\n方案选择分布:")
for campaign in campaigns:
print(f"方案 {campaign}: {campaigns[campaign]['impressions']} 次选择")
print("\n总点击数统计:")
for campaign in campaigns:
print(f"方案 {campaign}: {campaigns[campaign]['clicks']} 次点击")
# 可视化分析1:CTR估计值的收敛过程
plt.figure(figsize=(12,6))
plt.plot(estimated_ctrs_history['A'], label='方案A的估计CTR',
alpha=0.7, linewidth=2)
plt.plot(estimated_ctrs_history['B'], label='方案B的估计CTR',
alpha=0.7, linewidth=2)
plt.axhline(y=true_ctrs['A'], color='blue', linestyle='--',
label='方案A的真实CTR', alpha=0.5)
plt.axhline(y=true_ctrs['B'], color='orange', linestyle='--',
label='方案B的真实CTR', alpha=0.5)
plt.xlabel('投放次数')
plt.ylabel('点击率估计值(CTR)')
plt.title('CTR估计值随时间的演变')
plt.grid(True, alpha=0.3)
plt.legend()
plt.tight_layout()
plt.show()
# 可视化分析2:方案选择的分布情况
plt.figure(figsize=(8,5))
campaigns_selected = [selection_history.count('A'), selection_history.count('B')]
campaign_names = ['方案A', '方案B']
plt.bar(campaign_names, campaigns_selected, color=['blue', 'orange'],
alpha=0.7, edgecolor='black')
plt.xlabel('方案')
plt.ylabel('选择次数')
plt.title('方案选择分布')
plt.grid(True, axis='y', alpha=0.3)
plt.tight_layout()
plt.show()

运行结果:

=== 最终结果 ===
最终CTR估计值:
方案A:0.0412
方案B:0.0618
方案选择分布:
方案A:580次选择
方案B:9420次选择
总点击数统计:
方案A:23次点击
方案B:581次点击

打开网易新闻 查看精彩图片
打开网易新闻 查看精彩图片

这个实现展示了几个关键的技术要点:

  1. 状态维护:系统为每个方案维护alpha和beta参数,这些参数随着反馈不断更新,反映了系统对各个方案性能的动态评估。
  2. 采样机制:使用numpy的random.beta函数从Beta分布中进行采样,这是算法在探索与利用之间权衡的核心机制。
  3. 决策过程:通过比较采样值选择最优方案,这种基于随机采样的决策方式自然地平衡了探索与利用。
  4. 参数更新:根据反馈结果更新参数,使系统能够持续学习和适应。
  5. 结果分析:通过可视化展示CTR估计值的收敛过程和方案选择的分布情况,直观地反映了算法的性能。

实验结果表明,系统成功地识别出了性能更好的方案B(真实CTR为6%),并在探索过程中逐渐将更多的资源分配给它。这种自适应的资源分配策略正是汤普森采样算法的核心优势。

通过观察CTR估计值的收敛曲线,我们可以看到系统在早期经历了一个探索阶段,随后逐渐收敛到真实的CTR值。这个过程很好地展示了算法如何在保持适度探索的同时,逐步发现和利用更优的选项。

这个实现为在线决策系统提供了一个可靠的框架,可以根据具体应用场景进行相应的调整和扩展。例如可以添加时间衰减因子来处理非平稳环境,或者扩展到多目标优化场景。

https://avoid.overfit.cn/post/9423af7a03534afea00f84416e926d0d

作者:Raj Arun