惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

W
WeLiveSecurity
博客园 - 【当耐特】
Microsoft Azure Blog
Microsoft Azure Blog
WordPress大学
WordPress大学
Stack Overflow Blog
Stack Overflow Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
IT之家
IT之家
Cloudbric
Cloudbric
The Register - Security
The Register - Security
小众软件
小众软件
PCI Perspectives
PCI Perspectives
G
Google Developers Blog
AI
AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Google DeepMind News
Google DeepMind News
Google DeepMind News
Google DeepMind News
宝玉的分享
宝玉的分享
Recent Commits to openclaw:main
Recent Commits to openclaw:main
量子位
TaoSecurity Blog
TaoSecurity Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
F
Full Disclosure
N
Netflix TechBlog - Medium
博客园_首页
Last Week in AI
Last Week in AI
A
Arctic Wolf
B
Blog RSS Feed
J
Java Code Geeks
C
Cybersecurity and Infrastructure Security Agency CISA
I
InfoQ
aimingoo的专栏
aimingoo的专栏
云风的 BLOG
云风的 BLOG
NISL@THU
NISL@THU
MyScale Blog
MyScale Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Jina AI
Jina AI
有赞技术团队
有赞技术团队
S
Schneier on Security
L
Lohrmann on Cybersecurity
P
Privacy & Cybersecurity Law Blog
T
Threat Research - Cisco Blogs
P
Palo Alto Networks Blog
S
Security @ Cisco Blogs
Security Archives - TechRepublic
Security Archives - TechRepublic
Security Latest
Security Latest
Vercel News
Vercel News
博客园 - 司徒正美
Webroot Blog
Webroot Blog
Hacker News: Ask HN
Hacker News: Ask HN
A
About on SuperTechFans

中文博客 on 范叶亮 | Leo Van

