分享
LEARN: LLM在快手电商广告推荐场景的应用
输入“/”快速插入内容
LEARN: LLM在快手电商广告推荐场景的应用
2024年7月16日修改
作者:Lukan | NewBeeNLP
知乎原文:
https://mp.weixin.qq.com/s/3wvh3Xlz1LcUOqJ768uAFw
公众号原文:
https://mp.weixin.qq.com/s/Slnf-whAqOKtUX-K0TK3JQ
今天继续分享一篇大模型在推荐系统中的落地应用工作,是快手今年5月份发表的论文《Knowledge Adaptation from Large Language Model to Recommendation for Practical Industrial Application》。
太长不看版
这篇文章主要做了两个工作:
•
工作1:使用冻结的LLM提取文本embedding后,设计了一个基于transformer的双塔结构,用对比学习的方式训练用户行为序列数据,以提取更适用于推荐任务的user embedding和item embedding,
•
工作2:在排序模型中加一个CVR辅助任务,使用1学习到user embedding和item embedding接入一个MLP网络和推荐目标做进一步对齐,然后取出中间层特征供排序模型使用
方法其实和上次介绍的小红书的NoteLLM(
NoteLLM: 大语言模型在小红书推荐系统的落地应用
)有点类似的地方,都是想用大模型作为特征提取器来提取item文本中的语义信息来弥补推荐模型中的冷启动以及长尾物品由于行为稀疏学不好的问题,并且都使用对比学习的范式进行学习。
不过小红书的采用i2i的方式来训练,产出一个item embedding,最终用在i2i的召回上,这篇用的是u2i的方式,能够同时产生user embedding和item embedding,看文章的线上实验最终两个embedding是用在排序模型中作为特征使用(对应工作2),并没有用于u2i召回。
所以个人认为这篇文章对于实践的价值参考意义更大的可能是工作2,虽然笔墨很少,但毕竟是有上线的,工作1花里胡哨一通操作,最终也就离线自己搞了个数据集和其他几个方法跑了跑对比,为了发文章也可以理解,但是思想也可以稍微参考下吧。
背景
现有的推荐系统模型都是通过ID embedding学习用户和物品之间的交互来表示用户和物品,然而这种方式忽略了,物品文本描述中包含的语义信息。同时,对于一些行为数据少的用户和物品(冷启动和长尾)ID embedding是学不好的,但是LLM对于语义信息的表征能力是很强的,所以自然就会想用LLM学习物品描述中的语义信息来改善推荐中的冷启动和长尾问题。
现有的用LLM来做推荐的大多是通过构建prompt将推荐的数据文本化作为LLM的输入,然后通过生成式的方式来推荐物品,但受限于计算性能以及LLM的输入长度,所以也只能在几个玩具数据集上跑一跑,文章把这种方式称为Rec-to-LLM, 而文章要做的工作就是LLM-to-Rec,将LLM用作特征提取器,将推荐任务作为训练目标,不仅有利于从 LLM 的开放世界领域无缝过渡到RS的协作领域,还能确保更好地满足工业在线 RS 的实际需求。
方法
提出方法的框架叫做Llm-driven knowlEdge Adaptive RecommeNdation,简称LERAN,采用的是双塔的架构来进行自监督学习,用户塔和物品塔均由内容嵌入生成模块(CEG)和偏好理解模块(PCH)组成。
模型学习的目标是预测感兴趣的下一个物品,也就是序列推荐,所以训练时会抽出用户的历史行为序列,然后在中间截断一下分成两个序列,
作为用户塔的输入, 作为物品塔的输入。
内容嵌入生成CEG 模块采用了预训练的LLM(文章用的Baichuan2-7B)作为物品编码器。编码的内容包括:标题、类别、品牌、价格、关键词和属性,这里LLM是冻结参数的,防止灾难性遗忘问题,最终会提取出每个token最后一层的隐向量做平均池化后作为物品最终的表征。
偏好理解PCH模块是为了将LLM生成的内容embedding与推荐任务进行对齐,弥补的开放世界知识与协作知识之间的领域差距,采用推荐任务的自监督训练目标来指导模型优化。PCH 模块使用用户交互过的物品的内容嵌入序列作为输入,过一个使用因果注意力的transformer编码器,最终生成user embedding或者item embedding,下面画的这个图右侧应该是用户塔的,很好理解,但是最终生成的user embedding没说是去平均池化还是最后一个token。
物品塔就写的有点难以理解了,文章说设计了三个变体,最终采用的是变体1,其他两个效果不好,来具体看下三个变体怎么搞的:
•
变体1:采用和用户塔一样的结构和权重,为每个目标物品进行编码
•
变体2:文章说用了自注意力,应该是把变体1的因果注意力换成了自注意力?那为什么输入的时候要换成单个物品输入,而不是用序列输入?这里有点不太理解
•
变体3:这个就是直接把LLM生成的内容嵌入拿来当成item embedding,连加一个映射层都不做了
有个不太理解的地方就是这个物品塔为啥用序列作为输入,因为文章说训练时是用一个物品序列作为输入,但是在推理时,只用单个物品,这样不会存在训练和测试不一致的情况吗?
另外还有一个训练成本的问题,因为这里又加了一个transformer的encoder,那么用的序列长度应该也不能很长,而且也不知道这个transformer到底能起到多大作用,毕竟行为序列里面噪声应该还是很多的,所以我觉得更简单粗暴的一个方法是用户塔序列pooling后接一个MLP,这样可以支持更长的序列,物品塔在拿到LLM的表征后也接一个MLP,这样的方式不知道会不会更好。
不管咋样,就当他通过某种手段拿到了LLM提取得到的user embedding和item embedding,然后就是进行对比学习了,正样本用当前用户交互的物品,负样本用其他用户交互的物品,损失函数用的也是Info-NCE
实验
离线实验