本篇文章主要介绍一下雅虎在2012年发表的论文 【A Contextual-Bandit Approach to Personalized News Article Recommendation】,同时由于最近在做用户留存方面的工作,也涉及了一些冷启动方面的东西,尝试了很多种方法:包括性别热门、用户群体热门、bandit算法和LDA等尝试,有的效果好,有的效果差(当然和具体的业务场景和使用方法都有关系,不能否则算法或者思路本身的好坏)。最近也在尝试LinUCB算法,因此重新翻看了该论文,整理成下文,同时涉及一些个人的想法和一些实践思路。
个性化Web服务通过利用用户和内容的信息调整他们的服务以满足用户的个性化需求,尽管之前的研究取得了一些进展,但仍然存在两个问题:
论文中把文章推荐看作是多臂老虎机问题,一种有效的做法是根据用户和文章的上下文信息,选择文章推荐给用户,同时基于用户对文章的点击行为动态调整策略,追求点击次数最大化。实验证明加入上下文信息的Bandit算法比传统的Bandit算法CTR提升在12.5%以上,如果是基于稀疏的数据,效果会变得更好。
通常用户和物品都有其特征进行表示,在这种情况下不同用户对于同一物品而言,看法也会不同,因此识别不同内容之间的共性,并在内容池中转移该知识变得格外重要。
论文分析了已有的Bandit算法,包括UCB、E-Greedy、Thompson Smapling、朴素Bandit,然后提出了LinUCB算法,LinUCB分为两种:
之所以称为DisJoint LinUCB是因为不同臂之间的参数不共享。
首先定义每个臂的期望收益为:
其中:
通常模型优化采用的是最小化损失函数,在这里损失函数可以表示为:
基于岭回归得到的参数估计值为:
其中:
根据最小平方和强化学习理论:
其中 是一个常数,为:
基于这个不等式可以选择收益最大的臂,在进行第t次实验时:
其中
其对应的算法流程为:
Hybrid LinUCB考虑了臂之间的共性,因此每个臂的期望修改为:
其中:
由于篇幅有限,论文中并没有给出hybrid的推断,给出的伪代码如下:
与传统的监督学习算法评测相比,融合上下文的Bandit算法的评估十分困难,由于算法的交互性,似乎只能在线上进行效果评测。然而在具体的实践过程中,这种方法是不可行的,对线上效果带来的挑战也很大。
文中提到了一种方法是根据记录的数据模拟臂的选择过程,但随即又说明了这种方法在实验过程中会引入偏差,导致结果不可信。
文中提出了一种实验方法,其实验算法如下:
实验使用的数据是Yahoo-Today Moudle,在选择数据时,为了避免曝光位置带来的偏差,只关注Story和F1位置。
在选取数据时,文中提出了一点:选取了一周的数据作为评估数据,运行bandit算法。从实践经验上讲这是靠谱的,避免了数据本身带来的偏差。
这里通过K-means对用户特征进行聚类,划分为5个簇,即最终得到的用户特征维度为5,最后补一列特征值为1(即第六列特征值为1,为什么为1,文中并没有说明,这里小编也不太明白,如果你有想法的话欢迎留言)
吧啦吧啦就是比别的算法好!
当来一个新用户的时候,我们并不知道该用户的偏好和兴趣,那么最常见的方法就是试探法,假设我们有10个标签,每个标签下都有运营配置的一些精品文章或者商品或者新闻等。
那么这里就可以把每个标签看作是一个臂,我们可以每个臂下展示一个事物,来对用户的兴趣进行试探,然后根据用户的行为进行结果修正。
在选取特征时,论文中使用了用户维度和臂维度的特征,那么在我们实践过程中通常可以使用下面的三大维度的特征:
在实际的应用过程中,并没有那么简单,常见的痛点如下:
具体的场景、业务面对的问题和解决的办法往往是不尽相同的,如果大家决定要应用LinUCB算法,那么在使用之前一定要考虑后相关的问题和解决办法,这样才能避免使用过程中遇到的坑。
针对上边的问题并没有唯一具体的解决办法,感兴趣的欢迎在进行留言讨论。