深度学习推荐系统(一)

原文来自微信公众号
 
协同过滤
  • 定义
协同过滤 就是协同大家的反馈、评价和意见一起对海量的信息进行过滤,从中筛选出目标用户可能感兴趣的信息的推荐过程。
  • 商品推荐的例子:
  1. 电商网站的商品库里一共有四件商品
  2. 用户X访问该电商网站,电商网站的推荐系统需要决定是否推荐电视机给用户X
  3. 将用户商品图转化成矩阵的形式,被称作“共现矩阵”,好评记为1,差评记为0,没有的可以取评分的均值
  4. 推荐问题转换成预测矩阵中问号元素的值的问题。
  5. 从共现矩阵中得知,用户B和用户C跟用户X的行向量近似,被选为Top n(n取2)的相似用户
  6. 相似用户对“电视机”的评价是负面的,因此预测用户X对“电视机”的评价也是负面的
  • UserCF
基于用户相似度进行推荐,被称为基于用户的协同过滤,如上所示
优点
符合人们直觉上的“兴趣相似的朋友喜欢的物品,我也喜欢”的思想
缺点
互联网应用场景下,用户数远远大于物品数,因此UserCF的用户相似矩阵存储开销非常大
用户的历史数据向量非常稀疏,对于只有几次购买或者点击行为用户而言,找到相似的用户准确率非常低
  • ItemCF
基于物品相似度进行推荐的协同过滤算法。
具体步骤:
  • 构建用户-物品m*n维的共现矩阵
  • 计算任意列向量间的相似性,构建n*n维物品相似度矩阵
  • 获取用户历史行为数据中正反馈物品列表
  • 利用物品相似度矩阵,找出与用户正反馈物品相似的Top k个物品,组成相似物品集合
  • 对相似物品集合,根据相似度分值排序生成最终排序列表
应用场景
  • UserCF具备更强的社交性,可以通过“朋友”的动态快速更新自己的推荐列表,适用于新闻推荐场景
  • ItemCF适用于兴趣变化较为稳定的应用,如电商场景
特点
  • 直观、解释性强
  • 头部效应较明显、泛化能力弱
  • 无法有效地引入用户特征、物品特征和上下文特征
相似度计算
  • 余弦相似度
缺点:对绝对值大小不敏感,在某些情况下会出问题。如:用户A对两部电影评分分别是1分和2分,用户B对两部电影评分分别是4分和5分,通过余弦相似度计算,两个用户相似度为0.98。
  • 皮尔逊相关系数
通过使用用户平均分对各独立评分进行修正,减小了用户评分偏置影响
  • 改进的皮尔逊相关系数
引入物品平均分的方式,减少物品评分偏置对结果的影响
矩阵分解算法
  • 原理
将用户和物品映射到同一个表示空间上,得到用户隐向量和物品隐向量,通过用户隐向量与物品隐向量的相似度给用户推荐。
矩阵分解算法将协同过滤生成的m*n维共现矩阵R分解成m*k维用户矩阵U和k*n维物品矩阵V,其中m是用户数,n是物品数,k是隐向量维数。
用户u对物品i的预估评分如下,其中pu是用户矩阵U中对应行向量,qi是物品矩阵V中的列向量
  • 求解过程
特征分解
只能作用于方阵,因此不能用于推荐。
特征分解是将方阵A分解成如下形式,其中Q是方阵A特征向量组成的矩阵,𝚺是特征值组成的对角矩阵。
特征向量v和特征值𝛌求解如下:
奇异值分解(SVD)
假设M是m*n的矩阵,矩阵的SVD如下,其中U是m*m的正交矩阵,V是n*n的正交矩阵,𝚺是m*n的对角阵。
取对角阵𝚺中较大的k个元素,矩阵M被分解成如下形式。
局限性
  • 要求原始共现矩阵是稠密,因此必须对缺失值填充
  • 传统奇异值分解计算复杂度高 ,达到了O(mn^2) 计算方式
梯度下降(GD):
确定目标
  • 让原始评分rui与用户向量和物品向量之积的差尽量小
  • 对目标函数求偏导
  • 更新参数
  • 迭代次数超过上限或者损失低于阈值结束训练
