推荐系统算法综述:从LR到FM再到DNN
最近在看推荐系统,主要学习了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回归,甚至可以直接舍弃一次项。具体而言,二阶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)=