Fork me on GitHub

《搜索与推荐中的深度学习匹配》之推荐篇

作者: 黄冠
这个tutorial确实不错https://www.comp.nus.edu.sg/~xiangnan/sigir18-deep.pdf,我很喜欢,好像一个博士论文一样,将这两个领域梳理得很清楚。

搜索,推荐和广告其实是机器学习在工业界最好的落地。而且容易拿到由用户的行为来表示的海量的标注数据,而且这三者要不可以赚钱,要不可以增加流量,往往是公司的核心业务。

其实这篇tutorial主要讲推荐模型的,而实际上推荐就是一个匹配问题,所以标题才叫推荐里的深度学习匹配。另外,由于广告和推荐的技术很像,所以对广告技术感兴趣的人也可以看看这篇tutorial。

本篇blog的提纲:

  • part-1 推荐系统的概述

  • part-2 推荐系统里的传统匹配模型:

  • part-2.1 Collaborative Filtering Models

  • part-2.2 Generic Feature-based Models

  • part-3 推荐系统里的深度学习匹配模型:

  • part-3.1 基于representation learning的方法:

  • part-3.1.1 基于Collaborative Filtering的一些方法介绍

  • part-3.1.2 基于Collaborative Filtering + Side Info的一些方法介绍

  • part-3.2 基于matching function learning的方法:

  • part-3.2.1 基于Neural Collaborative Filtering的一些方法介绍

  • part-3.2.2 基于Translation的一些方法介绍

  • part-3.2.3 Feature-based的一些方法介绍

  • part-3.3 Modern RecSys Architecture : representation learning和matching function learning的融合

  • part-4 short summary

part-1 推荐系统的概述

推荐系统是由系统来根据用户过去的行为、用户的属性(年龄、性别、职业等)、上下文等来猜测用户的兴趣,给用户推送物品(包括电商的宝贝、新闻、电影等)。推荐一般是非主动触发的,和搜索的主动触发不一样(搜索一般有主动提供的query);也有小部分情况,用户有提供query:例如用户在电商里搜索一个商品后,结果页最底下推荐给用户的商品,这种情况算是有提供query。

搜索一般是想尽快的满足用户,而推荐是更多的是增加用户停留时长。

推荐系统涉及到的两大实体:user和item往往是不同类型的东西,例如user是人,item是电商的宝贝,他们表面上的特征可能是没有任何的重叠的,这不同于搜索引擎里的query和doc都是文本:

正是由于user和item不同类型的东西,所以推荐里匹配可能比搜索里的更难。

接下来是,推荐系统里的传统匹配模型的介绍。

part-2 推荐系统里的传统匹配模型

先简单的提一下推荐算法的分类:

  • 基于内容的推荐

  • 基于协同过滤(CF)的推荐

  • 一般是基于用户的行为,可以不用上内容信息

  • 基于规则的推荐

  • 基于人口统计信息的推荐

  • 混合推荐

part-2.1 Collaborative Filtering Models

协同过滤(CF)是推荐里最通用、最著名的算法了。

CF的基本假设是:一个用户的行为,可以由跟他行为相似的用户进行推测。

协同过滤一般分为user-based和item-based、model-based三类方法。user-based和item-based、model-based的协同过滤的算法的思想通俗的讲,就是:

  • user-based:两个用户A和B很相似,那么可以把B购买过的商品推荐给A(如果A没买过);例如你和你的师兄都是学机器学习的,那么你的师兄喜欢的书籍,你也很有可能喜欢
  • item-based: 两个item:A和B很相似,那么某个用户购买过A,则可以给该用户推荐B。例如一个用户购买过《模式识别》这本书,它很有可能也喜欢《推荐系统》这本书。计算两个item是否相似的一种简单方法是,看看他们的共现概率,即他们被用户同时购买的概率
  • model-based: 用机器学习的思想来建模解决,例如聚类、分类、PLSA、矩阵分解等

CF要解决的问题用数学化的语言来表达就是:一个矩阵的填充问题,已经打分的item为observed data,未打分的是missing data:

  • 矩阵填充一般是用SVD分解来解决:

SVD就是在解决以下问题:

svd有以下缺点:

1.missing data(就是没打分的,占比99%)和observed data(观测到的、已打分的)有一样的权重。