打分偏差优化
问题:不同用户打分体系不同,不同物品的衡量标准也不同。
为了消除用户和物品打分偏差,在矩阵分解时加入用户和物品的偏差向量,𝛍是全局偏差常数,bi是物品偏差系数,可使用物品i收到的所有评分,bu是用户偏差系数,可使用用户u给出的所有评分的均值。
特点
  • 泛化性强:一定程度解决数据稀疏问题
  • 空间复杂度低:不需要存储用或物品相似性矩阵,由n^2降低到(m+n)k
  • 扩展性和灵活性:与Embedding类似,便于与其他特征组合拼接
逻辑回归
  • 原理
利用用户、物品和上下文等多种特征,生成较为“全面”的推荐结果,逻辑回归将推荐问题转化成一个点击率预估问题。
  • 推荐流程
  • 将用户、物品和上下文等特征转化成数值型特征向量
  • 确定优化目标,训练模型
  • 服务阶段,输入特征向量,输出点击概率
  • 根据点击概率对候选物品进行排序,得到推荐列表
  • 优势
  • 数学含义支撑,假设因变量y服从伯努利分布
  • 可解释性强:各个特征的加权和,在施加sigmoid
  • 工程化的需要:易于并行、模型简单、训练开销小等
  • 局限性
  • 表达能力不强,无法进行特征交叉、特征筛选
POLY2
逻辑回归只对单一特征做简单加权,不具备特征交叉生成高维组合特征的能力,改造逻辑回归模型,使其具有多维度特征交叉是重要的。、
  • 原理
暴力组合特征,每种特征组合带有一个权重
Wh(j1, j2)是特征组合的权重
  • 特点
优点
通过暴力组合特征,一定程度解决特征组合问题
仍是线性模型,训练方法与逻辑回归无区别
局限性
特征交叉后会使原本非常稀疏的特征向量更加稀疏,导致大部分交叉特征权重缺乏有效的数据进行训练,无法收敛
权重参数数量由n变成n^2
FM
  • 原理
FM为每个特征学习一个隐权重向量,在特征交叉时,使用两个特征隐向量的内积作为交叉特征的权重
  • 推导
推导参考:
https://www.cnblogs.com/zhangchaoyang/articles/7897085.html
  • 特点
权重参数数量减少到了nk(k为隐向量维度,n>>k)
更好解决数据稀疏问题
FFM
  • 原理
相比于FM模型,FFM引入特征域概念,在做特征交叉时,每个特征选择与对方域对应的隐向量做内积运行,得到交叉特征权重。
每个特征对应的不是唯一一个隐向量,而是一组隐向量
在FFM模型训练过程中,需要学习n个特征在f个域上的k维隐向量,参数数量共n*k*f个,计算复杂度为kn^2
  • 举例
  • 特点
相比于FM,引入特征域,为模型引入更多有价值信息,使模型表达能力更强
FFM的计算复杂度上升到kn^2,远大于FM的kn
参考:
https://github.com/ycjuan/libffm
https://www.cnblogs.com/zhangchaoyang/articles/8157893.html
https://tech.meituan.com/2016/03/03/deep-understanding-of-ffm-principles-and-practices.html
GBDT+LR
如何有效地处理高维特征组合和筛选问题?
  • 组合特征结构
  • 影响
  • 推进特征工程模型化,即特征工程完全交由一个独立模型完成
LS-PLM
LS-PLM,又被成为MLR(Mixed Logistic Regression),首先对样本进行“分片”,在每个“分片”内部构建逻辑回归模型,将每个样本的各“分片”概率与逻辑回归的得分进行加权平均,得到最终预估值
  • 具体例子
  • 传统LR模型不能解决非线性问题,MLR可以克服该问题
  • 特点
端到端的非线性学习能力
总结
 
 
深度学习推荐系统特点
  • 丰富特征交叉方式
  • 组合模型
  • 引入注意力机制
  • 融合序列模型
  • 结合强化学习
AutoRec
  • 原理
