汤普森采样(Thompson sampling): 理论支持

目录

  • 一、UCB与TS算法数学原理
    • 1、Upper Confidence Bounds 数学原理
    • 2、Thompson sampling 数学原理
      • a、TS 基本数据原理
        • 1. beta 分布
        • 2. 共轭分布与共轭先验
        • 3. 采样的编程实现
      • b、TS 算法流程
        • 1. TS算法基础版本
        • 2. Batched Thompson Sampling
  • 二、UCB与TS算法的优缺点
    • 1、TS算法的优缺
      • a、TS的一些基本性质:
      • b、结合推荐场景,TS为什么有效
      • c、TS的不足:
    • 2、UCB算法的优缺
      • a、UCB算法的一些基本性质
      • b、ucb 优点
      • c、ucb 缺点
      • 3、TS与UCB对比总结
  • 三、参考资源

一、UCB与TS算法数学原理

1、Upper Confidence Bounds 数学原理

在这里插入图片描述
在这里插入图片描述

Python demo

# !/usr/bin/python
# -*- coding=utf-8 -*-
# Name:         UCB
# Description:
# Author:       liu
# Date:         2021/9/14
# Mail:         from __future__ import absolute_import
from __future__ import print_function
from __future__ import divisionimport numpy as npN = 3  # 物品总数
T = 100  # 试验次数/轮数
epsilon = 0.1  # 贪婪系数
P = [0.5, 0.6, 0.55]  # 每个物品的真实被转化率
Round = [0, 0, 0]  # 每个物品被选中的次数
Reward = [0, 0, 0]  # 每个物品被转化的次数def pull(N, epsilon, P):"""通过epsilon-greedy来选择物品Args:N(int) :- 物品总数epsilon(float) :- 贪婪系数P(iterables) :- 每个物品被转化率Returns:本次选择的物品"""# 通过一致分布的随机数来确定是搜索还是利用exploration_flag = True if np.random.uniform() <= epsilon else False# 如果选择探索if exploration_flag:i = int(min(N - 1, np.floor(N * np.random.uniform())))# 如果选择利用else:i = np.argmax(P)return idef calculate_delta(Round, i):"""利用所有物品被选中的次数和i物品被选中的次数来计算deltaArgs:Round(iterables) :- 每个物品被选择的次数i(int) :- 物品序号Returns:使得置信度为1-2/ sum(Round) ** 2的delta"""round_i = Round[i]if round_i == 0:return 1else:return np.sqrt(np.log(sum(Round)) / round_i)def calculate_empirical(Round, Reward, i):"""利用所有物品被选中和获得奖励的次数来计算实证参数Args:Round(iterables) :- 每个物品被选择的次数Reward(iterables) :- 每个物品获得奖励的次数i(int) :- 物品序号Returns:i物品的实证参数"""round_i = Round[i]if round_i == 0:return 1else:return Reward[i] / round_idef trial_ucb(Reward, Round, rounds=T):"""做rounds轮试验Args:Reward(iterables) :- 每个物品的被转化次数Round(iterables) :- 每个物品被选择的次数rounds(int) :- 一共试验的次数Returns:一共的转化数rewards来记录从头到位的奖励数"""rewards = 0for t in range(rounds):P_ucb = [calculate_empirical(Round, Reward, i) + calculate_delta(Round, i) for i in range(len(Round))]i = pull(N, epsilon, P_ucb)Round[i] += 1reward = np.random.binomial(1, P[i])Reward[i] += rewardrewards += rewardreturn rewardsif __name__ == '__main__':trial_ucb(Reward, Round, rounds=T)

2、Thompson sampling 数学原理

a、TS 基本数据原理

1. beta 分布