2. 没有加正则,容易过拟合。

  • MF(matrix Factorization,user-based CF)

user和item分别用一个embedding表示,然后用户对item的偏好程度用这两个embedding的内积表示:

使用L2-loss(其它loss也可以)和正则:

  • Factored Item Similarity Model(Kabbur et al., KDD’14),FISM

这个论文是用user作用过的item的embedding的和来表示user,item用另一套embedding下的一个embedding来表示,最后两者的内积表示user对该item的偏好。

这个模型也叫item-based的CF,因为把括号里的东西展开后,其实就是找用户作用过的item和item[j]的相似度。

  • SVD++:

很简单,另外用一个user的embedding,和上述的FISM的方法,融合来表示user。这曾经是netflix比赛中连续三年效果最好的单模型。

part-2.2 Generic Feature-based Models

  • FM: Factorization Machines (Rendle, ICDM’10)

这个模型的最大的特点就是每一个特征都用要一个低维度的隐向量来表示(一般是10维左右),其实就是现在说的embedding;可以自动的做2阶的特征组合(自己和自己不组合);并且很多其它的模型都是FM的特例。

当只有两个输入的时候:userID和itemID,FM就等价于MF(matrix factorization):

如果输入包含两个变量:1.用户的历史作用过的item 2.要预测的item的ID,那么FM也是包含了FISM模型的(Factored Item Similarity Model):

而如果再加上user的embedding,那就包含了svd++。所以mf,fism和svd++都是fm的特例

而实践证明用打分预测来解决推荐系统的排序问题,效果不好。可能的原因:

  • 预测打分用的RMSE和排序指标有差异性
  • 观测到的打分数据有bias,例如用户偏向对他们喜欢的item打分

所以一般用pairwise的ranking来解决推荐的排序问题:

接下来我们介绍一下推荐系统里的深度学习匹配模型。

part-3 推荐系统里的深度学习匹配模型

和搜索里的深度学习匹配模型一样,推荐里深度学习匹配模型也主要分两大类:

  • representation learning,这类方法是分别由NN,学习出user和item的embedding,然后由两者的embedding做简单的内积或cosine等,计算出他们的得分
  • matching function learning,这类方法是不直接学习出user和item的embedding表示,而是由基础的匹配信号,由NN来融合基础的匹配信号,最终得到他们的匹配分。

part-3.1 基于representation learning的一些方法介绍

此类方法,tutorial也大概分为两类:

  • 基于Collaborative Filtering的一些方法介绍
  • 基于Collaborative Filtering + Side Info的一些方法介绍

part-3.1.1 基于Collaborative Filtering的一些方法介绍(representation learning)

这类方法是仅仅建立在user-item的交互矩阵上。

首先,简单复习一下MF,如果用神经网络的方式来解释MF,就是如下这样的:

输入只有userID和item_ID,representation function就是简单的线性embedding层,就是取出id对应的embedding而已;然后matching function就是内积。

  • Deep Matrix Factorization (Xue et al,IJCAI’17)

用user作用过的item的打分集合来表示用户,即multi-hot,例如[0 1 0 0 4 0 0 0 5],然后再接几层MLP,来学习更深层次的user的embedding的学习。例如,假设item有100万个,可以这么设置layer:1000 * 1000 ->1000->500->250

用对item作用过的用户的打分集合来表示item,即multi-hot,例如[0 2 0 0 3 0 0 0 1],然后再接几层MLP,来学习更深层次的item的embedding的学习。例如,假设user有100万个,可以这么设置layer:1000 * 1000 ->1000->500->250

得到最后的user和item的embedding后,用cosine计算他们的匹配分:

这个模型的明显的一个缺点是,第一层全连接的参数非常大,例如上述我举的例子就是100010001000。

  • AutoRec (Sedhain et al, WWW’15)

这篇论文是根据auto-encoder来做的,auto-encoder是利用重建输入来学习特征表示的方法。

auto-encoder的方法用来做推荐也分为user-based和item-based的,这里只介绍user-based。

先用user作用过的item来表示user,然后用auto-encoder来重建输入。然后隐层就可以用来表示user。然后输入层和输出层其实都是有V个节点(V是item集合的大小),那么每一个输出层的节点到隐层的K条边就可以用来表示item,那么user和item的向量表示都有了,就可以用内积来计算他们的相似度。值得注意的是,输入端到user的表示隐层之间,可以多接几个FC;另外,隐层可以用非线性函数,所以auto-encoder学习user的表示是非线性的。

  • Collaborative Denoising Auto-Encoder(Wu et al, WSDM’16)

