随着ChatGPT横空出世,大模型的风算是吹遍了每一个领域,推荐系统作为老牌AI领域,也得沾沾光嘛~
大模型与推荐结合的方式有很多,我个人将其分为三种类型:
- LLM与传统推荐结合
- Rec-to-LLM
- 例:《Chat-REC: Towards Interactive and Explainable LLMs-Augmented Recommender System》
- LLM-to-Rec(本文探讨)
- Rec-to-LLM
- 传统推荐模型做“大”
- 例:《On the Embedding Collapse when Scaling up Recommendation Models》
- 生成式推荐大模型
- 例:meta GRs
相比于其他方案,LLM-to-Rec是最容易落地的,且ROI较高,也不用太多训练资源。
本文主要看一下今年工业界落地LLM-to-Rec的一些方案并进行快速总结,供大家一起讨论~
1. 快手:LEARN
《Knowledge Adaptation from Large Language Model to Recommendation for Practical Industrial Application》
和之前想用word2vec、bert的思路一样,都是想用LM的embedding来弥补推荐模型中的冷启动以及长尾物品由于行为稀疏学不好的问题。
直接硬怼进去效果不好,主要是觉得在特征embedding那么长的里面,文本embedding比较小的一个点。另外就是这些特征本质上都是在其对应的预训练任务上做的, 与推荐任务的目标是不一致 的,直接加入到模型中可能会被当成噪音。之前尝试过把文本embedding单取出来与其他特征做attention,有一定效果。但是总感觉不是最好的方法。
2024.5快手这篇工作主要就是说怎么把LLM的embedding用在排序中,简单说一下我理解的点:
- 模型是冻结参数(方便直接调用API)
- LM编码:是把标题、类别、品牌、价格、关键词和属性给了一个prompt之后进行编码,然后做avg pooling作为item的embedding。
3. 模型: 文章这里是又train了一个模型,简单说就是一个 双塔模型 来获取user embedding和item embedding,输入是用户序列,中间一刀切,一半在user塔,一半在item塔。loss就是infonce(第二版变成了dense all action loss)。
其中每个塔都是一个SASRec,和传统的dssm相比,从id embedding换成了LLM的embedding。
这里为啥没用Bert,文章里面说的是:
用了,效果不如SASRec这种结构。(Although Variant 2 also achieves the projection from the content domain to the collaborative domain, its performance is not as well as Variant 1, which utilizes the causal attention mechanism.)
文章没有解释清楚原因,感觉是BERT的自注意力机制导致 泄露信息,毕竟这里和Bert4Rec不一样,本质上还是一个序列模型。
4. 线上使用: 这里生成了 64维 的用户和物品向量。线上弄了个辅助的CVR任务,没说具体是啥转换任务,可以根据自己业务选择吧。把用户和物品embedding concat之后输入到左边的MLP里面做辅助任务,取中间的embedding再和之前的64维embedding一起塞入主模型。
2. 抖音:HLLM
《HLLM: Enhancing Sequential Recommendations via Hierarchical Large Language Models for Item and User Modeling》
推荐系统主流的方法是基于ID embedding的,基于id的两个缺点:1. 严重依赖 ID 特征,导致冷启动场景中性能不佳;2.相对较浅的神经网络,难以对复杂多样的用户兴趣进行建模。抖音HLLM仅使用文本特征,往LLM怼,并且 做SFT。和LEARN比,HLLM去STF模型。模型结构大概如下:
- 模型结构(2个模型都可训练):
- Item LLM:给prompt后,把item各种文本塞进去,完全就是一个 纯LLM。用[item]的输出作为整个item的embedding。(这里论文也尝试过直接frozen+avg pooling效果很差,主要原因应该还是没有做对齐,硬怼不太行)
- User LLM:User LLM就是用户序列,然后每个item用上面的item LLM输出作为输入。
- 模型目标与loss:
- 生成式: 如果是使用生成式方法,就是预测下一个item,infonce做loss。和meta GRs比,不用id体系embedding,直接用纯文本来做。
- 判别式(最终线上使用): 判别式就是二元交叉熵损失。此外,可以把生成式的loss作为辅助loss。λ用来控制辅助loss权重。item的embedding不进用户塔,单拎出来效果好。
细节:
- LLM都用的是预训练的,效果比从头训练好,而且预训练越充分,效果越好
- 模型用的是TinyLlama-1.1B
- 2个模型frozen之后效果都不好。这里应该需要做对齐,硬怼还是不行
- 展现了scaling law
- item LLM文本max len是256,文本描述越多效果越好
- item LLM 用这个[item] token比avg pooling效果好。(这个结论应该和bert [CLS] token效果好是类似的)
线上使用:
- 阶段一:用150长度用户序列完全训练2个LLM。(判别式主loss+生成式辅助loss)
- 阶段二:item LLM frozen之后直接存起来,然后只训练user LLM,用户序列长度到了1000
- 最后所有embedding都不训练,直接灌线上模型,也不会舍弃id特征,完全就是加特征,特征日更。(这里也可以结合LEARN的方式)
3. 谷歌:FLARE
《FLARE: Fusing Language Models and Collaborative Architectures for Recommender Enhancement》
本文是把LLM生成的Emb作为ID Emb的side info,来补充信息。同时借鉴了很多 多模态的技术,来优化模型和效果。比如CLIP和Perceiver。
- 模型结构:
- 主结构:就是一个BETR4Rec
- side info:相比于传统BERT4Rec,我理解是加了一个side info,就是LLM的Emb。frozen之后的LLM Emb过一个 Perceiver网络(先cross attention,再transformer encoder(self attention)),然后把输出结果和ID emb做对比学习,拉近LLM emb和ID emb。这里Perceiver简化的话就是一个MLP。
- Critiquing:原文和Critiquing过LLM之后concat送入perceiver,Critiquing是可以不加的,如果加了的话,预测的时候都不会被mask
- 模型目标与loss:
- 最终任务是MLM,Loss是NLL Loss
- 辅助任务是对齐LLM emb和ID emb(CLIP思想),Loss是infoNCE
- 总loss=主loss(MLM)+辅助loss(对比学习),loss权重比例是1:1
- 细节:
- Critiquing用的是物品的分类文本(“一级分类-二级分类-三级分类-四级分类”),而且越详细越好,比如“办公室产品-办公室和学校供应商-打印机墨水和托纳-喷墨打印机墨水”效果比“办公室产品-办公室和学校供应商”效果好(肯定信息越多,效果越好)
- MLM任务中,不会mask critiquing
- Perceiver作用不大,但是未来多模态可能有用。意思就是简单点我就把perceiver换成mlp,或者直接怼进去
4. 总结
从业界近期工作看下来之后发现:
- 问题:传统推荐缺少开放世界语义信息;冷启动ID物品训练不充分;多加特征多多益善。
- 方法论:借鉴多模态技术做LLM embedding融合;LLM embedding对齐推荐任务或补充协同信息;再来就是一些特征的处理方式
而LLM emb与推荐系统结合,可以总结成2个步骤:
- 怎么拿embedding
- 怎么用embedding
因此可以有以下几个步骤来实现:
- 直接拿 + 直接用
- 直接拿 + 排序辅助任务对齐
- 离线模型对齐 + 排序辅助任务对齐
【直接拿】: 利用LLM生成item embedding,再根据用户历史互动序列,做avg pooling获取user embedding。
【直接用】: 拿到Ei和Eu之后,直接以dense特征送入排序模型。比如:分别MLP再Concat;或先Concat再MLP
【排序辅助任务对齐】: 简单一些的类似于LEARN的辅助塔结构,思路打开后也可以把FLARE的对比学习模块放入精排中,对用户序列特征做一个辅助任务,其目的是让embedding更好的适应于推荐任务。
【离线模型对齐】: 参考LEARN、HLLM、FLARE,基本上都是利用交互信息来把LLM emb对齐推荐任务。
聪明的大家肯定可以排列组合来一步步迭代自己的模型,总的来说还是换汤不换药,本质上是多模态融合,但是毕竟带着LLM,故事也好说嘛~(狗头)