大模型的微调技术(高效微调原理篇)

背景

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

file

参数高效微调(Parameter-Efficient Fine-Tuning, PEFT)

  • 核心思想:冻结大部分预训练参数,仅微调少量参数
  • 优势:显存占用低,适合资源受限场景
  • 应用场景:快速领域适配、多任务适配

LoRA(Low-Rank Adaptation)

LoRA微调是针对大参数量模型全量微调高昂的存储和计算成本提出的解决方案,直接、通用、高效。其解决方案是冻结预训练模型的权重,仅通过向Transformer层的权重矩阵注入低秩分解矩阵(秩为r)来适应下游任务,显著减少可训练参数数量。

file

  • 假设权重更新矩阵Δ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是另一种参数高效迁移的微调方法。通过在预训练模型的每一层中插入小型可训练模块(适配器),原始模型参数冻结,从而大大减少需要训练的参数量。

file

  • 设计原理

    • 在预训练模型的每一层中插入小型可训练模块(适配器),固定原始模型参数。
  • 适配器结构为瓶颈式(Bottleneck):输入→降维→非线性激活(如ReLU)→升维,中间层维度远小于输入(例如d=768 → m=64)。

    • 初始化时接近恒等函数(参数接近零),确保训练初期不干扰预训练模型。
  • 参数效率

    • 每个任务仅需添加少量参数(每层约0.5%-8%的参数量),总参数量远低于全微调(例如GLUE任务仅需3.6%的新参数)。
    • 新增参数包括适配器权重和任务特定的层归一化(LayerNorm)参数。
  • 部署灵活性

    • 支持任务增量学习:新任务仅需添加新的适配器,不影响已有任务。

    • 适配器自动聚焦于高层网络(高层适配器对任务影响更大,低层影响较小)。

对比LoRA和Adapter

选择维度
维度优先选Adapter优先选LoRA
任务复杂度复杂任务(需高频特征或复杂推理)常规任务(文本分类、生成等)
模型规模中小模型(参数量<10B)超大规模模型(如LLaMA-70B、GPT-3)
推理延迟敏感性可容忍一定延迟(如离线任务)要求零延迟(如实时API)
多任务扩展性需动态插拔任务适配器需同时服务大量任务(共享低秩矩阵)
显存/计算资源资源较充足,需稳定性能显存紧张(如单卡微调LLM)
场景化建议
  1. 大模型+实时服务(如部署LLaMA到聊天机器人):

    选择LoRA,因其零延迟、参数少,适合资源敏感场景。

  2. 多任务灵活切换(如云平台支持NLP多任务):

    选择Adapter,通过插拔适配器快速扩展任务,避免模型冗余。

  3. 低资源微调小模型(如BERT-base文本分类):

    可任选:Adapter在小模型上延迟可忽略;LoRA参数更少但需调秩。

  4. 复杂任务(如代码生成、数学推理):

    优先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 映射到每一层的激活空间(提升训练稳定性)。

具体说明:

  1. 假设前缀长度为 L,每个前缀向量维度为 d(与Transformer隐藏层维度一致),则前缀参数矩阵 P θ {P_θ} Pθ 的尺寸为 L×d

  2. 定义一个小矩阵 P θ ′ P_θ' Pθ,其尺寸为 L×k,其中 kd。此时参数量减少为 L×k

  3. 通过一个多层感知机(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. 输入构造
  • 嵌入处理
    1. 将输入文本 X 转换为词嵌入 X_emb
    2. 将软提示 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-TuningPrompt 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模型)。

  1. 预训练模型量化
    • 将原始FP16/BF16模型权重量化为4-bit NF4格式,并冻结权重。
    • 存储量化后的权重和对应的量化常数(缩放因子/零点)(双量化)。
  2. 前向计算反量化
    • 在计算时,将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
  3. 低秩适配器训练
    • 仅优化LoRA适配器参数(矩阵 AB),通过反向传播更新。
    • 梯度计算时,通过链式法则传递到适配器参数,绕过量化权重。
  4. 内存优化策略
    • 使用分页优化器管理显存,双量化压缩存储开销。
    • 混合精度训练(4-bit存储 + 16-bit计算)平衡速度与精度。