这篇论文和上述的auto-encoder的差异主要是输入端加入了userID,但是重建的输出层没有加user_ID,这其实就是按照svd++的思路来的,比较巧妙,svd++的思想在很多地方可以用上:

简单总结一下,基于Collaborative Filtering的做representation learning的特点:

  • 用ID或者ID对应的历史行为作为user、item的profile
  • 用历史行为的模型更具有表达能力,但训练起来代价也更大

而Auto-Encoder的方法可以等价为:

用MLP来进行representation learning(和MF不一样的是,是非线性的),然后用MF进行线性的match。

part-3.1.2 基于Collaborative Filtering+side info的一些方法介绍(representation learning)

这类方法是建立在user-item interaction matrix + side info上的。

  • Deep Collaborative Filtering via Marginalized DAE (Li et al, CIKM’15):

这个模型是分别单独用一个auto-encoder来学习user和item的向量表示(隐层),然后用内积表示他们的匹配分。

  • DUIF: Deep User and Image Feature Learning (Geng et al, ICCV’15)

这篇论文比较简单,就是用一个CNN来学习item的表示(图像的表示),然后用MF的方法(内积)来表示他们的匹配分:

  • ACF: Attentive Collaborative Filtering(Chen et al, SIGIR’17)

这篇论文主要是根据SVD++进行改进,使用两层的attention。

输入包括两部分:

  • user部分:user_ID以及该user对应的作用过的item
  • item部分:item_ID和item的特征

两个层次的attention:

  • Component-level attention:

  • 不同的components 对item的embedding表示贡献程度不一样,表示用户对不同feature的偏好程度

  • 由item的不同部分的特征,组合出item的表示:

  • attention weight由下述式子做归一化后得到:

其中u表示用户的向量,x[l][m]表示物品的第m部分的特征

  • Item-level attention:

  • 用户历史作用过的item,对用户的表示的贡献也不一样,表示用户对不同item的偏好程度

  • attention weight的计算公式如下,其中u表示用户的向量,v表示基础的item向量,p表示辅助的item向量,x表示由上述的component-level的attention计算出来的item的特征的表示向量:

  • 然后使用svd++的方式计算用户的方式,只是这里的item部分不是简单的加和,而是加权平均:

这个论文是采用pairwise ranking的方法进行学习的,整个模型的结构图如下:

模型采用pairwise ranking的loss来学习:

  • CKE: Collaborative Knowledge Base Embedding (Zhang et al, KDD’16)

这篇论文比较简单,其实就是根据可以使用的side-info(文本、图像等),提取不同特征的表示:

对上述方法做一个简单的总结(基于Collaborative Filtering+side info的一些方法介绍(representation learning)):

  • Matching function就是简单的cosine
  • 根据可以使用的side-info(文本、图像、语音等),来选择适合的DNN(MLP、auto-encoder、CNN、RNN等)来描述user、item的representation

part-3.2 基于matching function learning的方法

part-3.2.1 基于Neural Collaborative Filtering的一些方法介绍(matching function learning)

  • Neural Collaborative Filtering Framework (He et al, WWW’17)

这篇论文是使用NN来学习match function的通用框架:

这篇论文的模型就是将user的embedding和item的embedding concat到一起,然后用几层FC来学习他们的匹配程度。

  • MLP在抓取多阶信息的时候,表现并不好

很不幸的是,MLP效果并没有比内积好。有一篇论文证明了,MLP在抓取多阶的信息的时候,表现并不好:

这篇论文要说的是,即使是二维的1阶的数据,也需要100个节点的一层FC才能比较好的拟合;而如果是2阶的数据,100个节点的一层FC拟合得非常差,所以MLP在抓取多阶信息上并不擅长。不过个人总体上觉得这篇论文的说服力不够。

  • NeuMF: Neural Matrix Factorization (He et al, WWW’17)

这篇论文其实是MF和MLP的一个融合,MF适合抓取乘法关系,MLP在学习match function上更灵活:

