疫情在家阅读了大量了推荐系统论文,但是都没有好好的写过博客,基本上都是精读过后只记得论文的思想,重新阅读之前的论文还会对有些数学公式一知半解。基于这方面的考虑,还是决定在阅读论文的时候把对论文的思考和见解通过博客的形式记录下来。本人水平有限,希望大家多多指教,也欢迎批评和提出建议。
论文原文
论文链接:https://www.ijcai.org/Proceedings/2019/0380.pdf
论文题目:《Sequential and Diverse Recommendation with Long Tail》
一,背景
很多人吐槽过抖音的推荐算法,再点击一个视频之后,系统会一直给你推荐这个系列的视频,当你第二次,第三次点开这类视频后,系统又会给你推荐这类视频,这就造成了用户一直在这类视频的环绕下,没法跳脱出去。
序列推荐任务,学习顺序数据中用户行为的时间动态,并预测用户随后想要点击的项目。在推荐系统给用户做推荐的时候,系统认为用户的兴趣是单一的,只考虑了普通物品的序列建模分析,这会导致当序列推荐任务只关注一个用户兴趣点的情况,最后形成让用户不满意的推荐列表。我们知道,用户在一段很短的时间内的兴趣都是暂时的,我理解为:“一时兴起”。当然,如果推荐系统只是考虑这个“一时兴起”来给用户推荐,那么推荐的结果就会过于单一了,缺乏多样性。如果我们能把多样性这个问题考虑进去,给用户推荐更多不同类型物品的同时又把握住用户所谓的“单点兴趣”,就会让用户满意。
那么,如何来进行具有多样性优点的序列推荐呢?本来利用长尾物品来解决这个问题。长尾物品在推荐系统中往往是被移除的,这类物品被曝光的机率小,与用户交互的次数也很少,此时可能推荐模型学习不充分导致推荐系统的精度有所损失。所以,在很多任务里,为了不影响模型的精度,会选择将长尾物品剔除,牺牲了推荐的多样性,导致推荐的结果中包含很多热门的物品。多样性和准确性是矛盾的,为了提升多样性就会降低准确性,本文提出了一个方法,在保持准确性的同时提升了多样性。(小tip:协同过滤的模型会强调多样性)
二,模型与方法
2.1问题定义
该任务就是给定用户的行为序列,学习一个模型函数f,f会把用户的行为序列进行建模计算,得到最后的ranking score向量s,并根据这个向量进行分数排序,得到top-n个物品,即:
2.2 label的构建
本论文的label跟别的序列推荐的label不一样,具体后面会展开来说。
k-means聚类
这部分主要是对长尾物品进行聚类,利用长尾物品的内容向量来进行聚类,目的是为了让语义上很相近的长尾物品能更好地聚在一个类里。(这里有个疑问,物品的内容向量是怎么得出的,是物品的那些属性特征,商品类别这些向量吗)
这样每个长尾物品都被划分到一个类里,为了方便我们后面把长尾物品替换为它所属的类。
替换过程
假设有行为序列,其中T是长尾物品,G是普通物品,分别属于类,我们把这三个长尾物品替换为他们所属的类。
这里原文中提到用离类中心最近的那个物品来替代这个类,这里猜测这么做的理由是最中心的那个类能更好的代表整个类的,但是每次推荐的结果中只有这个item,这里原文所说的多样性应该是不同类之间的多样性,而不是每个类里面的多样性。用大白话来解释就是:推荐的时候包含一些不同类的长尾物品,只要是不同的类就行,不关心每个类里推荐的是那个物品。
Relocating
然而,我们不能直接用替换后的序列来进行序列推荐。传统的序列推荐是直接将长尾物品剔除,剩下的序列为:,并根据这个序列进行序列推荐,预测下一个会点击的普通物品。
分析一下上面说的为什么不可以直接用替换后的序列进行推荐,原因如下:
a)用替换够的序列进行推荐会损失模型的准确率,即损失对general items预测的准确率,因为模型可能会把下一个会点击的物品预测为tail items,而传统的序列推荐是只进行general items的预测,所以传统的序列推荐的准确率是比加入长尾预测的准确率高的,而普通物品的预测是序列预测任务中最重要的部门。
b)我们的目标是不仅不损失模型的准确率,还要引入多样性,如果把直接替换后的序列用于推荐,那么预测结果只可能是普通物品或者长尾物品,两者只能得其一,不符合我们的需求。
为了解决这些问题,文中把序列进行类重定位(relocating)操作,具体的步骤如图所示,步骤如下:
1,去掉training data里面的长尾物品,训练的数据中仅含有general items
2,把label替换成不仅包含普通物品还包含长尾物品,label里面还有两种物品
这里解释一下,比如用户的点击是,当我们在预测后面将会点击的物品时,我们会把当作label,但是会在前面。这意味着当用户点击完后可能会点击。在点击完后可能会点击,这样重定位后模型不仅可以预测普通物品,也能预测长尾物品类,而且普通物品的预测准确率不会损失,还保证了多样性。
2.3 利用GRU进行序列推荐
模型分为两部分子塔,一部分是general item的one-hot向量作为输入,然后进入到全连接层,相当于是进行embedding,然后进入gru,得到一个输出向量。另一部门也是进入一个gru网络,但是输入向量变成了物品的内容向量。最后将得到的两个向量拼接后送到全连接层,得到最后的ranking score向量,原文没有说这个向量的维度,这里猜测是物品的总数,每一个维代表一个物品的评分。
2.4 损失函数
J是序列中items的个数,损失函数很好理解,就是极大似然估计。这里来捋一下这个式子中各个符号的含义。
符号定义:
: item 的评分,来自于s=f(x),也就是s中的第个维度的值
: = < > ,即用户感兴趣的物品的集合(普通+长尾)
:j时刻,用户感兴趣的物品的集合,如<>
这里详细说一下这个概率为什么能进行排序作用,首先考虑一下softmax函数的特点,分子跟softmax一样,但是在分母中,跟传统softmax不一样,如果中只有一个item,那就是普通的softmax交叉熵损失函数。如果含有general 和tail物品,那么就不是简单的softmax函数了。首先当i = 1时,分母部门的求和符号会计算所有的exp指数的值+非关联物品的exp值;当i = 2时,这里用l = i剔除了普通物品的对softmax的影响,相当于时所有长尾物品自己的softmax,这里不会对普通物品的概率造成影响,只会让后续的长尾物品的概率变小,有点像第二个softmax的感觉。当然,i = 3,4,5...也一样。这个公式的效果就是让梯度更新的时候,普通物品的得分会变大,长尾物品的得分变小(但是相对于本身后面的长尾物品的得分会相对变大)。
有了这个损失函数后,我们要取得top-n个物品只需要取前n个分数较大的物品就可以了。
三,实验结果
评价标准采用MAP跟NDCG,效果还不错。
本文的介绍就到这里了,还有一些模型是怎么平衡准确率跟多样性的问题没有深入,有些细节还需要进一步讨论。