参数高效微调 (PEFT) 可以使预训练模型高效适应下游应用,而无需微调所有模型参数。 PEFT 支持广泛使用的大型语言模型低秩适应 (LoRA)。
为了从预训练的 Transformer 模型创建 LoRA 模型,我们导入并设置 LoraConfig。 例如,
from peft import LoraConfig
config = LoraConfig(
r=8,
lora_alpha=16,
target_modules=["q", "v"],
lora_dropout=0.01,
bias="none"
task_type="SEQ_2_SEQ_LM",
)
NSDT在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器
让我们回顾一下 LoraConfig 中的参数。
1、LoRA 维数/分解阶 r
对于要训练的每一层,d×k权重更新矩阵ΔW由低秩分解BA表示,其中B是d×r矩阵,A是r×k矩阵。 分解 r 的秩为 << min(d,k)。 r 的默认值为 8。
A 由随机高斯数初始化,因此初始权重更新有一些变化。 B 由零初始化,因此训练开始时 ΔW 为零。
2、LoRA 缩放参数 lora_alpha
根据 LoRA 文章,ΔW 按 α / r 缩放,其中 α 是常数。 当使用 Adam 进行优化时,如果适当缩放初始化,调整 α 与调整学习率大致相同。 原因是参数的数值随 r 线性增加。 随着 r 的增加,ΔW 中的条目值也随 r 线性缩放。 无论使用什么 r,我们都希望 ΔW 能够与预训练权重保持一致。 这就是为什么作者将 α 设置为第一个 r 并且不对其进行调整。 α 的默认值为 8。
3、将 LoRA 应用于 target_modules 的模块
你可以选择特定模块进行微调。 根据说明,loralib仅支持nn.Linear、nn.Embedding和nn.Conv2d。 微调线性层是常见的做法。 要了解你的模型具有哪些模块,请使用 Python 中的transformers库加载模型,然后打印(模型)。 默认值为“无”。 如果你想微调所有线性层,请执行以下操作:
import re
pattern = r'\((\w+)\): Linear'
linear_layers = re.findall(pattern, str(model.modules))
target_modules = list(set(linear_layers))
4、LoRA 层的丢失概率 lora_dropout
Dropout 是一种通过在训练过程中以 dropout 概率随机选择要忽略的神经元来减少过度拟合的技术。 这些选定的神经元对下游神经元激活的贡献在前向传递中被暂时删除,并且任何权重更新都不会应用于后向传递中的神经元。 lora_dropout的默认值为0。
5、Lora bias偏差类型
偏差可以是“无”、“全部”或“lora_only”。 如果是“all”或“lora_only”,则相应的偏差将在训练期间更新。 即使禁用适配器,模型也不会产生与没有适应的基本模型相同的输出。 默认值为“无”。
6、任务类型task_type
似乎在不指定task_type 的情况下一切都正常。 可能的任务类型包括 CAUSAL_LM、FEATURE_EXTRACTION、QUESTION_ANS、SEQ_2_SEQ_LM、SEQ_CLS 和 TOKEN_CLS。
7、其他参数
其余参数包括 fan_in_fan_out、modules_to_save、layers_to_transform 和layers_pattern 不太常用。
原文链接:PEFT LoraConfig参数详解 - BimAnt