大模型的微调技术(高效微调原理篇)
背景
公司有需求做农业方向的大模型应用以及Agent助手,那么适配农业数据就非常重要。但众所周知,大模型的全量微调对算力资源要求巨大,在现实的限制条件下基本“玩不起”,那么高效微调技术就非常必要。为了更好地对微调技术选型和应用,本文整理了常用参数高效微调的方法原理。

参数高效微调(Parameter-Efficient Fine-Tuning, PEFT)
- 核心思想:冻结大部分预训练参数,仅微调少量参数
- 优势:显存占用低,适合资源受限场景
- 应用场景:快速领域适配、多任务适配
LoRA(Low-Rank Adaptation)
LoRA微调是针对大参数量模型全量微调高昂的存储和计算成本提出的解决方案,直接、通用、高效。其解决方案是冻结预训练模型的权重,仅通过向Transformer层的权重矩阵注入低秩分解矩阵(秩为r)来适应下游任务,显著减少可训练参数数量。

- 假设权重更新矩阵ΔW具有低秩性,将其分解为两个小矩阵的乘积:ΔW = BA,其中B ∈ ℝ^(d×r),A ∈ ℝ^(r×k),r ≪ min(d, k)。
- 训练时,仅优化A和B的参数,预训练权重W0保持冻结。
- 推理时,将ΔW与W0合并,不引入额外延迟。
举个例子,假设在Transformer模型中,某个全连接层的权重矩阵 W₀ 的维度为 d=1024(输入维度),k=1024(输出维度),即 W₀ ∈ ℝ¹⁰²⁴×¹⁰²⁴。我们使用LoRA进行微调,选择低秩 r=8。
矩阵B:维度为 d × r,即 1024 × 8。
矩阵A:维度为 r × k,即 8 × 1024。
ΔW = B × A:矩阵乘法的结果维度为 1024 × 1024,与原始权重矩阵 W₀ 的维度一致。
原始全微调(ΔW):需要训练 1024×1024 = 1,048,576 个参数。
LoRA(B和A):仅需训练 1024×8 + 8×1024 = 16,384 个参数,减少约64倍。
Adapter
Adapter是另一种参数高效迁移的微调方法。通过在预训练模型的每一层中插入小型可训练模块(适配器),原始模型参数冻结,从而大大减少需要训练的参数量。

