LEARN:百川大模型在快手推荐中的应用
聊起这两年的推荐论文,冷启动和长尾问题几乎是绕不开的话题。就像前几年大家一窝蜂扎进序列模型和多目标优化里一样,现在这些问题的解决方案,外壳也从时序模型一路换到了对比学习、大语言模型。说到底,问题其实一直都在,只不过我们现在手里有了更好用的工具去解决它。这种“鸡生蛋、蛋生鸡”的循环,总是那么迷人,又那么处处显露。
关于冷启动和长尾推荐,传统模型最头疼的地方在于对ID的依赖。说白了,大多数模型学到的价值,就是那个ID对应的Embedding向量。一旦数据量不够,效果自然就大打折扣。
所以今天来分享一篇快手的工作,他们把百川大模型应用到了推荐系统中。
LLM-Rec大模型推荐
大型语言模型(像GPT-3,这里用的是Baichuan2-7B)在处理和理解自然语言上确实表现出色。把它作为基座,本质上是看中了它身上那种更普世的知识提取能力。这样一来,推荐系统就能更好地理解物品描述,提高推荐的准确性和多样性。
Baichuan2-7B:
把大语言模型引入推荐,前几年的工作里也一直有。比如Bert4Rec、RankT5、RecFormer这些,都算得上是早期的尝试。具体到落地方式,行业里大致分成两派:
- :这种做法是借助LLM来生成物品的内容Embedding。通常是通过处理物品的文本描述(标题、说明、评论等),来捕捉物品的语义信息。Chat-Rec就是典型代表。
冻结LLM的参数,只让模型适应推荐领域的数据
- :这种方法更直接,利用LLM来捕捉用户的行为序列。通过设计巧妙的提示词(prompt),让LLM去学习用户和物品之间的潜在关系,在预测任务中理解用户的偏好变化。TallRec在这方面做了示范。
用推荐领域的特定文本数据集对LLM进行微调
但这篇论文认为,以上两种方式本质上都是在把LLM的广域能力和推荐领域强行缝合(也就是Rec-to-LLM)。这样做有个隐患:随着推荐任务的学习,模型可能会遗忘它在预训练阶段学到的那些通用知识,出现所谓的“灾难性遗忘”。
于是,他们提出了一个叫LEARN的新框架(Llm-driven knowlEdge Adaptive RecommeNdation)。这个框架的目标很明确:让大模型和推荐系统高效融合,但更像是一种特征提取。LEARN通过双塔结构(用户塔和物品塔),把LLM生成的Embedding作为输入,来改进推荐性能。
LEARN
LEARN模型的结构不复杂,就是两个塔:用户塔(User Tower)和商品塔(Item Tower)。每个塔里又包含两个核心模块:内容Embedding生成模块(CEG)和偏好理解模块(PCH)。
商品文本描述
我们首先得给每个商品做文本描述,包括它的标题、品类、品牌、价格、关键词和属性:

内容Embedding生成模块(CEG)
这一步的原理比较简单。先通过主谓宾结构把商品的描述信息转成一个完整的句子,然后扔进大模型,提取出所有token的高维向量,再经过一个均一池化操作,最终生成一个固定的Embedding。关键在于,在训练阶段,LLM是冻结的,目的就是为了防止它遗忘掉那些广域知识。

偏好理解模块(PCH)
这个模块可以看作是在生成用户的Embedding。具体做法是:把用户历史交互过的商品的那些内容Embedding,按顺序组成一个序列,输入到Transformer里,进行时序预测。简单来说,就是通过用户看过什么,来推断他接下来会对什么感兴趣。训练阶段,这里用了一个自监督的对比学习目标,目的是让模型能更清晰地分辨用户偏好的商品和不感兴趣的商品。

历史序列和目标序列
行为序列的处理也很直观。就是把当前曝光时刻作为一个分界点,之前的归为历史序列,之后的当作目标序列。对于第i个用户,可以这样定义:
- 历史交互序列:
U_hist_i = {Item_i1, Item_i2, ..., Item_iH} - 目标交互序列:
U_tar_i = {Item_i(H+1), Item_i(H+2), ..., Item_i(H+T)}
用户塔和商品塔
用户塔就是前面说的PCH模块。而商品塔呢,论文里给了三种样式:

用户塔、商品塔
- :这个变体跟用户塔共享了相同的架构和模型权重,但输入的是用户的目标交互序列。它的好处是,通过因果注意机制(causal attention)来处理用户历史交互,能让用户和商品的Embedding在同一个空间里对齐。
Variant 1
- :使用自注意机制(self-attention mechanism),只关心商品本身,独立处理每个商品,不考虑商品之间的先后顺序。
Variant 2
- :最直接,就直接用CEG生成的内容Embedding。训练时用用户的目标交互序列,推理时就只用单个商品的文本描述。
Variant 3
训练时,Variant 1 的输入是用户目标交互序列,而Variant 2 和3都是独立处理每个商品。推理时,三种变体都简化了:只需要一个商品的文本描述,就能独立输出它对应的Embedding。
损失和实际模型
到了实际应用里,模型的目标还是预测CVR(转化率)。所以,训练时还得加上一个传统的、专门做CVR预测的MLP结构:

因此,最终的损失函数由两部分组成。
主损失(Main Loss)
主损失(Main Loss)
主损失直接来指导模型学习。输入是用户Embedding和商品Embedding,目标是预测用户对商品的偏好程度。正样本是用户实际交互过的商品,负样本是没交互过的。通过对比这两类样本,模型能更好地抓住用户偏好的特征。具体实现上,用的是InfoNCE损失。

辅助损失(Auxiliary Loss)
辅助损失(Auxiliary Loss)
辅助损失负责进一步提升模型性能,帮助模型融合不同类型的Embedding。它本质上就是一个关于CVR任务的交叉熵损失,算是锦上添花。
实验
表里H是命中率(Hit Rate),R是召回率(Recall Rate):


商品Embedding方面的对比:

训练方式的对比:

与SOTA(当前最优)模型的比较:

三种商品塔之间的表现差异:

PCH模块的消融实验:
线上A/B测试的AUC指标:
CVR的提升效果:
冷启动和长尾场景下的表现:
看完这篇文章,最大的感受就是:推荐领域永远是紧跟潮流的。从当年的ResNet、Attention、LSTM、GNN,到现在大家纷纷用上对比学习,甚至有人在提Diffusion Model。有一个问题值得思考:既然对比学习这么好用,我们为什么不尝试给推荐序列里加点噪音呢?
-
- 关于宇宙的好的网名有哪些
- 角色扮演 | 1
- 网名