多智能体系统 (Multi-Agent System) 确定性和掌控欲 - 你的 AI 不是你的 AI LLM Token 消耗节省计划 (How to Save Token for LLM) 智能体的角色定位和身份演化 (Agent Role Orientation and Identity Evolution) 本地部署 OpenClaw,QwenPaw 和 Hermes Agent (Local Deployment of OpenClaw, QwenPaw and Hermes Agent) 本地部署智能体 - OpenClaw,QwenPaw,Hermes Agent ... 部署 Matrix 服务器 Synapse (Deployment of Matrix Server Synapse) 部署 frp 内网穿透服务 (Deployment of frp NAT Traversal Service) 本地部署大模型服务 (Local Deployment of LLM Services) AI 时代的生产力和生产关系 (Forces and Relations of Production in AI Era) 业余无线电入门 - CQ, CQ, CQ, this is BD1CZP. Calling CQ and standing by. 重构 - 之于代码、之于工作、之于生活 提升图片分辨率和质量 - Invoke AI 101 教程 使用画布创建和组合生成新的图片 - Invoke AI 101 教程 探索 AI 模型和概念适配器 - Invoke AI 101 教程 理解图像到图像和降噪过程 - Invoke AI 101 教程 使用控制层和指示控制图片的生成 - Invoke AI 101 教程 使用 Invoke 创作你的第一张图片 - Invoke AI 101 教程 在 OpenWrt 和群晖中自动申请和部署证书 凡人歌 - 凡人,但不要烦心 Shell 调用方式 fork,exec 和 source (Run Shell with fork, exec and source) 重定向和管道 (Redirect and Pipe) 模型压缩和推理加速 (Model Compression and Inference Acceleration) 我们需要多少种编程语言 (How Many Programming Languages do We Need) 数据可视化小贴士 - 面向动态文档生成,秉承规范、统一和实用的理念 从 rm -rf * 说起 - 喜新、怀旧、再出发 当我谈摄影时,我谈些什么 - 色彩篇 Part 1 CSS 布局和定位 (CSS Layout and Position) 当我谈修图时,我谈些什么 - 色彩篇 Part 1 在 Windows 下利用 WSL2 和 Ubuntu 配置 GPU 机器学习环境 文学编程和可重复性研究 (Literate Programming and Reproducible Research) 在 OpenWrt 中安装 Jellyfin 搭建家庭影音中心 自私和贪婪 (Selfish and Greedy) 评分和排名算法 (Rating & Ranking Algorithms) 小记这一波裁员浪潮 基于内容的图像检索 (Content-based Image Retrieval, CBIR) 你所应该知道的 A/B 测试 (A/B Test You Should Know) 一个人的摩旅 (Travel with My Motorcycle Alone) 设计语言初探 (A Glimpse of Design Language) Spark 集群搭建 (Spark Cluster Setup) Hive 安装和配置 (Hive Setup) Hadoop 集群搭建 (Hadoop Cluster Setup) 虚拟环境准备 (Virtual Environment Preparation) 大数据 SQL 性能调优 (Big Data SQL Performance Tuning) SQL 样式指南 (SQL Style Guide) 进程,线程和协程 (Process, Thread and Coroutine) - 实现篇 进程,线程和协程 (Process, Thread and Coroutine) - 理论篇 胶囊网络 (Capsule Network) 投票公平合理吗? 图存储与计算 (Network Storage and Computing) - 复杂网络系列 网络算法 (Network Algorithms) - 复杂网络系列 真实世界网络结构 (Structure of Real-World Network) - 复杂网络系列 网络表示,测度和度量 (Network Representation, Measures and Metrics) - 复杂网络系列 文本相似度 (Text Similarity) 而立之前 (Life before 30) 最近邻搜索 (Nearest Neighbor Search) 无模型策略预测和控制 - 时序差分学习 (Model-Free Policy Prediction and Control - Temporal Difference Learning) - 强化学习系列 无模型策略预测和控制 - 蒙特卡洛方法 (Model-Free Policy Prediction and Control - Monte-Carlo Learning) - 强化学习系列 利用动态规划求解马尔可夫决策过程 (Planning by Dynamic Programming) - 强化学习系列 贝叶斯优化 (Bayesian Optimization) 马尔可夫决策过程 (Markov Decision Process) - 强化学习系列 多臂赌博机 (Multi-armed Bandit) - 强化学习系列 强化学习简介 (Introduction of Reinforcement Learning) - 强化学习系列 在群晖 NAS 上编译安装 tmux 隐马尔可夫,条件随机场和序列标注 (Hidden Markov Model, Conditional Random Fields and Sequence Labeling) 图嵌入和图神经网络 (Graph Embedding and Graph Neural Network) 预训练自然语言模型 (Pre-trained Models for NLP) toB 产品用户权限 (User Privileges of toB Products) 京东数科 HIPO 学习之旅 (JDD HIPO Learning Journey) 杭州和东京之旅 (Tour of Hangzhou and Tokyo) 国际智慧温室种植挑战赛 (International Autonomous Greenhouse Challenge) 记忆中的儿时 (My Childhood in Memory) 启发式算法 (Heuristic Algorithms) 关不掉的浏览器标签页 (Browser Tabs You do not Close) 贝塞尔曲线 (Bézier Curve) 如何阅读一本书 (How to Read a Book) 相似性和距离度量 (Similarity and Distance Measurement) 集成学习算法 (Ensemble Learning) 计算复杂性与动态规划 (Computational Complexity and Dynamic Programming) 利用 Flask 和 Google App Engine 部署模型服务 序列到序列和注意力机制 (Seq2Seq and Attention Machanism) 词向量 (Word Embeddings) 循环神经网络 (Recurrent Neural Network, RNN) 泰国之行 (Tour of Thailand) 媒介之战 (War of Medias) 卷积神经网络 (Convolutional Neural Network, CNN) 买书,囤书,看书 (Buy Books, Hoard Books and Read Books) Play Safe, Smart Choice & Yuppie 基于 PyQt5/PySide2 和 QML 的跨平台 GUI 程序开发 流形学习 (Manifold Learning) 深度学习优化算法 (Optimization Methods for Deep Learning) 深度学习优化算法 (Optimization Methods for Deeplearning) 生成对抗网络简介 (GAN Introduction) Ising 模型,Hopfield 网络和受限的玻尔兹曼机 (Ising, Hopfield and RBM) 马尔科夫链蒙特卡洛方法和吉布斯采样 (MCMC and Gibbs Sampling) 特征值分解,奇异值分解和主成分分析 (EVD, SVD and PCA) 墨尔本之行 (Trip to Melbourne)
大语言模型微调 (Fine-tuning Large Language Models)
范叶亮 · 2025-08-09 · via 中文博客 on 范叶亮 | Leo Van

