[原文链接]

选择是一个技术活

著名鸡汤学家沃.滋基硕德曾说过:选择比努力重要。

我们会遇到很多选择的场景。上哪个大学,学什么专业,去哪家公司,中午吃什么,等等。这些事情,都让选择困难症的我们头很大。那么,有办法能够应对这些问题吗?

答案是:有!而且是科学的办法,而不是“走近科学”的办法。那就是bandit算法!

bandit算法来源于人民群众喜闻乐见的赌博学,它要解决的问题是这样的[1]:

一个赌徒,要去摇laohu机,走进赌场一看,一排laohu机,外表一模一样,但是每个laohu机吐钱的概率可不一样,他不知道每个laohu机吐钱的概率分布是什么,那么想最大化收益该怎么整?这就是多臂赌博机问题(Multi-armed bandit problem, K-armed bandit problem, MAB)。

怎么解决这个问题呢?求菩萨?拜赌神?都不好使,最好的办法是去试一试,而这个试一试也不是盲目地试,而是有策略地试,越快越好,这些策略就是bandit算法。

这个多臂问题,它是一个可以装下很多问题的万能框:

1. 假设一个用户对不同类别的内容感兴趣程度不同,那么我们的推荐系统初次见到这个用户时,怎么快速地知道他对每类内容的感兴趣程度?这就是推荐系统的冷启动。

2. 假设我们有若干广告库存,怎么知道该给每个用户展示哪个广告,从而获得最大的点击收益?是每次都挑效果最好那个么?那么新广告如何才有出头之日?

3. 我们的算法工程师又想出了新的模型,有没有比A/B test更快的方法知道它和旧模型相比谁更靠谱?

4. ...

全都是关于选择的问题。只要是关于选择的问题,都可以简化成一个多臂赌博机问题,毕竟小赌怡情嘛,人生何处不赌博。

特别提出,在计算广告和推荐系统领域,针对这个问题,还有个说法叫做EE问题:exploit-explore问题。

exploit意思就是:比较确定的兴趣,当然要用啊。好比说我们已经挣到的钱,当然要花啊;

explore意思就是:不断探索用户新的兴趣才行,不然很快就会出现一模一样的反复推荐。就好比我们虽然有一点钱可以花了,但是还得继续搬砖挣钱啊,不然花完了喝西北风啊。

bandit算法哪家强

现在来一本正经地介绍一下bandit算法怎么解决这类问题的。

我们的选择到底有多遗憾?

王家卫在《一代宗师》里寄出一句台词:

人生要是无憾,那多无趣

本文作者说:

算法要是无憾,那应该是过拟合了。

其实我想引出的是:怎么衡量不同bandit算法解决多臂问题的好坏?多臂问题里有一个概念叫做累计遗憾(regret)[2]

解释一下这个公式:

首先,这里我们讨论的每个臂的收益非0即1,也就是伯努利收益。

公式1最直接:每次选择后,上帝都告诉你,和本该最佳的选择差了多少,然后把每次差距累加起来就是总的遗憾。

wB(i)是第i次试验时被选中臂的期望收益, w\*是所有臂中的最佳那个,如果上帝提前告诉你,我们当然每次试验都选它,问题是上帝不告诉你,所以我们就有了这篇文章。

这个公式可以用来对比不同bandit算法的效果:对同样的多臂问题,用不同的bandit算法试验相同次数,看看谁的regret增长得慢。

本着大家可以直接堆代码的原则,所以本文跳过一切数学上的分析,赤裸裸地陈列出最常用的几个bandit算法。

几个bandit算法

第一个,Thompson sampling算法。这个算法我喜欢它,因为它只有一行代码就可以实现。

简单介绍一下它的原理:

假设每个臂是否产生收益,其背后有一个概率分布,产生收益的概率为p

我们不断地试验,去估计出一个置信度较高的*概率p的概率分布*就能近似解决这个问题了。

怎么能估计概率p的概率分布呢? 答案是假设概率p的概率分布符合beta(wins, lose)分布,它有两个参数: wins, lose。

