推荐系统二章:推荐系统中的召回算法(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:
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函数一直是NLP任务的大敌,因为词汇表数量是庞大的,导致分母的
比如“我喜欢吃苹果”,对于 “喜欢” 这个词,从标签已经知道 “我”“吃”“苹果” 是正确的周围的词。但是还应该找一些其他的不相关的负样本词,像 “房子”“大树” 这些和 “喜欢” 在这句话里根本不挨着的词。通过比较这些正确的词和这些错误的词,模型就能越来越清楚每个词和它周围词的关系与区别。
基于负采样可以得到新的概率函数
带入到上面损失函数中,取对数,那么对于一个单词
其中
其他细节
单词
作为负样本被采样到的概率为 其中
表示对单词计数。 为整个词汇表。 单词
作为中心词时,被丢弃的概率为 其中 是一个预先设定的阈值(通常取值在 到 之间), 是单词在语料库中的词频(即单词出现的频率)。从公式可以看出,词频 越大, 越小,那么单词被丢弃的概率就越大。这符合我们想要减少高频词影响的初衷。当 非常大时, 会趋近于 1,但不会等于 1。这是因为我们还是希望保留一些高频词的信息,只是减少它们的比例,避免它们完全主导训练过程。
2.2 Item2Vec
Item2vec的原理跟Skip-gram的模型非常相似,其中最大的两点不同是
- Skip-gram训练基于句子序列(sequence),但物品向量的训练基于物品集合(set)。
- 物品向量的训练丢弃了空间、时间信息。
- 训练出来的Embedding和Context矩阵都会保留。
Item2vec原论文暂时忽略了用户购买物品的顺序和时间,当然这在一定场景下不实用,原论文只讨论了该场景下他们实验的有效性。
Item2vec首先将商品,例如“手机”,“手机壳”,“充电器”等映射为一个向量,再通过word2vec的方式让他们在向量空间中的距离更相近,与其他商品,如“衣服”,“书籍”等向量距离较远。如果把用户的购买、浏览行为看作是一个“句子”,那么商品就是这个“句子”中的“单词”。
举一个例子可以更快速了解Item2vec的思想。
一个用户购买了牛奶、面包、鸡蛋三个物品,这三个物品的组合就相当于一个句子,每一样就是单词。当收集到足够多的购买记录(样本)时,就可以通过item2vec的方式将物品投射到向量空间中,且这三样物品的相似度很高。在下一次用户购买这三个物品中的一个时,就可以向用户推荐另外两个物品,相当于用户购买的商品就是“中心词”,推荐的其他商品就是“上下文”,用Skip-gram,就可以通过中心词预测上下文。这就是我们在使用电商平台时,购买一个物品后,“猜你喜欢”会推荐多个物品的原因。
此外,跟word2vec的不同的是,item2vec会同时保留Embedding和Context矩阵,每一个物品的向量表示同时由这两个矩阵决定,共有两种表示方式
- 相加:
- 堆叠:
两种都可以有很好的表现,根据实际情况调整。
Item2vec的缺点:Item2Vec 在计算物品之间相似度时,仍然依赖于不同物品之间的共现。因此其无法解决物品的冷启动问题。所谓冷启动,就是指新的商品上架时没有与别的商品一起出现过,item2vec就不知道它和别的东西像不像,因为没有用户买过。一种解决方案是找到这个冷启动物品类别中的其他物品,然后把它们的向量加起来求平均来代替冷启动物品的向量。