【论文】LinUCB论文的思想解读、场景应用与痛点说明

本篇文章主要介绍一下雅虎在2012年发表的论文 【A Contextual-Bandit Approach to Personalized News Article Recommendation】,同时因为最近在作用户留存方面的工做,也涉及了一些冷启动方面的东西,尝试了不少种方法:包括性别热门、用户群体热门、bandit算法和LDA等尝试,有的效果好,有的效果差(固然和具体的业务场景和使用方法都有关系,不可否则算法或者思路自己的好坏)。最近也在尝试LinUCB算法,所以从新翻看了该论文,整理成下文,同时涉及一些我的的想法和一些实践思路。html

概述

个性化Web服务经过利用用户和内容的信息调整他们的服务以知足用户的个性化需求,尽管以前的研究取得了一些进展,但仍然存在两个问题:web

  • Web服务具备动态更改内容池的功能,从而使传统的协同过滤算法没法使用。
  • 大多数具备实际意义的Web服务要求具备快速学习和进行计算

论文中把文章推荐看做是多臂老虎机问题,一种有效的作法是根据用户和文章的上下文信息,选择文章推荐给用户,同时基于用户对文章的点击行为动态调整策略,追求点击次数最大化。实验证实加入上下文信息的Bandit算法比传统的Bandit算法CTR提高在12.5%以上,若是是基于稀疏的数据,效果会变得更好。算法

一般用户和物品都有其特征进行表示,在这种状况下不一样用户对于同一物品而言,见解也会不一样,所以识别不一样内容之间的共性,并在内容池中转移该知识变得格外重要。微信

论文分析了已有的Bandit算法,包括UCB、E-Greedy、Thompson Smapling、朴素Bandit,而后提出了LinUCB算法,LinUCB分为两种:app

  • 简单的线性不相交模型 disjoint LinUCB
  • 混合相交的线性模型 hybrid LinUCB

Disjoint LinUCB

之因此称为DisJoint LinUCB是由于不一样臂之间的参数不共享。机器学习

首先定义每一个臂的指望收益为:
E [ r t , a x t , a ] = x t , a T θ a E[r_{t,a} | x_{t,a} ] = x^T_{t,a} \theta^*_a
其中:ide

  • θ a \theta^*_a 表示臂a的参数
  • x t , a x_{t,a} 表示臂a的特征

一般模型优化采用的是最小化损失函数,在这里损失函数能够表示为:
l o s s = ( c a D a θ a ) 2 + λ θ a loss = (c_a - D_a \theta_a)^2 + \lambda|| \theta_a|| svg

基于岭回归获得的参数估计值为:
θ ^ a = ( D a T D a + I d ) 1 D a T c a \hat{\theta}_a = (D^T_a D_a + I_d)^{-1} D^T_ac_a
其中:函数

  • D a D_a 表示是一个m*d的矩阵(即m行,d列),m即选择臂a获得的m个上下文特征组,d为特征的维度
  • I d I_d 表示d*d的单位矩阵
  • c a c_a 表示臂a返回的事物是否被点击的记录向量,长度为m

根据最小平方和强化学习理论:
x t , a T θ ^ a E [ r t , a x t , a ] α x t , a T ( D a T D a + I d ) 1 x t , a | x^T_{t,a} \hat{ \theta}_a - E[r_{t,a} | x_{t,a} ] | \leqslant \alpha \sqrt{ x^T_{t,a}(D^T_aD_a + I_d)^{-1} x_{t,a} }
其中 α \alpha 是一个常数,为: 1 + l n ( 2 / δ ) / 2 1+\sqrt{ln(2/\delta )/2} 学习

基于这个不等式能够选择收益最大的臂,在进行第t次实验时:
a t = d e f a r g m a x a A t ( x t , a T θ ^ a + α x t , a T A a 1 x t , a ) a_t \overset{def}{=} \underset{a \in A_t}{arg max} (x^T_{t,a} \hat{ \theta}_a + \alpha \sqrt{ x^T_{t,a}A_a^{-1} x_{t,a} } )
其中 A = d e f D a T D a + I d A \overset{def}{=}D^T_aD_a + I_d

其对应的算法流程为:
LinUCB的算法流程

Hybrid LinUCB

Hybrid LinUCB考虑了臂之间的共性,所以每一个臂的指望修改成:
E [ r t , a x t , a ] = z t , a T β + x t , a T θ a E[r_{t,a} | x_{t,a} ] =z^T_{t,a}\beta^* + x^T_{t,a} \theta^*_a
其中:

  • z t , a z_{t,a} 表示的是用户/文章的组合特征
  • β \beta^* 表示的是全部臂的共享未知参数
  • θ a \theta^*_a 表示的是臂a的私有参数

因为篇幅有限,论文中并无给出hybrid的推断,给出的伪代码以下:
Hybrid LinUCB的算法流程

评估算法

与传统的监督学习算法评测相比,融合上下文的Bandit算法的评估十分困难,因为算法的交互性,彷佛只能在线上进行效果评测。然而在具体的实践过程当中,这种方法是不可行的,对线上效果带来的挑战也很大。

文中提到了一种方法是根据记录的数据模拟臂的选择过程,但随即又说明了这种方法在实验过程当中会引入误差,致使结果不可信。