每个臂都维护一个beta分布的参数。每次试验后,选中一个臂,摇一下,有收益则该臂的wins增加1,否则该臂的lose增加1。

每次选择臂的方式是:用每个臂现有的beta分布产生一个随机数b,选择所有臂产生的随机数中最大的那个臂去摇。

以上就是Thompson采样,用python实现就一行:

choice = numpy.argmax(pymc.rbeta(1 + self.wins, 1 + self.trials - self.wins))

第二个是UCB算法,UCB算法全称是Upper Confidence Bound(置信区间上界),不多说了,它的算法步骤如下[4]:

先对每一个臂都试一遍

之后,每次选择以下值最大的那个臂

其中加号前面是这个臂到目前的收益均值,后面的叫做bonus,本质上是均值的标准差,t是目前的试验次数,Tjt是这个臂被试次数。

这个公式反映:均值越大,标准差越小,被选中的概率会越来越大,起到了exploit的作用;同时哪些被选次数较少的臂也会得到试验机会,起到了explore的作用。

第三个是Epsilon-Greedy算法。这是一个朴素的算法,也很简单有效,有点类似模拟退火:

选一个(0,1)之间较小的数epsilon

每次以概率epsilon(产生一个[0,1]之间的随机数,比epsilon小)做一件事:所有臂中随机选一个。否则,选择截止当前,平均收益最大的那个臂。

是不是简单粗暴?epsilon的值可以控制对Exploit和Explore的偏好程度。越接近0,越保守,只想花钱不想挣钱。

最后还有一个完全是朴素的:

先试几次,每个臂都有了均值之后,一直选均值最大那个臂。这个算法是我们人类在实际中最常采用的,不可否认,它还是比随机乱猜要好。

以上五个算法,我们用10000次模拟试验的方式对比了其效果如图,原始代码来源[5]:

算法效果对比一目了然:UCB算法和Thompson采样算法显著优秀一些。

至于你实际上要选哪一种bandit算法,你可以选一种bandit算法来选bandit算法。。。

用bandit算法解决推荐系统冷启动的简单思路

我想,屏幕前的你已经想到了,推荐系统冷启动可以用bandit算法来解决一部分。

大致思路如下:

用分类或者Topic来表示每个用户兴趣,我们可以通过几次试验,来刻画出新用户心目中对每个topic的感兴趣概率。

这里,如果用户对某个topic感兴趣,就表示我们得到了收益,如果推给了它不感兴趣的topic,推荐系统就表示很遗憾(regret)了。

当一个用户来了,针对这个用户,我们用Thompson算法为每一个topic采样一个随机数,排序后,输出采样值top N 的推荐item。注意,这里略有改动,原始多臂问题每次只摇一个臂,我们这里一次摇N个臂。

获取用户的反馈,比如点击。没有反馈则更新对应topic的lose值,点击了则更新对应topic的wins值。

