DataWhale大模型基础与量化微调task4学习笔记(第 1章:参数高效微调_PEFT技术综述)

(本博客为Datawhale的baseLLM开源学习项目的学习笔记)

在这一章中,我们将步入对大模型微调的学习。之所以将PEFT作为学习的起点,是因为它不仅是当前应对大模型训练高昂成本的主流解决方案,更代表了我们与超大模型互动和应用范式上的一次重要变革。理解PEFT,是掌握如何在资源有限条件下,高效、灵活地驾驭大模型强大能力的关键一步。

一、大模型时代的"微调"困境

自BERT模型发布以来,"预训练-微调"(Pre-train and Fine-tune)的范式在自然语言处理领域取得了巨大成功。不过,当模型参数规模从BERT的数亿级别跃升至GPT-3的千亿级别时,传统的全量微调(Full Fine-Tuning)遇到了挑战:

**高昂的训练成本:**微调一个千亿参数的大模型需要巨大的计算资源(数百GB的显存)和时间成本,这对于绝大多数开发者和企业来说是遥不可及的。

**巨大的存储压力:**如果为每一个下游任务都保存一份完整的、千亿级别的模型副本,将导致难以承受的存储开销。

**灾难性遗忘:**在针对特定任务进行微调时,模型很可能会"忘记"在预训练阶段学到的海量通用知识,损害其泛化能力。

**训练不稳定性:**大模型的网络结构"又宽又深",其训练过程对学习率等超参数极为敏感,很容易出现梯度消失/爆炸等问题,导致训练失败。

针对以上这些问题,研究者们需要一种新范式,既可以利用大模型的强大能力,又能避免全量微调带来的高昂成本。

1."提示"范式的兴起于局限

2020年GPT-3论文带来了一种全新的、无需训练的范式-In Context Learning。研究者们惊喜地发现,在不调整任何模型参数地情况下,仅通过在输入中提供一些任务示例(即提示Prompt),就能引导大模型完成特定任务。这一发现迅速催生"提示工程(Prompt Engineering)"的繁荣。用户通过组合各种关键词、权重和特殊符号,像"炼金术士"一样探索和"召唤"AI的强大能力。这种人工设计的、离散的文本指令,我们称之为"硬提示"(Hard Prompt)。

然而,这种方式存在三个明显的局限。找到最优的提示词往往需要大量的试错和经验,过程繁琐且不稳定,充满了"玄学";离散的文本提示在表达能力上存在上限,难以充分激发和精确控制大模型的潜力;而且在一个模型上精心设计的提示,换到另一个模型或另一种语言上,效果可能大打折扣。

2.参数高效微调的诞生

如何找到一种既能有效利用大模型能力,又不必承受全量微调高昂成本的方法?学术界和工业界开始探索一种全新的方法:参数高效微调(Parameter-Efficient Fine-Tuning,PEFT)

这种方式的核心思想是冻结预训练模型99%以上的参数,仅调整其中极小一部分(通常<1%)的参数,或者增加一些额外的"小参数",从而以极低的成本让模型适应下游任务。这个思想借鉴了计算机视觉领域的迁移学习(Transfer Learning)。在CV任务中,我们通常会冻结预训练模型(如ResNet)负责提取通用特征的卷积层,仅微调后面的全连接层来适应新的分类任务。PEFT将这一思想应用于Transformer架构,并发展出多条技术路线。

二、PEFT技术发展脉络

1.Adapter Tuning

Adapter Tuning是PEFT领域的开创性工作之一,由Google在2019年为BERT模型设计。它的思路是在Transformer的每个块中插入小型的"适配器"(Adapter)模块。如下图所示,左侧的Transformer层展示了Adapter模块是如何被集成进去的。Adapter被插入到每个子层(注意力层和前馈网络)的内部,并与主干网络形成残差连接。在训练时,只有Adapter模块的参数会被更新。

右侧展示了Adapter模块模块自身的结构:

一个"降维"的全连接层(Feedforward down-project),将高维特征映射到低维空间。

一个非线性激活函数(Nonlinearity)。

一个"升维"的全连接层(Feedforward up-project),再将特征映射回原始维度。

一个贯穿该模块的残差连接,将模块的输出与原始输入相加,保证信息流的稳定。

通过这种"瓶颈式"的结构,Adapter模块可以用极少的参数量来模拟特定任务的知识。这种方法不仅参数效率高、训练稳定,而且性能上限接近全量微调。相比全量微调,能够显著降低可训练参数与优化器状态占用;但由于各层插入了额外模块,训练时仍会带来一定的激活内存与算力开销。在千亿级规模且资源受限的条件,工程实现更具挑战。

2.Prefix Tuning

2021年,斯坦福大学的研究者提出了Prefix Tuning,为PEFT开辟了一条全新的思路。与Adapter在模型内部"动手术"不同,Prefix Tuning选择在模型外部做文章,就像是给模型带上了一张"小抄"。下图是一个注解示例,揭示了Prefix Tuning的工作细节。该图分别展示了Prefix Tuning在自回归语言模型(上)和编码器-解码器模型(下)中的应用。它的核心机制在于:

