1. 横向对比
总体概览:
方法 | Transformer 中如何应用 | 特点 |
---|---|---|
Prompt Tuning | 在输入到Transformer的input文本中添加Prompt | hard 模式prompt CO-STAR |
P-tuning | 在输入到Transformer的embedding 层添加Prompt | soft 模式 prompt |
Adapter Tuning | 在 Transformer 中间层插入 Adapter layer | 添加额外模型层 |
Prefix-Tuning | 在 Transformer 自注意力的 K和V token 前添加前缀 | 适用于下游任务,易于调整 |
LORA | 在Transformer的 QKVO 矩阵和 FFN 矩阵中添加 | 可训练参数最少 |
IA3 | 在Transformer的 K 和 V token以及 FFN 中添加 | 通过中间任务优化微调步长 |
方法 | Transformer 中如何应用 | 特点 |
Prompt Tuning | 找到合适的prompt需要大量计算和时间 | 当计算资源有限但需要微调模型 |
P-tuning | 微调效果有限 | 当需要平衡原始信息和优化目标 |
Adapter Tuning | 引入推理延迟 | 复杂任务 |
Prefix-Tuning | 容易导致旧知识遗忘 | 使用 BERT 进行微调 |
LORA | 原有网络参数改变,但没有增加推理延迟 | 整体效果最好的情况 |
IA3 | 可能增加计算和存储要求 | 在源任务和目标任务之间需要平衡的情况 |
2. 纵向理解
2.1 Adapter Tuning
- 核心理念:在保留并冻结原始模型的基础上,通过添加并训练额外的网络层,增强模型对其他任务的适应性,就像给模型装上一种“适配器”
2.2 Prompt-tuning
- 核心理念:通过在训练数据前加入一段“提示”(Prompt)并只对其进行训练,从而在保留主模型全部参数的同时增加模型的弹性。其中,“提示”有两种形式,一种是固定的(hard prompt),一种是可以学习的(soft prompt)
2.3 P-Tuning
- 核心理念:在 Prompt-Tuning 的思想上更进一步,对 “提示” 部分引入额外的编码计算(比如 LSTM 或 MLP),以加速模型的收敛。这种方法只使用可以学习的“提示”(Soft Prompt)
2.4 Prefix-Tuning
- 核心理念:与其它方法不同,Prefix-Tuning 将 “提示” 当作可学习的前缀,在模型的每一层中都会使用到,具体形式为 past_key_values。这就像在模型的每个层级都留下了一段有用的“前缀”
- 什么是 past_key_values?
- past_key_values: Transformer 模型中历史计算过的key和value的结果,最早是用于生成类模型解码加速,解码逻辑是根据历史输入,每次预测一个新的tokern,然后将新的token加入输入,再预测下一个token。这个过程中,会存在大量的重复计算,因此可以将key和value的计算结果缓存,作为past_key_values输入到下一次的计算中,这一技术又被称之为kv_cache
- Prefix-Tuning中,就是通过past_key_values的形式将可学习的部分放到了模型中的每一层,这部分内容又被称之为前缀
2.5 Lora
- 核心理念:训练时,输入会与原始权重以及两个低秩矩阵共同参与计算,但优化过程只针对这两个低秩矩阵。训练完成后,可以将这两个低秩矩阵与原始模型合并,合并后的模型与原始模型一样,避免了推理时的额外计算量。
- 理论基础
- LORA得益于前人的一些关于内在维度(intrinsic dimensicon)的发现:模型是过参数化的,它们有更小的内在维度,模型主要依赖于干这个低的内在维度(lowintrinsic dimension)去做任务适配。
- 假设模型在任务适配过程中权重的改变量是低秩(lowrank)的,由此提出低秩自适应(LoRA)方法。
- LORA允许我们通过优化适应过程中密集层变化的秩分解矩阵,买来间接训练神经网络中的一些密集层,同时保持预先训练的权重不变。
- 算法细节
2.6 IA3
- 核心理念:通过一种可以学习的向量对激活值进行抑制或放大,对 K、V、FFN 三部分的值进行调整,从而在训练过程中只更新这部分向量。训练完成后,可以将这部分参数与原始模型合并,没有额外的推理开销。
2.7 结论
-
- Lora 微调方法适用于 LLM / LMM 微调,其参数量较全参数微调(Fine-Tuning)显著降低,参数量和现有高效参数微调方法持平或更低。性能优于其它参数高效微调方法,和全参数微调(Fine-Tuning)基本持平甚至更高。
-
- Adapter-tuning 与 predix-tuning 适用于 BERT 微调
2.8 P-Tuning V2
2.9 QLora
- 代码实现
import torch
from transformers
import BitsAndBytesConfig
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_use_double_quant=False, # 双量化
bnb_4bit_quant_type="nf4", # 创新2 int8、fp16、fp32、bf16
bnb_4bit_compute_dtype=torch.bfloat16
)
model_4bit = AutoModelForCausalLM.from_pretrained(model_id, quantization_config=bnb_config
-
非均匀量化
-
量化过程
-
Quantize:
- 1.73<x<2.26 -> 14
-
Dequantize:
- 14 -> (1.73+2.26) / 2 = 1.995
-
两边各舍弃累计概率密度:
- 0.0322917
-
0值单独拿出来,作为 16 个值中的 1 个,正数分配 8 个,复数分配 7 个,按照累计概率密度等分
-
这里也就是 NF4,用于对符合正态分布的数进行量化的,而非用于直接计算,需要反量化为浮点型才能进行推理计算,这也是 config 中需要指定计算类型——bnb_4bit_compute_dtype 的原因
-