通俗bandit算法的更多相关文章

  1. MindSpore:基于本地差分隐私的 Bandit 算法

    摘要:本文将先简单介绍Bandit 问题和本地差分隐私的相关背景,然后介绍基于本地差分隐私的 Bandit 算法,最后通过一个简单的电影推荐场景来验证 LDP LinUCB 算法. Bandit问题是 ...

  2. Bandit:一种简单而强大的在线学习算法

    假设我有5枚硬币,都是正反面不均匀的.我们玩一个游戏,每次你可以选择其中一枚硬币掷出,如果掷出正面,你将得到一百块奖励.掷硬币的次数有限(比如10000次),显然,如果要拿到最多的利益,你要做的就是尽 ...

  3. mab算法

    https://zhuanlan.zhihu.com/p/21388070?refer=resyschina 专治选择困难症——bandit算法 改善:https://zhuanlan.zhihu.c ...

  4. Bandit

    CSE599:online and adaptive machine learning Lecture 3:Stochastic Multi-Armed Bandits, Regret Minimiz ...

  5. 推荐算法之E&E

    一.定义 E&E就是探索(explore)和利用(exploit). Exploit:基于已知最好策略,开发利用已知具有较高回报的item(贪婪.短期回报),对于推荐来讲就是用户已经发现的兴趣 ...

  6. Multiarmed Bandit Algorithm在股票中的应用

    股票与Bandit Machine看起来相去甚远,但实际上通过限制买入和卖出的行为,股票可以转换为Bandit Machine,比如:规定股票必须在买入一天以后卖出.为什么要大费周折地把股票变成Ban ...

  7. 2019年所有人必须要掌握的一个技能 - “AI思维”

    或许很多人认为AI只是那些直接从事AI相关岗位的人必须要掌握的技能,但实际上,不分岗位所有人都需要一种能力,那就是“AI思维”.如果没能在合适的时机把自己的认知提升到一定程度,被替代是很自然的事情.在 ...

  8. Appboy 基于 MongoDB 的数据密集型实践

    摘要:Appboy 正在过手机等新兴渠道尝试一种新的方法,让机构可以与顾客建立更好的关系,可以说是市场自动化产业的一个前沿探索者.在移动端探索上,该公司已经取得了一定的成功,知名产品有 iHeartM ...

  9. 多臂机测试, AB测试

    bandit  强盗,土匪:恶棍:敲诈者 ['bændɪt] 多臂机 multi-armed bandit MAB  简写. one-arm bandit   tiger ji 是一种自动AB测试的方 ...

随机推荐

  1. python3 图片文字识别

    最近用到了图片文字识别这个功能,从网上搜查了一下,决定利用百度的文字识别接口.通过测试发现文字识别率还可以.下面就测试过程简要说明一下 1.注册用户 链接:https://login.bce.baid ...

  2. 吐槽下mac的打印机设置

    只有第一次使用的时候,会提示密码和用户名验证,但是如果中途修改了密码, 找了半天都找不到,给人一种挫败感. 最后是在:点击作业队列某一作业右边的刷新按钮,才会弹出验证的对话框, 可能,mac当初设计这 ...

  3. 国内阿里maven仓库镜像maven配置文件maven仓库速度快

    国内连接maven官方的仓库更新依赖库,网速一般很慢,收集一些国内快速的maven仓库镜像以备用. 最新更新:2016年11月11日 18:05:40 阿里云提供Maven私服,我把配置文件贴一下,自 ...

  4. 前端后台以及游戏中使用Google Protocol Buffer详解

    前端后台以及游戏中使用Google Protocol Buffer详解 0.什么是protoBuf protoBuf是一种灵活高效的独立于语言平台的结构化数据表示方法,与XML相比,protoBuf更 ...

  5. mysql分组用法

    --select num from 表 group by num --select num from 表 group by num,nid --特别的:group by 必须在where之后,orde ...

  6. 关于java多线程中异常捕获的理解

    在java多线程程序中,所有线程都不允许抛出未捕获的checked exception(比如sleep时的InterruptedException),也就是说各个线程需要自己把自己的checked e ...

  7. 【iCore1S 双核心板_ARM】例程二十:UART_IAP_ARM实验——更新升级STM32

    实验现象及操作说明: 1.本例程共有两个代码包,APP和IAP,IAP程序功能实现将APP程序升级至STM32中. 2.直接上电或烧写程序将执行升级的APP应用程序. BIN升级文件产生方法: 1.编 ...

  8. 【Java编码规范】《阿里巴巴Java开发手册(正式版)》【转载】

    2017年开春之际,诚意献上重磅大礼:阿里巴巴Java开发手册,首次公开阿里官方Java代码规范标准.这套Java统一规范标准将有助于提高行业编码规范化水平,帮助行业人员提高开发质量和效率.大大降低代 ...

  9. 和TransDecoder 学习perl 自定义模块的路径问题

    TransDecoder 软件是用perl 原因写的,其中包含了一些自定义的模块,通过一个脚本来进行调用,为了能够正常访问自定义的perl 模块, 在其源代码中利用了FindBin 这个模块 use ...

  10. yii2快速導出phpexcel

    https://packagist.org/packages/moonlandsoft/yii2-phpexcel 安装方式:首先是已经安装过Composer,则通过 Composer 下载安装 Mo ...