user和item分别用一个单独的向量做内积(element-wise product,没求和)得到一个向量v1;然后user和item分别另外用一个单独的向量,通过几层FC,融合出另外一个向量v2,然后v1和v2拼接(concat)到一起,再接一个或多个FC就可以得到他们的匹配分。

  • NNCF: Neighbor-based NCF(Bai et al, CIKM’17)

这篇论文主要是将user和item的neighbors信息引入。至于user和item的neighbor怎么挖掘,就有很多算法了,包括直接和间接的neighbors。例如两个用户同时购买过某个商品,他们就是neighbor等。

底层是用户的向量和item的向量的element-wise dot的结果拼接上另外两个向量:

  • user的neighbor信息(每个neighbor_ID也映射成向量),通过卷积和max-pooling后得到的向量
  • item的neighbor信息,通过卷积和max-pooling后得到的向量

效果:

Deep NCF效果要远远比MF好;而NeuMF要比普通的MF效果要好,说明加了MLP来做match function learning要比简单的内积效果要好。

  • ONCF: Outer-Product based NCF (He et al, IJCAI’18)

上述的模型,user向量和item向量要不是element-wise product,要不是concat,这忽略了embedding的不同维度上的联系。一个直接的改进就是使用outer-product,也就是一个m维的向量和n维的向量相乘,得到一个m*n的二维矩阵(即两个向量的每一个维度都两两相乘):

其中也包含了内积的结果。

然后就得到一个mn的矩阵,然后就可以接MLP学习他们的匹配分。但是由于m*n比较大,所以这样子是内存消耗比较大的:

很自然的一个改进就是将全连接,改成局部全连接,这就是CNN了。

使用CNN来处理上述的outer-product的二维矩阵,可以起到大大节省内存的效果:

效果上,ConvNCF要比NeuMF和MLP都要好:

part-3.2.2 基于Translation的一些方法介绍(matching function learning)

  • Overview of Translation-based Models

MF-based的model是让user和他喜欢的item的向量更接近:

而translation-based的模型是,让用户的向量加上一个relation vector尽量接近item的向量:

  • TransRec (He et al, Recsys’17):

这篇论文的主要思想是,item是在一个transition空间中的,用户下一次会喜欢的item和他上一个喜欢的item有很大关系。

这篇论文要解决的下一个物品的推荐问题,利用三元关系组来解决这个问题:,主要的思想是:

那么用户喜欢下一次物品的概率和下述式子成正比:

  • Latent Relational Metric Learning(Tay et al, WWW’18)

这个论文主要是relation vector通过若干个memory vector的加权求和得到,然后采用pairwise ranking的方法来学习。

首先和attention里的k、q、v类似,计算出attention weight:

其中p和q分别是user和item的向量。然后对memory vector进行加权求和得到relation vector(该论文中用了6个memory vector):

如果item_q是user_p喜欢的item,那么随机采样另一对p和q,就可以进行pairwise ranking的学习,即正样本的|p+r-q|(p喜欢q)应该小于负样本的  (  ,这里的正负样本用同一个r):

part-3.2.3 Feature-based的一些方法介绍

推荐里的特征向量往往是高维稀疏的,例如CF中feature vector = user_ID + item_ID。对于这些高维稀疏特征来说,抓取特征特征之间的组合关系非常关键:

  • 二阶特征组合:

  • users like to use food delivery apps at meal-time

  • app category和time之间的二阶组合

  • 三阶特征组合:

  • male teenagers like shooting games

  • gender, age, 和app category之间的三阶组合

对于feature-based的方法来说,能抓取特征的交互作用和关系非常重要。

  • Wide&Deep (Cheng et al, Recsys’16)

这个模型主要是将LR和DNN一起联合训练,注意是联合训练,一般的ensemble是两个模型是单独训练的。思想主要是:

  • LR擅长记忆;DNN擅长泛化(包括抓取一些难以人工设计的交叉特征)

  • LR部分需要大量的人工设计的feature,包括交叉特征

  • Deep Crossing (Shan et al, KDD’16)

这篇论文和wide&deep的主要差别是加了残差连接:

  • Empirical Evidence (He and Chua, SIGIR’17):

