推荐系统二章:推荐系统中的召回算法(2)

学习搜广推主要根据FunRec的教程,面向有机器学习、深度学习基础的搜广推学习笔记。

地址:FunRec

本博客系列所有笔记都是对其中的重点内容进行总结。

如有侵权,请联系我删除。

1. FM模型

1.1 FM模型公式

FM模型本质上是对线性回归的拓展,在线性回归的基础上加入了特征交叉项,公式如下

  • 表示特征的序号,表示特征的数量。
  • 表示第个特征的值。
  • 分别表示特征对应的隐语义向量(Embedding 向量),
  • 均表示需要学习的参数。

可以看出前两项就是线性回归的公式,用到了一阶特征,后两项用Embedding向量的内积作为权重,乘以二阶特征(交叉特征),就是FM模型。

1.2 FM模型化简

FM模型的前两项都是线性复杂度,特征交叉项的复杂度为,为了降低计算复杂度,可以对其进行一些数学变换。

参照博客: FM模型详解

可以将第三项化为

整体化简过程如下

线

那么整个FM模型化简为

这样计算复杂度就从化为了

因为需要讲FM模型用在召回,因此将二阶特征拆分为用户和物品项,就有

其中表示用户相关特征集合,表示物品相关特征集合。

1.3 FM模型用于召回

我们可以使用FM模型的作为用户和物品之间的匹配分。

需要注意的是,对于同一用户,即使他与不同物品交互,但用户特征内部之间的一阶、二阶交互项得分都是相通的。这就意味着,在比较用户与不同物品之间的匹配分时,只需要比较:(1)物品内部之间的特征交互得分;(2)用户和物品之间的特征交互得分

这里原文解释的有点模糊,问了问LLM,用80岁老奶奶都听的懂的语言来解释这段话

你就把用户想象成一个人,这个人有自己的小脾气和习惯。比如说,这个人很挑剔,还很着急。这两个就是他的特点。

  • “一阶” 的东西呢,就好比这个人的 “挑剔” 这个小脾气自己产生的影响。不管这个人是在挑苹果呢,还是在挑衣服,他 “挑剔” 这个小脾气对他做选择的影响是一样的。
  • “二阶” 呢,就是 “挑剔” 和 “着急” 这两个小脾气一起产生的影响。不管他是在和卖苹果的打交道,还是和卖衣服的打交道,这两个小脾气合起来对他的影响也是一样的。

然后呢,要是我们想看看这个人跟不同的东西合不合得来(就像匹配分),我们就不用管他自己的小脾气之间的那些固定的影响啦。我们只要看看东西自己有啥特点之间互相影响(这就是物品内部之间的特征交互得分),还有这个人的小脾气和东西的特点之间的互相影响(这就是用户和物品之间的特征交互得分)就行啦。就好像我们不用管这个人自己有多挑剔、多着急自己是怎么回事,就看东西自己好不好、东西和这个人的小脾气搭不搭就行啦。

那么我们就可以丢弃掉用户的一阶特征和二阶特征交互项,也就是包含相乘的项。

  • 丢弃用户项之后的一阶特征:

  • 丢弃用户项之后的二阶特征

将一阶、二阶特征加起来就可以得到FM召回的匹配分公式

在基于向量召回模型中,一般都会得到用户和物品的特征向量表示,然后通过向量间的相似度表示用户对物品的兴趣。 也就是说,应该转化为向量乘积的形式

观察原表达式,很显然有用户项的式子是第三项,那么将用户部分单独提出来就有

其中第二项是将用户相关特征进行sum pooling

观察原表达式,只有最后一项有用户参与,因此只要将最后一项放到向量相乘的对应位置即可

其中第一项表示物品相关特征的一二阶特征交互,第二项表示物品相关特征的sum pooling

1.4 思考题

选自原文

Q:为什么不直接将 FM 中学习到的 User Embedding:和Item Embedding:的内积做召回呢?

A:直接这样做也可以,但效果不好。因为用户喜欢的未必是与自身最匹配的,也包括一些自身性质优秀的item,例如热门物品,所以需要将item的一阶权重和所有item embedding的两两点积之和考虑进去。最后也需要写成点积形式

2. Item2Vec

