PEFT(Parameter-Efficient Fine-Tuning参数高效微调)
huggingface:PEFT (huggingface.co)
github:GitHub - huggingface/peft: 🤗 PEFT: State-of-the-art Parameter-Efficient Fine-Tuning.
概念:其核心理念是通过仅调整模型的一小部分参数,而保持大部分预训练参数不变,从而大幅减少计算资源和存储需求
LORA(Low-Rank Adaptation低秩适应)
github:GitHub - microsoft/LoRA: Code for loralib, an implementation of "LoRA: Low-Rank Adaptation of Large Language Models"
论文:2106.09685 (arxiv.org)
以下是LoRA微调的主要概念和步骤:
-
低秩矩阵的引入:在模型的某些层(例如注意力层或前馈层)中,引入低秩矩阵来替代完整的权重矩阵。这些低秩矩阵的参数远少于原始权重矩阵的参数,从而减少计算成本。
-
参数更新:只更新低秩矩阵的参数,而保持原始模型的大部分参数不变。这意味着微调过程中只有一小部分参数需要调整,极大地减少了计算量和内存需求。
矩阵的秩(Rank)
表示输出空间的维数。例如,输入向量通过线性变化,被映射到输出空间中,这个空间是二维的,那么秩就是2
如果一个矩阵的秩 rrr 远小于其维度 mmm 和 nnn,则称其为低秩矩阵

第三行是第一行的倍数,因此第三行可以由第一行线性表示(即它们是线性相关的)
第二行是第一行的倍数,所以它们也是线性相关的
矩阵的秩就是1
低秩矩阵(Low-Rank Matrix)
如果一个矩阵的秩 rrr 远小于其维度 mmm 和 nnn,则称其为低秩矩阵。例如,一个 1000×10001000 \times 10001000×1000 的矩阵,如果秩为10,则可以认为是低秩的
如何引入:
参数分解:将模型的某些参数矩阵分解为两个较低秩的矩阵的乘积。例如,对于一个权重矩阵W,可以分解为U⋅V,其中 U 和 V 是低秩的矩阵。

prompt(提示)

蓝色的是预训练模型。
-
模型调优(Model Tuning):
- 左侧部分表示模型调优的过程。
- 首先,有一个预训练的模型,包含110亿参数。
- 针对每个任务(任务A、任务B、任务C),有相应的训练数据批次(如任务A的a1和a2,任务B的b1,任务C的c1和c2)。
- 对于每个任务,预训练模型被分别微调,生成不同的任务特定模型(任务A模型、任务B模型、任务C模型),每个模型仍然包含110亿参数。
-
提示调优(Prompt Tuning):
- 右侧部分表示提示调优的过程。
- 提示调优使用相同的预训练模型(110亿参数),而不对模型本身进行修改。
- 不同任务的数据被混合成一个批次(Mixed-task Batch)。
- 每个任务都有自己的提示(Task Prompts),每个提示包含2万参数。
- 这些任务提示和相应的数据一起输入预训练模型,模型根据提示调整其行为以完成特定任务
示例
假设我们有一个文本分类任务,要将输入句子分类为“积极”或“消极”。在传统方法中,模型会直接输出一个类别标签。而在提示调优中,输入句子前会加上提示标记,模型生成的输出则是表示类别标签的标记,例如:“这是一条[积极]评论”或“这是一条[消极]评论”。
- 任务类型: 主要用于文本分类任务,最初在 T5 模型上发展起来的。
- 方法描述: 在输入文本中添加一组提示词(prompt),这些提示词通过预训练模型的参数来决定。这些提示词通常固定不变,并且模型的其他参数也是冻结的。所有下游任务都被转化为文本生成任务,比如分类任务会通过生成代表类别的词来完成。
- 应用场景: 适用于需要将任务转化为生成文本的任务,比如文本分类。
prefix-tuning
PEFT configurations and models (huggingface.co)