利用协同过滤中的共现矩阵,完成物品向量或者用户向量的自编码,再利用自编码的结果得到用户对物品的预估评分,进而进行推荐排序。
  • 模型结构图:
  • item-based AutoRec胜出user-based AutoRec,这可能是由于每个物品评分的平均数量高于每个用户的评分数,用户评分数量的高方差导致基于用户的方法的预测不可靠
  • 激活函数如何选择?g(.) sigmoid, f(.) identity
  • 隐层数量?k=500
  • 特点
  • 使用一个单隐层泛化用户或物品评分,使模型具有一定泛化和表达能力
  • 模型简单,泛化能力不足
  • 结构上与word2vec一致
代码
https://github.com/xiaopp123/recommendation_practice/tree/master/AutoRec
Deep Crossing
  • 需要解决问题 如何解决稀疏特征向量稠密化问题
如何解决特征自动交叉组合问题
如何在输出层达成问题设定的优化目标
  • 模型结构图
embedding层将稀疏类别型特征转换成稠密向量,数值特征(如Feauture #2)直接进入stacking层
stacking层把不同embedding特征和数值型特征拼接一起,形成新的包含全部特征的特征向量
多层残差网络对特征向量各个维度进行充分交叉组合
残差网络解决的问题<br> 通过输入向量短路减少过拟合现象的发生<br> 解决梯度消失现象,收敛速度加快
Scoring 使用逻辑回归或者softmax
  • 特征表示
文本特征如query:转换为字符级的 3-gram 的形式,得到一个 49292 维的向量
类别特征:one-hot
CampaignID:按点击次数排序,取top1000,剩余的归为一类,形成1001个类别,然后one-hot
  • embedding
使用偏置项,max操作相当于relu
  • 评价
采用“Embedding+多层神经网络”的结构,没有人工特征工程的参与
没有引用注意力机制、序列模型等特殊结构
NeuralCF
  • 解决问题
矩阵分解后用户隐向量和物品隐向量点积过于简单,NCF通过”多层神经网络+输出层“的结构替代了矩阵分解中简单内积操作
  • 特点
利用不同互操作层进行特征的交叉组合,并且可以灵活的进行不同互操作层的拼接
基于协同过滤思想,没有引入其他类型的特征
代码
https://github.com/xiaopp123/recommendation_practice/tree/master/NeuralCF
PNN
  • 基本原理
乘积层代替Deep Crossing中的Stacking层,不同特征的embedding向量不是简单拼接,而是用product操作进行两两交互
输入有更多形式、不同来源的特征
多种特征交叉方式:内积,外积
  • 模型结构
Wide&Deep
  • 基本原理
单层的wide部分与多层的Deep部分组成混合模型
wide部分让模型具有较强的“记忆能力”,Deep部分让模型具有“泛化能力”
记忆能力: 利用历史数据中物品或特征的“共现频率”的能力,如LR,CF等
泛化能力:挖掘未出现的特征组合
  • 模型结构
Deep部分(左): 全量的特征向量,离散特征经Embedding层输入全连接层
Wide部分(右): 组合“已安装应用”和“曝光应用”两类特征
Deep&cross
  • 原理
使用cross网络替代原来wide部分,目的是通过多层交叉(Cross layer)增加特征之间的交互力度;Deep部分则与Wide&Deep保持一致。
  • 结构
模型结构如下:
FM与深度学习融合
  • FNN 使用FM的隐向量完成embedding层初始化
  • DeepFM
结合FM的推荐能力和DNN的特征学习能力,综合利用了低阶交叉特征和高阶交叉特征
模型结构
DeepFM 模型由两种组件构成:FM 组件、deep 组件,它们共享输入。这种共享输入使得DeepFM 可以同时从原始特征中学习低阶特征交互和高阶特征交互,完全不需要执行特征工程,最终模型联合了 FM 组件和 deep 组件的输出
FM Component
FM部分用于学习一阶特征和二阶交叉特征
假设输入包含 sparse 特征和 dense 特征,将sparse特征变成one-hot形式,dense保持其原始特征,通过向量拼接形成输入向量
FM的输出
标量wj对一阶特征重要性进行建模,即 FM 组件左侧的 + 部分
Vj用于对它的二阶特征重要性进行建模,即 FM 组件右侧的 x 部分
Deep Component
Deep部分是一个全连接的前馈神经网络,用于学习高阶特征交互
与FM共享输入embedding层,embedding层的输出如下,其中ei是field i,m是field number。
DNN的输出
参考
https://www.ijcai.org/Proceedings/2017/0239.pdf
https://github.com/ChenglongChen/tensorflow-DeepFM https://github.com/Johnson0722/CTR_Prediction/blob/master/Deep_FM/DeepFM.py
  • NFM NFM模型用一个表达能力更强的函数替代原FM中二阶隐向量内积部分
Embedding层:这是一个全连接层,将稀疏输入映射到一个稠密向量,vi代表第i个特征的Embedding向量,在embedding后,得到全部向量
 
 
Bi-Interaction层: 该层是一个池化操作,将一系列的Embedding向量转换成一个向量, ⦿表示element wise相乘,Bi-interaction层的输出是一个k维向量
注意力机制在推荐模型中应用
  • AFM AFM是NFM的延续,在NFM中,不同域的特征经过交叉池化层的交叉,将各交叉向量进行“加和“。 AFM引入注意力机制是通过在特征交叉层和最终的输出层之间加入注意力网络实现的。 模型结构
 
使用MLP获取注意力得分
AFM最后输出
 
DIN
背景
在电商领域,每个用户都有丰富的历史行为数据,历史行为数据指的是用户曾经点击过商品集合,如何对这些历史行为数据建模得到用户特征?
基准模型
普通DNN通常是在 embeddin层之后添加一个池化层,sum pooling 或者 avg pooling,将用户的一组历史行为 embedding 转化为固定尺寸的embedding 向量,这导致部分信息丢失,无法充分利用用户丰富的历史行为数据
基准模型embedding&MLP由两个部分组成:
embedding 部分:将稀疏 id 特征映射到 embedding 向量,对于长度可变序列,对向量序列聚合(sum pooling)
MLP 部分:将 embedding 向量馈入 MLP 来预测输出
  • DIN模型
引入注意力机制,通过候选商品和历史行为数据计算权重,该权重代表了“注意力”的强弱。
Dice激活函数
依赖于数据
参考
https://arxiv.org/pdf/1706.06978.pdf
https://github.com/zhougr1993/DeepInterestNetwork/tree/master/din
https://zhuanlan.zhihu.com/p/39439947
DIEN--序列模型与推荐系统的结合
  • 背景
DIN 在内的大多数兴趣模型都将用户行为直接看做兴趣,而用户的潜在兴趣往往很难通过行为来完全表示
考虑到外部环境和用户自身认知的变化,用户兴趣会随着时间动态变化,大多数模型都未考虑这一点
  • 模型结构
Interest Extractor层
从用户行为序列中提取背后的一系列兴趣状态。
使用GRU来对用户行为之间的依赖进行建模,GRU的输入是用户按时间排序的行为序列,也就是行为对应的商品。
实际上隐状态ht无法无法有效的表达用户兴趣,目标商品的点击是由最终兴趣触发的,因此损失函数中使用的 label 仅仅监督了最后一个兴趣状态hT,历史兴趣状态没有得到合适的监督
辅助损失:利用t+1步的行为监督第t步的兴趣状态ht,正样本就是真实的下一个item,负样本就是从item set中随机抽取的item
Interest Evolving层
用户的各种兴趣随着时间的推移不断演化
Interest Evolving层对与目标商品相关的兴趣演化轨迹进行建模
DIEN 结合了注意力机制的局部激活能力以及GRU 的序列学习能力来建模兴趣演化过程
注意力
GRU attention
GRU with attentional input (AIGRU)
Attention based GRU(AGRU)
 
GRU with attentional update gate (AUGRU)
参考
https://arxiv.org/pdf/1809.03672v1.pdf
https://github.com/mouna99/dien/blob/master/script/model.py
强化学习与推荐系统的结合
  • DRN
强化学习相比传统深度模型的优势在于强化学习模型能够进行“在线学习”,不断利用新学到的知识更新自己,及时调整和反馈。
模型学习过程
  • 初始化推荐系统(agent)
  • 推荐系统基于当前已收集的数据(state)进行新闻排序(action),并推送到网站或app(Environment)中
  • 用户收到推荐列表,点击或忽略(反馈)某推荐结果
  • 推荐系统收到反馈,更新当前状态或通过模型训练更新模型
  • 重复第2步
总结
 
 
 
posted @ 2020-10-07 09:58  zhaop  阅读(877)  评论(0编辑  收藏  举报