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,则称其为低秩矩阵
![](https://img2024.cnblogs.com/blog/2894489/202406/2894489-20240617170801750-1121214657.png)
第三行是第一行的倍数,因此第三行可以由第一行线性表示(即它们是线性相关的)
第二行是第一行的倍数,所以它们也是线性相关的
矩阵的秩就是1
低秩矩阵(Low-Rank Matrix)
如果一个矩阵的秩 rrr 远小于其维度 mmm 和 nnn,则称其为低秩矩阵。例如,一个 1000×10001000 \times 10001000×1000 的矩阵,如果秩为10,则可以认为是低秩的
如何引入:
参数分解:将模型的某些参数矩阵分解为两个较低秩的矩阵的乘积。例如,对于一个权重矩阵W,可以分解为U⋅V,其中 U 和 V 是低秩的矩阵。
![](https://img2024.cnblogs.com/blog/2894489/202406/2894489-20240617172224669-381014670.png)
prompt(提示)
软提示:
通过引入可学习的张量,与输入嵌入向量结合,显著减少了需要训练的参数数量,同时保持了模型在不同任务上的适应性。
硬提示
虽然简单直观,但由于其需要手工制作,因此不如软提示方法高效和灵活。
软提示方法包括以下几种,这些方法都被集成在了🤗 PEFT(Parameter-Efficient Fine-Tuning)库中:
-
Prompt Tuning:
-
Prefix Tuning:
- 将可学习的前缀张量添加到输入序列的开头,并优化这些前缀以适应特定任务。
-
P-Tuning:
-
Multitask Prompt Tuning:
- 为多个任务设计可学习的提示,通过共享提示张量来同时优化多个任务。
Prompt Tuning
PEFT configurations and models (huggingface.co)
![](https://img2024.cnblogs.com/blog/2894489/202406/2894489-20240617233948746-1972708595.png)
蓝色的是预训练模型。
-
模型调优(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万参数。
- 这些任务提示和相应的数据一起输入预训练模型,模型根据提示调整其行为以完成特定任务。
代码
![](https://img2024.cnblogs.com/blog/2894489/202406/2894489-20240618124646627-392994917.png)
Prompt tuning 是专为文本分类任务开发的一种方法,最初应用于 T5 模型。其核心思想是将所有下游任务转换为文本生成任务。
工作原理
-
将任务转换为文本生成任务: 所有下游任务(如文本分类)都被转换为文本生成任务。例如,生成表示类别标签的标记。
-
固定模型参数: 预训练模型的参数保持不变,仅更新提示标记嵌入的梯度。
-
提示添加到输入中: 在输入文本前添加一系列提示标记,这些标记是模型在训练过程中学到的。
示例
假设我们有一个文本分类任务,要将输入句子分类为“积极”或“消极”。在传统方法中,模型会直接输出一个类别标签。而在提示调优中,输入句子前会加上提示标记,模型生成的输出则是表示类别标签的标记,例如:“这是一条[积极]评论”或“这是一条[消极]评论”。
prefix-tuning
PEFT configurations and models (huggingface.co)
![](https://img2024.cnblogs.com/blog/2894489/202406/2894489-20240617234012434-1876783309.png)
还是多个模型减少到一个模型
-
微调(Fine-tuning):
- 上半部分表示微调的过程。
- 对于每个任务(如翻译、摘要、表格到文本),有单独的Transformer模型。
- 每个任务的Transformer模型都经过专门的训练,以适应该任务的数据。
- 输入(Input)是带有特定格式的文本,例如“name Starbucks type coffee shop”。
- 模型生成相应的输出(Output),例如“Starbucks serves coffee”。
-
前缀调优(Prefix-tuning):
- 下半部分表示前缀调优的过程。
- 只使用一个预训练的Transformer模型,不针对每个任务单独微调整个模型。
- 每个任务有自己的前缀(Prefix),这些前缀是相对较小的参数集,分别用于不同的任务(如翻译、摘要、表格到文本)。
- 输入(Input)与微调类似,但在输入之前附加了任务特定的前缀。
- 预训练的Transformer模型根据输入和前缀生成相应的输出(Output)
Prefix tuning 是为自然语言生成(NLG)任务而设计的,特别应用于 GPT 模型。其工作原理与 Prompt Tuning 类似,都是在输入前添加一系列特定任务的向量,这些向量可以在保持预训练模型参数不变的情况下进行训练和更新
工作原理
-
任务特定向量的前缀: 在输入前添加一系列特定任务的向量,这些向量会贯穿模型的所有层。
-
前馈网络(FFN)优化: 使用一个独立的前馈网络来优化前缀参数,确保模型的稳定性和性能。FFN 在优化完成后会被丢弃。
-
保持预训练模型参数不变: 只需更新前缀参数,预训练模型的其他参数保持冻结状态。
示例
假设我们有一个生成任务,需要 GPT 模型根据输入文本生成相应的输出。在 Prefix tuning 中,我们会在输入前添加一系列特定任务的向量,这些向量会贯穿整个模型的所有层,确保在不改变预训练模型参数的情况下,优化生成的输出。
P-tuning
![](https://img2024.cnblogs.com/blog/2894489/202406/2894489-20240617234302961-497595827.png)
代码
![](https://img2024.cnblogs.com/blog/2894489/202406/2894489-20240618124325347-1889650458.png)