前缀激活值(Prefix Activations): 图中PREFIX部分对应的激活值hi(其中)是从一个专门的可训练矩阵Pθ中提取的,这部分参数就是微调的对象。

**模型计算的激活值:**而原始输入x和输出y对应的激活值,则是由冻结的Transformer模型正常计算得出的。

通过这种方式,模型在不改变原有参数的情况下,学会利用这些可控的"前缀"来引导后续内容的生成,从而适应新的任务。同时,为了达到更好的效果,Prefix Tuning不仅在输入层添加前缀,还在Transformer的每一层都添加了对应的可学习Prefix,并通过一个小型的前馈网络(MLP)来生成这些参数。

这种方式有如下的优缺点。

优点:

**较高的参数效率:**仅优化极少数Prefix参数,无需改动原模型。

**显存友好:**由于不更新原模型权重(仅训练前缀参数),训练时无需为原模型权重维护优化器状态,显著降低显存/存储开销;但需要为各层前缀的K/V额外占用预留显存。

**通用性强:**在自回归模型(如GPT-2)和编解码模型(如T5/BERT)上均取得了不错的效果

缺点:

**训练不稳定:**直接优化Prefix向量比微调Adapter更困难,对超参数和初始化较为敏感。

**占用上下文长度:**多数实现将前缀作为各层注意力的额外K/V记忆,其长度通常计入注意力配额,从而减少可用的有效上下文窗口(实现相关,取决于具体框架与实现方式)。

3.Prompt Tuning

Prefix Tuning虽然强大,但其复杂的训练过程和在每一层都添加参数的设计,在实践中不够便捷。同一年,Google提出了Prompt Tuning,可以看作是Prefix Tuning的一个简化版。这种方法也被称为一种"软提示"。它的做法就是只在输入的Embedding层添加可学习的虚拟Token(称为Soft Prompt),而不再干预Transformer的任何中间层。

下图中直观展示了Prompt Tuning这种简化思路在实践中所带来的巨大差异,它不仅是参数效率的提升,更是在使用范式上迈出了新的一步。

(1)**左侧:全量微调:**作为性能基准,这种方法遵循"一个任务,一个模型"的模式。针对每一个下游任务,都需要用其专属的数据集,对庞大的预训练模型(图中为110亿参数)进行完整的微调。最终会得到N个与原模型同样大小的任务专属模型副本,导致巨大的存储和部署开销。

(2)**右侧:提示微调:**它将PEFT的效率思想发挥得更加充分,将任务知识完全"外置"到一个轻量级的提示(Prompt)中。实践中可便利地实现混合任务批处理(Mixed-task-Batch),便于共享同一冻结模型并提升训练吞吐;多任务训练并非Prompt Tuning所独有,但其实现较为简洁。我们可以通过一个具体的例子来理解这个过程:

**定义任务:**假设我们有三个不同的任务类型。任务A是情感分析,任务B是回答,任务C是文章摘要。

**准备数据:**任务A的一条数据a1可能是一句影评:"这部电影拍得真不错!"。任务B的数据b1可能是一个问答对。

拼接提示进行训练: 在训练时,我们会为a1这条数据前,拼接上专门为"情感分析"任务学习的、可训练的Soft Prompt A。这个Soft Prompt A并非一段人类可读的文本指令(如"请分析情感")而是一组可通过反向传播优化的、连续的向量(Embeddings)。可以把它理解为一把能解锁大模型特定能力的"钥匙":在训练时,他可能由"情感"、"正面"、"负面"等词的向量来初始化,并最终被模型自动微调成最优的、能够高效引导模型执行情感分析任务的"虚拟指令"。同理,为b1数据拼接上为"问答"任务学习的Soft Prompt B。如图所示,这些来自不同任务、但都已拼接好各自Soft Prompt的数据,可以被组合成一个混合批次,然后一起送入同一个、完全冻结的大语言模型进行训练。模型通过反向传播,只会更新Soft Prompt A和Soft Prompt B的参数,而自身权重保持不变。

结果就是训练对象只是微型的任务提示(参数规模通常为万级,取决于提示长度与嵌入维度),而大模型(11B参数)始终冻结并被所有任务共享。最终产出的是几个极小的提示文件,而非庞大的模型副本。这种非侵入式的方法实现起来极为简单,达到了很高的参数与存储效率,为实现单一模型服务多种下游任务提供了可能。

此外,在Google的这篇论文中最重要的发现是模型规模的缩放效应(The Power of Scale)。如下图所示,实验表明当模型规模较小(如1亿参数)时,Prompt Tuning的效果(绿线)远不如传统的模型微调(红线和橙线)。但当模型规模超过100亿时,Prompt Tuning的性能开始追平甚至超越全量微调。

这个发现意味着,只要模型"足够大",我们就不再需要复杂的、侵入式的微调技术,仅仅通过学习一个微型的Soft Prompt,就能让大模型涌现出强大的任务适应能力。然而,这也揭示了Prompt Tuning的局限,它的成功强依赖于模型的规模,在中小模型上效果不佳。

