ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

PEFT DeLoRA 实战指南:通过解耦角度与幅度实现有界低秩微调

PEFT DeLoRA 实战指南:通过解耦角度与幅度实现有界低秩微调 人工智能大模型微调LoRA【免费下载链接】peft PEFT: State-of-the-art Parameter-Efficient Fine-Tuning.项目地址https://gitcode.com/gh_mirrors/pe/peft点击查看免费下载DeLoRADecoupled Low-Rank Adaptation解耦低秩自适应是 PEFT 库中新增的一种参数高效微调方法其核心思想是在 Frobenius 范数有界Frobenius-norm bounded的设置下进行微调通过对低秩矩阵 BA 进行归一化、引入可学习的缩放因子 λ、以及按层对原始权重范数 ‖W‖ 进行缩放从而将更新方向角度与更新强度幅度的学习解耦防止模型偏离预训练权重过远。本文以 examples/delora_finetuning/README.md 为主体结合 DeloraConfig 源码、DeloraLayer 实现 与完整可运行的 delora_finetuning.py 示例脚本从原理、API、训练、推理到调参实践为你提供一份可直接上手的完整指南。DeLoRA 的动机与核心机制为什么需要有界微调主流 PEFT 方法如 LoRA在超参数选择不恰当或训练轮次过长时容易出现对超参数敏感、微调后模型偏离预训练分布过远的问题。而 ETHER 等有界方法虽然鲁棒性更好但仅限于极低秩和固定强度变换表达力受限。DeLoRA 的出发点正是在两者之间取得平衡显式约束权重更新的 Frobenius 范数上界在不牺牲表达力的前提下提升鲁棒性。三项关键设计根据原文档DeLoRA 通过三个步骤实现上述目标详见 DeloraLayer._compute_deltaBA 低秩矩阵归一化对 A 矩阵的行范数与 B 矩阵的列范数进行归一化从而为权重更新 ΔW 施加 Frobenius 范数边界可学习缩放参数 λdelora_lambda控制更新的边界/幅度替代 LoRA 中的lora_alpha对每次更新的最大范数设上限按层缩放 ‖W‖delora_w_norm在初始化时冻结记录每个被适配层原始权重的逐列范数将更新幅度适配到原始权重的量级避免小范数层被大更新淹没或反之。从源码看前向传播中的 ΔW 计算可以拆解为对应 layer.py 的 forward 实现h (x * w_norm) A.T # 步骤 1逐输入通道按原始权重范数缩放 scaling (λ / r) / (‖A_i‖ · ‖B^j‖) # 步骤 2对角缩放矩阵 diag(λ/r / (‖A_i‖·‖B^j‖)) h h B.T # 步骤 3投影回输出空间其中An clamp(‖A‖行范数, min1e-4)、Bn clamp(‖B‖列范数, min1e-4)用于数值稳定性最终 ΔW B · diag(λ/r/(‖A_i‖·‖B^j‖)) · A再乘以冻结的 w_norm。与 LoRA 的固定alpha/r缩放不同这里的缩放因子随训练中 A、B 的范数动态变化从而持续约束更新范数。DeLoRA 与 DoRA 的对比DoRA 与 DeLoRA 都旨在解耦角度方向与幅度magnitude的学习但存在关键差异原文档明确说明维度DoRADeLoRA归一化/缩放作用对象全量微调后的权重W ΔW权重更新ΔW本身归一化空间权重矩阵的列空间内部的低维空间防发散效果较弱直接在更新上设界更好防止偏离预训练模型简言之DeLoRA 把边界约束直接加在更新量上因此对偏离预训练模型的抑制更强。快速开始在 PEFT 中使用 DeLoRA最小化训练示例将标准的LoraConfig替换为DeloraConfig即可。注意lora_alpha被delora_lambda取代它给权重变化的 Frobenius 范数设置上界。原文档给出的完整示例训练 推理import torch from peft import DeloraConfig, get_peft_model from transformers import AutoTokenizer, AutoModelForCausalLM from trl import SFTConfig, SFTTrainer from datasets import load_dataset model AutoModelForCausalLM.from_pretrained(meta-llama/Meta-Llama-3-8B, dtypetorch.bfloat16, device_mapauto) tokenizer AutoTokenizer.from_pretrained(meta-llama/Meta-Llama-3-8B) tokenizer.pad_token_id tokenizer.eos_token_id delora_config DeloraConfig(r32, delora_lambda15) peft_model get_peft_model(model, delora_config) peft_model.print_trainable_parameters() dataset load_dataset(imdb, splittrain[:1%]) training_args SFTConfig(dataset_text_fieldtext, max_length128) trainer SFTTrainer( modelpeft_model, argstraining_args, train_datasetdataset, processing_classtokenizer, ) trainer.train() peft_model.save_pretrained(delora-llama-3-8b)加载微调后的 DeLoRA 模块微调产物与 LoRA 完全兼容同一套 PEFT 加载机制import torch from peft import PeftModel from transformers import AutoModelForCausalLM model AutoModelForCausalLM.from_pretrained( meta-llama/Meta-Llama-3-8B, dtypetorch.bfloat16, device_mapauto ) peft_model PeftModel.from_pretrained(model, delora-llama-3-8b)保存的权重包含delora_A、delora_B、delora_lambda以及持久化的delora_w_normbuffer见 DeloraLayer 的参数定义可直接用于推理或继续训练。DeloraConfig 参数详解以下是DeloraConfig的完整参数清单依据 config.py 源码参数类型默认值说明rint8DeLoRA 适配器的秩必须是正整数r 0会抛ValueErrordelora_lambdaint15边界 λ 的初始值给权重变化的 Frobenius 范数设上界防止微调模型偏离原始模型过远module_dropoutfloat0.0训练中随机禁用 DeLoRA 模块的丢弃概率不同于常规 dropouttarget_modulesOptional[Union[list[str], str]]None应用适配器的模块名传字符串按正则匹配传列表按精确/后缀匹配all-linear匹配除输出层外所有 linear/Conv1D不指定时按架构自动选择未知架构会报错需手动指定exclude_modulesOptional[Union[list[str], str]]None需要排除的模块名规则同target_modulesbiasLiteral[none, all, delora_only]noneDeLoRA 的偏置训练策略注意设为all/delora_only后即使禁用适配器模型输出也不会与基座模型完全一致init_weightsboolTrue为 True 时 A 用 kaiming uniform 初始化、B 用零初始化初始 ΔW0为 False 时 A、B 均为 kaiming uniform立即产生非零增量一般不建议layers_to_transformOptional[Union[list[int], int]]None只对指定索引的层施加适配器layers_patternOptional[Union[list[str], str]]None配合layers_to_transform使用指向模型的nn.ModuleList常为layers或h指定了layers_pattern却未指定layers_to_transform会报错rank_patterndict{}按层名/正则指定不同秩如{^model.decoder.layers.0.encoder_attn.k_proj: 16}lambda_patterndict{}按层名/正则指定不同 λ如{^model.decoder.layers.0.encoder_attn.k_proj: 16}modules_to_saveOptional[list[str]]None除适配器层外需要设为可训练并保存的模块如分类头的classifier/score另外两点来自源码的约束校验target_modules传入字符串正则时不能同时使用layers_to_transform否则抛ValueErrorconfig.py 第 154-155 行peft_type会被自动设为PeftType.DELORA与LoraConfig等一同在 PeftConfig 体系 中注册。当前实现约束根据 docs/source/package_reference/delora.md 与 model.py 的_create_new_moduleDeLoRA 目前有以下限制仅支持torch.nn.Linear层其他层类型会抛出TypeError不支持量化层如 bitsandbytes 的 4/8 bit 层若你的场景不满足上述约束请改用其他 PEFT 方法如标准 LoRA。使用完整脚本微调 Llama 系模型仓库提供了开箱即用的命令行训练脚本 examples/delora_finetuning/delora_finetuning.py基于 randlora 示例脚本改造内部使用DeloraConfigtransformers.Trainer完成因果语言建模微调。完整训练命令原文档给出的完整参数示例python delora_finetuning.py \ --base_model PATH_TO_MODEL \ --data_path PATH_TO_DATASET \ --output_dir PATH_TO_OUTPUT_DIR \ --batch_size 1 \ --num_epochs 3 \ --learning_rate 3e-3 \ --cutoff_len 512 \ --val_set_size 500 \ --eval_step 10 \ --save_step 100 \ --device auto \ --rank 32 \ --delora_lambda 15 \ --module_dropout 0.1 \ --target_modules q_proj,v_proj \ --hub_model_id YOUR_HF_REPO \ --push_to_hub命令行参数与脚本默认值结合 脚本 argparse 定义各参数说明如下参数默认值说明--base_modelhuggyllama/llama-7b基座模型路径或 HF 名称--data_pathtimdettmers/openassistant-guanaco数据集路径或名称--output_dirpath/to/output微调产物输出目录--batch_size1每设备批大小--num_epochs1训练轮数--learning_rate3e-3学习率--cutoff_len512分词截断长度--val_set_size500验证集大小--eval_step10评估间隔步数--save_step100保存间隔步数--deviceauto设备auto时优先用torch.accelerator.current_accelerator()否则回退cuda--rank32DeLoRA 基秩--delora_lambda640边界 λ 初始值注意脚本默认 640原文档示例用 15按需调整--module_dropout0.05DeLoRA 模块丢弃率--target_modulesNone逗号分隔的目标模块列表为 None 时按架构默认映射--hub_model_idpath/to/repo推送到 HF Hub 的仓库名--push_to_hubFalsestore_true是否推送到 HF Hub脚本内部实现要点混合精度自动选择脚本检测当前设备是否支持 bf16device_module.is_bf16_supported()支持则用torch.bfloat16否则回退torch.float32脚本第 47-50 行DeLoRA 配置DeloraConfig(rrank, delora_lambdadelora_lambda, target_modules..., module_dropout..., biasnone)脚本第 59-65 行训练参数warmup 设为总步数的 10%gradient_accumulation_steps16weight_decay0.0save_total_limit2脚本第 91-107 行保存无论是否推送 Hub都会在本地保存模型与 tokenizer脚本第 129-131 行。自定义适配层target_modules与lambda_pattern默认情况下不指定target_modulesDeLoRA 使用与 LoRA 相同的架构映射见 src/peft/utils/constants.py 第 67-108 行例如 Llama/Mistral/Qwen 系列默认只适配q_proj和v_proj。如果需要在更多层上添加适配器注意会增加显存占用可以显式指定例如原文档中的python examples/delora_finetuning/delora_finetuning.py \ --base_model meta-llama/Meta-Llama-3-8B \ --target_modules q_proj,k_proj,v_proj,o_proj不同层还可以使用不同的 λ通过lambda_pattern按层名或正则指定例如{^model.decoder.layers.0.encoder_attn.k_proj: 16}源码中通过get_pattern_key对当前层名匹配rank_pattern/lambda_pattern来决定该层实际的r与delora_lambda见 model.py 的_create_and_replace。同理可用rank_pattern为不同层设置不同秩。调参最佳实践原文档明确给出了两条经验法则使用比标准 LoRA 大 10~100 倍的学习率典型值在 1e-3、1e-2 量级。因为 DeLoRA 的更新范数被 λ 显式约束较大的学习率不会导致更新失控反而能加快收敛λ 的初始值不要设得太小典型值在 10、15 附近。λ 是更新范数的上界设得过小会过度限制表达力导致欠拟合同时可以为不同层分配不同的 λ 以获得更精细的控制。官方文档delora.md还补充了超参数鲁棒性的设计目标由于角度与幅度学习被解耦DeLoRA 对超参数选择和训练时长的鲁棒性优于 LoRA官方评估覆盖了主题驱动图像生成、自然语言理解与指令微调等任务。源码中的实现细节与验证权重初始化与 λ 的冻结记录reset_delora_parameterslayer.py 第 128-154 行完成三件事init_weightsTrue时A 用kaiming_uniform_(asqrt(5))B 用零初始化保证初始 ΔW 0与 LoRA 类似训练开始时模型行为与基座一致delora_lambda填充为配置的初始值一个可学习标量nn.Parameter用torch.no_grad()冻结记录基座权重W的逐列范数到delora_w_normmeta 张量场景下退化为全 1该值在训练中不参与梯度更新。合并与解合并DeloraLinear.merge/unmergelayer.py 第 173-224 行支持把适配器权重合入基座权重safe_mergeTrue时先复制权重并检查 NaN。这与 LoRA 的合并语义一致方便在推理部署时零额外开销地使用微调结果。多适配器支持DeloraLayer继承自BaseTunerLayer支持多适配器并存delora_A、delora_B、delora_lambda均为ParameterDict前向传播时遍历active_adapters累加各适配器输出layer.py 第 242-262 行新增非激活适配器时自动requires_grad_(False)model.py 第 89-91 行。测试覆盖仓库测试对 DeLoRA 有较完整覆盖可作行为参考tests/test_initialization.py 第 2801-2827 行验证init_weightsTrue/False两种初始化路径tests/test_custom_models.py 第 1151-1154 行自定义 MLP 上target_modules的字符串/列表/正则三种写法tests/regression/test_state_dict.py 第 246 行DeloraConfig参与 state_dict 回归测试同时出现在 tests/test_decoder_models.py、tests/test_encoder_decoder_models.py、tests/test_seq_classifier.py 等模型族测试中验证其对主流架构的兼容性。引用DeLoRA 论文ICLR 2025inproceedings{bini2025decouplinganglesstrengthlowrank, title{Decoupling Angles and Strength in Low-rank Adaptation}, author{Massimo Bini and Leander Girrbach and Zeynep Akata}, year{2025}, booktitle{International Conference on Learning Representations (ICLR)}, }更多 API 细节可查阅 docs/source/package_reference/delora.md含论文摘要与DeloraConfig/DeloraModel的 autodoc。赞分享人工智能大模型微调LoRA【免费下载链接】peft PEFT: State-of-the-art Parameter-Efficient Fine-Tuning.项目地址https://gitcode.com/gh_mirrors/pe/peft点击查看免费下载相关推荐PEFT 中的 PEANuT 微调实战用权重感知神经网络 Tweaker 替代 LoRA 低秩分解PEFT 中的 PEANuT 微调实战用权重感知神经网络 Tweaker 替代 LoRA 低秩分解 本文基于仓库中的 PEANuT 微调示例文档 https:人工智能大模型微调LoRATRL 中的 PEFT 集成LoRA、QLoRA 与 Prompt Tuning 的低成本微调实战指南TRL 中的 PEFT 集成LoRA、QLoRA 与 Prompt Tuning 的低成本微调实战指南 本篇技术指南围绕 TRL 官方文档 docs/sour人工智能大模型强化学习RLHF预训练微调LoRALabel Studio多模态数据标注Docker 一条命令启动Label Studio多模态数据标注Docker 一条命令启动 3 万张商品图外包报价拖了两周还没排上项目排期直接卡死。Label Studio 是一人工智能大模型微调LoRA上一篇FreeAskInternet如何打造完全免费且保护隐私的本地AI搜索助手下一篇【亲测免费】 Arduino-HomeKit-ESP8266 开源项目教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表