还是多个模型减少到一个模型
-
微调(Fine-tuning):
- 上半部分表示微调的过程。
- 对于每个任务(如翻译、摘要、表格到文本),有单独的Transformer模型。
- 每个任务的Transformer模型都经过专门的训练,以适应该任务的数据。
- 输入(Input)是带有特定格式的文本,例如“name Starbucks type coffee shop”。
- 模型生成相应的输出(Output),例如“Starbucks serves coffee”。
-
前缀调优(Prefix-tuning):
- 下半部分表示前缀调优的过程。
- 只使用一个预训练的Transformer模型,不针对每个任务单独微调整个模型。
- 每个任务有自己的前缀(Prefix),这些前缀是相对较小的参数集,分别用于不同的任务(如翻译、摘要、表格到文本)。
- 输入(Input)与微调类似,但在输入之前附加了任务特定的前缀。
- 预训练的Transformer模型根据输入和前缀生成相应的输出(Output)
示例
假设我们有一个生成任务,需要 GPT 模型根据输入文本生成相应的输出。在 Prefix tuning 中,我们会在输入前添加一系列特定任务的向量,这些向量会贯穿整个模型的所有层,确保在不改变预训练模型参数的情况下,优化生成的输出。
- 任务类型: 主要用于文本生成任务,尤其是针对 GPT 模型。
- 方法描述: 在输入文本之前添加一个可训练的前缀向量序列,这些前缀是特定任务的向量,并在训练过程中进行优化。与 prompt tuning 相似,但它的前缀是可以学习和更新的,而不仅仅是固定的提示词。模型其他参数依旧是冻结的。
- 应用场景: 适用于需要生成内容的任务,如文本生成、对话生成等。
P-tuning
a部分,生成

(a) Discrete Prompt Search(离散搜索提示)不同的自然语言提示
- 工作原理:
- 图中的每个单词(如"The", "capital", "of", "Britain", "is", "[MASK]") 被映射到一个嵌入空间中,生成对应的嵌入向量 (e(The), e(capital), e(of), e(Britain), e(is), e([MASK]))。
- 这些嵌入向量被输入到预训练语言模型中(例如 GPT 或 BERT)。
- 该方法通过搜索固定的离散提示词来优化输出,即在给定上下文的基础上寻找最佳的提示词组合。然后,根据模型的输出(预测的[MASK]位置)给出离散奖励(discrete rewards),进一步优化提示词选择。
(b) P-tuning
- 工作原理:
- 在
Discrete Prompt Search
阶段得到的嵌入和相应的提示会被用作输入数据。。
- 在 P-tuning 中,使用了一个提示编码器(Prompt Encoder),这个编码器(通常是 LSTM 网络)会生成一组伪提示(Pseudo Prompts),这些伪提示 (P0, P1, …, Pm) 是可以学习和优化的参数。
- 伪提示与输入文本一起被输入到预训练语言模型中,通过反向传播(Back Propagation)来调整伪提示,使得模型输出更加准确。
伪提示向量和模型参数一起被调整,以便更好地生成符合目标输出(output)的结果
案例讲解:
情景:
假设你有一个预训练好的语言模型(比如 GPT),你想让它回答一些关于地理的问题,比如“英国的首都是哪里?”
传统方式:
通常,你可能会在问题前加上一些提示词,比如“关于地理问题,请回答:”,然后再输入“英国的首都是哪里?”。模型会根据这个提示词和问题来生成答案:“伦敦”。
但有时候,这个简单的提示词不够好用,因为它是固定的,不够灵活,模型可能没有完全理解你的意图。
P-tuning 的做法:
P-tuning 不使用固定的提示词,而是引入了一些“伪提示”,这些伪提示是模型可以优化的向量(可以理解为一组模型自己能懂的“暗号”)。
具体步骤:
-
初始化伪提示:
- 这些“伪提示”一开始是一些随机生成的向量,比如
[P0, P1, P2, ...]
。
- 假设这次的伪提示是3个向量组成的
[P0, P1, P2]
。
-
构建输入:
- 输入文本“英国的首都是哪里?”先被转换成向量,然后在输入之前,把这组伪提示
[P0, P1, P2]
加在文本前面,所以模型看到的输入实际上是 [P0, P1, P2, 英国的, 首都, 是, 哪里]
。
-
模型输出并反馈:
- 模型生成一个答案,比如说它回答了“曼彻斯特”。
- 这个时候,我们知道答案是错的,因此会给模型一个反馈,告诉它“曼彻斯特”不对,这个反馈会通过反向传播的方式传递到模型的伪提示上。
-
优化伪提示:
- 模型会根据这个反馈去调整伪提示的参数
[P0, P1, P2]
,让下次它生成的答案更接近正确答案。
-
重复训练:
- 通过不断地训练和优化,伪提示会越来越“聪明”,逐渐引导模型正确理解问题,最后它就会回答出正确的“伦敦”。
伪提示:
伪提示与输入的嵌入向量
伪提示向量的作用是为模型提供额外的“可调节信息”,帮助它更好地生成输出
P-tuning 模型在接收到类似的输入指令和提示时,能够利用学习到的伪提示生成准确的输出,即满足任务要求的中文释义
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
2023-06-17 数据结构-枚举
2023-06-17 基础语法-异常
2023-06-17 数据结构
2023-06-17 基础语法-类的注意事项
2023-06-17 面向对象-继承
2023-06-17 面向对象-封装