三、P-Tuning v2

Prompt Tuning虽然足够高效,但它的稳定性较差,且严重依赖超大模型的规模,这限制了其在更广泛场景中的应用。为了解决这一问题,由清华大学主导的P-Tuning系列工作,对软提示进行了深入优化,最终发展出了效果更强、更通用的P-Tuning v2。

1.P-Tuning的主要逻辑

为了理解P-Tuning v2的精髓,我们首先需要了解其前身P-Tuning v1。v1的主要目标是解决离散提示(Discrete Prompts)的"不稳定性"问题。

如下图所示,P-Tuning v1将自己与传统的离散提示搜索方法进行了对比:

(a)**离散提示搜索:**这类方法试图在离散的文本空间中找到最优的提示词组合。这种搜索过程通常只能依赖离散的奖励信号,优化非常困难且不稳定,找到的解往往是次优的。

(b)**P-Tuning:**它提出,不应该在离散空间搜索,而应该在连续空间中进行优化。为此,P-Tuning v1引入了一个关键组件:Prompt Encoder。它的逻辑是:

首先定义一组可学习的、连续的伪提示(Pseudo Prompts)。

然后将这些伪提示作为输入,送入一个小型神经网络(如LSTM)构成的Prompt Encoder

Prompt Encoder会将这些伪提示编码,捕捉它们之间的依赖关系,并生成最终的、作为大模型输入的任务相关向量。

通过这种方式,Prompt Encoder及其输入的伪提示,都可以通过反向传播进行端到端的优化。这从根本上改变了寻找最优提示的方式:从"人工试错"变成了可以通过"梯度下降"来自动化求解的数学问题,大幅提升了优化的稳定性和最终结果。

但是,P-Tuning v1仍然存在两个问题。它对模型规模较为敏感(在较小模型上收益有限,而在更大模型上更稳定、更具优势),并在一些复杂的自然语言理解(NLU)任务(特别是序列标注)上表现不佳。

2.P-Tuning v2的演进

2021年底问世的P-Tuning v2,就是为了解决v1的局限性而设计的。它博采众长,吸收了Prefix Tuning的思想,最终成为一种在不同模型规模、不同任务上都表现出色的通用PEFT方案。

在下图中我们可以看到P-Tuning v2的演进。

**(a)P-Tuning v1 & Prompt Tuning:**这两种方法都属于"浅层提示",即只在输入层(Embedding Layer)添加可学习的提示向量。这种方式虽然高效,但可调参数有限,且对模型后续层的影响较为间接。而且,它们通常依赖于一个精心设计的Verbalizer(模板映射器)来将任务输出转换为模型可理解的词汇,这在序列标注等复杂任务上难以适应。

(**b)P-Tuning v2:**它进行了两项关键的结构性改进,使其变得更加强大和通用:

**引入深层提示(Deep Prompts):**这是P-Tuning v2最核心的改进。它借鉴了PrefixTuning的思想,在Transformer的每一层都添加了可学习的提示(Layer Prompts)。使得可微调的参数量(尽管仍在0.1%-3%)和对模型行为的干预能力都显著增强,尤其对于需要复杂推理的NLU任务至关重要。

**摒弃Verbalizer:**在分类与序列标注等判别式任务中,P-Tuning v2移除了对任务高度敏感的Verbalizer,回归到传统微调的方式,在模型顶层增加一个随机初始化的线性分类头输出类别;而在生成式任务中,仍通过语言模型头进行生成。这样既能轻松处理序列标注等复杂任务,又增强了通用性。

通过这些改进共同作用,P-Tuning v2真正成为了一种通用的PEFT方案。它不再严重依赖模型的规模,在3亿到100亿等不同参数规模的模型上,都能稳定地达到甚至超越全量微调地效果。

相关推荐
leiming61 小时前
linux 进程学习之信号
linux·运维·学习
被遗忘的旋律.2 小时前
Linux驱动开发笔记(二十四)——(上)IIO + icm20608驱动
linux·驱动开发·笔记
zhangrelay2 小时前
thinkpad等笔记本电脑在ubuntu等linux系统下电池校准如何做?
笔记·学习
_Kayo_2 小时前
Node.JS 学习笔记8
笔记·学习·node.js
weixin_462446232 小时前
使用 Docker / Docker Compose 部署 PdfDing —— 个人 PDF笔记
笔记·docker·pdf
知识分享小能手2 小时前
Oracle 19c入门学习教程,从入门到精通,Oracle 数据表对象 —— 语法知识点详解与案例实践(10)
数据库·学习·oracle
炽烈小老头2 小时前
【每天学习一点算法 2026/01/22】杨辉三角
学习·算法
枷锁—sha2 小时前
【CTF笔记篇】SQL 注入总结
数据库·笔记·sql·安全·网络安全
狐572 小时前
2026-01-19-论文阅读-Agentic-Reasoning-for-Large-Language-Models
论文阅读·笔记