零、本系列前言
- 生成式推荐应该是推荐领域24、25年当之无愧的大明星了,无论是从热度还是从工业界的跟进程度来看,都是瞩目的。所以咱也来学习一波。
- 本系列首先分享的是meta在24年发表的一篇论文,这篇论文算是生成式推荐里的鼻祖级了
- 整体讨论都会按照本人自己理解的顺序,而非论文架构的顺序,若有理解错误,欢迎讨论指正
一、什么是生成式推荐?
要了解这篇论文,我们肯定首先要来回答一下最基本的问题,什么是生成式推荐?简单来说,它主要就是基于用户的历史行为序列,通过生成式模型直接给进行推荐。下图就展示了传统推荐和生成式推荐的区别:

- 可以看出,传统推荐的主要方式就是把"用户和待推荐的物品"打一个交互分(代表点击概率/转化概率等),然后层层筛选出最有可能交互的物品。模型的输入往往是庞大的特征工程的产物。
- 而生成式推荐,则是直接根据用户的历史行为序列预测下一个可能交互的物品。类似于语言大模型,已知前面的序列是"胡萝_",然后预测下一个字"卜",只不过把这里的字换成了用户的历史行为。模型的输入更多的依赖交互的序列信息,不再需要庞大的特征工程
二、为什么要做生成式推荐?
- 传统的深度学习推荐,依赖大量的人工特征:有各种计数特征、率值特征、id特征等,在前沿公司这些可能是几百人的团队迭代多年的成果。
- 业界前沿逐渐发现,这样的模式难以通过扩大模型参数来获取收益,然而生成式的语言大模型却在"扩大模型参数"上获得了瞩目的效果,这当然会让人思考为什么推荐里扩大模型参数没有用,又该如何借鉴生成式语言大模型的经验呢。
三、meta是如何实现生成式推荐的?
我们来看看meta是怎么做的,接下来我们从样本制作、训练、预估三个角度去具体介绍metagr是如何实现生成式推荐的。最后我再介绍一下模型结构
-
样本制作
:上面我们说到生成式推荐有一个重要的特点就是基于用户历史序列,因此整个样本制作过程就是基于序列的过程。分为以下几个步骤:-
1.1 获取用户的历史交互过的物品(视频)以及对应的交互动作,然后交错排列。这也是本篇论文的一个创新点,之前的一些序列推荐工作里是不包含动作行为的。
image.png -
1.2 将物品和交互动作都进行embedding
image.png - 1.3 划分输入和输出(标签):meta本次的生成式推荐同时涵盖了召回和排序任务,而且架构上是基本统一的,区别就在于两个任务是交错的:
-
如果是召回任务,那就是在动作之后预估物品(序列最后一个是物品时则不进行预估),但是注意这里下一个物品可能是用户不喜欢的物品(负样本),如果模型还去学习的话,岂不是就学坏了,所以作者这里加了限制,只有下一个物品是用户喜欢的物品(正样本)时,才进行预估,否则直接忽略。那这里的标签就是用户实际交互的下一个正样本!
image.png -
如果是排序任务,那就是在待排序物品后,预估交互动作(序列最后一个是动作时,也不进行预估)。由于模型是自回归学习,因此预估的下一个物品又可以放到下一个输入的末尾,因此其实模型训练的label其实就是输入左移一位。如下图
image.png
-
-
-
模型训练:已知模型输入和标签后如何训练呢?
- 自回归的训练方式:meta在这里和很多序列模型(比如transformer)一样采用了自回归的训练方式,如下图(待补充),可以看出,同一条序列产生的多个样本的输入其实大部分都是一样的,那么在模型结构相同的情况下,很多对输入的处理都是重复的,所以经典的自回归训练会把这些样本汇合起来一起学习,那具体是怎么做到的呢?首先我们最开始把样本分开训练的目的是因为每个输入虽然大部分相同,但信息范围是不一样的,早产出的样本的输出在晚产出样本的输入里,假如一起训练,那自然就会出现信息穿越,所以经典的自回归方法在这里加了个掩码矩阵,确保先产出的样本看不到后产出的样本
- 损失函数
- 继续拆分召回和排序:
- 对于召回任务,我们的目的是从万千候选物品中预估出下一个正样本,而我们的模型输出是一个embedding向量,该向量不一定能对应到一个真实物品的embedding上,因此我们要做的就是尽量让这个embedding和下一个正样本的embedding尽量相似就好了,同时和其它负样本尽量不相似。所以这里需要计算模型输出值和候选集里的正样本和负样本的相似度分数(可以是向量内积,也可以是其它,比如一个小的mlp等)。因此我们希望在全量的候选集上和目标样本的相似度分数最大,因此最直观的就是采用softmax+交叉熵,但是全量候选集太大,所以随机采样出一些负样本来进行softmax,也就是sampled softmax。(画图的时候要体现出模型的输出要和正样本负样本算相似度)
- 对于排序任务:我们预估的是动作,动作的类别一般比较少,不需要sampled softmax了,如果是两动作(喜欢和不喜欢)那就用二分类交叉熵就好,如果是多个,那就用softmax加交叉熵就好
- 继续拆分召回和排序:
-
模型预估
- 召回任务中,得到了模型预估的下一个物品的embedding后,然后从候选库中找到相似度高的推出来即可。
- 排序任务中,还需要将模型的输出过一个简单的神经网络,用于线上的多目标多任务。
-
模型结构:讲完了整体的训练预估流程,我们再来讲下模型结构
image.png- 如上图所示,我们从左往右看:最左边代表整个模型的输入输出框架,中间是模型的大架构,可以看出就是由多个decoder模块通过残差的方式拼接的,右边则是模型的具体结构
- 和tranformer结构的区别
- 第一点区别是自注意力机制公式里,在QK相乘后,外面没有套softmax
- 第二点是增加了门控单元U
四、实验评估
论文里关于公开数据集的评估部分,相当于只评估了hstu的结构,实际上是没用到动作信息的(团队在github上也回复到,这是为了公平对比,因为之前的对比方法大部分也是没有用到动作信息的)
五、工程优化——meta是如何优化推理过程的
代码实现细节
公开数据集的比对部分,在research文件夹下
dlrm-v3下有物品和动作交替的序列的代码,但是给的训练代码中是没有使用的




