写在前面
本文为王树森老师《小红书推荐系统公开课》的课程笔记
- 课程来源:ShusenWang的个人空间-ShusenWang个人主页-哔哩哔哩视频 (bilibili.com)
- 课程资料:GitHub - wangshusen/RecommenderSystem
由于篇幅较长,分为【上】【下】两篇文章来记录。其中【上】包括推荐系统基础、召回、排序,文章链接:【上】王树森《小红书推荐系统公开课》- 课程笔记(推荐系统基础、召回、排序)
【下】包括特征交叉、行为序列、重排/推荐系统多样性、物品冷启动、涨指标的方法,内容导航如下:
(四)特征交叉
特征交叉在召回和排序中都会用到。在推荐系统的应用中,特征交叉很有必要,可以让模型的预测更准确
1、Factorized Machine(FM)因子分解机
线性模型
- b:偏移项,bias/intercept
- wi:每个特征的权重
- p:对目标的预估(如果是二分类,可以用sigmoid激活函数)
d个特征之间只有相加、没有相乘,也就是说特征之间没有交叉
二阶交叉特征
- xixj是两个特征的交叉,uij是交叉特征的权重
- 大多数参数是模型交叉特征的权重u。如果d很大,参数数量太大,计算代价大,且容易出现overfitting
用特征交叉的话,两个特征不仅能相加,还能相乘,这样可以提升模型的表达能力
FM
上面提到,如果d很大,参数数量太大,计算代价大,容易出现overfitting。那如何减少参数数量?
- 重点关注交叉特征的权重uij
U矩阵有d行d列(d是参数数量),是个对称矩阵,可以对其做低秩近似:
- k << d,k是个超参数,由我们自己设置。k越大,矩阵V * V^T 就越接近矩阵U
- 此时 uij 就可以近似为 vi 和 vj 的内积
由此就得到了FM模型:
FM优点:
- FM是线性模型的替代品,能用线性回归、逻辑回归的场景,都可以用FM(FM本质上就是在线性模型后面加了交叉项)
- FM使用二阶交叉特征,表达能力比线性模型更强
- FM参数数量更少,二阶交叉权重的数量由 O(d^2) -> O(kd),其中 k<<d,d是特征数量。使得推理的计算量更小,且不容易出现过拟合
以前的应用:用逻辑回归预估点击率,在逻辑回归中用FM做特征交叉,在推荐系统中效果很好
2、DCN(深度交叉网络)
用来代替简单的全连接网络,召回和排序中都可以用
回顾召回、排序模型
召回的双塔模型(是一种框架,而不是具体的神经网络)中,用户塔、物品塔可以用任意的神经网络结构,最简单的就是全连接神经网络,可以换为深度交叉网络DCN,效果更好
多目标排序模型中,输入是用户、物品、统计、场景等特征,输出是对点击率、点赞率等指标的预估。中间的神经网络负责对特征做变换,输出一个特征向量,这个神经网络被所有任务共享,所以叫做shared bottom。它的网络结构可以任意,最简单的实现就是用多个全连接层,如果用更好的神经网络结构如DCN,模型预估的准确性会更高
排序用的MMOE模型,3个专家神经网络(第1号~第3号),用途是把各种输入特征(用户、物品、统计、场景等特征)拼接后映射到新的特征向量,用于顶层的预估任务。这3个专家神经网络也可以用任意的结构,包括全连接网络、深度交叉网络等
交叉层(Cross Layer)
DCN的基本组成单元。每个交叉层的输入、输出都是向量,且形状相同
x_0为输入,经过 i层 后神经网络的输出为x_i,下面详细讲解第i个交叉层的结构:
- Skip Connection(把输入和输出相加)是深度学习中的一种常用技巧,可以防止梯度消失
每一步拆解:
- 第i个交叉层的输入:x_0、x_i。其中x_0是整个神经网络最底层的输入,x_i是神经网络第i层的输入
- 全连接层输出是个向量,跟输入的 x_i向量 大小一样
- 参数全在全连接层里,即W和b,需要在训练过程中用梯度去更新;其余操作为向量哈达玛积和向量加法,都没有参数
- 哈达玛乘积(Hadamard Product):逐元素相乘,输入输出向量维度一致。因为是逐元素相乘,故要求输入维度一致
- 第i个交叉层的输出:x_(i+1)
交叉网络(Cross Network)
x_0向量是交叉网络的输入
上面介绍的是Cross Network V2,对应paper:Ruoxi Wang et al. DCN V2: Improved Deep & Cross Network and Practical Lessons for Web-scale Learning to Rank Systems. In WWW, 2021.
老版本(原始版本)的Cross Network 现在已经没用了,对应paper(没必要看):Ruoxi Wang et al. Deep & Cross Network for Ad Click Predictions. In ADKDD, 2017.
深度交叉网络(Deep&Cross Network,DCN)
结合交叉网络和全连接网络,两个网络并联;再加上全连接层,即为DCN
3、LHUC(PPNet)
LHUC与交叉网络的想法类似,在工业界有效,但只能用于精排
标准的多目标排序模型 结构如下,中间的Shared Bottom被多个任务共享,Shared Bottom用全连接网络、深度交叉网络、LHUC都可以
in语音识别
LHUC 全称 Learning Hidden Unit Contributions,起源于语音识别:Pawel Swietojanski, Jinyu Li, & Steve Renals. Learning hidden unit contributions for unsupervised acoustic model adaptation. IEEE/ACM Transactions on Audio, Speech, and Language Processing, 2016.
- 语音识别的输入是一段语音信号,用神经网络对输入的信号做变换,得到更有效的表征,然后识别出语音中的文字
- 语音是人说的,不同人的声音会有所区别,所以最好加入一些个性化,即说话者的特征。最简单的特征就是说话者的ID,对其做Embedding
- 上面输出的两个向量形状完全一致,这样才可以做哈达玛积(逐元素相乘),这样可以把语音信号的特征和说话者的特征相融合,语音信号有的特征被放大,有的特征被缩小,这样做到个性化
一个简单的例子如下,LHUC重复了两个模块(做了两次哈达玛积),实践中想实现更深的网络也没有问题:
in推荐精排(PPNet)
快手将LHUC应用在推荐精排,称作PPNet:快手落地万亿参数推荐精排模型,2021
4、SENet & Bilinear交叉
这两种方法用在排序模型上都有收益
SENet
Jie Hu, Li Shen, and Gang Sun. Squeeze-and-Excitation Networks. In CVPR, 2018. 其提出是应用在CV(计算机视觉)问题上
把SENet用在推荐系统的一篇Paper:Tongwen Huang, Zhiqi Zhang, and Junlin Zhang. FiBiNET: Combining Feature Importance and Bilinear feature Interaction for Click-Through Rate Prediction. In RecSys, 2019.
这里只介绍SENet在推荐系统中的应用
SENet怎样对这些特征做变换?
设一共有m个特征,每个特征都表示成一个k维向量,可以把所有特征表示成一个m*k的矩阵
- 中间m维向量的作用就是对特征做加权,比如学出物品ID这个特征对任务的重要性不高,就对物品ID的Embedding降权
上面把m个离散特征都映射成k维向量,其实这m个向量的维度可以不同,不会影响SENet(对每个向量做AvgPooling得到一个m维向量,再用两个全连接层FC得到另一个m维向量,用来对一开始的m个向量做加权)。最终SENet输出右边的m个向量,跟左边的m个向量的形状完全相同
总结SENet:
-
SENet 对离散特征做 field-wise 加权
-
什么是field? ⽤户ID Embedding 是64维向量,那么这64个元素算⼀个field,获得相同的权重
- 如果有m个离散特征,即m个fields,那么SENet计算出的权重向量就是m维,用这个向量的元素给fields做加权。也就是说,SENet会根据所有特征,自动判断每个fields的特征重要性,重要field的权重高,不重要field的权重低
Field间特征交叉
把两个field做交叉,得到新的特征。比如说,把物品所在地点、用户所在地点这两个特征各自做embedding,然后把两个embedding向量做交叉。怎样交叉两个向量?
内积/哈达玛积
推荐系统中m(离散特征)的数量不是很大,量级也就几十
- 左侧内积,m^2个实数,可以接受
- 右侧哈达玛积,m^2个向量,不能接受。故一般人工选择一些pair交叉,不能对所有m fields两两交叉
不论是内积or哈达玛积,都要求每个特征的embedding向量形状一样,都是k维向量;若形状不同,无法计算内积or哈达玛积
Bilinear Cross
包含内积和哈达玛积两种方式
方式1:内积
- x_i和x_j是两个特征的Embedding,它们的形状可以相同也可以不同
- f_ij是两个field的交叉。若有m个field,则会产生m^2个交叉特征(实数)
- W_ij为参数矩阵,若有m个field,则会产生 m^2 / 2 个参数矩阵。假如每个参数矩阵大小都是64*64,有1000个这样的参数矩阵,那么Bilinear Cross的参数量是400w
- 想要减小参数数量,需要人工指定某些相关且重要的特征做交叉,而不能让所有特征两两交叉
方式2:哈达玛积
- 先把参数矩阵W_ij 和 特征向量x_j 相乘,得到一个向量;再求两个向量的哈达玛积(逐元素相乘)
- 输出向量f_ij。若有m个field,会产生m^2个向量,对m^2个向量做concatenation,得到的向量维度太大,且其中大多数都是无意义的特征
- 因此在实践中,最好人工指定一部分特征做交叉,而不是让所有m个特征两两交叉,这样既可以减少参数数量,也可以让concatenation之后的向量变小
【小结】
SENet对离散特征做field-wise加权,让重要的特征获得大权重,不重要的特征获得小权重
Field间特征交叉,让两种特征的embedding向量做交叉,有3种方式:
- 向量内积
- 哈达玛积
- Bilinear Cross
结合SENet 和 Bilinear Cross,就得到了FiBiNet
FiBiNet = SENet + Bilinear Cross
FiBiNet用SENet加权和Bilinear Cross,用在精排模型上有收益
- 离散特征:如用户ID、物品ID、物品类目,等等
- 之前就是把离散特征embedding(用一个向量表示一个特征)concat后的向量,跟连续特征拼起来,作为排序模型的输入
- FiBiNet还做了其他的特征变换,见红框部分
- 对这些embedding向量做Bilinear Cross,得到很多交叉特征,拼接成一个向量
- 用SENet对这些embedding向量做加权,得到同样大小的向量;再对这些向量做Bilinear Cross,得到很多交叉特征,拼接成一个向量(小红书在实践中没做这一步)
- 把FiBiNet对离散特征变换之后得到的特征向量、变换后的连续特征一起输入上层的神经网络
(五)用户行为序列(last-n)
把用户行为序列叫做 last-n,指用户最近交互过的n个物品的ID。用户的 last-n行为序列 可以反映出用户对什么样的物品感兴趣
召回的双塔模型、粗排的三塔模型、精排模型都可以用 last-n特征(十分有效,用在召回和排序模型中,所有指标都会大涨)
1、用户历史行为序列建模
多目标排序模型:模型的任务是预测点击率、点赞率等指标,根据指标对物品做排序,选出用户最感兴趣的物品
重点关注用户特征中的 last-n行为序列:
取平均是早期的做法,现在也很常用;效果更好的做法是Attention,但计算量太大
用户lastN序列特征
LastN:用户最近n次交互(点击、点赞、收藏、转发等行为)的物品ID
- 对LastN物品ID做embedding,得到n个向量
- 把n个向量取平均,作为用户的一种特征
- 注意,用户还有其他的很多特征,比如用户ID、离散特征、连续特征等,把所有这些特征拼起来,作为用户特征输入神经网络
适用于召回双塔模型、粗排三塔模型、精排模型
小红书的实践
小红书的召回、粗精排都用到了LastN行为序列
- 对同一种行为的向量取平均,得到点击、点赞、收藏等行为的LastN向量表征
- 把这些向量拼起来,作为一种用户特征
- 实践中不止用物品ID,还用物品的其他特征,如物品类目。把物品ID Embedding和物品其他特征Embedding拼在一起
2、DIN模型(注意力机制)
DIN模型是对 LastN序列建模 的一种方法,效果优于简单的平均。用于精排
如上图,取平均最简单,但效果不是最好。DIN是一种更好的LastN序列建模方法,由阿里于2018年提出
Zhou et al. Deep interest network for click-through rate prediction. In KDD, 2018.
- DIN用加权平均代替平均,即注意力机制(Attention)
- 权重指候选物品与用户LastN物品的相似度(实数α)。哪个LastN物品与候选物品越相似,它的权重就越高
- 啥是候选物品?比如粗排选出了500个物品,它们就是精排的候选物品。精排模型要给每个候选物品打分,分数表示用户对候选物品的兴趣,最后根据分数的高低给这500个候选物品排序,保留分数最高的几十个展示给用户
- 计算相似度的方法有很多,比如内积、cos
【DIN模型-总结】
- 对于某候选物品,计算它与用户LastN物品的相似度,得到 α_1 ~ α_n
- 以相似度为权重,求用户LastN物品向量的加权和,结果是一个向量
- 把得到的向量作为一种用户特征,输入排序模型,预估 (用户, 候选物品) 的点击率、点赞率等指标,它们会决定候选物品的排序
- 本质是注意力机制
本质:注意力机制
简单平均 vs 注意力机制
简单平均 和 注意力机制 都适用于精排模型
简单平均还适用于召回的双塔模型、粗排的三塔模型
- 简单平均只需要用到LastN,属于用户自身的特征,跟候选物品无关
- 把LastN向量的平均作为用户塔的输入
注意力机制不适用于双塔模型、三塔模型
- 注意力机制需要用到 LastN + 候选物品
- 用户塔看不到候选物品(比如双塔召回时,有上亿候选物品,用户只能看到用户特征,看不到候选物品特征),故不能把注意力机制用在用户塔
3、SIM模型(长序列建模)
保留用户长期兴趣
回顾DIN
Zhou et al. Deep interest network for click-through rate prediction. In KDD, 2018.
- 计算用户 LastN向量 的加权平均
- 权重是候选物品与每个LastN物品的相似度
DIN模型的缺点:
- 注意力层的计算量 ∝ n(用户行为序列的长度)
- 只能记录最近几百个物品(一般一两百个物品),否则计算量太大
- 缺点:关注短期兴趣,遗忘长期兴趣
如何改进DIN?
- 目标:保留用户长期行为序列(n很大),而且计算量不会过大
- 改进DIN:
- DIN对LastN向量做加权平均,权重是相似度
- 如果某LastN物品与候选物品差异很大,则权重接近0
- 如果把不相关的物品从LastN物品中排除掉,几乎不会影响DIN加权平均的结果
- 只把相关物品输入注意力