大语言模型微调

Fine-tuning Large Language Models

分类: AI / 字数: 4368 / 标签: 微调, Fine-tuning, 大语言模型, LLMs, Large Language Models, 预训练, Pre-training, 后训练, Post-training, 全参数微调, Full Fine-tuning, 部分参数微调, Repurposing, 监督微调, Supervised Fine-tuning, 无监督微调, Unsupervised Fine-tuning, 指令微调, Instruction Fine-tuning, 对齐微调, Alignment Fine-tuning, 参数高效微调, Parameter-efficient Fine-tuning, Prefix Tuning, Prompt Tuning, P-Tuning, P-Tuning v2, LoRA, IA3


什么是微调

微调(Fine-tuning)是深度学习中迁移学习的一种方法,其将现有模型已经学到的知识作为学习新任务的起点。虽然微调表面上是模型训练中使用的一种技术,但它与传统意义上的“训练”截然不同。为了消除歧义,在这种情况下通常将传统意义上的“训练”称为预训练(Pre-training)。1

与微调类似的另一个概念称之为后训练(Post-training),两者均发生在预训练之后,其目的也都是为了进一步提升模型的效果,通常两者可以理解为相同的概念。从优化的发起人角度出发:当终端用户希望模型可以更好的适配自己的领域知识,则需要进行的操作称之为微调;当模型开发者希望可以更好的将模型与人类的价值、道德和预期保持一致,则需要进行的操作称之为后训练。2

为什么微调

从本质上讲,磨练一个预训练基础模型的能力要比从头开始训练一个新模型更容易,也更省钱,因为预训练已经获得了与当前任务相关的广泛知识。对于具有数百万甚至数十亿个参数的深度学习模型尤其如此,例如在自然语言处理(NLP)领域的大语言模型(LLM)或卷积神经网络(CNN)和视觉转换器(ViT)(用于计算机视觉任务,例如图像分类、对象检测或图像分割等)。

通过迁移学习利用先前的模型训练,微调可以减少获得适合特定用例和业务需求的大模型所需的昂贵算力和标记数据量。例如,微调可用于调整预训练大语言模型的对话语气或预训练图像生成模型的图片样式,还可用于使用专有数据或领域特定的专业知识来补充模型的原始训练数据集。

如何去微调

微调是需要进一步训练模型的技术,模型的权重已经通过先前的预训练得到了更新。使用基础模型的先前知识作为起点,通过在任务特定的较小数据集上进行训练来对模型进行微调。

虽然从理论上讲,任务特定的数据集都可以用于初始训练,但在小数据集上从头开始训练一个大模型可能会存在过拟合的风险:模型可能会在训练示例中学习得到良好的表现,但对新数据的泛化能力却很差。这会导致模型不适合给定的任务,也违背了模型训练的初衷。 因此,微调可以兼具两者的优势:利用对大量数据进行预训练所获得的广泛知识和稳定性,并训练模型对更详细、更具体概念的理解。

微调方法分类

参数角度

从参数角度,我们可以将微调分为全参数微调(Full Fine-tuning)和部分参数微调(Repurposing):

  • 全参数微调:即对模型的所有参数进行微调。这种微调方法通常适用于任务与预训练模型之间存在较大差异的情况。全参数微调需要耗费较大的计算资源和时间,通常可以获得更好的性能,但在数据不足时容易出现过拟合问题。
  • 部分参数微调:即仅对模型的部分参数或额外的模型参数进行微调。相比于全参数微调,部分参数微调可以在较少的计算资源和时间的情况下,在一些特定任务上提高模型的性能。

数据角度

从数据角度,我们可以将微调分为监督微调(Supervised Fine-tuning)和无监督微调(Unsupervised Fine-tuning):

  • 监督微调:在进行微调时使用有标签的训练数据集。通过使用这些标签来指导模型的微调,可以使模型更好地适应特定任务。
  • 无监督微调:在进行微调时使用无标签的训练数据集。通过学习数据的内在结构或生成数据来进行微调,以提取有用的特征或改进模型的表示能力。

方式角度

