LLMs+Persona-Plug = Personalized LLMs
👞

LLMs+Persona-Plug = Personalized LLMs

问题

根据用户个人兴趣偏好不同,输出不同的内容,实现大模型多样化回复,同时也更切近用户需求。
为了实现个性化输出,普遍的有两种做法:
  1. 为某个用户单独微调一个LLM,但成本高昂,为控制成本产生了几个相关优化工作:
    1. OPPU模型,通过LoRA方法为每个用户微调
    2. 将用户分到不同的组,针对每个组做微调
    3. 通过为每个用户寻找最佳的微调参数来进行微调(本质上是微调参数的学习)
  1. 基于rag的方法
    1. 简单来说就是把历史数据chunk embedding到向量数据库中,后续检索出来放到context中检索学习,但是这样只能检索出部分内容,会破坏用户历史的连续性
    2. 或者粗暴一点,直接把用户的历史数据放到prompt中,但是长度受限
新的方案和前面两个方案的对比:
notion image

提出方法-PPlug

notion image

User Embedder部分

Encoding

对应的右图,将历史记录和用户输入通过encoder,转换为向量表示。为后面的Aggregator做准备。
 
为了提升训练效率,在论文中freeze了User Behavior Encoder,对Input Encoder进行了微调
不太理解为什么这里要微调input encoder,微调的目标是什么?
实验中,两个encoder都选用了BGE-base-en-V1.5作为默认的encoder模型,同时对比了Contriver,两者差距不大。
 
notion image

Aggregator

notion image
借鉴attention机制,根据用户当前query,使用缩放点积注意力,输出包含对历史文本attention的embedding向量
是一个两层MLP的投影层,用于把多维的attention,映射到大模型的表达空间
notion image
💡
这里要对所有的历史数据进行softmax,如果历史数据非常多的话,还是非常大的一个计算量。并不是像论文里面说的,超越rag,可以集成所有用户行为

Inference部分

Instruction embedding

notion image
在把用户输入和User Embedder中的内容输入给大模型之前,需要先经过大模型本身的embedding,做一次转换。为了能够更好的融合前面给出的 ,新的大模型输入融合了:
然后微调这个embedding层的公式如右图:
  1. 可训练的参数
  1. User Embedder给出的
  1. 编码的prompt,也就是用户本次query的输入,
  1. 过程中生成的token,
损失函数的采用的是交叉熵损失
notion image

实验结果

💡
实验中,没有考虑针对用户进行微调的方法,而是直接说这种方法投入太大放弃了,也没有给出相关数据对比
notion image
三个baseline分别是:
  1. 没有加入任何用户历史数据的基础模型(FlanT5-XXL)得出的结果,作为无个性化的baseline
  1. 使用bm25,recency和contriever算法检索出前面4条记录,然后喂给baseline模型得出的结果。
  1. 使用了基于个人信息实现检索优化的算法:ROPG-RL, ROPG-KD, RSPG-Pre, and RSPG-Post (这四个算法都是LaMP这个评测数据集的作者做的)
从实验结果看,很不错,虽然和LaMP官方榜单比还是有一定的差距,比如说LaMP-1的最高分是0.714,是由FlanT5-base-finetuned + Contriever提出的方法。
官方榜单中的很多数据是来自于LaMP作者自己的论文😂,有一种自己弄个数据集出来自己玩的感觉。
 

PPlug + Retrieval

notion image
💡
在context中加入检索的top-k结果,会有效增加模型性能
使用BGE-base-en-v1.5模型,通过相似度计算找到top-k的数据,然后加入到prompt context中,模型的输入会变为:
notion image
其中, 就是模型检索出来的结果。
 
现在模型中既在context中融合了Retrieval内容,又有从User Embedder中获取到的相关信息,两者应该怎么平衡,怎么选择呢?会不会出现到某种情况,直接出现效果退化呢?
 
这提出了一个新的研究问题,即如何优化使用粗粒度的用户嵌入与细粒度的上下文检索引用。

问题和改进

💡
个人看法
  1. 用户的历史数据也不能全部编码进去,随着history增加,encoder history的负担变重,Aggregator计算会变得更加繁重,可以考虑一段时间微调一下,将历史数据freeze到模型里面,然后通过user prompt来trigger
  1. 性能应该不错,有几个地方都是可以并行的,比如说:prompt的prefill和User encoder可以并行;但是这会增加调度复杂度

其他

数据集

LaMP数据集样例
notion image
LaMP提供了两种不同的数据拆分方式:
  1. 基于用户拆分:在数据集中标记为LaMP-iU,采用这种划分方式,训练/验证/测试是在用户维度上拆分的,确保划分中没有共享的用户。
  1. 基于时间拆分:在数据集中标记为LaMP-iT,采用这种划分方式,训练/验证/测试数据集是按照时间划分的,最近的数据作为输入输出,旧的作为用户画像。

收获

💡
收获:
  • 会不会是memory的新思路?
 
你觉得这篇文章怎么样?
YYDS
比心
加油
菜狗
views

Loading Comments...