Beta分布Bernoulli分布二项式分布 共轭先验,是(0, 1)上的随机变量的一种分布,它有两个大于0的参数 α,β,概率密度函数为:
f B e ( θ ; α , β ) = θ α − 1 ( 1 − θ ) β − 1 B ( α , β ) f_{Be}(\theta ;\alpha,\beta )=\frac{\theta^{\alpha -1 } (1-\theta ) ^{\beta -1}}{B(\alpha,\beta)} fBe(θ;α,β)=B(α,β)θα1(1θ)β1其中: B ( α , β ) : = ∫ 0 1 θ α − 1 ( 1 − θ ) β − 1 d θ = Γ ( α ) Γ ( β ) Γ ( α + β ) B(\alpha,\beta):=\int_{0}^{1} \theta ^{\alpha -1}(1-\theta )^{\beta -1}\mathrm{d}\theta =\frac{\Gamma (\alpha) \Gamma (\beta)}{\Gamma (\alpha + \beta)} B(α,β):=01θα1(1θ)β1dθ=Γ(α+β)Γ(α)Γ(β)

  • 1> 其中B(α,β)是B函数,Γ(x)是伽马函数,B函数可以理解为归一化因子(Normalizer),其存在是为了使得概率的积分为1
  • 2> beta分布的支撑集: θ ∈ ( 0 , 1 ) \theta \in(0, 1) θ(0,1) 意义为二元随机变量X 其中一种结果x0的概率,所以Beta分布是一种“概率的概率分布”,其具体形式是为了满足贝叶斯推断过程中其内涵的一致性确定出来的。一般被用于建模伯努利试验事件成功的概率的概率分布。
  • 3>B函数在计算机求解中一般用Γ函数(分布)换算(如上面公式),计算机的内部实现就由积分变成阶乘
  • 4>Beta分布直观理解(可视化)
    图1 Probability density function (PDF)
    图1 Probability density function (PDF)
    在这里插入图片描述图2 Cumulative distribution function (CDF)

2. 共轭分布与共轭先验

  • 1> Beta分布与二项分布的关系 (解释建模问题)
    进行n次伯努利试验,其出现试验成功的概率p服从一个先验概率密度分布: B e t a ( α , β ) Beta(\alpha,\beta) Beta(α,β),试验结果出现k次试验成功,则试验成功的概率p的后验概率密度分布为: B e t a ( α + k , β + n − k ) Beta(\alpha +k ,\beta + n -k) Beta(α+k,β+nk),解释为什么beta分布用建模伯努利实验

  • 2> 共轭分布与共轭先验 (解释参数更新问题)
    a、 {先验概率分布}*{实验数据/似然函数/似然概率} ∝ {后验概率分布} ,∝表示等比于。通过贝叶斯推理,可发现先验概率与后验概率具有同样的数学形式,所以也称它们为共轭分布(Conjugate Distribution),称先验概率似然函数共轭先验(Conjugate Prior)
    b、在MAB问题中,Bernoulli分布正好有Beta分布作为共轭先验,有了共轭先验,就容易做贝叶斯更新。为什么?因为beta 分布的更新只要考虑两个参数即可。
    c、所以 Thompson sampling,允许我们利用每个物品被转化率先验知识来设定每个beta分布的参数。
    d、在业务中的应用:α表示为点击的次数β表示为曝光了但没有点击的次数,所以α+β表示曝光数

3. 采样的编程实现

Python:np.random.beta(α, β)   #  返回值[0,1] 概率大小,其中α > 0,β > 0
C++:boost::random::beta_distribution<>(alpha, beta)  // alpha > 0,beta > 0

b、TS 算法流程

1. TS算法基础版本

在这里插入图片描述

  • 为每个物品预估一对Beta分布的参数,可通过历史数据计算出来
  • 每次试验前从每个物品点击曝光数据的Beta分布中随机采样获得对应的被转化率得分
  • 选择被转化率最大的物品,进行输出/播放
  • 根据用户对物品是否转化,来更新该物品的Beta分布参数,具体来说,就是被转化则α加 1否则 β 加 1。(这个过程可以实时计算或者小时粒度进行在线计算)
  • python demo:
