众所周知,在机器学习中,数据以及数据本身的特征决定了模型效果的上限。因此,一个优秀的特征工程对于推荐系统是万分重要的。何谓优秀的特征工程?他需要解决以下三个问题:
在了解特征工程之前,我们需要知道,什么是特征,我们为什么需要特征?
特征的本质是对某种行为过程相关信息的抽象表达。 我们都知道机器学习模型接受的都是数学形式的数据,因此就需要将行为过程中的信息以特征的形式抽取出来,以多维度的特征来表示该行为。
然而,将具体的行为转换为抽象的特征必然会有信息损失,这有两方面的原因。其一是现实情境中的行为会包含包括图像、视频、音频、场景等纷杂的信息,把这所有信息全部存储会消耗大量存储空间。其二是因为具体的情境中,会包含众多无用的信息,将他们全部纳入模型会损害其泛化能力。也正是因为这两点,构建推荐系统的特征工程的原则被提出:
尽可能让特征工程抽取出的特征能保留推荐环境 (Recommend Environment) 和用户行为 (User Action) 中的所有有用信息,尽量摒弃冗余信息
这是推荐系统中最关键的数据。用户的兴趣、评价等信息都会蕴含在行为历史数据之中。在推荐系统中,用户行为主要可分为显示反馈 (Explicit Feedback) 和隐式反馈 (Implicit Feedback)。 用一个具体的例子就能理解:
当前的推荐系统使用的用户行为数据以隐式反馈为主。这很好理解,因为我们不能让让所有用户都对每一件商品/影片都做出详细的评价(白嫖党),因此显示反馈的数据量难以得到保证。
在此之前,我们实际上已经知晓了对于用户行为数据最常见的两种特征提取方式:
用户行为数据将用户与对象 (物品/视频等) 关联起来,用户关系数据则将用户和用户关联起来。用户关系数据同样可分为显示或隐式,也可以说是 “强关系” 和 “弱关系”。比如用户之间通过直接关注、添加好友就建立了 “强关系”;而相互点赞、同看过一部影片、steam 中处于同一个社区则建立了 “弱关系”。
用户关系数据主要有以下用途:
这一类型的数据很好理解,就是直接对用户或者物品打上标签来显示标注它们具有的属性等静态信息。 比如用户的年龄、身高、体重;物品的价格、类别等。一般大型的公司都会有一套独属于自己的标签体系。
该类型数据的使用方式和用户行为数据类似,同样是通过构筑 multi-hot 数据或者生成 Embedding 进行使用
==可以看作是属性、标签类数据的延伸,多为具体描述某个用户/物品的数据,比如文本描述、视频描述等。==由于这类数据形式的繁杂性。我们需要借助 NLP,CV 等技术手段提取其中的关键特征再输入给推荐系统。
上下文信息 (Context) 指的是用户行为发生的场景的信息。 常用的上下文信息有 “时间”,“地点”, “社会事件” 等。引入上下文信息是为了尽量与场景相关的有价值信息。
统计类特征指的是通过数学统计得出的数理特征。 比如:历史 CTR,历史 CVR,物品热门程度等。一般来说统计类特征会是连续型 (continuous) 特征,需要经过标准化/归一化之后再输入给推荐系统。但是,直接使用 CTR 之类的统计类特征会显得粒度很大,所以一般可以用作主特征,和其他特征一起用来进行预测。
将不同特征组合后形成的新特征。 最典型的有 “年龄 + 性别” 组成的人口属性分段 (Population Segment)。当下,随着推荐系统的不断进化,越来越多的模型具有自动交叉组合特征的能力。
我们之前已经说过,推荐系统模型的输入一般都是由数组成的特征向量。例如年龄、播放时长、历史 CTR 等可以由数字表示的特征可以很自然地作为特征向量的某个维度的数值。但是对于其他比如性别、观看历史这种难以用数字表示的特征,该如何转变为数值型的特征向量才是我们需要关注的。
为此,我们需要分别针对连续型 (continuous) 特征和类别型 (categorical) 特征进行不同的操作。
我们上面说到的年龄、播放时长、统计类特征等能够使用数字直接表示的特征都属于连续型特征。对于这一类特征的处理最常见的就是标准化/归一化、离散化、加非线性函数等。
类别型特征的典型例子有用户的历史行为数据、属性标签类数据等。它们的原有表示形式一般是一个类别或是一个 id。对于这类特征最常用的处理方法是使用 one-hot / multi-hot 编码将其转换为一个极为稀疏的数值向量。在此之前我们已经不止一次地说过,这种稀疏向量会造成欠拟合现象,同时大大增加了计算的参数量,使模型收敛的速度很慢。
所以,Embedding 往往多用于处理类别型特征,以此产生稠密的 Embedding 向量,再与其他特征组合,形成最后输入给模型的向量。
我们需要注意的是,尽管随着技术的不断进步,我们现在可以花费更少的事件和精力去进行诸如滤波、人工特征组合等比较繁重的特征工程任务。但是,我们仍需深入业务场景的内部,基于理解去选取更合适的的、更有价值的特征去构建模型。
回顾一下之前介绍过的推荐漏斗,整个推荐系统要通过召回层 - 排序层 - 重排序层的层层筛选,才能从数以千万计的海量物品中选择出最后的几十个推荐结果。排序层顾名思义,就是使用复杂的模型,利用多特征对物品进行精确排序,但是,这样的模型如果是对未曾筛选过的千万级数据进行计算,计算量会过分庞大。因此就需要借助召回层使用简单的模型和少量的特征对海量物品进行一个初步的快速筛选,减少精排的时间。
通过上述的介绍和结构图,我们可以简单归纳召回层和排序层特点如下:
目前工业上大多会使用多种简单召回策略组合而成的多路召回策略进行召回任务。这个思想和继承学习有些类似,具体来说就是用多个不同的简单模型、特征,分别召回一部分候选集,最后将所有候选集合并得到最终的候选集以供后续的排序层使用。 这是一种在 “计算速度” 和 “召回率” 之间进行权衡得出的结果。
上图是一个多路召回的例子,其中使用了热门新闻、兴趣标签等多种召回策略。可以看到,每种策略召回的物品数量并不相同,这里的 k 值根据策略的复杂程度会有差异。k 值本身是一个超参数,需要通过离线评估和线上 A/B 测试确定一个比较合适的取值范围。
但是这种策略有两个弊端:对于使用的多种策略以及 k 值都需要进行人工选择;无法综合考虑不同策略对一个物品的影响
在上一节我们已经介绍了 YouTube 推荐系统使用深度学习网络生成的 Embedding 作为召回层的方法,加上 LSH 快速计算临近 Embedding,是得这一方法的效率并不逊色于多路召回策略。
除此以外,多路召回中的 “兴趣标签”,“热门度”,“流行趋势” 和 “物品属性” 等信息都可以作为附加信息融合进 Embedding 向量之中。由于多路召回使用了不同的策略,因此这些策略产生的相似度和热度等指标不具备可比性,所以无法决定每个策略返回候选集的大小。而 Embedding 策略则可以使用 Embedding 相似度作为唯一的指标,随意限定返回的候选集的规模。
实时性对于推荐系统是否重要?Facebook 曾经利用 “GBDT + LR” 模型进行过实时性测试:
在这个图表中,横轴是「从推荐模型训练结束到模型测试的时间间隔」,纵轴是「损失函数 - 归一化交叉熵的相对值」。我们不难看出,无论是 GBDT + LR 模型,还是树模型,损失函数的值与模型更新延迟有正相关。换言之,模型更新的间隔时间越长,损失函数的值越大,推荐系统的效果就越差;反过来说,模型更新的越频繁,实时性越好,损失越小,效果就越好。
当然,这也是符合实际预期的,因为每位用户希望的都是 “尽可能快地” 获取到想要的内容。因此如果推荐系统你能够感知用户反馈,实时满足用户的需求,就能提升推荐地效果。从 ML 的角度来说,实时性的重要性体现在以下两个方面:
这实质上就是推荐系统中 “实时性” 的两大要素:“特征” 的实时性以及 “模型” 的实时性
“特征” 的实时性指的是推荐系统模型能够 “实时” 地收集和更新推荐模型地输入特征,使推荐系统总能够使用最新的特征进行预测和推荐。 这非常好理解,因为用户的兴趣变化是难以捉摸的,可能因为看了一部视频,兴趣点会立刻转移,此时用户就会希望应用能够尽快推荐与该视频相关的物品/视频,这就对 “实时性” 提出了考验。如果能够实时地为用户推荐出想要的内容,无疑会大大增加用户黏性和留存度。
而影响 “特征” 实时性主要有三个阶段:
传统地推荐系统中,会通过客户端 (Client) 收集时间、地点、推荐场景上下文特征等信息,通过 HTTP 请求一起发送给服务器 (Server) 以请求推荐结果。但这往往会忽略用户端的一项重要任务:它能够收集 session (会话) 内的用户行为。
这里的会话 (Session) 指的并不是用户与某方进行的聊天对话,而是指某种具体的行为。比如用户使用一个新闻 APP ,这就开启了一个会话 (Session),在这个时间长为 5 分钟内的会话之中,用户点击了 3 篇报道。这 3 篇报道就能够体现用户当前的兴趣。这种即时兴趣若能体现在推荐结果中,会很成功
若使用上面推荐系统数据流架构图中传统的 Flink (实时流计算平台) 以及 Spark (批处理计算平台)。系统可能无法在 5 分钟之内就会话 (Session) 内发生的行为历史存储至特征数据库 (redis),这意味着生成推荐结果时,不会用到会话中的这些行为数据,因此结果也就不会体现出即时兴趣的影响。
因此,我们会希望客户端 (Client) 也能够缓存会话 (Session) 内部的行为,将其作为和上下文特征一样的实时特征发送给服务器 (Server),如此一来推荐系统可以实时得到这部分信息进行推荐。
流计算平台会将日志以流的形式进行微批处理 (Mini Batch Processing)。我们之所以称它为 “准实时” 特征处理,是因为每次需要等待并处理一小批日志,所以并不是完全的实时计算。 但它的优势就在于可以进行一些简单的统计类特征计算,比如某物品在当前时间窗内的曝光 (Expose) 次数、点击 (Click) 次数、用户点击的话题分布等。
流计算平台计算出的特征可以立刻存入特征数据库以供推荐模型使用。尽管会有分钟级的延迟,但基本可以保证推荐系统可以准实时地引入用户近期的行为。
依然是看上面的数据流图,可以看到,数据最终都会流入以 HDFS 为代表的分布式存储系统,此时就可以使用 Spark 等批处理平台进行全量特征计算和提取。因为用户的点击、曝光、转化数据时时刻刻都在产生,如果想要对这些行为进行更为全面的分析,就需要全量计算,比如计算一天内用户的行为数据。所以,只有在全量数据批处理这一环节,才能进行全部特征以及相应标签的抽取与合并,因此才能进行更高阶的特征组合工作。 分布式批处理平台的计算结果主要有 2 个用途:
所以,与流处理平台注重 “实时性” 不同,批处理平台更注重特征的 “全面性”,确保下次为用户提供更优质的推荐结果
“特征” 的实时性力求使用更准确的特征去描述用户、物品和相关场景,从而让推荐系统给出更适合当前场景的推荐结果。“模型” 的实时性希望从全局角度把握新数据的模式,发现新的趋势和相关性。
用一个具体的场景来理解。比如电商平台的 “双十一” 大促,在这个场景下,“特征” 的实时性会根据用户最近的行为更快发现用户可能感兴趣的商品。但是无法用它去发现一款刚刚流行起来的爆款商品、一个刚兴起的促销活动等。
诸如爆款商品、促销活动、同类人群的兴趣这类的全局性数据变化,需要实时更新模型来发现。而模型的实时性是由训练的方式决定的:
根据上图我们可以知道,模型实时性从弱到强的训练方式分别为:全量更新、增量更新和在线学习
“全量更新” 顾名思义,使用某个时间段内全部的训练样本进行训练。 所以它需要等到所有数据全部 “落盘 (persist)” 到 HDFS 之后才能进行,同时训练时间会比较长,因此实时性较差
“增量更新” 就是仅将新增的数据喂给模型进行训练。我们都清楚,神经网络中大多会使用随机梯度下降 (SGD) 进行参数更新 (学习),模型对增量样本的学习就是在原有样本的基础上继续对新增的增量样本进行梯度下降。所以它的缺点在于有时无法达到全局最优点。
所以实际情境中,往往会选择结合使用全量更新和增量更新,即先进行几轮增量更新,然后再业务量较小的时间窗内使用全量更新一口气修正积累的误差。
这是模型实时更新的主要方法,就是每当有新的样本到来,就更新模型。但如此一来,对于模型大量参数的线上频繁存储和更新对工程提出了更高的要求。
在线学习的一个问题在于模型的稀疏性不够强。
比如某个推荐系统的输入向量维度达到几百万维,如果模型的稀疏性足够好,那么就可以在模型效果不受影响的前提下,让极小一部分特征对应的权重不为 0,让上线的模型体积变得非常小(因为有大量的值为 0 的维度,这些维度对应的模型的权重毫无意义,所以可以完全忽略,这就减少了模型的参数量)。但如果使用 SGD 方式更新模型,则比起 batch 方法容易产生大量小权重的特征,因而无法降低模型的参数量
所以在线学习需要兼顾训练效果和模型的稀疏性。另外,在线学习也可以与强化学习相结合
核心思想是降低训练效率低的部分的更新频率,增加训练效率高的部分的更新频率。 之前介绍的 GBDT + LR 模型就是一个很好的例子。在这个模型中,使用 GBDT 去进行自动化特征工程,用 LR 去拟合优化目标。GBDT 中串联了一系列的决策树,每次都需要依次训练,因此训练用时比较长,所以 Facebook 采用的策略就是一天训练一次 GBDT 模型,在 GBDT 稳定之后,再实时训练 LR 来快速捕捉数据的整体变化。
这样的策略也可以推广到 Embedding 层 + 神经网络的深度学习模型之中。
客户端模型实时更新仍处于探索阶段。它的思想着重于将用户 Embedding 的更新放在客户端部分完成。 比如用户 Embedding 是其历史点击物品 Embedding 平均得到的,那么最先采集到用户最近点击物品的客户端,就可以根据这个新物品的 Embedding 直接更新用户 Embedding 并保存,在下次推荐时,将该 Embedding 发送给服务端 (Server) 来请求实时推荐结果
在实际的业务场景中,对于推荐系统的搭建,我们有很多需要注意的事项。
首先,要合理设定推荐系统中的优化目标。 在推荐系统中,如果你的推荐模型的优化目标是不准确的,即使模型的评估指标做得再好,也肯定与实际所希望达到的目标南辗北辙。而要设定合理的优化目标,就要有合理的设定原则,这一原则就是 “以业务的商业目标(增长目标)来制定推荐系统的优化目标”
以 YouTube 为例,YouTube 的推荐系统优化目标不是 “点击率”、“播放率” 等 CTR 预估类优化目标而是 “播放时长”。这是由他们的盈利模式决定的,如果使用 YouTube 就会知道,它的广告是在视频中段或者开头出现,因此,用户的播放时长就会和广告的营收直接相关,如果以 “点击率” 为优化目标,那么,系统会更喜欢推荐标题党、预览图更吸引眼球的短视频。但是为了增长播放时长,推荐高质量的 “电影” 和 “电视剧” 才比较合理。因为电影和电视剧是长视频,而高质量会进一步保证用户留存,保证未来的时长
另外,模型优化目标的制定还应该考虑的要素是模型优化场景和应用场景的统一性。
以电商平台为例,用户的购物行为由 2 步组成:
- 产品曝光,点击进入详情页
- 进行购买
与之前的 YouTube 形成鲜明对比,电商考虑的是通过推荐让用户进行更多的购物行为。因此,电商推荐系统应以 CVR (Click Value Rate, 转化率) 为优化目标。
根据上面两个抽象步骤可知,购买发生在第 2 步,所以在训练模型时,最直觉的方法就是使用点击数据 + 转化数据;但是在使用 CVR 模型时,用户一开始见到的一定是曝光页,因此就需要在产品曝光的场景下进行预估。
这就使得 “训练空间” 和 “预测空间” 不一致。我们当然可以选择在购物第一步的场景下使用 CTR 模型,第二步使用 CVR 模型,但这不是全局最优化转化率的方案。因此阿里提出了 ESMM (Entire Space Multi-task Model),该模型能够同时模拟 “曝光到点击” 和 “点击到转化” 两个阶段的模型。
该模型中,底层模型由 CVR 和 CTR 部分共享。这两部分独立的神经网络分别拟合自己的优化目标 pCVR (post-click CVR, 点击后转化率) 和 pCTR (post-view CTR, 曝光后点击率)。这两个结果相乘得到最终的 pCTCVR (曝光后点击转化序列的概率):
阿里巴巴通过构建 ESMM 这一多目标优化模型同时解决了 “训练空间和预测空间不一致” 及 “同时利用点击和转化数据进行全局优化” 两个关键的问题。
遵循以上两个原则,制定合理的优化目标有助于算法和产品的业务接驳。在确定了优化目标之后,在构建推荐模型的过程中, 从应用场景出发,基于用户行为和数据的特点,提出合理的改进模型的动机才是最重要的。一切对于模型的选择以及改进都需要从具体的业务场景出发去思考
在此之前我们已经提及过一次 “冷启动” 问题,根据数据匮乏情况的不同,该问题可以分为以下三类:
针对这三种类别,结合具体的场景,主流的冷启动应对策略有以下三种:
由于数据的匮乏,处于冷启动过程中的物品无法使用个性化推荐进行有效推荐。此时就可以借助 “前推荐时代” 中采用基于规则的推荐方法。最直觉的方法就是根据 “热门排行榜”,“最高评分” 等趋势榜单进行推荐。
稍微升级一点的方法就是参考专家意见,建立一些个性化物品列表,换言之,根据当前能获取到的有限的用户信息,进行粗粒度的规则推荐。 比如以点击率作为目标建立一个用户属性决策树,于每个叶节点 (Leaf Node) 建立冷启动榜单,此时只需要根据用户已有的信息,寻找到对应叶节点的榜单即可。 这是处理用户冷启动的选择之一。
针对物品冷启动,可以根据一些规则(比如无监督学习的聚类算法)找到与新物品相似的物品,使用这一类物品的推荐逻辑,去推荐该新物品。
一个例子就是 Airbnb,每当有新的房源加入 Airbnb 的内容池,就根据这个新房的属性,将其分配到某个 “聚类 (Cluster) ” 中,同一个 “聚类” 中的房源有着类似的推荐规则。而聚类的规则也很直观:
- 同样的价格段位,比如都是 5000 - 6000
- 相似的房屋属性 (面积、居室等)
- 距离目标房源都在同样的距离范围之内
基于规则的冷启动解决策略确实行之有效,但是这就意味着我们在应对该问题时,独立于主体的推荐模型,使用了一个额外的策略。我们自然希望能够通过改动主推荐模型来应对冷启动问题。这就需要往模型中添加更多的用户或物品属性特征,而非历史数据特征。
如此一来,推荐系统就可以凭借物品和用户的属性特征完成粗粒度的推荐。这类属性特征包含:
这里就需要了解 “主动学习” 和 “被动学习” 之间的区别。
- 被动学习: 在已有的数据集上建模, 学习过程中不对数据集进行更改,也不会加入新的数据, 学习的过程是 “被动的”
- 主动学习: 不仅利用已有的数据集进行建模,而且可以 “主动” 发现哪些数据是最急需的,主动向外界发出询问,获得反馈,从而加速整个学习的过程,生成更全面的模型
主动学习的流程为:每次迭代中,系统对每个潜在 “查询 (Query)” 进行评估,看哪个查询能使加入该查询后的模型损失最小,就将该查询发送给外界,得到反馈后更新模型 M。
上面伪代码中的 Loss(qj) 代表 E(Loss(M’))。M’ 是加入查询 qj 之后的新模型,Loss(qj) 的含义是新模型 M’ 的损失的期望。
用一个例子来理解:
上图中每个 node 表示一部电影,横纵坐标分别表示电影两个特征维度,Node 颜色的深浅表示用户为电影的打分,所有影片被聚类为 a, b, c, d 四类。可以看到,当前所有电影未被打分,这是一个标准的冷启动场景。主动学习的目标在于尽可能快地定位所有电影可能的打分。在此情况下,使用主动学习,最有可能推荐的影片应为聚类 d 的中心点,因为这样就能得到用户对于整个聚类 d 的一个反馈,获得的期待收益最大,损失最小
主动学习的过程完全遵循 “行动 - 反馈 - 状态更新” 的强化学习循环。 它的学习目的就是在一次又一次的循环迭代中,让推荐系统尽量快速地度过冷启动状态,为用户提供更个性化的推荐结果。
迁移学习是在某领域知识不足的情况下,迁移其他领域的数据或 知识,用于本领域的学习。换言之,我们借用其他领域的知识来填补当前领域的知识不足,来应对冷启动问题。
比如之前介绍的阿里的 ESSM 模型中,使用 CTR 数据生成物品和用户 Embedding,共享给 CVR 模型。另一种比较常见的迁移学习是在领域 A 和领域 B 的模型结构和特征工程相同的前提下,若 A 中的模型已经训练完毕,则将 A 的参数直接作为 B 中模型参数的初始值。该方法的局限性是要求领域 A 和领域 B 所用的特征必须基本一致
这是一种在 “探索新数据” 和 “利用旧数据” 之间的权衡。让推荐系统既能够利用旧数据进行推荐,达到推荐商业目标,又能高效探索冷启动的物品是否是 “优质” 商品,让其能够更快被曝光。
最经典的 “探索与利用” 机制就是 UCB (Upper Confidence Bound,置信区间上界) 。该方法需要使用 UCB 公式去计算每个物品的得分:
x j ‾ \overline{x_j} xj 是观测到的第 j 个物品的平均回报 (指 CTR, CVR, 播放率等) ,nj 是目前为止向用户曝光物品 j 的总次数,n 是目前曝光所有物品的总次数。 根据这个式子,我们不难得出结论:当物品的平均回报高或者曝光次数少时,会有更高的 UCB 得分。因此,借助 UCB 推荐,会比较偏向推荐 “效果好” 或 “冷启动” 的物品。
总结一下,解决 “冷启动” 问题有 2 个主要方向:
我们刚刚使用探索与利用机制去解决冷启动问题,但是它的作用远不止于此,事实上我们可以使用它更好地挖掘用户潜在兴趣,维持系统的长期受益状态
在构建推荐系统时,我们不能只是一味根据用户的历史行为来进行推荐,因为这样的做法忽视了挖掘用户新兴趣的重要性,难以保证长远的收益,因此,一个理想的推荐系统应该能够主动试探用户新的兴趣点 , 主动推荐新的物品,发掘有潜力的优质物品。这就是一个探索的过程。 但是,既然是探索,那必然是不成熟的,这就意味着在此过程中会推荐一些实际上不是用户会感兴趣的对象,因此,在 “保障推荐质量” 和 “进行探索” 之间需要进行权衡,这就需要借助探索与利用机制。
目前的探索与利用可分为三大类:
该方法实质上解决的是一个 “多臂老虎机问题 (Multi-Armed Bandit Problem, MAB)”
在推荐场景中,我们可以将问题转换为 “多臂老虎机”。此时每个候选物品就是一台老虎机,推荐系统选择向用户推荐的物品时,就是选择老虎机的过程。比如视频推荐,老虎机的收益值得就是用户观看时长,因此,推荐系统会将观看时长期望最大的老虎机(视频)推荐给用户。
需要注意的是,多臂老虎机中,假定每台老虎机的期望收益对于所有用户都是一致的,比如对玩家 A 来说,赚钱概率为 0.7,对 B 也一样。因此,这不会是一个个性化推荐。
这是解决多臂老虎机问题的一种方式。它的核心思想为:
选用一个 [0, 1] 的数 ε 作为从所有老虎机中选择一个老虎机的概率,以 (1 - ε) 作为选取截至目前为止平均收益最大的老虎机,在摇臂之后,根据回报值对老虎机的期望回报进行更新
这里的 ε 就代表对 “探索” 的偏好程度,以 (1 - ε) 的概率来利用,基于被选择的物品的回报更新该物品的回报期望。
但是 ε-Greedy 算法缺少启发式的方法,这是因为他对于 “探索” 和 “利用” 的划分显得很死板。因为探索是有其极限的,当探索到一定程度,已经没有更多未知信息可以挖掘,此时就应减小 ε,增大利用部分占比。另外,完全随机的探索也不甚合理,比如有的老虎机已经积累了相当的信息,那就不需要再对它投入更多的精力,因为探索永远是希望从更多的 “未知” 中进行发掘。
汤普森采样 (Thompson Sampling) 算法是一种启发式的探索与利用算法。
它假设所有老虎机的赢钱概率都是 p,同时 p 的概率分布符合 beta(win, lose),每个老虎机都会维护一组 beta 分布参数,即 win,lose。每次试验后,选择一台老虎机,摇臂如果胜利,则 win 加 1,否则 lose 加 1。选择老虎机的方式是利用每台老虎机的 beta(win, lose) 分布,生成一个随机数 b,如此每台老虎机都会有一个随机数,选择其中生成随机数最大的那台老虎机。
所谓的 beta 分布就是伯努利分布的共轭先验分布,掷硬币是一个标准的伯努利分布:
即概率为 0.5 时,概率密度最大。换言之,我们可以认为掷硬币出正面的概率为 0.5。但如果我们为硬币正面的概率给出一个先验概率,那么该分布就是 beta 分布。也就是说,此时的硬币可以看作一枚质地不再均匀的硬币,我们可以把 CTR 问题近似为一个掷偏心硬币的问题,点击率就是将该硬币掷出正面的概率。
看一个具体的例子,下图中蓝色的分布 action1 是 beta(600, 400);绿色的分布 action2 是 beta(400, 600);红色的分布 action3 是 beta(30, 70):
因为 action1 和 action2 已经做过 1000 次实验,所以不确定性已经很小,所以置信区间很窄,曲线因此比较陡峭。而 action3 仅做了 100 次实验,所以不确定性很高,因为较为平坦。
通过汤普森采样,在选择下一次行动时,action3 的收益期望最低,如果仅仅考虑 “利用” (立刻见效)则不应选择该行动。但是根据其概率分布曲线,其概率分布有一部分落在 action 1 和 action 2 概率分布右侧,而且概率并不小 (10%-20%)。 也就是说,选择 action 3 这一 “老虎机” 的机会并不小。这实际上体现了汤普森采样对于 “新物品” 的倾向性
UCB 与汤普森采样一样都利用了分布的不确定性作为探索强弱程度的依据。其流程如下:
在上面这个 UCB 计算公式中, x j ‾ \overline{x_j} xj 是老虎机 j 在此之前的实验收益期望,也就是 “利用” 的分值;而第二部分就是 “置信区间的宽度”,代表 “探索” 的分值。两者相加就是老虎机 j 的置信区间上界。
不管是汤普森采样还是 UCB,尽管它们都是启发式方法,但仍无法应对个性化推荐场景。这是因为它们无法引人用户的上下文和个性化信息,只能进行全局性的探索。因此就需要使用基于上下文的多臂老虎机算法 (Contextual-Bandit Algorithm),其中最具代表性的就是 LinUCB 算法。
LinUCB 中的 Lin 表示的是 Linear,即线性。这就意味着 LinUCB 是建立在线性推荐模型或 CTR 预估模型之上。线性模型的数学形式如下:
其中 xt,a 表示老虎机 a 在第 t 次实验的特征向量,θa* 表示模型的参数;rt,a 代表摇动老虎机 a 获得的回报。因此,该式就是预测在特征向量 xt,a 的条件下,摇动老虎机 a 获得的回报期望。
为了训练得到参数 θa* ,根据线性模型采用了岭回归 (Ridge Regression) 的方式
其中 Id 是 d x d 维的单位向量,d 指的是老虎机 a 的特征向量的维度。矩阵 D 是一个 m x d 维的矩阵,m 表示所有训练样本中与老虎机 a 相关的 m 个训练样本,因此矩阵 D 的每一行就是一个与老虎机 a 相关样本的特征矩阵。向量 ca 则是所有样本的标签组成的向量,顺序与矩阵 D 的 样本顺序一致。
LinUCB 需要将传统的 UCB 扩展到线性模型场景之下。其 “探索” 部分得分由下式表示:
其中 xt,a 是老虎机 a 的特征向量,α 是一个控制探索力度的超参数。而 A 则是一个矩阵:
之所以探索部分的得分会是上面这种形式,是因为探索得分的本质实际上就是对预测不确定性的一种估计,抽样的不确定性越高,抽样得出高分的可能性越大。 根据岭回归的特点,模型的预测方差 (Variance) 就是 xt,aT Aa-1 xt,a, x t T A − x t \sqrt{x_t^T A^- x_t} xtTA−xt 就是预测标准差,也就是 “探索” 部分的得分。
for t in 1, 2, 3, ..., T do
Observe features of all arms. a ∈ A~t~ x~t,a~ ∈ R
for all a ∈ A~t~ do
if a is new then
A~a~ ← I~d~ (d-dimensional identify matrix)
b~a~ ← 0 (d-dimensional 0 matrix)
end if
θ ← A~a~ * b~a~
p ← θ * x~t,a~ + α √x A x
end for
Choose arm a~t~ = argmax(p) with ties broken arbitrarily and observe a real-valued payoff r~t~
A~a~ ← A + x^T^x
b~a~ ← b + r~t~
算法的整体流程实际上和汤普森采样以及 UCB 基本一致。不同在于挑选老虎机时使用了 LinUCB 的探索与利用得分计算,更新模型时则使用基于岭回归的方式进行计算。 但是,LinUCB 需要严格的理论支撑才能得到预测标准差的具体形式
但是不管是汤普森采样,UCB 还是 LinUCB。这些模型都无法直接和深度学习模型进行有效整合。真很好理解,比如 LinUCB 是基于线性模型的,如果将模型换为深度学习模型,那么逻辑会发生变化。
在深度学习中应用探索与利用思想的典型是之前介绍过的 DRN 模型。该模型会对训练好的参数加入随机扰动,并根据以此产生的新模型的效果决定是否保留这种对于参数的改变。这是不断利用探索去优化模型的体现。
总结一下探索与利用机制在推荐系统中的应用:
总的来说,推荐系统的优化目标在于利用已有的数据,使得当前的收益最大化;而探索与利用则是将目光放长远,希望能够发掘用户的长期兴趣并保证企业的长期收益