bandit算法与推荐系统

导语

首先声明,本文基本转载于陈开江先生的《Bandit 算法与推荐系统》一文,加上笔者自己的结合目前推荐项目的理解。不准确之处,愿诸君指正。拜谢。
推荐系统中经常会遇到EE问题和冷启动问题,在笔者项目过程中,无可厚非的遇到了冷启动问题。对于这两个问题,前者涉及到了平衡准确和多样,后者涉及到了产品推荐算法和运营。bandit算法就是为解决这两个问题的一种在线学习算法。

一:什么是bandits算法

1.1:为选择而生

原文中,作者阐述bandit 为为选择而生,笔者认为,bandit算法更准确的说是为选择困难而生。例如,引入经典的MAB问题(多臂赌博机问题),bandit算法就是为了解决在不知道老虎机吐钱的概率分布下,要达到吐钱概率最大也就是收益最大化的问题。当然,最好的办法就是取试一试,不是盲目的去试,而是有策略的快读的去试。这些策略,就是bandit算法。

那么,引入推荐系统中,我们也会看到很多类似的场景。例如:
1,由于用户对不同物品的感兴趣程度不同,在推荐系统初次见到某个用户时,如何快速的知道某个用户对不同内容的感兴趣程度呢,这就是经典的推荐系统冷启动问题。这也前面提到的产品推荐算法和运营问题。
2,对于推荐广告,我们如何知道该给哪个用户展示那个广告,才能达到广告的点击收益最大呢,如果都挑选效果最好的广告,那么新的广告和新鲜度不高的广告是不是完全无用了?
3,在推荐系统中,如果我们想出了一种新的模型,对用户模型测试而言,有没有比A/Btest更快的方法让我们知道新模型和旧模型谁更靠谱呢。
4,对于一个用户,在推荐系统中,我们如果一直给他推荐他感兴趣的物品,那么我们如何才能科学的冒险的为他推荐一些新的物品呢。典型的例子,就是笔者在推荐做内容画像时候,除了根据用户感兴趣的物品进行推荐以外,我们是否需要准备一些其他的用户可能接受的内容来补充推荐呢。

总之,这些问题都可以转化成为mab问题,都可以用bandit算法来解决

1.2 bandit 算法与推荐系统

在导论中我们提到了两个在推荐系统中遇到的问题,EE问题和冷启动问题。这两个问题基本上是任何一个推荐系统无法绕开的话题。那么,我们接下来就介绍一下这两个问题。
EE问题: 又称为EXPLOIT—EXPLORE问题。exploit就是用户确定比较感兴趣的事物,要求准确率较高。explore就是探索用户可能感兴趣的,新的事物。因为光对着用户感兴趣的事物进行推荐,用户很快会腻,我们需要科学的冒险的为用户推荐一些新鲜事物。
冷启动问题: 冷启动问题也就是上面提到的,我们的推荐系统在面对一个新用户时,如何通过若干次实验,来大致猜测出用户可能感兴趣的事物。

总之:这两个问题本质都是如何选择用户感兴趣的事物来进行推荐,比较符合bandit算法后面的mab问题,因此可以用bandit算法来解决一部分问题。
**

bandit解决冷启动的大致思路如下:

**
我们用分类或者topic来表示用户兴趣,也就是MAB问题中的臂,我们可以通过几次实验,来刻画出新用户心目中对每个topic的感兴趣概率
如果用户对某个topic感兴趣(提供了显示或者隐式反馈),就表示我们获得了收益,如果推荐了不感兴趣的topic(也提供了显示或者隐式反馈,即用户明确反馈不感兴趣,或者用户对topic长时间,多次数未进行任何操作,无动于衷),推荐系统就表示regret了。
当一个用户来了, 针对这个用户,我们采用汤普森采样为每一个topic 采样一个随机数,排序后,我们取前topn的推荐item,注意,这里有一点改动,那就是在原始的多臂问题一次只摇一个臂,我们这里一次摇n个臂。
获取用户的反馈,比如点击。没有反馈则更新对应top的lose,点击了则更新对应topic的win值。

1.3 怎么选择 bandit 算法?

现在介绍一下,bandit算法如何解决这类问题的。bandit 算法需要量化一个核心问题:错误的选择到底有多大的遗憾?能不能遗憾少一些?怎么衡量不同 bandit 算法在解决多臂问题上的效果?首先介绍一个概念,叫做累积遗憾 (regret)2:
bandit算法与推荐系统_第1张图片

这个公式可以用来对比不同 bandit 算法的效果:对同样的多臂问题,用不同的 bandit 算法试验相同次数,看看谁的 regret 增长得慢。 这里,不得不抛出一个问题,有个同事问我,用regret来比较bandit算法效果, 在相同的次数下,我们到底是用整体的regret最终的值的大小来比较,还是说用regret的增长速度快慢来进行选择。其实这两个问题,最终是统一的,一张图,说明一切。
bandit算法与推荐系统_第2张图片

1.4 常用 bandit 算法

1,Thompson sampling 算法
算法原理 :
1,假设每个臂是否产生收益,其背后有一个概率分布,产生收益的概率为 p。
2,我们不断地试验,去估计出一个置信度较高的 “概率 p 的概率分布” 就能近似解决这个问题了。
3,怎么能估计 “概率 p 的概率分布” 呢? 答案是假设概率 p 的概率分布符合 beta(wins, lose)分布,它有两个参数: wins, lose。
4,每个臂都维护一个 beta 分布的参数。每次试验后,选中一个臂,摇一下,有收益则该臂的 wins 增加 1,否则该臂的 lose 增加 1。
5,每次选择臂的方式是:用每个臂现有的 beta 分布产生一个随机数 b,选择所有臂产生的随机数中最大的那个臂去摇。
bandit算法与推荐系统_第3张图片
UCB 算法 (置信区间上界)
实现步骤:
初始化:先对每一个臂都试一遍
按照如下公式计算每个臂的分数,然后选择分数最大的臂作为选择:
在这里插入图片描述
观察选择结果,更新 t 和Tjt。其中加号前面是这个臂到目前的收益均值,后面的叫做 bonus,本质上是均值的标准差,t 是目前的试验次数,Tjt是这个臂被试次数。
这个公式反映一个特点:均值越大,标准差越小,被选中的概率会越来越大,同时哪些被选次数较少的臂也会得到试验机会。
Epsilon-Greedy 算法
实现步骤:
1,选一个(0,1)之间较小的数作为epsilon。
2,每次以概率epsilon做一件事:所有摆臂机中随机选一个
3,每次以概率1-epsilon选择截止目前平均收益最大的那个臂
朴素bandit算法:
先试若干次,然后计算每个臂的平均收益,一直选择均值最大的那个。
bandit算法与推荐系统_第4张图片
用bandit算法解决推荐系统冷启动的简单思路
大致思路如下:
用分类或者Topic来表示每个用户兴趣,我们可以通过几次试验,来刻画出新用户心目中对每个topic的感兴趣概率。
这里,如果用户对某个topic感兴趣,就表示我们得到了收益,如果推给了它不感兴趣的topic,推荐系统就表示很遗憾(regret)了。
当一个用户来了,针对这个用户,我们用Thompson算法为每一个topic采样一个随机数,排序后,输出采样值top N 的推荐item。注意,这里略有改动,原始多臂问题每次只摇一个臂,我们这里一次摇N个臂。
获取用户的反馈,比如点击。没有反馈则更新对应topic的lose值,点击了则更新对应topic的wins值。
未完待续。

你可能感兴趣的:(算法,机器学习,概率论)