随着信息技术和互联网的发展,人们逐渐从信息匮乏的时代走入了信息过载(information overload)的时代。在这个时代,无论是消费者还是信息生产者都遇到了很大的挑战:对于信息消费者,从大量信息中找到自己感兴趣的信息是一件非常困难的事情;对于信息生产者,让自己生产的信息脱颖而出,受到广大用户的关注,也是一件非常困难的事情。推荐系统就是解决这一矛盾的重要工具。
推荐系统的任务就是联系用户和信息,一方面帮助用户发现对自己有价值的信息,另一方面让信息能够展现在对它感兴趣的用户面前,从而实现信息消费者和信息生产者的双赢。
——推荐系统实战 项亮
经典方法
协同过滤 CF
我们一般都有喜欢的演员和导演,有些人可能会打开搜索引擎,输入自己喜欢的演员名,然后看看返回结果中还有什么电影是自己没有看过的。比如我非常喜欢周星驰的电影,于是就去豆瓣搜索周星驰,发现他早年的一部电影我还没看过,于是就会看一看。这种方式是寻找和自己之前看过的电影在内容上相似的电影。推荐系统可以将上述过程自动化,通过分析用户曾经看过的电影找到用户喜欢的演员和导演,然后给用户推荐这些演员或者导演的其他电影。这种推荐方式在推荐系统中称为基于内容的推荐(content-based filtering)。
我们还可能查看排行榜,比如著名的IMDB电影排行榜,看看别人都在看什么电影,别人都喜欢什么电影,然后找一部广受好评的电影观看。这种方式可以进一步扩展:如果能找到和自己历史兴趣相似的一群用户,看看他们最近在看什么电影,那么结果可能比宽泛的热门排行榜更能符合自己的兴趣。这种方式称为基于协同过滤(collaborative filtering)的推荐。
CF是推荐系统里的一个大课题,我们后面的研究基本上都逃脱不掉CF的思想。
CF分为ItemCF和UserCF,以及基于模型的CF,具体可以看推荐系统:协同过滤CF和基于内容的推荐CB。
下面历史的车轮滚滚向前,我们由最基本的CF过度到了基于模型的CF阶段。
矩阵分解 MF
首个重要的进展就是矩阵分解(Matrix Factorization),说到矩阵分解技术,首先想到的往往是特征值分解与奇异值分解(Singular value decomposition,SVD)。这两个词我们貌似都在线性代数里学到过,这里就不展开了。可以看这篇博文温习一下。奇异值σ跟特征值类似,在矩阵Σ中也是从大到小排列,而且σ的减少特别的快,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上了。于是我们就可以用少量的信息去抽象表示UI矩阵(如果不稀疏可以学到的话),然后就可以恢复出没有交互过的位置的潜在值。
特征值分解需要矩阵为方阵,奇异值分解又要求矩阵是稠密的,而推荐系统场景下的UI矩阵则一般是非方形的,稀疏的。
于是在2006年,Simon Funk提出了Funk-SVD算法,其主要思路是将原始评分矩阵M(mn)分解成两个矩阵P(mk)和Q(kn),同时仅考察原始评分矩阵中有评分的项分解结果是否准确,而判别标准则是均方差(MSE)。
即对于矩阵M(mn),我们想办法将其分解为P(mk)、Q(kn),此时对于原始矩阵中有评分的位置MUI来说,其在分解后矩阵中对应的值就是
这种方法就是基于隐语义模型(LFM,Latent Factor Model)的矩阵分解。其算法意义层面的解释为通过隐含特征(latent factor)将user兴趣与item特征联系起来。
以矩阵分解为代表的隐语义模型LFM和LSI,LDA,Topic Model其实都属于隐含语义分析技术(隐含语义分析技术是门大学问,这里就先不展开了,这里只讲LFM),是一类概念,他们在本质上是相通的,都是找出潜在的主题或分类。这些技术一开始都是在文本挖掘领域中提出来的,近些年它们也被不断应用到其他领域中,并得到了不错的应用效果。比如,在推荐系统中它能够基于用户的行为对item进行自动聚类,也就是把item划分到不同隐类别中,这些隐类别可以理解为用户的兴趣,也可以理解为对物品进行的不同抽象程度的分类。
LFM的思想其实很简单,就是人为设计一个“隐类别”的类别数,各个隐类别的意义我们不用去管,然后通过训练user和item在每个隐类别上的“兴趣”或者“比重”,进而恢复出UI矩阵的思想(后面提到的很多模型都是可以得到用户对未交互过的物品的打分或者点击购买概率,那也相当于恢复出了UI矩阵)。
那么使用LFM的好处是什么呢?为什么要用LFM呢?
还是回到推荐系统的场景中。我们遇到的UI矩阵都是稀疏的,即用户基本和绝大多数的item都没有交互过,体现在隐式反馈的数据中则是一大片的0。
那么我们比如想利用模型恢复出(i,j)位置(用户i对物品j的打分),而这个位置正好没有交互过,是0,那么我们是无法训练到这个点的。使用SVD也是很难训练出一个理想的结果的,因为矩阵太稀疏了,很难学到可以表示UI矩阵的特征值和特征向量们。
而使用了LFM之后,我们将UI矩阵抽象到了两个矩阵P和Q上,这两个矩阵一个代表用户兴趣矩阵,一个代表物品矩阵,两者相乘恢复出UI矩阵。
那么只要这个用户或者物品与其他物品或者用户交互过,其矩阵就能得到训练,所以不需要矩阵稠密,即可训练。
所以我们使用LFM。
矩阵分解相关方法细节可以看推荐系统:矩阵分解方法。
因子分解机 FM
前面我们提到了两个重要的思想,协同过滤CF和隐语义模型LFM。后面的模型基本都或多或少使用了这两个思想。
因子分解机(Factorization Machine,FM)是由Konstanz大学(德国康斯坦茨大学)Steffen Rendle(现任职于Google)于2010年最早提出的一种基于矩阵分解的方法,旨在解决大规模稀疏数据下的特征组合问题。
前面的CF,LFM,MF都是针对UI矩阵进行处理的推荐算法。而FM不同,FM是一个通用方法,不止可以用于推荐领域,它可以用于各个领域,解决回归、二分类、排序等问题。
思考线性回归,我们有很多的特征,这些特征中,有些特征我们是可以通过特征工程来完成特征的交叉的,比如:年龄和性别,25岁的男生和25岁的女生的购买行为必然是会有不同的。那么我们可以将这些交叉项的权重学习也放到公式里,于是有:
但是由于特征数量较多,以及推荐场景下,UI矩阵较为稀疏,特征共现少,wij难以充分学习。(只有特征i,j共同在样本中出现,wij才能得到学习,而可能数据集中一共都没有共现过一次,wij根本无法得到学习)。
于是FM借鉴矩阵分解思想,对参数wij进行分解,分解为两个向量\(v_i,v_j\)的向量内积。这样,只要特征i在样本中出现,特征i的特征向量\(v_i\)就能得到训练。此外,由于隐向量维度设置一般不会过大,这样还可以有效减少模型要训练的参数量。
此外,上式的时间复杂度为O(kn^2),FM还通过二次项展开,将之化简为O(kn)的模型:
证明过程(二次项展开):
场感知因子分解机 FFM
场感知因子分解机(Field-aware Factorization Machine,FFM)通过引入field的概念,FFM把相同性质的特征归于同一个field。
比如,所有的日期类特征都可以归入日期场,所有品类特征都可以归入品类场。
假设样本的 n个特征属于 f 个field,那么FFM的二次项有 n*f个隐向量。而在FM模型中,每一维特征的隐向量只有一个,即总体只有n个隐向量。FM可以看作FFM的特例,是把所有特征都归属到一个field时的FFM模型。
其中,\(f_j\)是第j个特征所属的field。如果隐向量的长度为k,那么FFM的二次参数有nfk个,远多于FM模型的n*k个。此外,由于隐向量与field相关,FFM二次项并不能够化简,其复杂度为O(kn2)。
BPR和BPRLoss
在推荐系统中,我们经常可以见到implicit feedback,即训练集中,训练数据分为正样本和负样本,正样本是用户发生过购买行为的物品构成的样本,而负样本是用户未发生过购买行为的物品构成的样本,这不意味着用户不喜欢该物品、未来不会购买该物品。负样本包含两种情况:1.用户不知道该物品的存在;2.用户知道该物品的存在但是没买。而且前者的概率大一些,所以我们不能简单的将正样本的物品作为1,负样本的物品作为0。
于是我们就需要使用BPRLoss在解决这个问题。
BPR Loss(Bayesian Personalized Ranking),是一种pairwise的loss。我们之前常用的交叉熵、MSE都可以认为是pointwise的loss。
pairwise loss特别适用于implicit feedback,因为我们不需要预测值和ground truth做比较形成损失,我们只需要让正样本的分数比负样本高即可。
假设先验的概率密度:
即,经过MAP,目标函数为:
Deep方法
介绍完经典的推荐算法后,我们来学习一下基于深度学习神经网络的一些算法。
Wide&Deep
说到经典算法,首当其冲的肯定就是大名鼎鼎的Wide&Deep。这是Google在2016年提出的一个模型,个人认为更像一个框架,一种思想,内容不难,但是很有效。
论文中主要讲了Memorization和Generalization两个概念,翻译过来一个叫记忆,一个叫泛化。Memorization就是模型可以记住见过的样本,从而进行准确分类,但是这样容易过拟合,在没有见过的样本上,模型的表现就会相对差一些。而Generalization则是泛化性能,为了在未见过的样本上有较好的表现,让模型具有一定的推测能力,但是推测的是会有不准确的时候存在的。所以我们最好是追求一个两者的结合和平衡。
于是Google就推出了Wide&Deep框架。Wide部分就是一个不含隐层的单层网络,直连最终的输出节点,这部分体现的是Memorization。Deep部分则是一个较深的DNN,用来对高阶抽象的特征进行建模,从而提升模型在Generalization方面的表现。
模型架构如图:
我们初始的特征来自用户的一个query,表示用户想在google应用商店下载什么app。然后google的推荐系统会有一个retrieval给出一个物品的待选集,然后从待选集中给出评分最高的app进行推荐。
特征就是这个用户的信息。
wide部分接收我们特征工程过的交叉项特征,由于是手工特征工程,所以这里可以对任意维交叉特征进行建模。
deep部分则接收所有的连续特征,以及embedding后的离散特征,然后将他们concat到一起。
这两部分最终的结果被加权求和在一起得到最终结果。并一起使用logloss联合训练。
不过原文还说到,对于wide部分使用FTRL做优化器,对于deep部分使用AdaGrad做优化器,这个不知道是怎么实现的。
DeepFM
这是华为在2017年3月提出的一个模型,用于CTR预估。
从Wide&Deep我们可以得知,同时考虑低阶和高阶交叉特征能取得更好的效果。于是DeepFM将FM和DNN结合,可以更好的使用一阶特征、二阶交叉特征以及DNN学习到的高阶抽象特征,进而取得更好的效果。
我们观察网络结构,其实DeepFM相比wide&deep就是将wide部分拓展了一下,wide部分使用FM部件代替,并加入了不交叉的部件来保留一阶特征。
FM部件好像结构图上画的不是很清楚,这里用公式明确一下:
其实还是FM的公式。
另外DeepFM的两个部件都使用相同的输入。
在DeepFM中,对于稀疏的输入向量,模型先将他们经过一个embedding layer,转化为稠密向量,然后再送入两个部件做输入。原来就是稠密向量的输入应该就不用经过这一步了,或者也经过这一步之后仍然是稠密向量,这点原论文好像没有提到。
其中,embedding layer的结构如图。其中一个field可以表示一个离散变量onehot后的结果,是一个稀疏的只有一个1的向量,然后embedding layer对不同长度的field生成同样长度的embedding向量。其实实现时就还是做一个embedding lookup。
deepFM中FM与deep部分共享一份embedding数据,有两点好处:
1)能够从原始特征同时学习低阶和高阶特征
2)不需要像W&D做特征工程
DCN Deep Cross Network
这是一篇谷歌2017年8月推出的论文,和DeepFM一样,也是对Wide&Deep框架的改进。
它提出,DNN是对implicit交叉特征进行提取的,而explicit交叉特征也很重要,这部分在W&D中需要人工特征工程。
于是它就提出用CrossNetwork自动交叉特征,然后和DNN结合,这样对两种交叉特征都可以学习到,还省去了人工。
网络结构如上,和DeepFM一样,也是两个部件使用了同样的输入。
稀疏特征经过embeddinglayer形成稠密向量和原本就稠密的特征一起作为输入。
CrossNetwork部分不是特别清晰,具体可以见下图和公式:
其中\(w_l\)是一个和输入同纬度的权重向量,这样交叉后得到的还是同样维度的向量。这个向量还加上了偏置向量以及上个CrossLayer的结果,这样相当于保留了(l-1)阶交叉特征的信息,只不过是通过对位相加来实现的保留。
NFM Neural Factorization Machines
这是新加坡国立大学的何向南大佬2017年8月的论文。
这篇论文感觉倒是没什么新东西。
其实就是FM的神经网络版本。
我们知道上式可以变形为复杂度为O(kn)的模型。
然后NFM提出了一个叫Bi_interaction Pooling的操作,来完成这一点,然而其实FM就已经做了。唯一的区别是,NFM在做这个操作前,将稀疏的输入特征经过了Embedding Layer,然后对每个特征对应的新向量(1位到多位)进行特征交叉,这样的话相当于增加了特征的参数复杂度,从而提高对特征的把控。
目标函数是MSE。
AFM Attentional Factorization Machines
这篇是新加坡国立大学的何向南大佬2017年8月的论文。
模型也是对FM做了改进,上一篇是加上了EmbeddingLayer,这篇是加了Attention。
其中Attention权值的算法:
模型整体公式:
从模型整体公式我们可以看出,AFM和FM除了Attention外还有差别。
FM中的\(v_i,v_j\)是权值\(w_{ij}\)的因子分解结果,没有什么意义,所以直接向量内积得到权值即可。
而这里的\(v_i,v_j\)是特征\(x_i,x_j\)对应的embedding,所以相当于他们也是特征信息,所以这里采用向量对位相乘,最终乘一个weights\(\mathbf{p}\),得到最终结果。
目标函数为MSE+L2正则。
NCF Neural Collaborative Filtering TODO
又见何向南大佬!2017年4月。
如图,MF存在将高维空间映射到低维空间表示能力不足的缺点。
本文就提出了NCF框架,使用GMF+MLP来解决这个问题(具体咋解决TODO)。
模型架构:
DIN Deep Interest Network
这是阿里妈妈定向广告团队2018年5月的论文。
作者们认为,我们用一个固定长度的向量来表示用户,而不管我们的candidate ads是啥,这将成为从丰富的用户行为历史中捕捉用户广发兴趣的瓶颈。于是提出DIN网络:
网络结构不复杂:输入:用户特征,多个商品的特征(商品ID,商铺ID,品类ID),CandidateAd(商品ID,商铺ID,品类ID),上下文特征。都是离散类别特征。
所有的离散特征经过一层embedding layer。
商品特征和CandidateAd特征经过ActivationUnit计算出权重,每个商品和权重一起加权求和sum pooling。
得到的记过和用户特征、CandidateAd和上下文特征一起concat送入DNN。
这里用的激活函数是PRelu或者Dice。
目标是CTR,所以目标函数用交叉熵。
DIN在训练时还用了两个小trick:Mini-batch Aware Regularization和Data Adaptive Activation Function。
在网络参数量非常巨大时,如果我们不对网络加正则化约束,那么网络的训练效果会随着迭代增多越来越差(train loss 越来越小,但是到了某个时间节点,test loss飞速上升)。
所以我们需要对网络参数加正则化约束,但是对于接近上亿级别的参数量,进行传统的l1l2正则化约束会带来巨大的计算量,而这些参数主要来自embedding参数,是稀疏的。所以作者们就提出了Mini-batch Aware Regularization来简化计算量。
我们一般的L2正则可以用以下公式表示:
这里\(\mathbf{W}\)是DK的embedding参数,D可以理解为item个数,K为embedding维数。\(w_j\)则是其中的一列(注意不是一行!),\(n_j\)则是特征j在数据集中出现的总次数。\(I(x_j\neq 0)\)表示数据集中所有的样本x里是否有特征j,有为1,没有为0。其实这里这个指示函数没什么意义,直接用1就好,因为如果没有出现,最后一项\(||w_j||_2^2\)自然为0。
然后从全部数据集转化为只看mini-batch里样本的视角:
这里\(w_j\)变成了BK中的一列。\(I(x_j\neq 0)\)表示minibatch中所有的样本x里是否有特征j,有为1,没有为0。
因为稀疏,所以一个batch可能也就出现一次这个参数,所以可以用参数\(w_j\)是否在minibatch m中出现过来近似其次数(即1次表示出现过,无论多少次;0表示没出现过)。
于是得到近似:
其中\(\alpha_{mj}=max_{(x,y)\epsilon B_m}I(x_j\neq 0)\)
所以可以这么更新:
所以感觉只是以列的形式表示了这个更新过程呀?并没有减少计算量?这个问题留待以后解决吧。
然后则是Data Adaptive Activation Function:
其实就是PRelu,PRelu就是leaky Relu。
leaky Relu中,控制函数p(s)=I(s>0)。而实际应用中,每层数据分布都不一样,PRelu的recified point 都在0,不一定合适,所以推出Dice
Dice可以看作是pRelu的泛化,根据inputdata动态调整rectified point。其实就是将控制函数变为了一个移位的sigmoid函数。
CDAE TODO
PNN TODO
https://zhuanlan.zhihu.com/p/33177517
https://zhuanlan.zhihu.com/p/56651241
DIEN TODO
以上是经典的基于深度学习的推荐算法:wide&deep,DeepFM,DCN都是wide+deep框架的模型,NFM,AFM都是基于FM的小修改,NCF则是对MF的改进。DIN则是基于Attention的模型,可以对用户最近购买的物品重要程度进行建模。CDAE则是另外一种思路,基于AutoEncoder的。
deep方法至此写完,这篇博文结束了。后面会新开博文介绍序列推荐、知识图谱、GANs、CNN等,并给出链接。
参考资料:
《推荐系统实战》 项亮
https://blog.csdn.net/HarryHuang1990/article/details/9924377
https://zhuanlan.zhihu.com/p/34497989
https://www.cnblogs.com/fuleying/p/4466326.html