# !/usr/bin/python
# -*- coding=utf-8 -*-
# Name:         demo
# Description:
# Author:       liu
# Date:         2021/9/14
# Mail:         from __future__ import absolute_import
from __future__ import print_function
from __future__ import divisionimport numpy as npN = 3                # 物品总数
T = 100              # 试验次数/轮数
epsilon = 0.1        # 贪婪系数
P = [0.5, 0.6, 0.55]  # 每个物品的真实被转化率
Round = [0, 0, 0]    # 每个物品被选中的次数Alpha = [25, 50, 75]  # 每个物品被转化率的Beta先验参数
Beta = [75, 50, 25]# 在代码中加入了 epsilon-greedy 策略,这个过程不是必要的def pull(N, epsilon, P):"""通过epsilon-greedy来选择物品Args:N(int) :- 物品总数epsilon(float) :- 贪婪系数P(iterables) :- 每个物品被转化率Returns:本次选择的物品"""# 通过一致分布的随机数来确定是搜索还是利用exploration_flag = True if np.random.uniform() <= epsilon else False# 如果选择探索if exploration_flag:i = int(min(N-1, np.floor(N*np.random.uniform())))# 如果选择利用else:i = np.argmax(P)return idef trial_thompson(Alpha, Beta, rounds=T):"""做rounds轮试验Args:Alpha, Beta(iterables) :- 每个物品被转化率的Beta分布的参数rounds(int) :- 一共试验的次数Returns:一共的转化数rewards来记录从头到位的奖励数"""rewards = 0for t in range(rounds):P_thompson = [np.random.beta(Alpha[i], Beta[i]) for i in range(len(Round))]i = pull(N, epsilon, P_thompson)Round[i] += 1reward = np.random.binomial(1, P[i])Alpha[i] += rewardBeta[i] += 1 - rewardrewards += rewardreturn rewardsif __name__ == '__main__':trial_thompson(Alpha, Beta, rounds=T)

2. Batched Thompson Sampling

在这里插入图片描述

BTS算法特点:Beta 分布只在每批次的结束时进行更新,例如一个小时一次等

二、UCB与TS算法的优缺点

1、TS算法的优缺

a、TS的一些基本性质:

  • (1)贝塔分布主要有 α和 β两个参数,这两个参数决定了分布的形状,从上图及其均值和方差的公式可以看出
  • (2)α/(α+β)也就是均值,其越大,概率密度分布的中心位置越靠近1,依据此概率分布产生的随机数也多说都靠近1,反之则都靠近0
  • (3)α+β越大,则分布越窄,也就是集中度越高,这样产生的随机数更接近中心位置,从方差公式上也能看出来
  • (4)实现相对简单,计算量较小
  • (5)TS更大程度上利用了先验知识
  • (6)TS 基于贝叶斯思想,全部用概率分布来表达不确定性

b、结合推荐场景,TS为什么有效

  • (1)如果一个候选项被选中的次数越多,也就是α+β (曝光)越大,它的分布就会变窄,换言之,这个候选项的收益已经非常确定了,不管分布中心靠近0,还是靠近1,都几乎比较确定。用它产生的随机数,基本上就在中心位置附近,接近平均收益。
  • (2)如果一个候选项不但α+β 很大,即分布很窄,而且α/(α+β) 也很大(点击率很高),靠近1,那就确定这是个好的候选项,平均收益很好,每次选择很占优势,就进入利用阶段(Exploitation)。反之则有可能平均分布比较靠近0,几乎再无出头之日
  • (3)如果一个候选的α+β很小(曝光很少),分布很宽,也就是没有被选择太多次,说明这个候选项是好是坏还不确定,那么分布就是跳跃的,这次可能好,下次就可能坏,也就是还有机会被选中,没有完全抛弃。那么用它产生随机数就有可能得到一个较大的随机数,就在排序时被优先输出,这就是所说的探索作用(Exploration)。

c、TS的不足:

  • (1)返回的结果具有一定随机性,不是确定的事件

2、UCB算法的优缺

a、UCB算法的一些基本性质

  • (1)UCB是一种乐观的算法,选择置信区间上界排序(如果是悲观保守的做法,是选择置信区间下界排序)
  • (2)置信因子c一般是固定的,同一个粒度下一般是相同
  • (3)上界修正项,是根据霍夫丁不等式推导出来的

b、ucb 优点

  • (1)充分利用历史信息进行选择

c、ucb 缺点

  • (1)算法是确定性的,结果也是固定的,在模型更新前,推荐结果不会改变
  • (2)在先验知识利用方面,仅在置信区间上界利用,也就是部分使用了概率分布
  • (3)相对TS计算量大些

3、TS与UCB对比总结

  • a、UCB算法部分使用概率分布(仅置信区间上界)来量化不确定性,而TS基于贝叶斯思想,全部用概率分布来表达不确定性(避免马太效应)
  • b、UCB采用确定的选择策略,可能导致每次返回结果相同(不是推荐想要的),而TS则是随机化策略
  • c、TS实现相对更简单,UCB计算量更大(可能需要离线/异步计算),在计算机广告、文章推荐领域,效果与UCB不相上下
  • d、TS是逐步完善的模型,从采样的角度讲,TS的探索能力更好

