推荐系统从0到1[三]:排序模型

2018-08-02 15:24:22 浏览数 (1)

前文中,我们根据不同召回策略召回了一批文章,并统一根据文章质量排序输出。但实际上,用户的阅读兴趣还会受到很多其他因素的影响。比如用户所处的网络环境,文章点击率、时效性,用户的年龄、性别,或者多种因素交叉的影响,而排序最终决定了用户优先看到的内容(最终推荐流是召回队列的topN),因此排序过程是至关重要的。

1. 模型选择

排序的问题在机器学习中有很多可以使用的方法,应用到推荐系统实际上就是一个二分类问题。以用户、内容、上下文的一些特征作为输入,输出是介于0(不感兴趣)和1(感兴趣)之间的一个概率,称作 pCTR(预测点击率)。分类算法有很多,出于规模和性能的考量,业界更多的还是使用线性的方法,传统方法有 Logistic Regression 和 Factorization Machine。

1.1. Logistic Regression

逻辑回归是一个经久不衰的统计分析方法,它的预测公式如下:

其中g(x)为sigmoid函数,它的作用是将数值压缩到(0,1)的范围内,函数曲线如下:

有了公式,我们便可以将已知的用户特征和行为作为训练集的输入和输出,其中 x 表示输入特征向量,θ 表示每一维特征对应的权重。输入特征我们可以大致分为用户特征、行为特征和内容特征,示例如下:

这其中每一个特征即是 x 向量中的一维,也对应着预测公式中 θ 向量中的一个权重,而我们模型训练的过程则是求出 θ 向量,最终我们可以通过线上的 x 向量实际输入,代入公式最终得出预测点击率 g(x)。

1.2. 特征工程

当然,以上示例的特征取值如果直接使用 LR 进行训练,效果肯定是不好的。因为 LR 学到的是变量的线性关系,而有一些特征取值却并不具备线性相关。比如性别,0代表男性,1代表女性,但这里的数值大小关系并没有什么意义;再比如年龄,不一定所有年龄段内,兴趣都和年龄大小完全线性相关。因此,在训练之前我们需要对特征做一些诸如离散化、数值分桶等操作,尽量让特征与结果表现出线性关系。

另外,有些特征单独对分类影响并不大,但与其他特征交叉影响就明显了。比如年龄X性别、分类X关键词,因此,我们需要根据一些业务上的了解和经验来决定如何进行特征交叉(当然我们可以直接将所有特征的笛卡尔积扔进去训练,但对于训练效率来说这通常是不现实的),往往在特征上的工作占了模型工作的绝大部分时间,因为特征工程的质量决定了模型效果的上限。

我们也可以用一些决策树的方法来自动选择特征,比如 Facebook 在2014年提出的 GBDT LR 的推荐模型,就是采用 GBDT(梯度提升决策树)的方法做特征选择,并将树的输出直接作为 LR 的特征输入,取得了比较好的效果。

1.3. Factorization Machine

特征工程是个耗时耗力,且非常考验业务理解力的过程,当我们处在项目初期,又不想花太多精力去做特征选择时,FM 算法便成了我们的另一种选择。FM 的预测公式如下:

仔细对比上述公式和 LR 公式,可以看出 FM 本质上其实就是在 LR 的基础上增加了发掘二阶特征关系的kernel,vi,vj 表示的是二阶特征经过矩阵分解后得到的低秩矩阵的值:

矩阵分解在推荐系统中很常用,实质上是将一个高维稀疏矩阵分解成两个低秩矩阵,其中 k 被称为隐向量维度。在原始的稀疏矩阵 R 中,大部分二阶特征的关系系数是缺失的。而通过训练模型最小化 R 和预测矩阵 R‘ 的损失(如最小二乘),可以求出任意 Ri,j 的值。FM 的kernel在此基础上学习到任意二阶特征的非线性关系,求得它们的权重。

2. 模型训练

确定模型后,我们需要根据目标确认损失函数,比如回归一般使用 RMSE,二分类使用 Cross Entropy,然后我们就需要朝最小化损失函数的目的来训练参数了。

求解函数有多种,如果数据量较小,可以选择批量训练的方式,如传统的梯度下降法: Batch Gradient Descent,也可以选择拟牛顿法如 L-BFGS ,用二阶导数求得更快的训练速度。它们的优点是考虑到全部样本,模型准确,但缺点是数据量太大时训练速度很慢。我们可以考虑每次采用小批量的样本训练模型的 online learning,从而达到实时更新模型的效果。方法如 SGD、FOBOS、RDA、FTRL 等等,对比和公示详解建议阅读冯扬的《在线最优化求解》,讲得很详细,这里就不赘述了。

3. 在线预测

训练完成后,我们可以把模型文件(实质是所有参数的取值)保存到本地,或者为了更高的执行效率,把它们加载到内存。预测的执行步骤如下:

  1. 召回内容队列
  2. 线上的服务器从内存读取参数取值 θ
  3. 拉取到内容/用户/上下文的实时特征 x
  4. 代入预测公式,计算用户 u 对内容 i 的点击率
  5. 依据点击率对召回内容排序并返回

每隔一段时间,模型更新之后需要将新训练得到的参数值刷新到预测服务器的内存中。当特征维度很大时模型文件体积也很大,此时如何按时完成更新是个问题,Parameter Server 是一类解决这类问题的框架。

4. Rerank

在排序完成之后,直接将排序结果呈现在用户面前可能不是一个好的选择。首先,产品需要有一些特殊的内容形式作为自己的品牌形象;另外,完全根据模型规则走可能让用户兴趣越来越窄,推荐内容同质化,久而久之则会影响用户对内容产品的黏性。

解决这个问题就是在排序之后再进行一次 rerank,我们可以用人工规则的方式,或者贪心算法来确保最后推荐给用户的 TOP10 内容的多样性,以及插入一些对于用户画像里缺失兴趣的探索。

5. 总结

推荐系统涉及到的东西很多,本文只是对各个环节作了些简单的概述。如果要完善系统并真正满足用户的需求,则需要在各个环节都做深入的研究,希望大家共勉。

0 人点赞