-
设计原理:
- 在预训练模型的每一层中插入小型可训练模块(适配器),固定原始模型参数。
-
适配器结构为瓶颈式(Bottleneck):输入→降维→非线性激活(如ReLU)→升维,中间层维度远小于输入(例如d=768 → m=64)。
- 初始化时接近恒等函数(参数接近零),确保训练初期不干扰预训练模型。
-
参数效率:
- 每个任务仅需添加少量参数(每层约0.5%-8%的参数量),总参数量远低于全微调(例如GLUE任务仅需3.6%的新参数)。
- 新增参数包括适配器权重和任务特定的层归一化(LayerNorm)参数。
-
部署灵活性:
-
支持任务增量学习:新任务仅需添加新的适配器,不影响已有任务。
-
适配器自动聚焦于高层网络(高层适配器对任务影响更大,低层影响较小)。
-
对比LoRA和Adapter
选择维度
| 维度 | 优先选Adapter | 优先选LoRA |
|---|---|---|
| 任务复杂度 | 复杂任务(需高频特征或复杂推理) | 常规任务(文本分类、生成等) |
| 模型规模 | 中小模型(参数量<10B) | 超大规模模型(如LLaMA-70B、GPT-3) |
| 推理延迟敏感性 | 可容忍一定延迟(如离线任务) | 要求零延迟(如实时API) |
| 多任务扩展性 | 需动态插拔任务适配器 | 需同时服务大量任务(共享低秩矩阵) |
| 显存/计算资源 | 资源较充足,需稳定性能 | 显存紧张(如单卡微调LLM) |
场景化建议
-
大模型+实时服务(如部署LLaMA到聊天机器人):
选择LoRA,因其零延迟、参数少,适合资源敏感场景。
-
多任务灵活切换(如云平台支持NLP多任务):
选择Adapter,通过插拔适配器快速扩展任务,避免模型冗余。
-
低资源微调小模型(如BERT-base文本分类):
可任选:Adapter在小模型上延迟可忽略;LoRA参数更少但需调秩。
-
复杂任务(如代码生成、数学推理):
优先Adapter,因其模块化设计能更灵活捕捉任务特征。
Prefix-Turning
Prefix-Turning的核心在于在输入前添加可训练前缀,引导生成过程。由于其仅微调前缀参数,冻结主干参数,具备高效性以及减少灾难性遗忘风险。核心机制是通过注意力机制间接控制生成方向(隐式控制)。
以一个具体任务为例子说明Prefix-Turning具体做了什么。
任务:将结构化表格(如餐厅信息)转化为自然语言描述。
输入表格(线性化后):
name: Starbucks | type: coffee shop | food: pastries | price: moderate | area: downtown
目标输出:
Starbucks is a coffee shop located in downtown. It serves pastries at moderate prices.
1. 构造输入序列
在输入前添加长度为 k=2 的可训练前缀(实际应用中可能更长,如 k=10)。
输入序列构造:
[前缀向量1] [前缀向量2] [name: Starbucks] [type: coffee shop] ... [生成文本]
前缀矩阵:前缀被参数化为一个可训练矩阵 P θ ∈ R L × d P_θ∈R^{L×d} Pθ∈RL×d,其中 L 是前缀长度,d 是隐藏层维度。
输入序列构造:对于输入序列 x x x,将前缀矩阵 P θ P_θ Pθ 直接拼接在 x 的前面,形成新的序列 z = [ P θ ; x ] z=[P_θ;x] z=[Pθ;x]。
2. 参数初始化
- 前缀参数:随机初始化一个矩阵
P(形状k × d_model,如2×768)。 - 重新参数化:通过一个小型 MLP(如单层全连接)将
P映射到每一层的激活空间(提升训练稳定性)。
具体说明:
-
假设前缀长度为 L,每个前缀向量维度为 d(与Transformer隐藏层维度一致),则前缀参数矩阵 P θ {P_θ} Pθ 的尺寸为 L×d。
-
定义一个小矩阵 P θ ′ P_θ' Pθ′,其尺寸为 L×k,其中 k≪d。此时参数量减少为 L×k。
-
通过一个多层感知机(MLP)将低维矩阵 P θ ′ P'_θ Pθ′ 映射到原始维度 d,生成最终的前缀矩阵:
P θ = M L P ( P θ ′ ) P_θ=MLP(P'_θ) Pθ=MLP(Pθ′)
3. 训练
- 冻结模型参数:原始大模型的所有参数固定不变。
- 仅优化前缀参数:通过反向传播更新前缀向量和 MLP 参数。
- 损失函数:标准语言模型损失(生成文本的交叉熵)。
4. 推理
-
参数化:丢弃 MLP,直接使用优化后的 P θ = M L P ( P θ ′ ) P_θ=MLP(P'_θ) Pθ=MLP(Pθ′) 作为固定前缀,不增加额外计算。
-
输入构造:将训练好的前缀 + 表格输入模型,自回归生成文本。这里
-
生成示例:
[前缀向量1][前缀向量2][name: Starbucks][type: coffee shop]... → 生成 "Starbucks is a coffee shop..."
Prompt Turning
与Prefix-Turning几乎同一时期,有另外一篇论文Prompt Turning,其核心思想跟Prefix-Turning很类似,通过在预训练模型的输入前添加可学习的连续向量(软提示,Soft Prompts),仅训练这些向量来引导冻结的模型完成特定任务。
1. 模型初始化
冻结预训练模型:选择LLM模型,冻结其所有权重
2. 输入构造
- 嵌入处理:
- 将输入文本
X转换为词嵌入X_emb。 - 将软提示
soft_prompt拼接在X_emb前,形成新的输入序列。
- 将输入文本
输入嵌入序列 = [soft_prompt_1, soft_prompt_2, ..., soft_prompt_5] + [X_emb_1, X_emb_2, ...]
3. 训练/推理阶段
-
训练-参数更新:仅通过反向传播更新
soft_prompt参数,保持模型权重冻结。 -
推理-使用训练后的软提示:将学习到的
soft_prompt与新输入拼接,直接生成结果。 -
多任务支持:同一冻结模型可为不同任务加载不同的软提示,无需额外存储成本。
对比Prefix-Tuning和Prompt Tuning
| 维度 | Prefix-Tuning | Prompt Tuning |
|---|---|---|
| 参数位置 | 所有 Transformer 层 | 仅输入嵌入层 |
| 参数量 | 随模型深度线性增长 | 固定为输入层嵌入维度 × 提示长度 |
| 训练稳定性 | 需重参数化(如 MLP 投影) | 直接优化,无需额外稳定机制 |
| 适用任务 | 生成任务(如文本续写、摘要) | 分类、生成通用任务 |
| 模型规模依赖 | 适用于中小模型 | 在超大模型(>10B)效果显著 |
BitFit(Bias-Term Fine-Tuning)
BitFit是一种针对预训练Transformer模型的高效微调方法,仅调整模型中的偏置项(bias terms),而非全部参数。其核心方法相对简单,为:
- 仅微调模型中的偏置项(如BERT-large中占0.08%的参数),冻结所有权重矩阵和其他参数。
- 进一步发现,仅调整query偏置(bq)和中间MLP层偏置(bm2)(占总参数0.04%)即可保持性能。
- 所有任务共享相同的可调参数(偏置项),支持多任务部署,无需为每个任务存储独立模型。
其重要意义为:
- 结果支持假设:微调主要暴露预训练中学到的知识,而非学习新任务特定知识。
- 偏置项在调整模型输出分布中起关键作用,可能编码了任务无关的语言理解能力。
- 固定大部分参数(如权重矩阵)可支持硬件优化,仅需少量可调偏置项。
QLoRA
QLoRA是在LoRA方法的基础上进行改进,其核心要解决的问题是显著降低微调内存占用(单卡48GB GPU可微调65B模型)。
- 预训练模型量化:
- 将原始FP16/BF16模型权重量化为4-bit NF4格式,并冻结权重。
- 存储量化后的权重和对应的量化常数(缩放因子/零点)(双量化)。
- 前向计算反量化:
- 在计算时,将4-bit权重动态反量化为16-bit BFloat16,保持计算精度。
- 公式: W d e q u a n t = W 4 b i t × s c a l e + z e r o P o i n t W_{dequant}=W_{4bit}×scale+zeroPoint Wdequant=W4bit×scale+zeroPoint
- 低秩适配器训练:
- 仅优化LoRA适配器参数(矩阵 A 和 B),通过反向传播更新。
- 梯度计算时,通过链式法则传递到适配器参数,绕过量化权重。
- 内存优化策略:
- 使用分页优化器管理显存,双量化压缩存储开销。
- 混合精度训练(4-bit存储 + 16-bit计算)平衡速度与精度。
量化步骤
-
权重分桶(Bucketing)
- 假设权重服从正态分布(实际中近似成立),将权重数值范围划分为 24=16 个区间(桶)。
- 分桶边界通过**分位数估计(Quantile Estimation)**确定,目标是每个桶内数据点数量相等,最小化信息损失。
- 具体实现:使用经验分位数(如
torch.quantile)计算15个分割点,将数据分为16组。
-
计算量化常数
-
每个桶的缩放因子(Scale):桶内最大值与最小值的差除以桶的数量(4-bit可表示范围)。
-
零点(Zero Point):将原始零点(0值)映射到量化后的整数范围(0~15)。
-
公式:
s c a l e = b u c k e t M a x − b u c k e t M i n 15 z e r o P o i n t = ⌊ 0 − b u c k e t M i n s c a l e ⌉ scale=\frac{bucketMax−bucketMin}{15} \\ zeroPoint=⌊\frac{0−bucketMin}{scale}⌉ scale=15bucketMax−bucketMinzeroPoint=⌊scale0−bucketMin⌉
-
-
量化与存储
- 将每个FP16权重值映射到最近的4-bit整数索引(0~15),权重存储为紧凑的4-bit数组。
- 量化参数(scale/zero_point)按层单独存储(每层独立量化)。
关键特性
- 静态量化:量化在训练前一次性完成,量化后的权重和参数在训练中被冻结。
- 按层量化:每层权重单独计算分桶边界和量化参数,适应不同层的分布差异。
- 双量化(Double Quantization):对
scale和zero_point(原为32-bit浮点数)进行二次量化,压缩为8-bit整数。二次量化参数全局共享,进一步减少存储开销。
何时发生动态反量化?
- 前向传播(训练/推理):
每次计算时,4-bit权重需动态反量化为16-bit(BFloat16)参与矩阵乘法。 - 反向传播(仅训练):
梯度通过反量化后的权重传递到LoRA适配器参数,但原始量化权重不更新。
计算量是否会增加?
- 额外计算量极低:反量化是轻量级操作(逐元素线性变换),相比矩阵乘法(计算密集型)可忽略不计。
- 内存节省 vs. 计算开销:QLoRA牺牲少量计算时间(反量化)换取显存大幅降低,整体性价比高。
相关文章:
大模型的微调技术(高效微调原理篇)
背景 公司有需求做农业方向的大模型应用以及Agent助手,那么适配农业数据就非常重要。但众所周知,大模型的全量微调对算力资源要求巨大,在现实的限制条件下基本“玩不起”,那么高效微调技术就非常必要。为了更好地对微调技术选型和…...
区间震荡指标
区间震荡指标的逻辑如下: 一、函数注解 1. Summation函数 功能: 计算给定价格序列Price的前Length个数据点的和,或在数据点数量超过Length时,计算滚动窗口内的价格和。 参数: Price(1):价格序列&#…...
HCIE-SLAAC
文章目录 SLAAC 🏡作者主页:点击! 🤖Datacom专栏:点击! ⏰️创作时间:2025年03月21日10点58分 SLAAC 帮助设备发现本地直连链路相连的设备,并获取与地址自动配置的相关前缀和其他…...
JavaScript | 爬虫逆向 | 掌握基础 | 01
一、摘要 实践是最好的导师 二、环境配置 在开始之前,需要确保你的计算机上已经安装了 Node.js。Node.js 是一个开源的、跨平台的 JavaScript 运行时环境,它允许你在服务器端运行 JavaScript 代码。 1. 下载 安装地址:https://nodejs.org…...
【PCIe 总线及设备入门学习专栏 3.2 -- PCIe 在进行大数据搬运时是如何组包的?】
文章目录 Overview1. PCIe数据传输的核心机制(1) 数据分割(2) TLP头部构造(3) 数据链路层封装(4) 物理层传输2. GPU从内存搬运数据的组包流程场景示例:3. 优化机制(1) 大页传输(TLP合并)(2) 流量控制与信用机制(3) 地址对齐优化4. 完整示例5. 性能影响Overview 本文将详细介…...
C++算法代码-植物生长算法求解多目标车辆路径规划问题
为了求解电商物流配送中的车辆路径规划问题,并同时优化多个目标(降低运营总成本、降低碳排放量、降低消费者的不满意程度),我们可以设计一个结合植物生长算法(Plant Growth Algorithm, PGA)、**模拟退火算法(Simulated Annealing, SA)和多目标优化算法(MODAD)**的组合…...
力扣算法Hot100——128. 最长连续序列
题目要求时间复杂度为O(n),因此不能使用两次循环匹配。 首先使用 HashSet 去重,并且 HashSet 查找一个数的复杂度为O(1)外循环还是遍历set集合,里面一重循环需要添加判断,这样才不会达到O( n 2 n^2 n2)判断是否进入最长序列查找循…...
深入解析 Java Stream API:从 List 到 Map 的优雅转换!!!
🚀 深入解析 Java Stream API:从 List 到 Map 的优雅转换 🔧 大家好!👋 今天我们来聊聊 Java 8 中一个非常常见的操作:使用 Stream API 将 List 转换为 Map。🎉 具体来说,我们将深入…...
当全球化成为商业常态,Shopify 如何为品牌生意铺平出海之路?
从独立站搭建到支付履约,从数据分析到生态整合,Shopify 为不同规模的企业提供可扩展的解决方案。 在数字化浪潮的推动下,跨境电商与品牌出海的黄金时代已然到来。然而,看似广阔的市场蓝海背后,是无数企业正在经历的“成…...
集成平台是选择专业iPaaS厂商还是大型软件企业?
在数字化转型的浪潮中,企业对于高效、灵活的集成平台需求日益增长。iPaaS(Integration Platform as a Service)作为当下热门的解决方案,为企业提供了将不同应用和数据源进行整合的云端平台。面对市场上的众多选择,企业…...
RC6在线加密工具
RC6加密算法是一种基于RC5改进的分组密码算法,曾作为AES(高级加密标准)的候选算法之一。它采用了4个32位寄存器,增加了32位整数乘法运算,以增强扩散和混淆特性,提高了安全性。RC6的设计简单、高效ÿ…...
python每日十题(5)
保留字,也称关键字,是指被编程语言内部定义并保留使用的标识符。Python 3.x版本中有35个保留字,分别为:and, as,assert,async,await,break,class,continue,def,del,elif,else, except, False, finally,for,from,global, if,import…...
应用案例 | 核能工业:M-PM助力核工业科研项目
M-PM助力核工业科研项目 一、项目背景 在核工业复杂系统的研发进程中,MBSE(基于模型的系统工程)方法的应用愈发成熟,已然成为推动系统设计与优化的关键力量。如今,各相关设计系统的 MBSE 模型数据呈现出精细化、多元…...
通过 Executors 创建线程池
在Java中,使用线程池来管理和创建线程是一个更为高效和灵活的方法。线程池可以帮助你管理线程的生命周期,避免了频繁创建和销毁线程的开销,从而提高了性能。 Java 提供了java.util.concurrent包来处理线程池的相关操作。常用的线程池类是 Ex…...
4.1、网络安全模型
目录 网络安全体系概述网络安全模型-BLP模型网络安全模型-Biba模型网络安全模型 - 信息流模型信息保障模型能力成熟度模型其它安全模型网络安全原则 网络安全体系概述 网络安全体系是网络安全保证系统的最高层概念抽象,是一个体系,体系一般是一个概念&a…...
ManiWAV:通过野外的音频-视频数据学习机器人操作
24年6月来自斯坦福大学、哥伦比亚大学和 TRI 的论文“ManiWAV: Learning Robot Manipulation from In-the-Wild Audio-Visual Data”。 音频信号通过接触为机器人交互和物体属性提供丰富的信息。这些信息可以简化接触丰富的机器人操作技能学习,尤其是当视觉信息本身…...
可发1区的超级创新思路:基于注意力机制的DSD-CNN时间序列预测模型(功率预测、交通流量预测、故障检测)
首先声明,该模型为原创!原创!原创! 一、应用场景 该模型主要用于时间序列数据预测问题,包含功率预测、电池寿命预测、电机故障检测等等 二、模型整体介绍(本文以光伏功率预测为例) DSD-CNN(Depthwise-Spacewise Separable CNN)结合通道注意力机制,通过以下创新提升…...
IREE 调度机制深度解析:静态编译与动态执行的协同优化
IREE 调度机制深度解析:静态编译与动态执行的协同优化 一、引言 IREE (IR Execution Environment) 作为 TensorFlow 生态的重要成员,通过多层次调度策略实现了跨硬件平台的高效执行。其调度系统融合了编译期静态优化与运行时动态调整,在保证…...
istio 介绍-01-一个用于连接、管理和保护微服务的开放平台 概览
istio istio 一个用于连接、管理和保护微服务的开放平台。 介绍 Istio 是一个开放平台,用于提供统一的方式来集成微服务、管理跨微服务的流量、执行策略和聚合遥测数据。 Istio 的控制平面在底层集群管理平台(例如 Kubernetes)上提供了一…...
详细说明脚本评估和耗时较长的任务
在网页性能优化中,脚本评估和耗时较长的任务是两大关键性能瓶颈。它们直接影响页面的加载速度、交互响应以及用户体验。以下是对这两个概念的详细说明及优化策略: 一、脚本评估(Script Evaluation) 1. 定义 脚本评估指浏览器解析…...
Floyd 算法——97. 小明逛公园
卡码网:97. 小明逛公园https://kamacoder.com/problempage.php?pid=1155 题目描述 小明喜欢去公园散步,公园内布置了许多的景点,相互之间通过小路连接,小明希望在观看景点的同时,能够节省体力,走最短的路径。 给定一个公园景点图,图中有 N 个景点(编号为 1 到 N),…...
QT二 QT使用generate form 生成常用UI,各种UI控件
一 。没有使用general form 和 使用 general form 后,file层面和代码层面的不同比较 file层面的不同 代码层面的不同, 在 使用了general form之后,在主界面的构造方法中,使用ui->setupUi(this),就完成了所有UI的处理。 而之…...
蓝桥每日打卡--打家劫舍4
#蓝桥#JAVA#打家劫舍4 题目描述 沿街有一排连续的房屋。每间房屋内都藏有一定的现金。现在有一位小偷计划从这些房屋中窃取现金。 由于相邻的房屋装有相互连通的防盗系统,所以小偷 不会窃取相邻的房屋 。 小偷的 窃取能力 定义为他在窃取过程中能从单间房屋中窃…...
Intel Alder Lake N200桌面级处理器 详细介绍
1.Intel Alder Lake N200桌面级处理器 详细介绍 Intel Processor N200 是一款属于 Alder Lake-N 系列的入门级处理器,以下是其详细介绍: 基本规格 架构:Alder Lake-N,采用 Gracemont 架构的高效能核心。 核心与线程࿱…...
AudioTrack
AudioTrack是Android Audio系统提供给应用开发者(java/C)的API,用于操作音频播放的数据通路。MeidaPlayer在播放音乐时用到的是它,我们可以也可以直接使用AudioTrack进行音频播放。它是最基本的音频数据输出类。 AudioTrack.java…...
多条件排序(C# and Lua)
C# 升序排序 OrderBy 按升序对序列的元素进行排序 ThenBy 按升序对序列中的元素执行后续排序 降序排序 OrderByDescending 按降序对序列的元素排序 ThenByDescending 按降序对序列中的元素执行后续排序 public class Fruit {public int id;public string name;publi…...
人工智能之数学基础:线性方程组求解的得力助手——增广矩阵
本文重点 增广矩阵是一个极具实用价值的工具,尤其在处理线性方程组时,它展现了卓越的功效。通过整合系数和常数项,增广矩阵简化了计算过程并提供了判断方程组解集的有效方法。 增广矩阵的起源与定义 增广矩阵的概念源于线性方程组求解的需求。在解决线性方程组时,我们常…...
Vue3 + ECharts 数据可视化实战指南
一、为什么选择ECharts? 百度开源的成熟可视化库 支持30种图表类型 完善的文档和社区支持 与Vue3完美兼容 二、环境搭建 1. 创建Vue3项目 npm create vuelatest # 选择TypeScript、Pinia等按需配置 2. 安装核心依赖 npm install echarts vue-echarts vueus…...
关于Flask框架30道面试题及解析
文章目录 基础概念1. 什么是Flask?其核心特性是什么?2. Flask和Django的主要区别?3. 解释Flask中的“路由”概念。如何定义动态路由?核心组件4. Flask的请求上下文(Request Context)和应用上下文(Application Context)有什么区别?5. 如何访问请求参数?POST和GET方法的…...
服务安全认证概述与基础认证方式
文章目录 1. 引言1.1 认证与授权的区别1.2 认证方式的演进 2. 基础认证方式2.1 HTTP Basic Authentication2.2 API Key 认证2.3 HMAC-SHA256 签名认证2.4 JWT(JSON Web Token) 3. 认证方式对比与总结3.1 认证方式对比3.2 如何选择合适的认证方式…...
