下列关于wap手机网站网站这么设置微信支付
下列关于wap手机网站,网站这么设置微信支付,企业邮箱个人注册,做效果图的素材网站1. 从“赌场老虎机”到“智能决策”#xff1a;多臂老虎机问题到底是什么#xff1f;
想象一下#xff0c;你走进一个赌场#xff0c;面前摆着十台看起来一模一样的老虎机。你手里只有有限的游戏币#xff0c;目标是赢到最多的钱。你听说每台机器的“中奖概率”可能不同&a…1. 从“赌场老虎机”到“智能决策”多臂老虎机问题到底是什么想象一下你走进一个赌场面前摆着十台看起来一模一样的老虎机。你手里只有有限的游戏币目标是赢到最多的钱。你听说每台机器的“中奖概率”可能不同但你不知道哪一台才是真正的“幸运机器”。你会怎么做是逮着一台机器猛摇还是每台都试试运气这个经典的困境就是多臂老虎机问题的精髓。在实际的互联网世界里我们每天都在面对类似的“老虎机”。比如一个新闻App要决定给用户推送哪条新闻一个电商网站要决定展示哪个商品广告一个游戏公司要测试哪个新玩法更受玩家欢迎。这里的每一条新闻、每一个广告、每一种玩法都是一台“老虎机”。我们不知道用户点击它的概率即“中奖概率”但我们可以通过展示它并观察用户是否点击即“投币并看结果”来学习。我们的目标就是用有限的展示机会有限的游戏币获得最多的总点击量赢最多的钱。这个问题难就难在“探索”与“利用”的权衡。利用就是选择当前看起来最好的那个选项比如点击率最高的那条新闻。这能保证短期收益。探索则是去尝试那些我们还不太了解的选项比如一条新上线的新闻。这可能会牺牲短期收益但能帮助我们发现有潜力的“黑马”从而提升长期收益。如果只“利用”不“探索”我们可能会过早地锁定一个次优选项错过真正的最佳选项。如果只“探索”不“利用”我们又会浪费大量资源在明显很差的选项上。汤普森采样就是一种优雅地解决这个权衡问题的算法。它不像我们拍脑袋做决定而是让“概率”本身来帮我们做选择。简单来说它为每个选项每台老虎机维护一个关于其成功概率的“信念”——一个概率分布。每次需要做选择时它就从每个选项的“信念分布”里随机抽取一个样本值然后选择那个“被抽到样本值最大”的选项。这个听上去有点“随机”的方法恰恰是它聪明的地方对于当前数据多、把握大的选项它的“信念分布”很集中抽出的样本值会稳定在其真实概率附近对于数据少、不确定的选项它的“信念分布”很宽泛抽出的样本值可能很高也可能很低从而给了它被探索的机会。这样算法就能自动、动态地平衡探索与利用。2. Beta分布为“不确定性”量身定做的数学工具要理解汤普森采样我们必须先认识它的核心武器Beta分布。Beta分布是概率论中一个专门定义在0到1区间上的概率分布家族。这个特性让它天生就是为描述像“点击率”、“转化率”、“中奖概率”这类事件发生的概率而生的。2.1 用形状参数描绘“信念”Beta分布由两个正参数α阿尔法和β贝塔控制它们被称为形状参数。你可以把α想象成我们观测到的“成功”次数比如点击把β想象成观测到的“失败”次数比如未点击。这两个参数共同刻画了我们对某个事件发生概率的“信念”状态。它的概率密度函数看起来有点复杂但我们可以直观地理解均值期望α / (α β)。这可以理解为基于当前信念我们对成功概率的最佳估计。比如α2β3那么估计的成功概率就是2/(23)0.4。方差αβ / [(αβ)²(αβ1)]。方差衡量了信念的不确定性。αβ的总和越大方差越小分布越“瘦高”说明我们的信念越确定总和越小方差越大分布越“扁平”说明我们非常不确定。让我画几张图在你脑子里当α1β1时Beta分布就是一条从0到1的平坦直线这其实是均匀分布。它代表我们对该概率一无所知认为0到1之间任何值的可能性都相等是“完全不确定”的状态。当α远大于β时比如α10β2分布的高峰会靠近1意味着我们强烈相信成功概率很高。反之当β远大于α时高峰则靠近0。2.2 一个生动的例子更新对棒球手击球率的认知理论有点枯燥我们看个棒球的例子。赛季开始前我们对一位新球员的击球率一无所知。但根据历史数据我们知道大部分球员的赛季平均击球率在0.27左右通常在0.21到0.35之间波动。这时我们可以用一个Beta分布来代表我们的“先验信念”。通过计算我们可以选择α81β219因为这个分布的均值正好是81/(81219)0.27并且大部分概率质量也集中在0.21-0.35之间。这就像在赛季开始前我们“虚拟地”认为这位球员已经有81次击中、219次未击中的历史记录。现在赛季开始了。球员第一次上场击出了一记安打我们获得了新的数据1次击中0次未中。如何更新我们的信念简单得惊人直接将这次观测加到原有的参数上。新的信念分布变为Beta(α1, β0) Beta(82, 219)。分布曲线会微微向右击球率增高的方向移动一点。随着赛季进行打到一半时该球员累计300次击球击中100次。那么我们的信念分布就更新为Beta(81100, 219200) Beta(181, 419)。新的均值是181/(181419)≈0.301。你会发现两个关键点第一新的分布曲线比最初更窄、更高了说明随着数据增多我们对球员能力的判断越来越确定。第二这个贝叶斯更新后的估计值0.301比单纯用频率计算100/300≈0.333更保守、更平滑。因为它融合了我们先前的经验0.27避免了个别时段手感火热或冰冷带来的极端评估更能反映球员长期、稳定的真实水平。这个“α记录成功β记录失败新数据来了直接相加”的更新方式正是贝塔分布作为伯努利试验的共轭先验带来的美妙性质。它让计算变得极其简单高效为汤普森采样的在线实时更新奠定了基础。3. 汤普森采样算法让“概率抽样”代替你思考现在我们把Beta分布和多臂老虎机问题结合起来。假设我们有K个广告K台老虎机每个广告i都有一个未知的真实点击率θ_i。汤普森采样的运作机制就像一个不断学习并实践的智能体。3.1 算法流程初始化、抽样、行动、更新第一步初始化信念。对于每一个广告i我们都为其点击率θ_i设置一个初始的Beta分布。在完全无知的情况下通常设α_i 1, β_i 1即均匀分布。这代表我们认为该广告的点击率可能是0到1之间的任何值且可能性均等。如果你有行业先验知识比如横幅广告的平均点击率通常很低也可以设置相应的α和β来反映这个先验。第二步抽样。当一个新的用户来访我们需要决定展示哪个广告时算法会进行一轮“思想实验”它从每个广告i当前的Beta(α_i, β_i)分布中独立地随机抽取一个样本值θ̂_i。这个θ̂_i是一个介于0和1之间的数可以理解为“基于当前信念该广告本次可能展现出的点击率的一个随机实现”。第三步行动利用。比较从所有广告中抽出的样本值{θ̂_1, θ̂_2, ..., θ̂_K}选择那个样本值最大的广告展示给当前用户。这一步是“利用”因为我们选择了本次“思想实验”中最优的选项。第四步观察与更新。用户看到了广告产生了结果要么点击成功要么没点击失败。根据这个真实反馈我们去更新被选中广告的信念参数如果用户点击了α_i α_i 1如果用户未点击β_i β_i 1其他未被选中的广告其信念参数(α, β)保持不变。然后算法等待下一个用户回到第二步开始新一轮的“抽样-行动-更新”循环。3.2 为什么这样做是聪明的动态平衡的奥秘汤普森采样的精妙之处完全体现在第二步的“抽样”上。我们来看三种典型情况对于一个表现良好且已被充分探索的广告假设广告A历史展示了1000次点击了200次那么它的分布是Beta(201, 801)。这个分布非常“瘦高”均值在0.2附近且方差很小。每次从它里面抽样得到的样本值θ̂_A几乎都在0.19到0.21之间小幅波动非常稳定。因此只要它的真实点击率确实是最高的一档它被选中的概率就会一直很高持续利用。对于一个表现很差且已被充分探索的广告假设广告B展示了800次只点击了40次分布为Beta(41, 761)。这个分布的高峰靠近0且也很集中。从它里面抽出的样本值θ̂_B几乎总是很小的数比如0.05附近。因此它很难在抽样中胜出自然就被淘汰了停止浪费资源。对于一个新上线的、探索不足的广告假设广告C刚刚上线只展示了5次点击了1次分布是Beta(2, 5)。这个分布非常“扁平”从0到1几乎都有可能性。虽然它的均值只有0.286但由于不确定性高方差大下一次抽样时有可能抽到一个很高的值比如0.8。一旦抽到这样的高值它就能在当轮竞争中胜出从而获得被展示的机会。这就是探索随着它被展示的次数增多无论其真实点击率如何它的分布都会逐渐收窄趋向其真实值。如果它确实是个“潜力股”它的分布会逐渐右移并收窄之后被频繁选中如果它其实很差分布会左移收窄之后被选中的概率就越来越小。这个过程完全自动化了探索与利用的权衡。不确定性方差大的选项自动获得了探索的机会确定性数据量高的选项则稳定地贡献收益。算法不需要像ε-greedy那样手动设置一个探索概率ε一切由概率分布本身的性质驱动。4. 手把手实战用Python实现汤普森采样理论说得再多不如亲手写一行代码。我们用一个完整的Python示例来模拟一个包含3个广告老虎机的汤普森采样推荐场景。假设它们的真实点击率我们事先知道但算法不知道分别是0.3、0.5和0.7。我们看看汤普森采样如何一步步找到最好的那个。import numpy as np import matplotlib.pyplot as plt class ThompsonSamplingBandit: def __init__(self, true_probs): 初始化多臂老虎机 :param true_probs: 列表每个老虎机的真实成功概率 self.true_probs true_probs self.k len(true_probs) # 初始化Beta分布参数α成功次数β失败次数 self.alpha np.ones(self.k) # 初始为1代表均匀分布先验 self.beta np.ones(self.k) self.rewards [] # 记录每次的收益 self.choices [] # 记录每次的选择 def choose_arm(self): 汤普森采样从每个臂的Beta分布中抽样选择样本值最大的臂 # 从每个臂的Beta分布中随机抽取一个样本theta_i sampled_theta np.random.beta(self.alpha, self.beta) # 返回样本值最大的臂的索引 return np.argmax(sampled_theta) def pull_arm(self, arm): 拉动指定的臂根据真实概率返回奖励1或0 reward np.random.binomial(1, self.true_probs[arm]) return reward def update(self, arm, reward): 根据获得的奖励更新被选中臂的Beta分布参数 if reward 1: self.alpha[arm] 1 else: self.beta[arm] 1 def run_experiment(self, num_trials5000): 运行实验 for t in range(num_trials): chosen_arm self.choose_arm() reward self.pull_arm(chosen_arm) self.update(chosen_arm, reward) self.rewards.append(reward) self.choices.append(chosen_arm) # 计算累计点击率和每个臂被选择的次数 cumulative_reward np.cumsum(self.rewards) cumulative_ctr cumulative_reward / (np.arange(num_trials) 1) arm_counts np.bincount(self.choices, minlengthself.k) return cumulative_ctr, arm_counts # 设置真实点击率三个广告真实点击率分别为0.3, 0.5, 0.7 true_ctrs [0.3, 0.5, 0.7] bandit ThompsonSamplingBandit(true_ctrs) # 运行5000次试验 cumulative_ctr, arm_counts bandit.run_experiment(num_trials5000) # 打印结果 print( 汤普森采样实验结果 ) print(f真实点击率: {true_ctrs}) print(f每个广告被展示的次数: {arm_counts}) print(f最终累计点击率: {cumulative_ctr[-1]:.4f}) print(f\n各广告最终信念分布参数 (α, β):) for i in range(bandit.k): print(f 广告{i}: Beta({bandit.alpha[i]:.1f}, {bandit.beta[i]:.1f}), 均值估计{bandit.alpha[i]/(bandit.alpha[i]bandit.beta[i]):.4f}) # 可视化结果 fig, axes plt.subplots(1, 2, figsize(12, 4)) # 图1累计点击率随时间的变化 axes[0].plot(cumulative_ctr, linewidth2) axes[0].axhline(ymax(true_ctrs), colorr, linestyle--, label最优点击率 (0.7)) axes[0].set_xlabel(试验次数) axes[0].set_ylabel(累计点击率) axes[0].set_title(汤普森采样累计点击率收敛过程) axes[0].legend() axes[0].grid(True, alpha0.3) # 图2各广告被选择的比例 axes[1].bar(range(bandit.k), arm_counts / np.sum(arm_counts), color[skyblue, lightgreen, salmon]) axes[1].set_xlabel(广告索引) axes[1].set_ylabel(被选择的比例) axes[1].set_title(各广告最终被选择的频率分布) axes[1].set_xticks(range(bandit.k)) for i, v in enumerate(arm_counts / np.sum(arm_counts)): axes[1].text(i, v 0.01, f{v:.2%}, hacenter, fontweightbold) plt.tight_layout() plt.show()运行这段代码你会看到类似以下的结果和图表 汤普森采样实验结果 真实点击率: [0.3, 0.5, 0.7] 每个广告被展示的次数: [ 45, 812, 4143] 最终累计点击率: 0.6826 各广告最终信念分布参数 (α, β): 广告0: Beta(15.0, 31.0), 均值估计0.3261 广告1: Beta(412.0, 412.0), 均值估计0.5000 广告2: Beta(2910.0, 1255.0), 均值估计0.6987结果解读收敛性累计点击率曲线从最初的随机波动快速上升并最终稳定在接近最优广告点击率0.7的水平0.6826。这说明算法成功地找到了最佳选项并最大化利用了它。探索与利用广告2点击率0.7被选择了4143次占总次数的83%这是利用。广告1点击率0.5被探索了812次广告0点击率0.3仅被探索了45次。算法将更多探索资源分配给了潜力更大的广告1而迅速放弃了表现最差的广告0。信念更新算法对每个广告点击率的估计Beta分布的均值最终都非常接近其真实值。尤其是广告2经过四千多次试验其估计值0.6987已非常精准且其α和β值很大分布非常集中不确定性极低。你可以尝试修改true_ctrs列表增加广告数量或者改变试验次数num_trials观察算法的表现。你会发现即使面对10个甚至更多选项汤普森采样也能高效地找到最佳者并将遗憾因未选择最优选项而损失的点击降到很低。5. 进阶与对比汤普森采样为何优于ε-Greedy和UCB在实际应用中我们常听到的Bandit算法还有ε-Greedy和上置信界算法。了解汤普森采样与它们的区别能帮你更好地做技术选型。5.1 对比ε-Greedy摆脱呆板的探索ε-Greedy算法非常简单以概率1-ε选择当前点击率估计最高的广告利用以概率ε随机选择一个广告探索。它的缺点是探索过于“盲目”和“平均”。无论一个选项当前看起来多差或者已经被探索了多少次它在探索阶段被选中的概率都是一样的ε/K。这会导致资源浪费在明显很差的选项上。而汤普森采样的探索是概率匹配式的。一个选项被选中的概率正好等于它是真正最优选项的后验概率。换句话说算法认为某个选项有10%的可能性是最好的那么在决策中它就有10%的机会被选中。这种探索是定向的、高效的它会将更多探索资源分配给那些“有希望但不确定”的选项而不是那些“几乎确定很差”的选项。5.2 对比UCB更自然的概率解释上置信界算法如UCB1为每个选项计算一个“分数”样本均值 置信区间上界。它总是选择分数最高的选项。这个置信区间上界会随着一个选项被探索次数的增加而缩小。UCB同样能平衡探索与利用但它基于的是频率学派的置信区间理论。汤普森采样则源于贝叶斯学派。它维护的是关于参数点击率的完整概率分布而不仅仅是点估计和置信区间。这种贝叶斯框架带来了几个优势更易处理先验知识如果你知道某些广告类型通常点击率较低你可以通过设置较小的初始α、较大的初始β即先验分布峰值靠近0来融入这个知识。UCB较难自然地融入这类先验。更适应非平稳环境在真实场景中用户的偏好可能会随时间变化非平稳性。我们可以通过让Beta分布的参数随时间衰减例如引入一个遗忘因子γ1定期执行αγα, βγβ来让算法“忘记”久远的历史更快地适应变化。这种调整在贝叶斯框架下非常直观。计算更简单UCB需要存储每个选项的播放次数和总奖励并在每次决策时计算平方根等运算。汤普森采样只需要存储α和β两个整数决策时只需要从标准Beta分布中抽样计算开销极低尤其适合高并发、低延迟的在线服务。5.3 实际部署的注意事项与技巧在实际的推荐系统或A/B测试平台中部署汤普森采样有几个坑需要注意冷启动问题对于全新的选项α1, β1由于不确定性极高在最初的几轮抽样中它们有较大概率被选中。这有时是期望的探索但如果你有大量新选项同时上线可能会导致初期效果剧烈波动。一个常见的技巧是使用信息先验。例如如果你知道历史广告的平均点击率是0.02你可以将所有新广告初始化为Beta(α2, β98)这样其先验均值就是0.02方差也较小避免了过于激进的初期探索。处理批量更新在实际系统中我们可能不是每次用户交互都实时更新模型而是每隔一段时间如5分钟收集一批日志数据然后批量更新α和β参数。实现时务必注意数据的顺序性和一致性。用于更新模型的数据必须是在模型当前版本下产生的决策数据。不能把新模型决策产生的数据拿去更新旧模型的参数这会造成偏差。并行实验与分层一个大型平台可能同时运行成千上万个汤普森采样实验。直接为每个实验独立运行一个Bandit实例可能会导致资源冲突和统计干扰。这时需要引入分层抽样或上下文Bandit的概念。例如你可以先根据用户画像选择一个大类如“年轻男性科技爱好者”再在这个大类下运行一个独立的汤普森采样来选择具体内容。这能更好地共享信息加速学习。我在一个新闻Feed流项目中应用汤普森采样时就曾踩过一个坑初期没有设置合理的先验导致几个点击率极低但标题党的新内容因为初期偶然的点击而被过度探索拉低了整体效率。后来我们引入了基于内容类型的先验如娱乐类新闻先验点击率稍高财经类稍低并设置了每个内容的最低展示次数阈值问题才得到解决。这些经验告诉我再优雅的算法也需要结合业务场景进行细致的调优和工程化包装。