参数高效微调(Parameter-Efficient Fine-Tuning, PEFT )是一种针对预训练模型(尤其是大语言模型)进行微调的策略,旨在以较低的计算和存储成本适配模型到特定任务或数据集,同时保持模型的泛化能力。PEFT 的核心思想是避免对模型的全部参数进行更新,而是仅调整一小部分参数或引入少量额外参数,从而在资源受限的环境下实现高效微调。
以下是对 PEFT 的详细描述及其常见方法的列举与解释:
<hr>
<font size="4" style="line-height: 45px;" color="#c200ff"><strong>1. 什么是参数高效微调(PEFT)?</strong></font>
在传统的全参数微调 (Full Fine-Tuning)中,模型的所有参数都会被更新,这需要大量的计算资源(GPU/TPU 内存)和存储空间(保存完整的模型副本)。对于参数量达到数十亿甚至千亿的大型模型(如 GPT-3、LLaMA 等),全参数微调的成本往往是不可承受的。此外,全参数微调可能导致过拟合,尤其是在目标数据集较小的情况下。
PEFT 通过以下方式解决这些问题:
<ul><li>减少参数更新:只更新模型的一小部分参数或添加少量可训练参数,而冻结大部分预训练参数。</li>
<li>降低存储需求:仅保存更新参数或额外参数的权重,而不是整个模型。</li>
<li>保持性能:通过精心设计的方法,PEFT 能够在性能上接近甚至媲美全参数微调。</li>
<li>适应多样化任务:PEFT 方法通常是模块化的,易于在不同任务间迁移。</li></ul>
PEFT 的应用场景包括:
<ul><li>在边缘设备上部署模型。</li>
<li>快速适配模型到特定领域或任务。</li>
<li>在低资源环境中进行模型训练。</li></ul>
<hr>
<font size="4" style="line-height: 45px;" color="#c200ff"><strong>2. 常见的 PEFT 方法</strong></font>
以下是几种主流的 PEFT 方法,每种方法都有其独特的设计理念和适用场景:
<font style="line-height: 40px;"><strong>(1) Adapter-based Methods(适配器方法)</strong></font>
<ul><li>描述:Adapter 方法在预训练模型的每一层中插入小型的神经网络模块(称为适配器),这些模块是可训练的,而原始模型参数保持冻结。适配器通常是轻量级的全连接层,参数量远小于原始模型。</li></ul>
<ul><li>工作原理:
在 Transformer 模型中,适配器通常插入到注意力模块或前馈网络(FFN)之后。
适配器包含一个降维层(down-projection)、一个非线性激活函数(如 ReLU)和一个升维层(up-projection),形成瓶颈结构(bottleneck)。
训练时只更新适配器的参数,原始 Transformer 参数保持不变。</li></ul>
<ul><li>优点:
参数效率高:适配器参数量通常只占模型总参数的 0.5%-10%。
模块化设计:适配器可以针对不同任务独立训练和存储,易于切换。
性能接近全参数微调。</li></ul>
<ul><li>缺点:
推理时会增加少量延迟,因为适配器引入了额外的计算。</li></ul>
<ul><li>代表工作:
AdapterHub:一个开源框架,支持在 Transformer 模型中插入适配器。
Pfeiffer Adapter:一种经典的适配器设计,插入在 Transformer 的 FFN 之后。
Houlsby Adapter:在每一层插入两个适配器(一个在注意力后,一个在 FFN 后)。</li></ul>
<ul><li>应用场景:多任务学习、跨语言迁移学习。</li></ul>
<font style="line-height: 40px;"><strong>(2) LoRA(Low-Rank Adaptation)</strong></font>
<ul><li>描述:LoRA(低秩适配)通过在预训练模型的权重矩阵上添加低秩分解(low-rank decomposition)的更新矩阵来实现微调,只训练这些低秩矩阵的参数。</li></ul>
<ul><li>工作原理:
对于一个权重矩阵 W∈R<sup>d×k</sup>,LoRA 假设权重更新可以表示为低秩形式:ΔW = A ⋅ B,其中 A∈ R<sup>d×r</sup>,B∈R<sup>r×k</sup>,r ≪ min(d,k)。
训练时冻结原始权重 W ,只更新 A 和 B 。
在推理时,可以将 ΔW 合并到 W 中,无需额外计算开销。</li></ul>
<ul><li>优点:
高效:参数量极少(通常 rrr 很小,新增参数占总参数的 0.01%-1%)。
推理无额外延迟:低秩更新可以合并到原始权重。
易于迁移:LoRA 权重可以保存为小文件,方便在不同任务间切换。</li></ul>
<ul><li>缺点:
需要为每个任务训练独立的 LoRA 模块。
对于某些复杂任务,可能需要较大的秩(rrr)才能达到理想性能。</li></ul>
<ul><li>代表工作:
LoRA(Hu et al., 2021):最早提出低秩适配的论文。
QLoRA:结合量化和 LoRA,进一步降低微调的内存需求。</li></ul>
<ul><li>应用场景:大模型的快速适配、个性化模型定制。</li></ul>
<font style="line-height: 40px;"><strong>(3) Prefix Tuning</strong></font>
<ul><li>描述:Prefix Tuning 通过在 Transformer 的输入或注意力层中添加可训练的“前缀”向量来引导模型的行为,而不修改模型的权重。</li></ul>
<ul><li>工作原理:
在 Transformer 的每一层注意力模块中,引入一组可训练的虚拟 token(称为前缀),这些 token 的嵌入向量是可学习的。
前缀向量参与自注意力计算,影响模型的输出,但模型的原始参数保持冻结。
前缀可以看作任务特定的“提示”(prompt),引导模型生成特定输出。</li></ul>
<ul><li>优点:
参数量极少:仅需训练前缀向量(通常占总参数的 0.1% 以下)。
适合小数据集:前缀可以看作一种软提示,减少过拟合风险。</li></ul>
<ul><li>缺点:
性能可能不如全参数微调,尤其是在任务差异较大的场景。
前缀长度需要手动调整,可能影响效果。</li></ul>
<ul><li>代表工作:
Prefix-Tuning(Li & Liang, 2021):最早提出前缀调优的方法。
P-Tuning v2:改进版本,增强了前缀的表达能力。</li></ul>
<ul><li>应用场景:自然语言生成任务、提示驱动的任务适配。</li></ul>
<font style="line-height: 40px;"><strong>(4) Prompt Tuning</strong></font>
<ul><li>描述:Prompt Tuning 是通过在输入序列中添加可训练的软提示(soft prompts)来微调模型,类似于手动设计的文本提示,但这些提示是连续的、可学习的向量。</li></ul>
<ul><li>工作原理:
在输入序列前添加一组可训练的嵌入向量(软提示),这些向量与输入 token 一起送入模型。
模型参数冻结,只优化软提示的嵌入。
软提示的长度和初始化方式对性能有较大影响。</li></ul>
<ul><li>优点:
参数极少:只需训练少量提示向量(通常占总参数的 0.01%-0.1%)。
适合低资源场景:对小数据集友好。</li></ul>
<ul><li>缺点:
性能依赖于提示设计,可能不稳定。
对于复杂任务,效果可能不如 LoRA 或适配器。</li></ul>
<ul><li>代表工作:
Prompt Tuning(Lester et al., 2021):提出软提示微调的概念。
Black-Box Tuning:针对不可访问内部参数的模型(如 API 模型)设计。</li></ul>
<ul><li>应用场景:低资源任务、API 模型适配。</li></ul>
<font style="line-height: 40px;"><strong>(5) P-tuning</strong></font>
<ul><li>描述:P-tuning 是一种通过优化连续提示(continuous prompts)来适配预训练模型的方法,结合了离散提示(discrete prompts)和软提示(soft prompts)的思想。与 Prompt Tuning 不同,P-tuning 使用一个小型神经网络(如 LSTM 或 MLP)来生成提示嵌入,从而增强提示的表达能力。</li></ul>
<ul><li>工作原理:
在输入序列中插入一组可训练的提示 token,这些 token 的嵌入由一个轻量级的提示生成器(prompt encoder)动态生成。
提示生成器通常是一个小型神经网络(如双层 MLP 或 LSTM),其参数是可训练的,而预训练模型的参数保持冻结。
P-tuning 允许提示嵌入根据任务上下文动态调整,相比静态的 Prompt Tuning 更具灵活性。
在某些实现中,P-tuning 还会结合离散提示(如手动设计的文本提示)作为初始化,进一步提高性能。</li></ul>
<ul><li>优点:
参数效率高:提示生成器的参数量通常占总参数的 0.01%-0.1%。
灵活性强:动态生成的提示能更好地适配复杂任务。
对小数据集友好:结合离散提示的初始化可以减少过拟合风险。</li></ul>
<ul><li>缺点:
提示生成器的设计和超参数(如网络结构、提示长度)需要仔细调优。
相比 LoRA 或 Adapter,性能可能略逊,尤其是在生成任务中。
实现复杂度稍高,需要额外设计提示生成器。</li></ul>
<ul><li>代表工作:
P-tuning(Liu et al., 2021):提出使用提示生成器优化连续提示的方法。
P-tuning v2:改进版本,增强了提示生成器的表达能力和任务适配性。</li></ul>
<ul><li>应用场景:自然语言理解任务(如文本分类、关系抽取)、小数据集场景、结合离散提示的任务。</li></ul>
<font style="line-height: 40px;"><strong>(6) Sparse Fine-Tuning(稀疏微调)</strong></font>
<ul><li>描述:稀疏微调通过只更新模型中一小部分权重(通常基于某种选择策略)来实现参数效率。</li></ul>
<ul><li>工作原理:
使用启发式方法(如基于梯度或重要性分数)选择需要更新的参数子集。
冻结其他参数,只训练选中的参数。
一些方法结合了剪枝(pruning)和微调,动态调整参数选择。</li></ul>
<ul><li>优点:
灵活性高:可以根据任务需求调整稀疏程度。
存储需求低:只需保存更新的参数。</li></ul>
<ul><li>缺点:
参数选择策略复杂,可能需要额外计算。
性能可能不稳定,依赖于稀疏策略的质量。</li></ul>
<ul><li>代表工作:
BitFit:只微调模型的偏置(bias)参数。
Diff Pruning:基于差异剪枝选择需要更新的参数。</li></ul>
<ul><li>应用场景:资源受限环境、模型压缩。</li></ul>
<font style="line-height: 40px;"><strong>(7) Hybrid Methods(混合方法)</strong></font>
<ul><li>描述:一些方法结合了上述多种技术,以进一步提升效率或性能。</li></ul>
<ul><li>工作原理:
例如,结合 LoRA 和 Prompt Tuning,同时优化低秩更新和软提示。
或者在适配器中引入稀疏性,减少参数量。</li></ul>
<ul><li>代表工作:
(IA)^3:通过学习可训练的缩放向量(scaling vectors)来调整注意力权重。
MAM Adapter:结合多种适配器设计,动态调整结构。</li></ul>
<ul><li>应用场景:复杂任务、需要权衡性能和效率的场景。</li></ul>
<hr>
<font size="4" style="line-height: 45px;" color="#c200ff"><strong>3. PEFT 方法的对比</strong></font>
<style type="text/css">
th{padding:5px;}
td{padding:5px;}
</style>
<table align="center" border="1" width="100%">
<tr><th>方法</th><th>参数效率</th><th>推理延迟</th><th>性能(相对全参数微调)</th><th>适用场景</th></tr>
<tr><td>Adapter</td><td>高</td><td>轻微增加</td><td>接近</td><td>多任务、跨语言迁移</td></tr>
<tr><td>LoRA</td><td>极高</td><td>无增加</td><td>接近</td><td>大模型适配、个性化</td></tr>
<tr><td>Prefix Tuning</td><td>极高</td><td>无增加 </td><td>稍逊</td><td>生成任务、低资源场景</td></tr>
<tr><td>Prompt Tuning</td><td>极高</td><td>无增加</td><td>稍逊</td><td>小数据集、API 模型</td></tr>
<tr><td>Sparse Fine-Tuning</td><td>高</td><td>无增加</td><td>依赖策略</td><td>模型压缩、资源受限环境</td></tr>
<tr><td>Hybrid Methods</td><td>因方法而异</td><td>因方法而异</td><td>接近或稍逊</td><td>复杂任务、特定优化需求</td></tr>
</table><br>
<hr>
<font size="4" style="line-height: 45px;" color="#c200ff"><strong>4. PEFT 的优势与挑战</strong></font>
<font style="line-height: 40px;"><strong>优势:</strong></font>
<ul><li>计算效率:大幅降低 GPU 内存和训练时间需求。</li></ul>
<ul><li>存储效率:只需保存少量参数,适合多任务部署。</li></ul>
<ul><li>模块化:支持任务间快速切换,易于扩展。</li></ul>
<ul><li>泛化能力:冻结预训练参数有助于保留模型的通用知识。</li></ul>
<font style="line-height: 40px;"><strong>挑战:</strong></font>
<ul><li>性能权衡:某些方法在复杂任务上可能无法完全匹配全参数微调的性能。</li></ul>
<ul><li>超参数敏感:如 LoRA 的秩、前缀长度等需要仔细调优。</li></ul>
<ul><li>任务适配性:不同任务可能需要不同 PEFT 方法,通用性有待提升。</li></ul>
<ul><li>实现复杂性:一些方法(如稀疏微调)需要复杂的参数选择策略。</li></ul>
<hr>
<font size="4" style="line-height: 45px;" color="#c200ff"><strong>5. 总结与建议</strong></font>
PEFT 是大模型 微调的重要技术方向,特别适合资源受限或多任务场景。选择合适的 PEFT 方法需要根据以下因素权衡:
<ul><li>任务复杂度:简单任务(如文本分类)可用 Prompt Tuning,复杂任务(如生成)可能需要 LoRA 或 Adapter。</li></ul>
<ul><li>资源限制:内存和存储受限时,优先选择 LoRA 或 Prompt Tuning。</li></ul>
<ul><li>推理需求:对延迟敏感的场景,LoRA 更优(无额外推理开销)。</li></ul>
<ul><li>数据集规模:小数据集适合 Prefix Tuning 或 Prompt Tuning,大数据集可尝试 Adapter 或 LoRA。</li></ul>
<hr>
<font color="#9a9a9a">版权声明:本文为CSDN博主「彬彬侠」的原创文章,</font>
<font color="#9a9a9a">遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。</font>
<a href="https://blog.csdn.net/u013172930/article/details/147338558"><font color="#9a9a9a">原文链接:https://blog.csdn.net/u013172930/article/details/147338558</font></a>
<br>