从方式角度,我们可以将微调划分为指令微调(Instruction Fine-tuning)和对齐微调(Alignment Fine-tuning):

  • 指令微调:利用格式化的实例以有监督的方式微调大语言模型。通过指令微调不仅可以改善模型的性能,同时也可以增强模型的泛化能力。
  • 对齐微调:为了避免大语言模型的幻觉问题,以及同人类的价值观和偏好对齐,提高伦理表现,将人类整合到模型的训练过程中。例如基于人类对结果的反馈,模型通过强化学习从而与人类对齐。

显存消耗

在进行模型微调时我们需要关注显存的消耗,以确保在当前的硬件环境中可以正常进行微调。在进行模型微调时,显存消耗主要同如下因素有关:

  • 参数精度:决定了每个参数占用的实际显存大小,例如 FP32(单精度)占用 4 字节,FP16(半精度)占用 2 字节,INT8 占用 1 字节等。
  • 模型参数:微调所需显存的基础决定因素,例如微调一个 1B 模型,其参数总量则为 10 亿。
  • 梯度:在微调过程中需要存储反向传播计算得到的梯度信息,这部分大小同模型参数相同,精度同训练精度一致。
  • 优化器状态:优化器所需的额外信息,例如动量、方差等,不同的优化器占用的显存大小也不尽相同,保守估计为模型参数所需显存的 4 倍。
  • 激活值:用于储存前向传播过程中的中间结果,所需显存大小主要受到批大小和序列长度的影响,量级相比前面可以忽略不计。

以全参数微调一个 1B 模型为例,所需的显存大致为 12GB(模型参数:2GB,梯度:2GB,优化器状态:8GB)。在使用部分参数微调时,模型参数本身不变,需要微调的参数会大幅度减少,因此梯度和优化器状态所需的显存也会大幅度减少。在应用一些量化技术后,例如使用 INT8 精度进行微调,则所有部分的显存占用均会相应的减少。

参数高效微调

参数高效微调部分主要参考了 llm-action 项目。

参数高效微调(Parameter-Efficient Fine-Tuning)是指固定大部分预训练模型的参数,仅微调少量或额外的模型参数的微调方法,从而可以极大的降低计算成本。参数高效微调可以从方法的角度可以分为三类 3:引入新参数(Addition-based),微调部分参数(Selection-based)和重参数化(Reparametrization-based),其中引入新参数又可以划分为适配器方法和软提示方法两种。

参数高效微调方法分类

在实战过程中我们可以使用 Huggingface 开源的 PEFT 扩展库进行参数高效微调,作为 Huggingface 开源项目其可以与 TransformersAccelerateDiffusers 等多个开源库无缝衔接使用。在官方文档中我们可以查看支持的微调类型任务类型

Prefix Tuning

Prefix Tuning 4 是在输入的 token 前构造与任务相关的 virtual token 作为前缀,在微调的时候仅更新前缀部分的参数。

针对不同的模型结构,构造的前缀也有所不同:

  • 自回归结构:添加前缀后,得到 $z = \left[\text{PREFIX}; x; y\right]$。
  • 编码器-解码器结构:在编码器和解码器前均添加前缀,得到 $z = \left[\text{PREFIX}; x; \text{PREFIX}’; y\right]$。

作者发现直接更新前缀的参数会导致训练不稳定,因此在前缀之前添加了 MLP 结构,在训练完成后 MLP 部分的参数无需保留,仅保留前缀的参数即可。同时作者也针对前缀使用多少个 virtual token 以及前缀放置的位置对于微调的性能影响进行了相关实验,细节请参考论文原文。

Prompt Tuning

Prompt Tuning 5 可以看作是 Prefix Tuning 的简化版本,其为每个任务定义不同的 Prompt,然后拼接到数据上作为输入。

Prompt Tuning 仅在输入层添加 token,不需要像 Prefix Tuning 那样添加 MLP 结构解决训练问题。通过实验发现,随着模型参数的增加,Prompt Tuning 的效果会逼近全参数微调的效果。

实验还发现,与随机和使用样本词汇表的初始化相比,采用类标签初始化的微调效果更好,但随着模型参数的增加,效果差异会消失。同时 Prompt 的 token 长度在 20 左右可以获得不错的效果,同样随着模型参数的增加,token 长度带来的增益会消失。

P-Tuning

P-Tuning 6 将 Prompt 转换为可学习的 Embedding 层,再通过 MLP+LSTM 结构对 Prompt Embedding 进行处理。