Item2Vec源自于Word2Vec,Word2Vec详见LLM学习笔记:Embedding, 这里补充做一些简单的补充,包括Skip-gram的一些知识点

2.1 Skip-gram与负采样

Skip-gram与CBOW是word2vec中的一对算法,CBOW是用周围的词预测当前中心词,Skip-gram是用当前中心词预测周围的词。Skip-gram的损失函数如下

意思就是用的单词预测前后个单词共计个单词的概率。

其中的公式是一个softmax函数,是指给定单词去预测单词的概率。

其中是当前中心词的Embedding,指的上下文单词的Embedding(也就是Context矩阵中的向量)。表示单词数量有个。

Softmax函数一直是NLP任务的大敌,因为词汇表数量是庞大的,导致分母的通常很大,计算开销增加增加迅速。为了减少计算开销,采用负采样的方法,采样更多错误样本来学习,跟对比学习有一些相似。举一个负采样的例子:

比如“我喜欢吃苹果”,对于 “喜欢” 这个词,从标签已经知道 “我”“吃”“苹果” 是正确的周围的词。但是还应该找一些其他的不相关的负样本词,像 “房子”“大树” 这些和 “喜欢” 在这句话里根本不挨着的词。通过比较这些正确的词和这些错误的词,模型就能越来越清楚每个词和它周围词的关系与区别。

基于负采样可以得到新的概率函数

带入到上面损失函数中,取对数,那么对于一个单词的损失函数为

其中表示负采样样本数量,为Sigmoid函数,如果是多个单词则再加上求和运算即可。

其他细节

  • 单词作为负样本被采样到的概率为

    其中表示对单词计数。为整个词汇表。

  • 单词作为中心词时,被丢弃的概率为

    其中是一个预先设定的阈值(通常取值在之间),是单词在语料库中的词频(即单词出现的频率)。从公式可以看出,词频越大,越小,那么单词被丢弃的概率就越大。这符合我们想要减少高频词影响的初衷。当非常大时,会趋近于 1,但不会等于 1。这是因为我们还是希望保留一些高频词的信息,只是减少它们的比例,避免它们完全主导训练过程。

2.2 Item2Vec

Item2vec的原理跟Skip-gram的模型非常相似,其中最大的两点不同是

  1. Skip-gram训练基于句子序列(sequence),但物品向量的训练基于物品集合(set)。
  2. 物品向量的训练丢弃了空间、时间信息。
  3. 训练出来的Embedding和Context矩阵都会保留。

Item2vec原论文暂时忽略了用户购买物品的顺序和时间,当然这在一定场景下不实用,原论文只讨论了该场景下他们实验的有效性。

Item2vec首先将商品,例如“手机”,“手机壳”,“充电器”等映射为一个向量,再通过word2vec的方式让他们在向量空间中的距离更相近,与其他商品,如“衣服”,“书籍”等向量距离较远。如果把用户的购买、浏览行为看作是一个“句子”,那么商品就是这个“句子”中的“单词”。

举一个例子可以更快速了解Item2vec的思想。

一个用户购买了牛奶、面包、鸡蛋三个物品,这三个物品的组合就相当于一个句子,每一样就是单词。当收集到足够多的购买记录(样本)时,就可以通过item2vec的方式将物品投射到向量空间中,且这三样物品的相似度很高。在下一次用户购买这三个物品中的一个时,就可以向用户推荐另外两个物品,相当于用户购买的商品就是“中心词”,推荐的其他商品就是“上下文”,用Skip-gram,就可以通过中心词预测上下文。这就是我们在使用电商平台时,购买一个物品后,“猜你喜欢”会推荐多个物品的原因。

此外,跟word2vec的不同的是,item2vec会同时保留Embedding和Context矩阵,每一个物品的向量表示同时由这两个矩阵决定,共有两种表示方式

  • 相加:
  • 堆叠:

两种都可以有很好的表现,根据实际情况调整。

Item2vec的缺点:Item2Vec 在计算物品之间相似度时,仍然依赖于不同物品之间的共现。因此其无法解决物品的冷启动问题。所谓冷启动,就是指新的商品上架时没有与别的商品一起出现过,item2vec就不知道它和别的东西像不像,因为没有用户买过。一种解决方案是找到这个冷启动物品类别中的其他物品,然后把它们的向量加起来求平均来代替冷启动物品的向量。