三、参考资源

[1] 《 Bandit算法在携程推荐系统中的应用与实践》
[2] 《汤普森采样(Thompson sampling) 》
[3] 《多臂老虎机之Thompson Sampling》
[4] 《Bate分布公式推导》
[5] 《Beta分布,共轭先验与贝叶斯推断》
[6] 《Multi-armed bandit and Thompson Sampling in C++ and Python》

声明: 总结学习,有问题或不当之处,可以批评指正哦,谢谢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/106981.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[管理与领导-49]:IT基层管理者 - 8项核心技能 - 4 - 团队激励

目录 前言&#xff1a; 一、什么是团队激励 二、为什么需要激励 三、激励的误区 3.1 常见误区 3.2 以下是一些常见的激励错误做法&#xff1a; 四、如何正确地激励 五、关于激励的一些理念 六、常见障碍 前言&#xff1a; 管理者存在的价值就是制定目标&#xff0c;即…

Springboot开发所遇问题(持续更新)

SpringBoot特征&#xff1a; 1. SpringBoot Starter&#xff1a;他将常用的依赖分组进行了整合&#xff0c;将其合并到一个依赖中&#xff0c;这样就可以一次性添加到项目的Maven或Gradle构建中。 2,使编码变得简单&#xff0c;SpringBoot采用 JavaConfig的方式对Spring进行配置…

【目标检测】理论篇(2)YOLOv3网络构架及其代码实现

网络构架图&#xff1a; 代码实现&#xff1a; import math from collections import OrderedDictimport torch.nn as nn#---------------------------------------------------------------------# # 残差结构 # 利用一个1x1卷积下降通道数&#xff0c;然后利用一个3x3卷…

接口多态 面试题及习题

基础题目 第一题&#xff1a;概念辨析 什么是接口&#xff0c;如何定义接口&#xff1f; 接口&#xff0c;是Java语言中一种引用类型&#xff0c;是方法的集合。使用interface关键定义接口&#xff0c;其中可以定义抽象方法&#xff0c;默认方法&#xff0c;私有方法&#xf…

CAPL - Panel和TestModule结合实现测试项可选

目录 一、定义脚本编号和脚本组编号 1、测试组定义 2、测试脚本编号定义

智慧政务,长远布局——AIGC引领,加速推进数字化政府建设

在人工智能、虚拟现实等领域迅猛发展且日益成熟的背景下&#xff0c;AI行业正迈向蓬勃发展的全新阶段&#xff0c;市场规模持续扩张。与此同时&#xff0c;数字服务也正在蓬勃兴起&#xff0c;新一代信息技术为数字政府构建了坚实支撑&#xff0c;重塑了政务信息化管理、业务架…

设计模式--适配器模式(Adapter Pattern)

一、什么是适配器模式&#xff08;Adapter Pattern&#xff09; 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许将一个类的接口转换成客户端所期望的另一个接口。适配器模式主要用于解决不兼容接口之间的问题&#xff0c;使得原本…

将数据类型,类名作为参数传递使用的方法

在开发中遇到一个问题&#xff0c;就是给了很多的数据类型&#xff0c;需要找出当前数据属于哪个数据类型。 举个例子&#xff0c;我们现在有一组数据类型<int, double, float, char, bool>&#xff0c;并给定一个数据char c&#xff1b;需要通过一个函数找出变量c是类型…

七层、四层和五层网络模型区别和联系

七层、四层和五层网络模型区别和联系 概述OSI网络7层模型&#xff08;概念型框架&#xff09;概述图片分析 四层模型概述常用协议OSI与TCP/IP四层的区别 五层模型概述三种网络模型对比 总结 概述 网络模型-七层模型&#xff08;OSI模型&#xff09;、五层协议体系结构和TCP/IP…

【提升接口响应能力的最佳实践】常规操作篇

文章目录 1. 并行处理简要说明CompletableFuture是银弹吗&#xff1f;测试案例测试结论半异步&#xff0c;半同步总结 2. 最小化事务范围简要说明编程式事务模板 3. 缓存简要说明 4. 合理使用线程池简要说明使用场景线程池的创建参数的配置建议 线程池的监控线程池的资源隔离 5…

