URL
TL;DR
LLM 作为基础预训练模型,由于其参数量极大(以 B 计)的特点,无法像传统视觉或语言预训练模型一样,在下游任务数据集上全局微调
- 本文提出一种非常新颖的
LLM 微调方法,不对原始模型参数进行改进,而是在每个任务的 Prompt 输入之前加入不同长度的虚拟 prefix token seqence 来实现
- 其中
prefix token seqence 实际上是一个 Rlen×dims 的可学习矩阵
- 其中,len 表示
prefix token seqence 的长度
- dims 表示原始模型的词嵌入的长度
- 虚拟
token 的含义是不是真正来自词表的 token,而是无意义的可学习的连续的任务相关的 token 表征
- 不同任务的可学习矩阵不共享
Algorithm
传统 fine tuning 和 prefix tuning 的对比

- 传统
fine tuning 更新全部模型参数
prefix tuning 不更新任何模型参数,只是额外加入了部分参数(虚拟 token 表征参数)
任务相关应该怎么理解?
- 任务相关是指,每一个任务都需要独立的无法共享的
prefix token 表征,而且表征的长度可能不同
- 例如,用预训练的
GPT-2 small + prefix tuning,使其可以做内容总结任务,就需要初始化一个 R200×768 的矩阵,然后通过有监督训练优化这个虚拟 embedding 层相关的参数
- 其中:
200 是通过实验发现的最合适的总结任务 prefix token sequence 长度
768 是 GPT-2 small 模型真实 token embedding 的维度
- 如果想用预训练的
GPT-2 small + prefix tuning,使其可以做表格转文本的任务,就需要重新初始化虚拟 token embedding 矩阵,重新训练

实验证明,对于总结任务,200 是个合适的 prefix token sequence 长度,对于表格转文本,10 长度更合适
prefix tuning 如何适配不同架构的预训练模型?

- 对于
GPT 系列的 Casual Decoder 架构,只需要在输入文本 token sequence 之前加入 prefix token sequence
- 对于
Encoder Decoder 架构,需要在 encoder 和 decoder 输入之前都加入 prefix,encoder 和 decoder 的 prefix token 表征可以共享,也可以不共享,具体看任务效果
和 fine tuning 相比,效果如何?
- 在数据充足且任务难度不大的情况下,
prefix tuning 效果不差于 fine tuning
- 由于
prefix 没有修改模型原始参数,所以不容易出现 full fine tuning 中常出现的模型退化问题
Thought
prefix tuning 看起来是非常有希望的 topic,prompt engineering 可挖掘的空间还很大
- 这种微调方式实际上还需要存储大模型的所有参数和推理的中间结果用于梯度回传,所以实际微调代价不如想象中小