近年来,机器学习在搜索、广告、推荐等领域取得了非常突出的成果,成为最引人注目的技术热点之一。微博也在机器学习方面做了广泛的探索,其中在推荐领域,将机器学习技术应用于微博最主要的产品之一——热门微博,并取得了显著的效果提升。
热门微博推荐系统介绍
热门微博业务场景
热门微博是基于微博原生内容的个性化兴趣阅读产品。提供最新最热优质内容阅读服务,更好地保障用户阅读效率和质量,同时达到激励微博上内容作者更好的创作和推广内容。
热门微博的推荐系统主要面临以下两点挑战。
- 大规模:需要处理微博上的海量用户和海量内容;
- 时效性:微博内容的生产周期短,变化较快。
热门微博推荐系统算法流程
我们定制了一套完善的推荐系统框架,包括基于机器学习的多路召回与排序策略,以及从海量大数据的离线计算到高并发在线服务的推荐引擎。推荐系统主要分为三层,基础层、推荐(召回)和排序三个部分,推荐(召回)主要负责生成推荐的候选集,排序负责将多个算法策略的结果进行个性化排序。
整体的推荐技术框架如图1。
图1
基础层:分为内容建模和用户建模两部分。内容建模主要是微博内容的语义识别,包括主题模型、实体词识别、文本分类和图片分类。用户建模对用户建立完整的画像,包括用户自然属性(性别/年龄)、用户兴趣、用户聚类和用户之间的关系(亲密度等)。
推荐层:我们通过用户行为、微博内容等进行实时判断,通过多个召回算法获取不同候选集。再对召回的候选集进行融合。具体的召回算法如下:
- User-based协同推荐:找出与当前User X最相似的N个User,并根据N个User对某Item的打分估计X对该Item的打分。
- Item-based协同推荐:我们计算不同mid的共现概率,取出满足一定阈值且排在top的mid作为协同mid的候选。
- Content-based推荐:通过自然语言处理、图像识别等算法,对微博文本、图片、视频等内容打标签;通过用户行为和微博内容标签,挖掘用户的兴趣标签。基于内容标签和兴趣标签的匹配,提供基于内容的推荐候选。
排序层:每类召回策略都会召回一定的候选微博,这些候选微博去重后需要统一做排序。排序使用的模型包括逻辑回归、GBDT/FM、DNN等。排序框架大致可以分为三部分:
- 特征工程:特征的预处理、离散化、归一化、特征组合等,生成训练模型需要的样本数据。
- 模型工具:基于样本数据,使用不同的模型做训练、评估,生成模型训练结果。
- 排序引擎:在线模型LOAD,提取出相对应的特征并且做特征映射,并利用机器学习排序算法,对多策略召回的推荐候选进行融合和打分重排。
热门微博的机器学习推荐
协同过滤推荐是目前业界常用的推荐算法之一。协同过滤推荐是利用users和items的关系矩阵来对user和item进行建模,从而进行推荐的一类算法。其主要分为两种:基于user的协同过滤推荐和基于item的协同过滤推荐。在热门微博业务场景下,一个item是指一条微博。下面介绍基于用户的协同过滤推荐和基于微博的协同过滤推荐两方面的实践。
表1 User-Item关系矩阵
大规模user-based协同推荐
基于用户的系统过滤推荐的基本原理是:某用户的相似用户群喜欢什么,就给该用户推荐什么。
实践中,基于用户的系统过滤推荐过程就是以下步骤:
- 为当前用户找到他的相似用户群;
- 获取该用户群在历史一段时间内喜好的若干微博作为候选;
- 计算该用户群对各个候选微博的喜好程度;
- 将喜好程度最高的N条微博推荐给当前用户。
上述步骤中,最关键的是a。用户的相似度刻画,直接影响推荐的准确度;用户的相似用户群的规模,直接影响推荐的个性化程度。相似用户群的方案有很多,常见的有聚类、K近邻。它们的优劣对比如下。
表2 聚类、K近邻方案对比
最终,根据我们的业务场景,选择了聚类方案。鉴于业务的特性,我们还要对聚类结果有额外的要求:每个类别内包含的优质用户数量要尽量相近。我们的解决方案是只用优质用户做训练同时保证聚类均匀,全部用户做预测。所以接下来要解决的问题是选择聚类算法、用户的向量表征、控制聚类均匀。
尽管聚类算法有很多,但它们依然基本上都还是在K-Means算法的框架下,因此我们直接选用K-Means算法。关于用数学向量表示用户。值得注意的是,当解决实际聚类问题时,一般情况下,问题对象的向量表征比聚类算法本身对最终效果影响更大。
首先,我们考虑直接用关系矩阵的行向量作为用户的向量表示。在微博推荐的场景下,item的数量是快速增长的,因此只能使用历史上一段时间内的用户-微博关系矩阵。同时,矩阵是集群稀疏的,当我们用较短历史数据训练聚类时,效果表现不好。
所以,我们尽可能拉长历史来保证用户向量中包含充足的信息,然而,K-Means对高维数据的训练效率极低。我们尽量平衡训练效率和聚类效果,但效果很差,各个类别规模极其不均匀,不能满足需求。
所以,我们考虑了三个降维方案:LDA、Word2Vec、Doc2Vec。
- LDA:虽然LDA训练出来的主题分布可以作为特征向量,但是LDA本身不强调向量间距离的概念,可与后面K-Means算法的训练过程不相匹配,所以效果不佳,淘汰。
- Word2Vec:强调向量间的距离,适合K-means。但是当使用Word2Vec时我们要微博ID当成句子ID,微博的阅读者序列作为句子内容,用户ID作为词。按照微博的特性,这么处理的话,语料里“句子”长度的分布会非常不均匀。所以最终也没有选用。
- Doc2Vec:强调向量间的距离,适合K-means。把用户ID当成句子ID、用户的阅读序列作为句子内容,微博ID作为词进行训练时,语料里“句子”长度的分布会均匀很多,效果较好。
所以最终选择了Doc2Vec对用户向量进行降维。然后使用低维向量进行聚类,结果明显改善,类别规模变得很均匀,符合我们的需求。
在线部分,在线部分只需要记录几小时内每个聚类下的用户群体对各个微博的行为,经过简单的加权计算、排序、取Top。当为某用户推荐时,只需查到相应的聚类ID对应的推荐列表。在线计算开销极小。
大规模item-based协同推荐
基于微博的协同过滤推荐的基本原理是:如果看了微博A的用户很大比例都去看了微博B,那么应该给只看了微博A的用户推荐微博B。这个原理的实现就是计算任意两个微博的相关性。关键点时设计相关性公式。我们迭代了三个版本的相关性公式。
第一版,我们将相关性抽象为:
具体实现是按上述公式计算两两微博的相关性后,为每个微博按预设阈值节选可推荐相关微博。这个可以推荐相关微博列表,用于即时推荐模块。当用户点击某条微博后,在下次刷新时候会推荐该条微博的相关微博。由于微博内容实效性比较强,这种推荐方式可以捕捉用户很及时的阅读需求,所以推荐的准确率很高。然而,上述方法的召回率比较低。
第二版重点提升召回率。通过分析发现,召回率低的原因是用户-微博矩阵特别稀疏,两条微博在一个用户浏览时的共现次数特别少。所以设计了新的公式:
在公式中我们加入了变量expo(B),表示B在用户的页面里曝光了。按新公式实现后,召回大幅度提升。
第三版,我们试图解决关系矩阵稀疏的问题。在微博场景中,很多微博是相似的,但是它们拥有不同的微博ID。这会天然地造成矩阵稀疏,从而相关性计算不准确。举个例子:
假设Bi和Bj是描述的同一个内容,且RABi和RABj都略低于阈值,那么Bi和Bj是不能作为A的协同推荐微博的,这显然是不合理的。
为了解决这个问题,我们改进了算法。首先将相似微博Bi和Bj聚合成B,然后计算相关性。流程如下:
改进后,覆盖率有得到了进一步的提升。
热门微博的机器学习排序
机器学习排序是搜索、广告、推荐等业务场景的核心算法,对业务效果有着极大的影响。通常的做法,是基于曝光日志、点击日志等采集各种特征,建模用户点击率。在热门微博业务中,以下是我们在排序算法方面的一些有效的实践。
大规模特征组合
影响机器学习排序效果的一个核心因素就是特征。特别是当使用线性模型时(如逻辑回归),对模型效果影响较大的,是特征组合,也就是特征的表达能力。
图2 排序模型的特征空间
如图2所示,排序模型可被认为是建立在物料、用户、环境的三维特征空间。每个维度上,从零点向外的方向代表从具体到泛化。例如,物料轴从零点开始,分别为物料按mid(微博id)、细粒度标签、粗粒度标签、作者、形式划分等。
根据热门微博中的实践,总结出了特征组合的一些设计经验和原则:
- 越逼近零点的特征越有效,但是要考虑稀疏性。
- 跨轴的特征组合,会产出更加个性化的特征,特别是用户和物料的组合。
多目标机器学习排序
通常的ctr预估排序,只以点击率为目标。而热门微博业务会有多个目标,所以需要考虑多目标的排序。实践表明,多个目标之间往往没有很强的正相关关系。因此,如何在排序模型中兼顾多个目标,使得每个目标都有增长,就非常重要。在热门微博的机器学习排序中,我们实验了两种方法:
- 每个目标各自使用一个模型,做模型融合。例如热门微博需要考虑转发、评论和赞,分别训练预估转发率模型、预估评论率、预估赞率的模型,以这三个模型的预测结果,做加权后,做为排序分数。
图3 多目标机器学习模型的融合
模型融合后,以提升所有正向行为的概率为总目标,给各个模型分配以不同的权重。该方法的优点在于,分别建模不同的目标,以快速的多组实验来调整权重,以找到权重参数的更优解。缺点在于需要同时训练多个模型,开发成本高。
所有目标使用一个模型,在标注正样本时,考虑多个目标。例如对于转发和赞,在标注正样本时,给予不同的权重,使它们综合体现在模型目标中。如表3,每行为一条训练样本,根据业务需要,把转发、评论、赞的权重分别设置为1、2、5。
表3 通过样本标注不同权重,一个模型兼顾多个目标
该方法通过对不同正向行为给予不同权重,将多目标问题转化为单目标问题。它的优点在于,一个模型同时兼顾了多个目标,使不同目标的权重体现在损失函数中,参与模型优化求解,便于平衡多个目标的效果。
- 分片线性模型
互联网行业的机器学习算法,广泛使用了线性模型。线性模型的缺点,在于无法充分利用数据中的非线性规律。
热门微博下,不同用户的点击率以及行为偏好是有差异的,不同物料领域下的点击率也是有差异的,因此我们考虑使用基于用户、基于领域的先验知识,构造分片的线性模型。
另外,热门微博的分片线性模型结合了多目标的优化。根据不同人群的行为偏好,在分片时设置不同的多目标权重。
分片线性模型:
其中πi为分片的作用范围,对应分片内为1,其他为0。
在热门微博业务中,分片为不同的人群(80 / 90后、男 / 女)。
分片的多目标模型(以指数加权为例):
其中πi为分片的作用范围,ωij为i个分片内第j个目标模型的参数,δij为第i个分片内第j个目标模型的指数权重。
机器学习效果评估
对于协同过滤推荐,我们设计了一个量度m,来模拟估计上线后实际效果。假设有N+1天的历史行为日志。首先,用1-N天的用户-微博矩阵,为每一个用户计算出第N+1天协同推荐的候选微博集合C。然后将第N+1天的真实曝光微博集合E与C做交集,得到集合Ec;将第N+1天的真实点击微博集合A与C做交集,得到集合Ac。最后计算Ac/Ec作为量度。
对于排序算法,采用了离线AUC评估和线上的ABTest评估。
机器学习应用于热门微博推荐系统后,业务指标和用户体验都得到了显著提高。
总结和展望
我们将机器学习相关技术应用于热门微博业务,并结合业务特色对算法做了进一步的拓展。
推荐算法方面,基于用户的协同过滤推荐我们使用user embedding+Kmeans方案来平衡算法效果、离线计算规模和线上响应速度。基于微博的协同过滤推荐我们升级了两次相关度计算公式,来解决行为稀疏和重复内容的导致的数据稀疏的问题。
排序算法方面,大规模特征组合在特征工程实践中总结的一些规律和原则,多目标机器学习排序是为了兼顾多个业务目标而做的尝试和探索,分片线性模型是结合热门微博业务知识完善线性模型的结构和效果。
未来推荐和排序算法仍有很大的提升空间,在以下两方面:
- 深度学习和embedding应用于热门微博推荐;
- 海量uid应用于热门微博排序模型,进一步提升模型个性化。