这篇论文主要想说明两点:

  • 如果只有raw feature,如果没有人工设计的特征,DNN效果并不够好
  • 如果没有很好的初始化,DNN可能连FM都打不过。如果用FM的隐向量来初始化DNN,则DNN的效果比FM好

  • NFM: Neural Factorization Machine(He and Chua, SIGIR’17)
    这个模型主要是,将FM里的二阶特征组合放到NN里,后面再接几层FC学习更高阶的特征组合。具体方法是:两两特征进行组合,即进行element-wise dot,得到一个K维的向量,然后所有组合的K维向量进行加和,得到一个K维的向量,往后再接几个FC,模型结构图如下:

效果上,该模型完爆了之前没有手工做特征组合的模型和FM:

  • AFM: Attentional Factorization Machine(Xiao et al, IJCAI’17):

这个模型主要是针对FM的不同特征的组合的结果的简单加和,变成加权平均,用attention来求权重(有利于提取重要的组合特征;NFM是使用MLP来学习不同特征组合的权重,且没有归一化的过程):

模型的整体结构图如下:

效果上,不带隐层的AFM就能干掉带一层隐层的NFM。如果增加隐层,AFM的效果能进一步提升:

  • DeepFM (Guo et al., IJCAI’17):

这一篇论文主要是将wide&deep的LR替换成FM,FM可以抓取二阶的特征组合关系,而DNN可以抓取更高阶的特征组合关系:

对上述的feature-based的方法做个简单总结:

  • 特征交互对matching function learning非常关键

  • 早期的对raw feature进行交叉,对效果提升非常有用:

  • wide&deep是手工进行组合

  • FM-based的模型是自动进行组合

  • 用DNN可以用来学习高阶的特征组合,但可解释性差。怎么学习可解释性好的高阶组合特征,依然是一个大的挑战。

part-3.3 Modern RecSys Architecture : representation learning和matching function learning的融合

  • Deep neural networks for youtube recommendations:

这一部分是我自己添加的,我觉得讲到推荐的话,这篇论文还是值得讲一讲的。这篇论文中有很多实践的干货,值得好好琢磨琢磨。

一个top-n推荐的系统一般也分两个排序阶段:

  • 粗排:万里挑百
  • 精排:百里挑十

整个推荐系统的架构图如下:

对于粗排模型:

采用分组全连接:

什么叫分组全连接呢?例如对特征分组,有两组特征是:1.用户过去14天点击过的视频的ID 2.用户过去3天观看时间超过2分钟的视频的ID,每一组特征内的ID的embedding加和,那每一组内都是一个全连接,每一组加和后都到一个定长的K维向量,如果有N组特征,就会一个定长的N*K维的特征,然后再接若干层FC,就可以预测用户对该视频的偏好程度。分组全连接的思想,有点像CNN里的局部连接。上述的Deep Matrix Factorization是全连接,第一层全连接的参数可能很大。

那么这篇论文的粗排具体是怎么做的呢?主要是以下几点:

  • 多分类,label=1为用户看完的视频
  • 输出层有v个节点,v是item的集合大小
  • 倒数第二层的输出表述user的embedding
  • 最后一层的权重表示每个item的embedding

那么通过这个模型,user和item的embedding都得到了,那么就可以用CF的方法,用内积计算出他们的匹配分,用来做粗排(召回)。所以上述的tutorial里的架构图才把粗排模型叫Collaborative Filtering Models。

对于精排模型,也是使用分组全连接的模型:

part-4 short summary

这篇tutorial总算撸完了,收获非常大。总体上,个人感觉推荐的深度学习模型比搜索的、NLP的要简单一点点。

总体上,不管是搜索还是推荐,匹配模型都主要分两大类:

  • representation learning,这种方法重点是学习出要匹配的两个物品的表示。具体到推荐中,可以根据可以使用的信息,例如文本、图像、语音等,来确定到底是使用auto-encoder、MLP、CNN还是RNN等模型结构
  • matching function learning,这种方法,在底层就进行匹配,然后用NN将基础的匹配信号进行融合,得到最后的匹配分。在推荐中,这种方法,想办法做一些特征组合非常重要

另外,svd++的思想很强大,很多nn的模型都是借鉴svd++来改进的;而svd++又是FM的一个特例,FM的威力也不可小觑。

参考链接:

https://www.comp.nus.edu.sg/~xiangnan/sigir18-deep.pdf

《搜索与推荐中的深度学习匹配》之搜索篇


本文地址:https://www.6aiq.com/article/1546854301776
本文版权归作者和AIQ共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出