对比 Prefix Tuning,P-Tuning 增加了可微的 virtual token,但仅作用于输入层,没有在每一层都添加。同时,virtual token 的位置也不一定是前缀,其插入的位置是可选的,目的是将传统人工设计的 Prompt 模板中的真实 token 替换为可微的 virtual token。

实验发现随机初始化 virtual token 容易陷入局部最优,因此通过一个 Prompt Encoder(即 MLP+LSTM 结构)对其进行编码可以获得更好的效果。

P-Tuning v2

Prompt Tuning 和 P-Tuning 存在如下问题:

  • 缺乏规模通用性:Prompt Tuning 在模型超过 100 亿时可以与全量微调媲美,但对于较小参数的模型与全量微调的效果有很大的差距。
  • 缺乏任务普遍性:Prompt Tuning 和 P-Tuning 在一些 NLU 基准测试中表现出优势,但对序列标注任务的有效性尚未得到验证。
  • 缺少深度提示优化:在 Prompt Tuning 和 P-Tuning 中,提示仅被插入到输入中,后续插入提示位置的嵌入是通过之前层计算得到。这可能导致插入提示对模型最终效果的影响有限,同时由于序列长度限制可调参数的数量也是有限的。

考虑到上述问题,P-Tuning v2 7 利用深度提示优化(例如:Prefix Tuning)对 Prompt Tuning 和 P-Tuning 进行改进,类似 Prefix Tuning,其在每一层都加入了 Prompt token 作为输入。

P-Tuning v2 还通过移除重参数化编码器、针对不同任务采用不同提示词长度、引入多任务学习、使用传统分类标签范式等方法进行模型改进。实验表明 P-Tuning v2 可以在不同规模和不同任务中实现与全量微调相媲美的效果。

Adapter Tuning

Adapter Tuning 8 设计了一个 Adapter 模块,并在每个 Transformer 层中插入两个 Adapter 模块,在微调时仅更新增加的 Adapter 模块和 Layer Norm 层中的参数。

Adapter 模块由两个前馈层和一个非线性层组成。第一个前馈层将 Transformer 的输入从 $d$ 维(高维)映射到 $m$ 维(低维),其中 $m \ll d$。通过控制 $m$ 的大小可以限制 Adapter 模块的参数量。中间通过非线性层后,第二个前馈层再将 $m$ 维映射回 $d$ 维作为 Adapter 模块的输出。同时通过 Skip Connection 将 Adapter 的输入也添加到 Adapter 的输出中,这样可以保证即便 Adapter 最开始的参数值接近 0,通过 Skip Connection 的设置也可以保证训练的有效性。

LoRA

神经网络包含很多全连接层,其通过矩阵乘法实现。很多全连接层的权重矩阵是满秩的,针对特定任务微调后,模型的权重矩阵其实具有很低的本征秩(intrinsic rank),因此将参数矩阵投影到更小的空间仍可以得到有效的学习。LoRA 9 的核心思想就是通过低秩分解降低特征矩阵的参数量,从而以较小的参数量来实现大模型的间接训练。

在涉及到矩阵相乘的模块中,在其旁边增加一个新的通路,通过第一个矩阵 $A$ 将维度从 $d$ 降至 $r$,在通过一个矩阵 $B$ 将维度从 $r$ 升回 $d$,其中 $r \ll d$。

在微调时,仅更新上述两个矩阵的参数,再将两条通路的结果相加作为最终的结果,即 $h = W_0 x + B A x$。训练时矩阵 $A$ 通过高斯函数初始化,矩阵 $B$ 初始化为零矩阵,这样训练开始时 $B A = 0$,从而可以确保新的通路对模型的结果没有影响。

在 Attention 模块中,权重矩阵包括用于计算 Q,K,V 的 $W_q$,$W_k$,$W_v$ 以及多头注意力的 $W_o$,实验表明保证权重矩阵的种类数量比增加秩 $r$ 的大小更为重要,通常情况下 $r$ 选择 4,8,16 即可。

IA3

IA3 10 不同于 LoRA 学习低秩权重,而是通过学习向量($l_k$,$l_v$,$l_{ff}$)对模型的部分参数进行加权实现对一些激活层的抑制或放大,同时优化损失函数以适应少样本学习。