推荐系统中的排名技术
召回阶段对应的是之前文章提到的各种推荐算法。例如,根据数据,Spotify至少使用了三种算法来生成其广受好评的Discover Weekly歌曲列表,包括:
这些算法各有特点,音频分析显然可以用来解决冷启动问题,NLP在处理乐评时可以学习专业人士的领域知识。他们独立运行,给出自己的结果。由于它们的独立性,算法的数量可以增加或减少,也可以独立地迭代改变。
这个过程会从几千万个条目中筛选出成百上千个候选集,然后在排序阶段给每个用户选择30首歌曲。这个排名可以理解为一个函数,输入是用户、物品、环境,输出一个0到1之间的分数,取分数最高的歌曲。这个过程通常被称为CTR估计。
本文将谈谈这个“函数”的常见形式和基本操作。
最简单的是逻辑回归,一种广义线性模型。
取一个用户的用户画像(一个向量),比如[3,1],拼接一个物品的物品画像,比如[4,0],加上代表上下文的向量[0,1,1]得到[3,1,4,0,0]。如果用户接触过该商品,标签为1,加起来就是正样本。同时,用户“跳过”的商品或者没有接触过用户的热门商品可以作为负样本,标签为0,拟合如下等式:
其中是上面的向量,x的每个元素对应的权重,截距。损失函数是:
其中样本的label0或1是根据模型预测的介于0和1之间的数字。
通过降低这个损失函数来拟合训练样本,完成了模型的训练,新的数据被模型预测出来,这就是评分的完成。参考sklearn的LogisticRegression,训练过程很容易完成。
传统的LR只能批量离线处理大量数据,无法有效处理大规模在线数据流。模型更新可能需要一天或更长时间,这不够及时。2013年,谷歌提出了遵循正则化领导(FTRL),一个在线逻辑回归算法。这种方法修改了logistic回归的目标函数,加上各种系统工程优化,使得模型的参数可以在每个在线数据点动态更新。
你可以在网上找到很多FTRL的开源实现,比如libftrl-python。
FM和FFM分别是因式分解机和场感知因式分解机的简称。
LR作为广义线性模型,在处理特征向量和标签之间的非线性关系时会有困难。这时候就需要结合特征,比如用线性模型来预测各种近似矩形的面积。两个特征是长和宽,显然你学不到好的模型。这个时候,增加一个新的特性可以得到很好的效果。
在实际应用中,特征向量的维数非常高,很难像上面的例子那样直接看到这种有意义的组合。考虑到所有成对的特征组合,线性回归方程变为:
除了原始特征的权重,还要学习每个特征组合对应的权重。对于参数训练,我们需要大量和不为零的样本。但由于一热编码等原因造成的稀疏性,无法满足这一要求,因此训练样本不足会导致不准确,从而影响模型的质量。
解决方法是使用矩阵分解。在推荐系统中,会对user_item_matrix进行分解,学习一个低维向量,供用户和项目表示自己。那么这里的情况可以与之比较,将特征组合的所有权重表示为一个形状为(i * i)的矩阵,这样就可以对这个矩阵的第I行第J列的值进行高维矩阵的分解,为每个特征得到一个关于权重的隐藏向量,这个向量可以通过点乘得到。此时,线性方程变为:
上面的模型叫因式分解机。经过一定的数学变换和处理,该模型可以在复杂度下进行训练和预测,是一种相对高效的模型。
在FM的基础上,有人提出了场感知因式分解机。例如,特征向量中有200多个维度来表示用户的国家,如country.uk和country.us等。,所以这200多个特征可以认为属于一个领域。不同的是,在为特征学习隐向量时,要为每一个场学习一个对应的隐向量,特征组合权重是由关于场的隐向量乘以关于场的隐向量得到的。线性方程变成:
该方法更加有效,预测时间复杂度上升到。有一个开源库libffm的实现供使用。
脸书估算广告点击率的方法是使用梯度提升决策树(GBDT)&;LR的方案
其思想是通过GBDT对原本要输入LR的特征向量进行过滤组合,生成新的特征向量,然后发送给LR。如图所示:
作为一个集成的模型,GBDT将使用多个决策树,每棵树都将拟合前一棵树的残差,以获得良好的拟合效果。当一个样本输入到一个树中时,它会根据每个节点的条件向下到一个叶节点,将节点值设置为1,其余的设置为0。例如,训练中使用三棵决策树,每棵决策树有五个叶节点,样本落在每棵树从左到右的第1,2,3个节点上,则得到三个一热码为[1,0,0,0],[0,1,0,0]。拼接在一起作为变换后的特征向量:[1,0,0,0,1,0,0,0,1,0,0],输入LR模型得到得分。
这种模式明显提高了脸书的广告效果。在其发表的论文中,也讨论了各种工程实践和细节,包括GBDT和LR的更新频率,以及下采样率的做法,值得参考。开源的XGBoost包可以用来实现GBDT。
谷歌使用一种叫做Wide &的方法;Deep的深度-宽度模型。如下图所示:
宽的部分是广义线性模型,在原有特征的基础上适当增加了一些特征组合。深层部分是一个前馈神经网络,可以从一些稀疏特征中学习一个低维的稠密向量,加上宽和深的信息,仍然使用Sigmond进行函数预测,表示为:
其中是Sigmond函数,是宽部分的权重,代表宽部分的组合特征,是深度网络最后一层的输出,是线性模型的偏差。
将两个模型放在一起进行联合训练(不同于集成训练,需要对每个模型分别进行训练,然后将结果进行收敛),弥补彼此的不足(特征工程难度大,可解释性差)。这种模式相比纯宽模式,为Google Play的在线收入带来了3.9%的提升。实现可以参考tensorflow/models项目。