11.大模型微调理论方法介绍
·
1. 其他主流微调方法详解
1)全量参数微调
- 定义:所有模型参数一同参与训练,每个参数都会被更新
- 优点:
- 灵活性高:参数全部开放训练,模型能力上限更高
- 性能更好:参数量越大、网络层数越深,模型能力通常越强(符合深度学习理论)
- 缺点:
- 计算资源要求高:所有参数都需要GPU计算资源
- 训练风险:
- 数据量少时容易过拟合(epoch迭代次数过多会导致参数过度适配当前数据集)
- 可能遗忘预训练知识(当微调任务与预训练任务差异较大时,会"洗坏"原有参数)
- 数据构造不良时,可能导致模型在原有任务和新任务上表现都变差
2)Freeze:冻结部分层进行微调
- 冻结部分层进行微调的概述与特点
- 基本原理:
- 冻结(不更新)部分模型参数
- 仅开发(更新)特定层的参数
- 典型做法:
- 选择冻结模型的底层(低级特征提取部分)
- 仅更新模型的高层(高级语义处理部分)
- 优势:
- 高效性:训练速度快(参数更新量少)
- 知识保留:不易遗忘预训练知识
- 防过拟合:参数更新受限,不易过度适配当前数据
- 基本原理:
- 图像领域中冻结部分层进行微调的应用
- 典型架构:
- Backbone:预训练好的特征提取网络(如ResNet、MobileNet等)
- FC层:根据下游任务定制的输出层
- 应用场景:
- 目标检测
- 语义分割
- 实例分割
- 图像分类
- 工作流程:
- 下载预训练模型
- 冻结backbone全部参数
- 仅修改输出层适配新任务
- 典型架构:
- 自然语言领域中冻结部分层进行微调的应用
- 典型架构:
- Backbone:Transformer Encoder(如BERT)
- FC层:任务特定输出层
- 应用场景:
- 文本分类
- 文本摘要
- 其他NLP下游任务
- 理论基础:
- 底层网络:负责低级特征提取(词语/语法层面)
- 高层网络:负责高级语义处理(篇章/意图层面)
- 典型架构:
- 冻结部分层进行微调的代码实现与一个backbone多个头
- 代码实现:
- 多任务应用:
- 一个backbone多个头:同一backbone可连接不同FC层处理不同任务
- 实现方式:
- 训练时:多任务联合训练(如同时处理目标检测和语义分割)
- 推理时:根据需要切换不同的输出头
- 冻结部分层进行微调的局限性及高效微调的引出
- 局限性:
- 效果受限:仅调整输出层,对模型能力提升有限
- 灵活性不足:无法调整特征提取过程
- 任务适配性差:当新任务与预训练任务差异较大时效果不佳
- 改进方向:
- 引出高效微调方法(如Adapter、LoRA等)
- 在保留预训练知识的同时,实现更灵活的参数调整
- 局限性:
3)高效微调方法介绍
- adapter tuning(适配器调试)
- 核心思路:在Transformer的encoder架构中,feedforward层后接入adapter适配器模块
- 实现方式:
- 冻结原始主干网络所有参数
- 仅更新adapter模块参数进行微调训练
- 应用领域:图像和自然语言处理领域均有应用
- 优势:在保持原网络参数不变的情况下增强下游任务适配能力
- 缺点:
- 增加网络深度导致额外推理延迟
- 增加参数量(每个adapter约0.5-8%原始参数量)
- 推理时延显著增加(约15-20%)
- prefix tuning 前置调试
- 核心机制:在Transformer主干上添加可训练的prefix头部
- 参数控制:
- 冻结主干右半部分参数
- 仅开放左半部分prefix头部参数进行调整
- 技术特点:
- 保留预训练获得的通用知识
- 通过小规模参数调整适配下游任务
- 主要问题:
- 训练难度大(开放参数量过小)
- 缩减可用序列长度(如1024→896)
- 效果稳定性较差(约30%任务表现波动)
- prompt tuning 提示调试
- 实现原理:
- 在输入文本旁添加可训练prompt
- 将prompt与原始输入拼接后送入预训练模型
- 多任务支持:
- 不同下游任务训练不同prompt参数
- 同一模型支持多任务推理(分类/摘要等)
- 参数更新:
- 通过反向传播机制优化prompt参数
- 仅需训练prompt参数(约0.1%总参数量)
- 优势对比:
- 相比完全微调节省90%训练资源
- 模型部署体积减少85%
- 实现原理:
- p-tuning P调试
- 技术演进:
- 将硬提示(prompt)转换为可学习embedding层
- 引入MLP+LSTM处理prompt embedding
- 核心改进:
- 在embedding空间而非文本空间进行优化
- 支持prompt在序列任意位置插入(非限定头部)
- 实现细节:
- 通过prompt encoder生成任务特定embedding
- 与输入embedding动态融合(concat/add等方式)
- 典型参数量:每任务新增约0.3-1.2M参数
- 版本差异:
- v1:基础embedding拼接
- v2:加入双向LSTM特征增强
- v2.1:引入对抗训练提升鲁棒性
- 技术演进:
-
2.当前高效微调总结
2.1LoRA微调
- 方法对比
- Prompt Tuning:
- 仅训练prompt参数
- 支持多任务推理
- P-tuning:
- 将prompt转为可学习Embedding层
- 使用MLP+LSTM处理Prompt Embedding
- Adapter Tuning:
- 插入适配层增加模型深度
- 导致额外推理延迟
- Prefix Tuning:
- 提示训练难度大
- 会缩短可用序列长度
- 效果评估:LoRA经2-3年实践验证,在效果和稳定性上最优
- Prompt Tuning:
- Lora tuning:通过低秩分解来模拟参数的该变量,从而以极小的参数两来实现大模型的间接训练
- 优势:显存占用低、训练速度快、模型小、效果最好
- 作用位置:主要作用于注意力机制的query,key,value的Wq,Wk,Wv以及多头attention的输出矩阵Wo
- 核心参数选择
- 低秩分解原理:通过并联100万×1000和1000×100万两个小矩阵模拟原100万×100万大矩阵的参数变化,实现参数冻结下的间接训练
- 秩(rank)选择:
- 决定了微调时使用的低秩矩阵的难度
- 简单任务/小数据集取4
- 复杂任务/大数据集取8或16
- lora_alpha参数:
- 控制低秩矩阵的缩放因子,平衡低秩矩阵的影响
- alpha过高可能会导致训练不稳定或过拟合;如果太低,lora的效果可能不太明显
- 取值16-32(过高导致过拟合,过低效果不明显)
- Dropout设置:
- 控制丢弃的概率
- 常用0.2-0.3
- 小模型取0.1,大模型取0.4-0.5防止过拟合
- 矩阵运算示例:[10000000,1000]×[1000,1000000]=[10000000,10000000]
- 并联结构优势:相比Adapter的串联结构,不会增加推理延迟
- 参数冻结机制:原始预训练权重保持冻结,仅更新低秩分解矩阵参数
- 方法对比
2.2 量化与LoRA结合
- 4-bit 量化
- Qlora首先将整个预训练模型从常规的16bit浮点数(FP16或BF16)量化韦4bit数据类型,同时记录量化常数(缩放因子scale和零点zero-point)来帮助还原信息,显著减小了模型现存占用
- 混合精度训练
- 冻结的模型是4-bit的,但在前向和反向传播计算式,Qlora会将4bit参数动态反量化回16bit浮点数进行计算,以保持精度(只有lora适配器A B矩阵是在16bit京都下进行训练和梯度更新)
- 双量化
- 对量化常熟(fp32)进一步量化(通常到8bit)进一步减小空间
- QLoRA范围:5e-5到2e-4(因量化需更低学习率)
- LoRA范围:1e-4到5e-4(常规设置)
- Qlora中bitsandbytes库的使用与配置
- 三阶段处理:
- 归一化:权重归一化到特定范围,便于高效表示常见值
- 量化:权重被量化为4/8-bit,NF4模式下量化级别均匀分布
- 反量化:计算时临时恢复为16-bit保证精度
- 实践配置:
- 量化方法选择"bnb"(bitsandbytes)
- 量化等级可选4-bit或8-bit
- 推理时使用原始数据类型保证精度
- 三阶段处理:
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)