1.7.llm_recommend
最后更新于
最后更新于
https://github.com/nancheng58/Awesome-LLM4RS-Papers
A Survey on Large Language Models for Recommendation How Can Recommender Systems Benefit from Large Language Models: A Survey Recommender Systems in the Era of Large Language Models (LLMs)
中科大LDS实验室的tutorial:XadC3O-large-language-models-for-recommendation-tutorial-slides.pdf
对应的datafun talk:当"狂飙"的大模型撞上推荐系统
生成式推荐综述:
Large Language Models for Generative Recommendation: A Survey and Visionary Discussions
A Review of Modern Recommender Systems Using Generative Models (Gen-RecSys)
CRM(conventional recommendation models)
user-item level feature augmentation
通过LLM的世界知识来获取更好的user/item表示
KAR:Towards Open-World Recommendation with Knowledge Augmentation from Large Language Models通过LLM生成user侧的preference知识,和item侧的factual知识,并作为CRM的输入特征。代码:https://github.com/YunjiaXi/Open-World-Knowledge-Augmented-Recommendation/blob/main/knowledge_encoding/utils.py,其实就是把模型输出的hidden states处理一下:
instance-level sample generation
Text Is All You Need: Learning Language Representations for Sequential Recommendation 亚马逊发的
https://github.com/AaronHeee/RecFormer
参考知乎:https://zhuanlan.zhihu.com/p/470182510
Transformer memory as a differentiable search index,提出的可微搜索索引(differentiable search index, DSI),拆成两个阶段:
indexing:建立文档和doc_id的一一映射
retrieval:根据query生成候选doc_ids
与Autoregressive Entity Retrieval提出的受限beam search的GENRE(代码https://github.com/facebookresearch/GENRE,解读Transformer中PrefixConstrainedLogitsProcessor类的解读)对比:
GENRE生成的目标是有具体语义的实体名
DSI生成的目标则是无任何语义的任意doc_id
Inputs2Target:即doc_tokens->doc_id
Target2Inputs:即doc_id->doc_tokens
bidirectional:同时用上两面两个任务,并且在开始时加一个前缀,表明任务的方向
span corruption:参考T5(Exploring the limits of transfer learning with a unified text-to-text transformer),将doc_id当做前缀和doc_tokens拼起来,2个好处:
在索引时进行通用的预训练
实现doc_id作为去噪目标和输入的平衡
Direct Indexing:直接用文档的前L个单词当做文档的表示,并且保留单词的顺序。
Set Indexing:去掉文档中的重复的单词及停用词,然后和Direct Indexing一样的处理。
Inverted Index:随机对文档中的连续的k个单词(一个文档块)进行采样,并将它们与doc_id相关联
非结构化的原子标识符:直接对所有的文档使用一个随机但互不相同的的整数标识。假设一共有N篇文档需要检索,假设原来解码器输出有V个单词,现在有V+N个单词。
朴素的结构化字符串标识符:也使用一个随机的整数,但将这个整数当做一个字符串输出,用受限的beam search搜索前k个文档,因为需要保证输出的是数字。
用seq2seq,即teacher forcing+交叉熵,有如下两种方式:
先对indexing进行预训练(memorization),再进行将query映射为docid的微调
用多任务的方式同时进行,两个任务用不同的标识符,这样做效果会好很多
后来有一篇Bridging the Gap Between Indexing and Retrieval for Differentiable Search Index with Query Generation,对应的github:https://github.com/ArvinZhuang/DSI-QG,他也同时尝试复现DSI:https://github.com/ArvinZhuang/DSI-transformers,主要有如下两个地方:
准备数据,doc_id
训练和预测
对解码空间的限制:
Neural discrete representation learning
https://github.com/zalandoresearch/pytorch-vq-vae
用在推荐:
Learning Vector-Quantized Item Representation for Transferable Sequential Recommenders
https://github.com/RUCAIBox/VQ-Rec
Autoregressive Image Generation using Residual Quantization
Recommender Systems with Generative Retrieval
序列推荐的一些paper:
Session-based recommendations with recurrent neural networks:GRU4Rec首先把RNN用到推荐里
Neural attentive session-based recommendation:提出NARM(Neural Attentive Session-based Recommendation),在GRU里加了attention
Next item recommendation with self-attention:AttRec在metric learning里引入了self-attention
Self-attentive sequential recommendation:SASRec用了类似decoder-only的self-attention
S3-rec: Self-supervised learning for sequential recommendation with mutual information maximization:在预训练阶段引入了4个自监督的task,4个MIMM(mutual information maximization)
item-attribute MIM
sequence-item MIM:sequence和被mask掉的一个item间
sequence-attribute MIM
sequence-sequence MIM:sequence和被mask掉的连续item构成的片段间
这些方法都是学习item的向量,然后用MIPS去ANN,而TIGER(Transformer Index for GEnerative Recommenders)则是生成式地直接预测item的语义id
rq-vae的介绍:
原图里的下标有一些问题
码本的emb通过moving average更新
rqvae的代码:https://github.com/kakaobrain/rq-vae-transformer/blob/main/rqvae/models/rqvae/quantizations.py#L237
VQ部分:
RQ部分
Better Generalization with Semantic IDs: A Case Study in Ranking for Recommendations
如何评价Meta最新推荐论文: 生成式推荐打败深度分层架构推荐?
大规模推荐系统依赖高基数(high cardinality)、异质特性(heterogeneous features),每天要处理上百亿用户行为数据。将推荐系统重新定义为生成模型框架内的序列转化任务,提出HSTU(Hierarchical Sequential Transduction Unit),专为高基数、非稳态的流式推荐数据设计。
在公开数据集比基线NDCG+65.8%
在8192的序列长度上的处理速度比基于flash attention2的transformer快5.3-15.2倍。
1.5万亿(1.5 trillion)参数,线上ab测试指标+12.4%
在Breaking the curse of quality saturation with user-centric ranking中提到了NCE(normalized cross-entropy)指标:
可以发现,对于一个预训练好的模型来说,随着时间的变化,NCE的变化是很剧烈的,即数据分布是会漂移的,并不像nlp/cv一样有ground truth,所以传统推荐模型其实很难达到比较好的scaling能力。
需要克服的3个挑战:
推荐系统中的特征缺少显式的结构。序列建模(bert4rec、S3-rec等)在小规模数据集上效果不错,但工业界则需要异构特征(高基数的id、交叉特征、统计特征、历史点击率等)。
推荐系统使用十亿规模的动态词表,而nlp用的是10w的静态词表,要对上万候选进行target-aware操作(din、Cold等),训练和推理的代价很高。
大规模序列模型的计算成本是瓶颈。GPT-3在300B token的数据集上用上千个GPU训练1-2个月,而在推荐场景一天就有十亿级的活跃用户和十亿级的候选进行交互,用户序列在极端情况下有近10w(Twin: Two- stage interest network for lifelong user behavior modeling in ctr prediction at kuaishou),所以推荐系统每天要处理的tokens数量甚至比语言模型1-2个月处理的数量要大几个数量级
本文将用户action看成一个新的模态,2个主要的insights:
给定一个新的特征空间,核心的召回排序任务能被直接转换成生成式模型问题(序列直推任务,sequential transduction tasks)
这种范式能够系统性地解决传统推荐中的特征冗余、计算冗余、推理冗余,提升效率
transductive learning(直推式学习) vs inductive learning(归纳式学习)https://www.zhihu.com/question/68275921/answer/529156908:
归纳式学习:训练只使用训练集,不使用测试集,训出的模型对测试集做预测,如监督学习。
直推式学习:训练时使用训练集,还使用测试集的特征,但不使用测试集的label,
异构特征的统一表示
稀疏特征:itemid、类目、城市、语言、社区等
先选出最长的时间序列作为主时间序列,例如用户的交互序列。
剩下的特征随时间变化较慢,如关注作者的属性。对于连续出现的片段(consecutive segment),只保留最开始的入口,这样对于主时间序列而言,并不会增加太多的序列长度。
数值型特征:这里指的是序列特征里每个item的统计特征,比如用户在时刻t对某个item的ctr。直接删了,因为DIN里提到随着序列长度增加,target-aware的序列建模方式能够捕捉到这种数值性特征
假设用户消费了9个item,
绿色的有7个时间步,全保留,作为主序列;
蓝色的有7个时间步,但只有G0和G1两种取值,所以对于连续的G0只保留第0个(出现在t1),扔到主序列的最前面去,连续的G1也只保留第0个(出现在t8),插到主序列最后一个的前面
黄色的全是H0,第0个出现在t7,所以保留t7,往主序列t8前面插入
将数值型特征替换为target-aware的cross attention得到causal-masked的特征
通过t0、t1、t2(包括t2)的特征生成t2的样本,以此类推
召回和排序的重定义
排序:推荐中的排序需要在尽量早的阶段进行target-aware的交互,而标准的自回归这种交互往往比较迟,例如在encoder的输出才用上了softmax。因此,设计了一种target-aware的cross-attention
生成式训练
但其实可以发现(这段是自己的理解),假设序列长度9,要预测第4个的时候,4-9的输入是mask掉的,但他们还是要进行后面的attention+ffn计算,其实是很浪费资源的,所以如上面“异构特征的统一表示”小节的那个图(生成主序列和辅助序列)所示,该模型直接只吐出x=x1-x3,y=x4作为训练样本就行了,这样既省掉了4-9的无用计算,也更便于并行(相比不拆batch的自回归)
HSTU的单层包括3个部分:
其中,
对应到代码(https://github.com/facebookresearch/generative-recommenders/blob/main/modeling/sequential/hstu.py)里:
DLRM的3部分:
特征抽取:常见的基础版本是离散特征pooling,高级版本是din。HSTU本来就能做这种target-aware的attention
这个做法受Neural collaborative filtering vs. matrix factorization revisited和Revisiting neural retrieval on accelerators的启发,用MLP来近似点积是很困难的。原因大概是nn需要调超参和足够的训练数据,在线算得又慢,而且本来内积效果就不错了,nn能带来的边际收益其实不明确。
表示转换:常见的如MoE、PLE等,主要思想就是对不同人群用特定的子网络。HSTU里的element-wise product也能达到MoE中的门控操作,只是可能有一个正则化因子的区别。
pointwise聚合的注意力
用的是pointwise聚合的注意力,而不是transformer里的softmax,主要有如下两点考虑:
推荐中item的强度信息很重要,softmax会让这种强度失真,导致在预估(如时长)不准;如果只需要预估序,那其实softmax也可以,但推荐要同时预估序和值,所以要删掉softmax。
虽然softmax对噪声有鲁棒性,但不太适用于流式setting下的非稳态词表。做了一个模拟流式数据的实验,发现只去掉relative attention bias比relative attention bias并加上softmax会好得多
增加稀疏性
即:
最小化激活值的内存使用
在推荐系统中,大的batchsize很重要:
因此激活函数的内存占用就成为了主要的scaling瓶颈,这一点和llm不一样,llm一般是用小batchsize,并且内存主要由网络参数占据。HSTU设计了如下方式来减少激活函数的内存占用:
把attention外的linear layers从6减小到2,同时使用elementwise gating来降低MLP的计算(Transformer Quality in Linear Time和Efficiently modeling long sequences with structured state spaces)。第一篇对应的结构如下:
所以HSTU的设计能够让scaling达到大于两倍的更深的layers(14d vs 33d)
此外,词表中的id占用了极大的内存,对于10b的词表,512维的emb,Adam优化器,用fp32来存储emb和优化器状态要60TB的内存,因此,
将优化器状态存在DRAM里,从而每一个float在HBM的占用从12bytes降低到2bytes
cost-amortization(摊销)的预估scale up
对于召回来说,已经有很多加速方法了,例如MIPS的ANN加速,或者OTM等的beam search方法。
前向pass中,用于降低消耗
requests之间,降低长尾耗时
其他
发现了scaling-law:
Wukong: Towards a Scaling Law for Large-Scale Recommendation
SIGIR2023 | ID vs 模态: 推荐系统ID范式有望被颠覆?
Where to Go Next for Recommender Systems? ID- vs. Modality-based Recommender Models Revisited
https://github.com/westlake-repl/IDvs.MoRec
On Generative Agents in Recommendation
word版的笔记:https://github.com/daiwk/collections/blob/master/assets/multi-agents.docx
https://github.com/LehengTHU/Agent4Rec
Aligning Large Language Models with Recommendation Knowledge
https://zhuanlan.zhihu.com/p/705497209
过往的llm+推荐的两种思路:
freeze LLM参数并适应推荐领域数据:将用户行为历史改写成文本prompt,直接丢给LLM生成top-k推荐结果,例如:
在推荐领域的特定文本数据集上微调LLM:利用LLM捕捉用户行为序列,通过设计提示prompt,使LLM学习用户和物品之间的潜在关系,在预测任务中理解用户的偏好变化和行为模式,从而更好地预测用户可能感兴趣的物品,例如:
上面两种方法可以看成是Rec-to-LLM,即将推荐这个target domain适配到LLM这个source domain上去,有如下缺点:
将用户历史全丢给LLM不现实:一方面开源的LLM目前只支持1k(baichuan)-4k(llama),不支持这么长的序列,另一方面复杂度和序列长度呈二次关系
微调的方案可能会出现灾难性遗忘(catastrophic forgetting):全参数微调,会让模型丢失在预训练过程中学到的开放世界的知识,而LoRA的效果也不好。原因:
domain gap:两个领域有巨大的差别(profound gap),Continual Learning of Large Language Models: A Comprehensive Survey发现了全量参数微调会导致LLM对原有知识domain的严重的灾难性遗忘。
训练目标不对齐(misalignment):LLM是next token prediction,学习大语料的general知识;finetune则主要是检索类的任务,强依赖用户-item的交互行为
本文提出了LEARN(Llm-driven knowlEdge Adaptive RecommeNdation),实现了LLM-to-Rec,让LLM作为content extractor,推荐任务是训练目标
RecGPT: Generative Pre-training for Text-based Recommendation
RecGPT: Generative Personalized Prompts for Sequential Recommendation via ChatGPT Training Paradigm
https://zhuanlan.zhihu.com/p/699985083
Can Small Language Models be Good Reasoners for Sequential Recommendation?
第一阶段:蒸馏大型 GPT模型到较小的模型(如LLAMA2/3),来增强推理能力。
通过预设的 prompt,大模型生成推荐理由,这些理由基于预定义的模板。接着,
使用简化的推理模板请求小模型进行推荐和理由生成。
第二阶段:利用生成式Loss来微调小模型,使其具备推理能力。
模型训练完成,将通过prompt为用户行为提供T+1推理。
推理结果通过文本编码器(Text Encoder)转化为表征,这些表征将直接应用于线上模型。
接下来,希望将LLAMA进一步压缩至更小的序列模型。在实验中遇到几个挑战:
蒸馏过程中教师模型的知识可靠性存疑
从语言模型到序列模型的蒸馏跨越了不同的模型类型,带来两个主要问题:
参数差距大,学生模型难以容纳教师模型的知识
语义不一致,因为序列模型与原始语言模型之间存在天然差异
包含两个关键部分:基于Ranking的蒸馏策略(Importance-aware Ranking Distillation)和Embedding对齐(Collaborative Embedding Distillation)
核心在于排名蒸馏,采取了如下三个策略
选择LLAMA2作为教师模型,认为其排名靠前的分值更高;
考虑LLM生成的描述与目标物品(Target Item)的接近程度,增加其排名;
若教师模型(Teacher Model)认为某物品是优质且排名靠前的,学生模型(Student Model)也会给予其更高排名。
通过这些策略,设计了Ranking Loss,用于蒸馏小型序列模型
consistency-aware weight:同时被teacher和student推荐的item更有可能是一个强正例
Diversifying by Intent in Recommender Systems,涨了dau等指标
Item-Language Model for Conversational Recommendation
适用场景如下,{user}可以看成一种特殊的{item},{history}是若干个item
参考BLIP-2(Blip-2: bootstrapping language-image pre-training with frozen image encoders and large language models)提出的Q-former:
引入了Q-former
phase1:表示学习,交替训练如下两类表示学习
item-text表示学习:
query的tokens和item的cf emb过cross attn后,拿cls的输出得到v1
text过attn得到v2
v1和v2算item-text对比学习
v2走一个自回归的任务(item grounded text generation)
item-item表示学习
query的tokens和item的cf emb过cross attn后,拿cls的输出得到v1
query的tokens和item的cf emb过cross attn后,拿cls的输出得到v2
v1和v2算item-item的对比学习
phase2:item-language model训练
Q-former的item encoder经过一个linear输入到LLM中
LLM参数freeze,只tune Q-former的参数和linear
RecExplainer: Aligning Large Language Models for Explaining Recommendation Models
https://github.com/microsoft/RecAI
LLM+Recommendation大模型推荐近期进展|含WWW, SIGIR, AAAI等顶会文章