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