Shusen Wang推荐系统学习 --召回 矩阵补充 双塔模型
矩阵补充
该模型(不清楚叫什么,属于矩阵补充)是使用用户id和物品id经过embedding映射到一个向量上,使用向量的内积作为用户对物品的兴趣。
训练时使用的损失函数自然要使用用户对该物品的真实兴趣与预测兴趣之间的差距
minA,B∑(u,i,y)∈Ω(y−⟨au,bi⟩)2
\min_{\mathbf{A}, \mathbf{B}} \sum_{(u, i, y) \in \Omega} \left( y - \langle \mathbf{a}_u, \mathbf{b}_i \rangle \right)^2
A,Bmin(u,i,y)∈Ω∑(y−⟨au,bi⟩)2
该模型训练时需要正负样本,正样本为曝光给用户且用户真正点击的物品代表用户对该物品感兴趣,负样本是曝光给用户但用户没有点击的。
现实中这个模型的效果不好,原因主要有以下几点:
- 1.这里输入embedding的真的只是id,没有其他特征
- 2.负样本选取方式不对
正负样本的选型之后会讲 - 3 训练的方法不好
使用内积不如使用余弦相似度,使用均方差损失函数不如交叉熵损失函数
矩阵补充线上服务流程
线下训练得到矩阵A,B,将需要推荐的用户的id输入矩阵A,得到向量a,最近邻查找找到与向量a最接近的k个向量作为召回结果。
很明显,时间复杂度与物品数量成正比,优化方式是先聚类获取每个类的向量,与所有大类计算距离,再在该类中找到最近的几个物品召回。
双塔模型
前面提到模型有很多缺点,针对这些缺点就有了双塔模型,双塔模型和矩阵补充一样,也分为用户和物品,两者的参数也不互通
获得用户向量和物品向量之后,使用余弦相似度计算他们之间的相似度代表用户对物品的感兴趣程度。
离散特征和连续特征
离散特征
特点是离散,没有中间值,通常是表示类别的
例如:性别,颜色等
通常做的处理是通过embedding映射为一个向量
连续特征
特点是连续,例如:年龄,房价等
通常的处理是归一化,分桶等
双塔模型的训练
Pointwise
将召回任务看成一个分类任务,对于正样本鼓励cos<ai,bi>cos<a_i,b_i>cos<ai,bi>接近于1,对于负样本鼓励cos<ai,bi>cos<a_i,b_i>cos<ai,bi>接近于-1
要将正负样本比例接近于1:2或者1:3
损失函数为三元组损失函数:
L(a,b+,b−)=max{0, cos(a,b−)+m−cos(a,b+)}
L\left( \mathbf{a}, \mathbf{b}^+, \mathbf{b}^- \right) = \max\left\{ 0,\ \cos\left( \mathbf{a}, \mathbf{b}^- \right) + m - \cos\left( \mathbf{a}, \mathbf{b}^+ \right) \right\}
L(a,b+,b−)=max{0, cos(a,b−)+m−cos(a,b+)}
三元组损失函数的平滑版本
L(a,b+,b−)=log(1+exp[σ⋅(cos(a,b−)−cos(a,b+))])
L\left( \mathbf{a}, \mathbf{b}^+, \mathbf{b}^- \right) = \log\left( 1 + \exp\left[ \sigma \cdot \left( \cos\left( \mathbf{a}, \mathbf{b}^- \right) - \cos\left( \mathbf{a}, \mathbf{b}^+ \right) \right) \right] \right)
L(a,b+,b−)=log(1+exp[σ⋅(cos(a,b−)−cos(a,b+))])
exp是指数函数
思想是鼓励cos<a,b+>cos<a,b^+>cos<a,b+>大于cos<a,b−>cos<a,b^->cos<a,b−>
平滑意味着函数是连续可导的,以便于使用梯度下降算法进行优化
Listwise
选取一条正样本和多条负样本,思想是鼓励正样本的相似度值尽量大,负样本尽量小。
损失函数也是使用交叉熵损失函数,其实就是−logs+-log{s^+}−logs+将损失最小化,就是使得s+s^+s+最大化
正负样本的选择
正样本
曝光且用户真正有点击的样本,存在问题是少部分样本占据大部分点击,导致热门样本越热门,冷门样本越冷门,因此需要对热门样本做降采样,或者对冷门样本做过采样。
负样本
首先来说一下为什么不能选择曝光给用户但是没有交互的物品,因为曝光给用户的物品已经是用户感兴趣的物品了,没有点击不代表用户不感兴趣。因此不能选取曝光但未点击的物品作为负样本。
负样本的选择分为简单负样本和困难负样本
简单负样本
- 未被召回的样本,未被召回的样本对用户来说,大概率是不感兴趣的
未被召回的物品是很多的,约等于全体样本,怎么采样呢,因为未被召回的样本大概率是冷门的,所以也会导致热门越来越热门,冷门越来越冷门,所以要抑制这样的情况。
因此要选择非均匀采样,抽样概率与点击次数的0.75次幂正相关。使得热门样本相对冷门样本采样为负样本的概率更大 - batch内负样本,该思想认为,用户1对物品1感兴趣,那么对于其他的物品2,3,4都不感兴趣,这里的2,3,4都是负样本,这里其他物品的选取为负样本的概率是正比于点击次数的一次幂。此选取方法训练与预测时相似度计算不一致,训练时公式为
cos(a,bi)−logpi \cos\left( \mathbf{a}, \mathbf{b}_i \right) - \log p_i cos(a,bi)−logpi
推理是公式就是余弦相似度
pip_ipi是选取为负样本的概率,当点击次数越高,pip_ipi增大log(pi)log(p_i)log(pi)增大,相似度就变小,意义也是抑制热门物品对推荐系统的贡献
困难负样本
困难负样本一般是粗排或者精排被淘汰的样本,因为此时被淘汰的样本已经与用户感兴趣的样本十分相似了,所以不好分类。
训练时一般采用50%的简单负样本,和50%的困难负样本
负样本的选择
对于负样本的选择上,要看是训练那一部分的模型,我这一章讲的是召回模型,因此不能将曝光但未点击的样本作为负样本,但是此类样本可以作为排序模型训练的负样本
双塔模型的线上召回与更新
相对于用户特征,物品特征更稳定,因此可以把物品的向量在线下进行计算和存储,线上获取用户特征之后线上计算用户向量。
检索时使用最近邻检索
模型更新
模型更新分为全量更新和增量更新,全量更新是使用全天的数据进行训练更新的,但是人的兴趣想看的东西是在不断变化的,一天的时间太长了,短时间的更新就是增量更新。
增量更新和全量更新的关系如上图,为什么不能直接使用增量更新的模型呢,为什么不能一直做曾量更新呢,因为人的兴趣包括长期兴趣和短期兴趣,如果一直做增量更新就会导致模型遗忘了用户的长期兴趣。