最近在看推荐系统,主要学习了LR,FM,FFM和DNN四种常用的推荐算法。本文打算对推荐系统的问题背景和这些常见算法写一个简单的综述,由于不是专门研究推荐系统的,只是书写一下个人理解,恐怕会有颇多谬误,望各位大佬批评指正。
首先,计算广告/推荐系统本质上解决的是同样一个问题,即给定一个展示平台和一个广告/一个用户和一个待推荐的物品,该广告/该物品在该平台上/被该用户点击的概率是多少,即点击率预估问题:给定一个二元组(p, q),预测p对q发生点击行为的概率y。只是对于推荐系统来说,最终结果不是一个单一的点击率,而是:对于特定用户p,求物品集Q中的一组定长序列(q[0], q[1], …, q[k-1]),使得Q中这些物品按如前所述顺序向p展示。于是,得到用户p对Q中每个物品q[i]的点击率后,将Q按点击率从大到小排序取前k个即可。
计算广告/推荐系统的一个特点就是训练数据是一些只有id的实体,因此特征向量是很高维的few-hot向量。比如下图是在计算广告中常见的数据:
可以看到训练数据的特征是 (发布者,广告主) 的组合,这样的组合如果做成量化的特征,就会表现为few-hot向量的形式,比如
(ESPN, Nike) - (1, 0, 0 |1, 0, 0)
(ESPN, Gucci) - (1, 0, 0 | 0, 1, 0)
(ESPN, Adidas) - (1, 0, 0 |0, 0, 1)
(Vogue, Nike) - (0, 1, 0 |1, 0 , 0)
(Vogue, Gucci) - (0, 1, 0 |0, 1, 0)
(Vogue, Adidas) - (0, 1, 0 |0, 0, 1)
(NBC, Nike) - (0, 0, 1 |1, 0, 0)
(NBC, Gucci) - (0, 0, 1 |0, 1, 0)
(NBC, Adidas) - (0, 0, 1 | 0, 0, 1)
而实际上,我们面对的真实数据中,可能用上万个发布者和广告主的组合。而在推荐系统中,用户的规模更是可以上亿,物品也可能是百万级的,因此决定了广告/推荐中的特征,主要是高维稀疏特征。下面的算法应用中,都要特别关注这一点。
广告/推荐数据的另一个特点是成对特征的相关性。成对特征的相关性而非特征值本身决定点击率。比如运动品牌的广告,放在新闻网站的体育新闻专区,被点击的可能性更高;年轻男性用户,购买推荐的运动鞋的可能性更高。
计算广告中的y通常是一个发布平台上某广告的点击率,是一个float number,因此更类似一个回归问题. 与计算广告不同的是,推荐系统中一个 (用户,物品) 组合的y值只有“点击”/“未点击”或“购买”/“点击但未购买”/“未点击”等离散值(推荐系统会过滤掉用户已经点击或已经购买的商品——给用户重复推荐是没有意义的),因而更类似一个分类问题。
推荐系统中只有预测过程是实时的(用户刷新页面就要给出推荐排序的响应),训练过程可以离线完成(比如每天根据新的输入重新训练一遍模型,提前计算好每个用户对应的物品序列),因此分析推荐算法时,我们仅需关心预测的时间复杂度而一般无需关心训练的时间复杂度。
上述点击率预估问题可以看作一个回归问题:通过 (用户,物品) 组合特征,回归出点击率。很自然地可以想到用线性回归。对于推荐系统,再加一个logistic函数,将回归问题转化为分类问题。另外,考虑到在广告/推荐中,往往是特征间相互作用而非特征本身,因此可以将两个特征的乘积项去做Logistic回归,甚至可以直接舍弃一次项。具体而言,二阶Logistic回归的表达式如下:
f ( x ) = ∑ i , j ω i , j x i x j f(x) = \sum\limits_{i,j}\omega_{i,j}x_ix_j f(x)=i,j∑ωi,jxixj
论文原文:Factorization Machines
Logistic回归不是很适合处理高维稀疏特征。FM算法可以解决这个问题。我们从另外一个角度观察这个问题。对于一个推荐系统,假设存在用户与物品之间的一个评分矩阵Y:
User/Item | i1 | i2 | i3 | i4 | i5 | i6 | i7 |
---|---|---|---|---|---|---|---|
u1 | 1 | ? | ? | ? | ? | 1 | 1 |
u2 | ? | ? | ? | ? | 1 | ? | ? |
u3 | ? | 1 | 3 | 1 | ? | 1 | ? |
u4 | 3 | 1 | ? | ? | ? | 1 | ? |
左边一列是4个用户(u1, u2, u3, u4),上边一行是7个物品(i1, i2, …, i7),矩阵中的元素表示用户通过点击/购买行为对物品形成的评分,例如1表示用户点击了该物品,3表示用户购买了该物品。现在的任务是将矩阵中"?"的地方填充完成,从而得到每个用户的评分从高到低的物品序列做推荐。通过这样的视角转换,我们就把原先单个元素的评分预估问题转化为了一个全局的矩阵补全问题。
矩阵分解算法假设用户和物品之间的相关性由用户和物品的k维潜在特征向量的内积刻画,即用户i对物品j的评分
y i j = p j ⋅ q j y_{ij} = \mathbf{p}_j\cdot\mathbf{q}_j yij=pj⋅qj
那么,评分矩阵Y就可以分解成用户矩阵P和物品矩阵Q的矩阵乘法
Y = P Q Y=PQ Y=PQ
其中 P = [ p 1 T ; p 2 T ; . . . ] , Q = [ q 1 , q 2 , . . . ] P=[\mathbf{p}_1^T;\mathbf{p}_2^T;...], Q=[\mathbf{q}_1, \mathbf{q}_2, ...] P=[p1T;p2T;...],Q=[q1,q2,...].
这就是“矩阵分解”法名字的来由。
假设有m个用户,n个物品,则Y的维度为(m, n),P的维度为(m, k),Q的维度为(n, k). 这里k通常远远小于m和n(也是一种降维的思想)。
从评分矩阵填充的视角来看,我们可以看到二阶Logistic回归的一个非常大的局限性:对于没有评分信息的 (用户,物品) 对(比如(u1, i2)),因为没有评分标记,因此无法训练该二阶项系数,所以无法给出预测。而FM则一定程度上解决了这个问题:只要用户对其他的物品有过评分(例如用户u1虽然没有评价i2,但是评价了i1, i6, i7),那么我们就可以通过这些评分训练该用户(u1)的潜在特征向量;对于物品i2也是这样。基于这两个潜在特征向量,我们仍然可以计算(u1, i2)的预估评分。
具体到任务上,我们可以结合任务的性质(分类/回归)选择不同的loss函数,然后应用SGD优化模型参数(即潜在特征矩阵P和Q)。
论文原文:Field-aware Factorization Machines for CTR Prediction
FFM算法的英文全称是Field-aware Factorization Machines,即“域感知”的矩阵分解。结合一个例子来看FFM的Motivation:
但是,对于广告主而言,广告主潜在特征向量同发布者潜在特征向量的交互方式与广告主潜特征在向量同性别潜在特征向量的交互方式可能是不同的。而FM算法中每个属性的特征只有一个潜在特征向量,不能表现这种相互关系的差异性。于是FFM算法提出对于每一种属性(即FFM中的Field),都分别对应一个潜在特征向量。这样,对于有K个属性的数据,每个属性会对应K-1个特征向量,分别表示这个属性与其余K-1个属性的相互关系。上式就可以改写为:
论文原文:Deep Neural Networks for YouTube Recommendations
这篇文章的特点主要有二:
系统流程图如下图所示:
使用DNN的思路就是把第一阶段问题看作一个多分类问题,类标就是用户标签,然后把处理过的特征输入DNN进行学习;把第二阶段问题看作一个ranking问题,同样也是把处理过的特征输入网络去学。具体的网络图这里就不放了,论文里都有。使用DNN做推荐,特征的处理很重要,论文中有介绍关于离散特征和连续特征的处理方法,详情请移步论文。