Prompt Distillation for Efficient LLM-based Recommendation
本文发表在CIKM’2023上,主要针对大模型应用在推荐系统时采用离散提示(discrete prompt)出现的两个问题提出解决方案并进行了实验证明。
- 问题1:用户与物品的ID embedding 在推荐系统中用户对物品的偏好以及用户和物品的相似度,而离散提示的模板中的词嵌入通常捕捉的是词之间的上下文关系。在大模型训练时,通常需要经过大量的微调才能弥补id和模板词之间的gap。对此提出了 (Prompt Distillation)提示蒸馏的方法,将离散提示提炼为了连续向量的提示,是model-free的。
- 问题2:训练效率问题,大模型推荐通常是经过预训练之后适应到不同的下游任务。如本论文主要针对的是TopN推荐,序列推荐和可解释性推荐三种推荐。而不同的推荐对应的输入\输出以及提示模板的长度可能不同(常用的解决方法:填充到相同长度),如果将这些任务的训练样本混合在一起直接进行训练虽然是可行的,但是效率大打折扣。为此提出了任务交替训练策略,就是按照预先设定的顺序依次重复训练三种任务。
方法论
三种典型推荐介绍
U \mathcal U U:用户集合, I \mathcal I I:物品集合, u , i u,i u,i:具体用户和物品
- 序列推荐: 每个用户有自己的历史交互序列,根据给定的用户和物品交互序列,预测该用户下一项的点击物品。
- TopN推荐:给定用户以及一个候选物品列表,向给定的用户推荐一个项目列表,该列表内包含的是候选列表中N个最有可能交互的且用户未曾交互的物品。
- 解释性推荐:给定一个用户-物品对(u,i),生成一个解释来证明为什么要向该用户推荐该物品(比如:价格合理)。
离散提示
在推荐系统中,用户和物品的id是用来区分它与其他个体的关键,大多数过往的工作采用与id相关的文本段(如用户或者物品标题)来作为替代,填充在预定义的模板中。举个例子: Generate an expalanation for user_1234 about item_5678。这种类型的文本输入就被作者定义为离散提示,由一系列的离散token组成。由于user_1234会被分词为user,_,12,34。作者设计了一个额外的Whole-word Embedding来连接ID的token,具体形式在蒸馏中会解释。
提示蒸馏
提示蒸馏:不牺牲大模型的性能的前提下,缩短提示长度。经过提炼的简短提示符可以是自由文本也可以是向量
作者认为离散提示可能不能够有效的指引大模型。当两个不同的任务的输入数据格式十分相似的时候,大模型可能没法区分该任务是哪个任务,例如序列推荐和TopN推荐的输入都是一个用户和一堆物品。另一个问题就是当模板较长时,可能会掩盖关键的信息,这也会花费较长的时间来进行训练和微调。为此提出了POD提示蒸馏的方法,将离散的提示模板提炼成了多个的连续向量。一个具体的提示蒸馏样例如下。
整体连续向量提示的提炼过程如下图所示:
具体的推理过程如下,省略了提示模板和单词分词。
大致的流程:
X = [ x 1 , . . . , x ∣ X ∣ ] X = [x_{1},...,x_{|X|}] X=[x1,...,x∣X∣]是输入序列, Y = [ y 1 , . . . , y ∣ Y ∣ ] Y = [y_{1},...,y_{|Y|}] Y=[y