文中提出了一种实验方法,其实验算法以下:
LinUCB实验方法

  • π \pi 为选择的策略,这里即为带上下文的bandit算法
  • h t 1 h_{t-1} 即为 t 1 t-1 时刻的历史行为记录
  • R T / T R_T/T 即为最终的实验指标

实验说明

实验位置

实验位置

实验使用的数据是Yahoo-Today Moudle,在选择数据时,为了不曝光位置带来的误差,只关注Story和F1位置。

数据选择

在选取数据时,文中提出了一点:选取了一周的数据做为评估数据,运行bandit算法。从实践经验上讲这是靠谱的,避免了数据自己带来的误差。

特征选择

  • 用户维度
    • 人口统计学信息(性别化为两类,年龄划分为10个等级)
    • 地理特征(文中选取的是200个城市地区)
    • 行为类别信息(用户的消费历史和属性信息)
  • 文章维度:
    • 文章URL类别(推断出数十个类别信息)
    • 人工编辑的类别信息

特征降维

这里经过K-means对用户特征进行聚类,划分为5个簇,即最终获得的用户特征维度为5,最后补一列特征值为1(即第六列特征值为1,为何为1,文中并无说明,这里小编也不太明白,若是你有想法的话欢迎留言

实验结论

吧啦吧啦就是比别的算法好!

注意点

  • 【实践】在使用Thompson sampling时每一个臂的a、b值初始化时要注意,若是差值过大,就会致使通过几回负反馈以后,排在top的臂依旧排在top,所以设计a、b值的时候须要进行特别的设计
  • 计算每一个臂时的特征为臂a的特征,切勿和臂下的样本特征搞混(若是一个样本是一个臂的话,那么这里的特征就是样本的特征)
  • disjoint linucb中的 x t , z x_{t,z} 表示的是臂a的特征, z t , a z_{t,a} 表示的是用户/文章的组合特征(臂和文章在某种程度上是同样的概念,好比候选池有100篇文章,那么每篇文章就能够看做是一个臂)
  • 读论文时有些论文的实验并不太好作,这时候不只要学习论文中算法的思路,还要学习论文中实验的设计技巧和评判技巧

LinUCB 的重点

  • LinUCB 再也不是上下文无关地,像盲人摸象同样从候选臂中去选择了,而是要考虑上下文因素,好比是用户特征、物品特征和场景特征一块儿考虑。
  • 每个候选臂针对这些特征各自维护一个参数向量,各自更新,互不干扰。
  • 每次选择时用各自的参数去计算指望收益和置信区间,而后按照置信区间上边界最大的输出结果。
  • 观察用户的反馈,简单说就是“是否点击”,将观察的结果返回,结合对应的特征,按照刚才给出的公式,去从新计算这个候选臂的参数。
  • 当 LinUCB 的特征向量始终取 1,每一个候选臂的参数是收益均值的时候,LinUCB 就是 UCB。

2019-12-27 补充

  • 当备选池不大的时候,每一个备选物品能够做为一个臂,若是备选池大的话能够对备选池的物品进行归类,一个类别做为一个臂
  • 不一样业务场景下,设置的奖励和惩罚应该是不同的,好比点击,能够设置为1,购买设置为2,惩罚能够设置为0
  • alpha的值一般是拍脑门子定的几个,经过测试比较效果,通常初始值选0.5更加稳妥些

场景应用

当来一个新用户的时候,咱们并不知道该用户的偏好和兴趣,那么最多见的方法就是试探法,假设咱们有10个标签,每一个标签下都有运营配置的一些精品文章或者商品或者新闻等。

那么这里就能够把每一个标签看做是一个臂,咱们能够每一个臂下展现一个事物,来对用户的兴趣进行试探,而后根据用户的行为进行结果修正。

在选取特征时,论文中使用了用户维度和臂维度的特征,那么在咱们实践过程当中一般可使用下面的三大维度的特征:

  • 用户维度:性别、年龄、城市、手机品牌等
  • 臂维度:曝光点击率、标签类别信息等
  • 用户x事物交互维度:用户在该臂下的一些交互维度特征,好比点击、曝光点击率等

在实际的应用过程当中,并无那么简单,常见的痛点以下:

  • LinUCB不是一个传统的ctr算法,如何与线上服务进行集成?
  • 通过onehot或者分桶以后的特征维度会增高,高维的特征必然会引发延迟增大,如何进行线上降维?
  • 特征包括了用户访问时携带的特征、臂的离线和实时特征,如何进行特征拼接,进行计算?
  • LinUCB和Thomson sampling、UCB相比,参数增多数倍,线上如何进行参数维护和更新?
  • 新用户数量每每并很少,在有限的新用户下进行不一样留存策略的ABTest,如何保证结果的可靠和有效?
  • LinUCB是针对新用户的,那么对于新老用户之间的界定也十分重要,如何界定新老用户或者具体场景下的新老用户?

具体的场景、业务面对的问题和解决的办法每每是不尽相同的,若是你们决定要应用LinUCB算法,那么在使用以前必定要考虑后相关的问题和解决办法,这样才能避免使用过程当中遇到的坑。

针对上边的问题并无惟一具体的解决办法,感兴趣的欢迎在进行留言讨论。


扫一扫 关注微信公众号!号主 专一于搜索和推荐系统,尝试使用算法去更好的服务于用户,包括但不局限于机器学习,深度学习,强化学习,天然语言理解,知识图谱,还不定时分享技术,资料,思考等文章!