量化步骤
  1. 权重分桶(Bucketing)

    • 假设权重服从正态分布(实际中近似成立),将权重数值范围划分为 24=16 个区间(桶)。
    • 分桶边界通过**分位数估计(Quantile Estimation)**确定,目标是每个桶内数据点数量相等,最小化信息损失。
    • 具体实现:使用经验分位数(如torch.quantile)计算15个分割点,将数据分为16组。
  2. 计算量化常数

    • 每个桶的缩放因子(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=15bucketMaxbucketMinzeroPoint=scale0bucketMin

  3. 量化与存储

    • 将每个FP16权重值映射到最近的4-bit整数索引(0~15),权重存储为紧凑的4-bit数组。
    • 量化参数(scale/zero_point)按层单独存储(每层独立量化)。
关键特性
  • 静态量化:量化在训练前一次性完成,量化后的权重和参数在训练中被冻结。
  • 按层量化:每层权重单独计算分桶边界和量化参数,适应不同层的分布差异。
  • 双量化(Double Quantization):对scalezero_point(原为32-bit浮点数)进行二次量化,压缩为8-bit整数。二次量化参数全局共享,进一步减少存储开销。
何时发生动态反量化?
  • 前向传播(训练/推理)
    每次计算时,4-bit权重需动态反量化为16-bit(BFloat16)参与矩阵乘法。
  • 反向传播(仅训练)
    梯度通过反量化后的权重传递到LoRA适配器参数,但原始量化权重不更新
计算量是否会增加?
  • 额外计算量极低:反量化是轻量级操作(逐元素线性变换),相比矩阵乘法(计算密集型)可忽略不计。
  • 内存节省 vs. 计算开销:QLoRA牺牲少量计算时间(反量化)换取显存大幅降低,整体性价比高。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/37726.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 大视界 -- Java 大数据在智能家居设备联动与场景自动化中的应用(140)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

面试八股 —— Redis篇

重点&#xff1a;缓存 和 分布式锁 缓存&#xff08;穿透&#xff0c;击穿&#xff0c;雪崩&#xff09; 降级可作为系统的保底策略&#xff0c;适用于穿透&#xff0c;击穿&#xff0c;雪崩 1.缓存穿透 2.缓存击穿 3.缓存雪崩 缓存——双写一致性 1.强一致性业务&#xff08…

[网络安全] 滥用Azure内置Contributor角色横向移动至Azure VM

本文来源于团队的超辉老师&#xff0c;其系统分析了Azure RBAC角色模型及其在权限滥用场景下的攻击路径。通过利用AADInternals工具提升用户至Contributor角色&#xff0c;攻击者可在Azure VM中远程执行命令&#xff0c;创建后门账户&#xff0c;实现横向移动。文中详述了攻击步…

OO_Unit1

第一次作业 UML类图 代码复杂度分析 其中Expr中的toString方法认知复杂度比较高&#xff0c;主要源于多层条件嵌套和分散的字符串处理逻辑&#xff0c;重构时可重点关注这两部分的解耦。 代码量分析 1.”通用形式“ 我觉得我的设计的最大特点就是“通用形式”&#xff0c;具…

阿里云 AI 搜索产品荣获 Elastic Innovation Award 2024

阿里云AI搜索产品荣获Elastic Innovation Award 2024&#xff0c;该奖项于近日在新加坡ElasticON 2025的Elastic合作伙伴峰会上颁发&#xff0c;旨在表彰基于Elastic平台开发企业级生成式人工智能&#xff08;GenAI&#xff09;应用的顶尖合作伙伴&#xff0c;这些应用有效帮助…

网络原理之网络层、数据链路层

1. 网络层 1.1 IP协议 1.1.1 基本概念 主机: 配有IP地址,但是不进⾏路由控制的设备路由器: 即配有IP地址,⼜能进⾏路由控制节点: 主机和路由器的统称 1.1.2 协议头格式 说明&#xff1a; 4位版本号(version): 指定IP协议的版本,对于IPv4来说,就是4,对于IPv6来说,就是6 4位头…

炫酷的3D按钮效果实现 - CSS3高级特性应用

炫酷的3D按钮效果实现 - CSS3高级特性应用 这里写目录标题 炫酷的3D按钮效果实现 - CSS3高级特性应用项目介绍核心技术实现1. 基础结构设计2. 视觉效果实现2.1 背景渐变2.2 立体感营造 3. 交互动效设计3.1 悬停效果3.2 按压效果 技术要点分析1. 深度层次感2. 动画过渡3. 性能优…

Java定时任务的三重境界:从单机心跳到分布式协调

《Java定时任务的三重境界&#xff1a;从单机心跳到分布式协调》 本文将以生产级代码标准&#xff0c;揭秘Java定时任务从基础API到分布式调度的6种实现范式&#xff0c;深入剖析ScheduledThreadPoolExecutor与Quartz Scheduler的线程模型差异&#xff0c;并给出各方案的性能压…

鸿蒙Flutter开发故事:不,你不需要鸿蒙化

在华为牵头下&#xff0c;Flutter 鸿蒙化如火如荼进行&#xff0c;当第一次看到一份上百个插件的Excel 列表时&#xff0c;我也感到震惊&#xff0c;排名前 100 的插件赫然在列&#xff0c;这无疑是一次大规模的军团作战。 然后&#xff0c;参战团队鱼龙混杂&#xff0c;难免有…

PolyBench基准程序详解:编译器优化评测指标

PolyBench基准程序详解&#xff1a;编译器优化评测指标 PolyBench基本概念 PolyBench&#xff08;Polyhedral Benchmark&#xff09;是由UCLA&#xff08;加州大学洛杉矶分校&#xff09;的Louis-Nol Pouchet及其研究团队开发的基准测试套件&#xff0c;专门用于评估多面体编…

2025年渗透测试面试题总结-某四字大厂实习面试复盘 一面 二面 三面(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 一面 1. 数组和链表各自的优势和原因 2. 操作系统层面解析和进程 3. 线程和进程通信方式及数据安全问…

ruoyi-vue部署4

1.jdk-linux安装 2.tomcat-linux安装 3.ruoy后台部署 4.nginx-linux安装5.ruoyi前端部署​​​​​​​

查看visual studio的MSVC版本的方法

右键项目名称&#xff0c;下拉点击属性 然后点击库目录&#xff0c;下拉点击编辑 就可以看见msvc版本了

【Javascrip】Javascript练习01 REST API using Express.js.

针对该问题的项目路径 要求部分 what you need to doReview the tasks provided in the section below.Obtain the boilerplate code.Use your local development environment to implement a solution.Upload your solution for marking via Gradescope. There is no attempt…

【蓝桥杯速成】| 9.回溯升级

题目一&#xff1a;组合综合 问题描述 39. 组合总和 - 力扣&#xff08;LeetCode&#xff09; 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返…

apache-maven-3.9.9 详细安装配置教程(2025版)

apache-maven-3.9.9 详细安装配置教程 一、下载解压二、配置本地仓库镜像源三、配置环境变量四、配置 IDEA 一、下载解压 官网地址&#xff1a; https://maven.apache.org/download.cgi二、配置本地仓库镜像源 解压并新建文件夹&#xff0c;作为 maven 下载仓库。目的&#…

构建企业级数据的愿景、目标与规划历程

文章目录 1. 企业级数据的愿景2. 企业级数据的目标、实施标准和战略3. 企业级数据的蓝图3.1 业务数字化转型的蓝图3.2 大数据平台的架构蓝图 4. 企业级数据的规划历程4.1 第一阶段&#xff1a;数据生产与打通4.2 第二阶段&#xff1a;数据集成、联接、应用 伴随着数字科技、通信…

深入理解 JavaScript/TypeScript 中的假值(Falsy Values)与逻辑判断 ✨

&#x1f579;️ 深入理解 JavaScript/TypeScript 中的假值&#xff08;Falsy Values&#xff09;与逻辑判断 在 JavaScript/TypeScript 开发中&#xff0c;if (!value) 是最常见的条件判断之一。它看似简单&#xff0c;却隐藏着语言的核心设计逻辑&#xff0c;也是许多开发者…

74HC04(反相器)和74HC14(反相器、施密特触发器)的区别

74HC04和74HC14的具体区别详解 同样具有反相器功能&#xff0c;你知道74HC04和74HC14的具体区别吗&#xff1f; 74HC04 对于74HC04很好理解&#xff0c;输入低电平&#xff0c;输出高电平&#xff1b;输入高电平&#xff0c;输出低电平。 建议操作条件&#xff1a; 下图是TI的…

面向医药仓储场景下的药品分拣控制策略方法 研究(大纲)

面向医药仓储场景下的药品分拣控制策略方法研究 基于多机器人协同与智能调度的分拣系统设计 第一章 绪论 1.1 研究背景与意义 医药仓储自动化需求&#xff1a; 人工分拣效率低、出错率高&#xff08;如药品批次混淆、过期风险&#xff09;温控药品&#xff08;如疫苗、生物制…