SpringBoot权限认证

SpringBoot的安全 常用框架&#xff1a;Shrio,SpringSecurity 两个功能&#xff1a; Authentication 认证Authorization 授权 权限&#xff1a; 功能权限访问权限菜单权限 原来用拦截器、过滤器来做&#xff0c;代码较多。现在用框架。 SpringSecurity 只要引入就可以使…

ctfshow-web13 文件上传

0x00 前言 CTF 加解密合集CTF Web合集 0x01 题目 0x02 Write Up 首先看到是一个上传页面&#xff0c;测试其他无果&#xff0c;遂进行目录遍历&#xff0c;发现upload.php.bak文件 可以看到这里的限制条件&#xff0c;大小&#xff0c;以及内容&#xff0c;这里可以使用.use…

LeetCode669. 修剪二叉搜索树

669. 修剪二叉搜索树 文章目录 [669. 修剪二叉搜索树](https://leetcode.cn/problems/trim-a-binary-search-tree/)一、题目二、题解方法一&#xff1a;递归法方法二&#xff1a;迭代法 一、题目 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 hig…

使用秘籍|如何实现图数据库 NebulaGraph 的高效建模、快速导入、性能优化

本文整理自 NebulaGraph PD 方扬在「NebulaGraph x KubeBlocks」meetup 上的演讲&#xff0c;主要包括以下内容&#xff1a; NebulaGraph 3.x 发展历程NebulaGraph 最佳实践 建模篇导入篇查询篇 NebulaGraph 3.x 的发展历程 NebulaGraph 自 2019 年 5 月开源发布第一个 alp…

opencv进阶19-基于opencv 决策树cv::ml::DTrees 实现demo示例

opencv 中创建决策树 cv::ml::DTrees类表示单个决策树或决策树集合&#xff0c;它是RTrees和 Boost的基类。 CART是二叉树&#xff0c;可用于分类或回归。对于分类&#xff0c;每个叶子节点都 标有类标签&#xff0c;多个叶子节点可能具有相同的标签。对于回归&#xff0c;每…

【Acwing291】蒙德里安的梦想(状态压缩dp)详细讲解

题目描述 题目分析 显而易见的重要事实 首先&#xff0c;需要明白一个很重要的事实&#xff1a; 所有的摆放方案数所有横着摆放且合理的方案数 这是因为&#xff0c;横着的确定之后&#xff0c;竖着的一定会被唯一确定&#xff0c;举一个例子&#xff1a; ------唯一确定-…

RabbitMQ---订阅模型-Fanout

1、 订阅模型-Fanout Fanout&#xff0c;也称为广播。 流程图&#xff1a; 在广播模式下&#xff0c;消息发送流程是这样的&#xff1a; 1&#xff09; 可以有多个消费者 2&#xff09; 每个消费者有自己的queue&#xff08;队列&#xff09; 3&#xff09; 每个队列都要绑定…

Windows 10【压缩卷】操作报错【无法将卷压缩到超出任何不可移动的文件所在的点】的解决方法

目录 一、背景 二、原因 三、解决方法 3.1 Windows自带的碎片清理工具 3.1.1 操作步骤 3.1.2 操作结果 3.2 MyDefrag工具清理磁盘碎片 3.2.1 操作步骤 3.2.2 操作结果 3.3 Windows自带的事件查看器 3.3.1 操作步骤 3.3.2 操作结果 3.4 关闭虚拟内存并删除虚拟内存…

离谱事件解决方法2 无法定位程序输入点XXX于动态链接库XXX.dll

事情经过&#xff1a; 本人一只acmer&#xff0c;使用sublime编写代码&#xff0c;但是前两天在打开cpp类型的文件的时候显示报错如下&#xff1a; 这里的dll文件就是动态链接库&#xff0c;它并不是一个可执行文件&#xff0c;里面存放的是程序的函数实现过程&#xff08;公用…

django+MySQL计算机毕设之图片推荐系统(报告+源码)

图片推荐系统是在的数据存储主要通过MySQL。用户在使用应用时产生的数据通过Python语言传递给数据库。通过此方式促进图片推荐信息流动和数据传输效率&#xff0c;提供一个内容丰富、功能多样、易于操作的平台。述了数据库的设计&#xff0c;系统的详细设计部分主要论述了几个主…