大模型微调——Prompt-Tuning
一、NLP四种范式
1、第一范式:非神经网络时代的完全监督学习(特征工程)
利用特定的规则或数学、统计学的模型来对特征进行匹配和利用,进而完成特定的NLP任务。常见的方法比如贝叶斯、veterbi算法、隐马尔可夫模型等等,来进行序列分类、序列标注等任务。
特点:
2、第二范式:基于神经网络的完全监督学习(架构工程)
这类方法不用手动设置特征和规则,节省了大量的人力资源,但仍然需要人工设计合适的神经网络架构来对数据集进行训练。常见的方法比如CNN、RNN、机器翻译中的Seq2Seq模型、Transformer模型等等。
特点:相比于第一范式,模型准确度有所提高,特征工程的工作也有所减少。
3、第三范式:预训练+精调范式(目标工程)
先在大的无监督数据集上进行预训练,学习到一些通用的语法和语义特征,然后利用预训练好的模型在下游任务的特定数据集上进行fine-tuning,使模型更适应下游任务。
特点:相比于第二范式,模型准确度显著提高,模型也随之变得更大,但小数据集就可训练出好模型。
4、第四范式:预训练+提示+预测范式(Prompt工程)
将下游任务的建模方式重新定义,通过合适的prompt来实现直接在预训练模型上解决下游任务,这种模式需要极少量(甚至不需要)下游任务数据,使得小样本、零样本学习成为可能。
特点:相比于第三范式,模型训练所需的训练数据显著减少。
范式 | 特征工程 | 数据需求 | 模型类型 | 典型任务 | 优点 | 缺点 |
非神经网络完全监督学习 | 需要 | 标注数据 | 传统机器学习 | 文本分类、NER | 可解释性强 | 特征工程耗时,难以捕捉复杂语义 |
神经网络完全监督学习 | 不需要 | 标注数据 | 深度学习 | 机器翻译、文本生成 | 自动学习特征,表现优异 | 需要大量标注数据,可解释性差 |
预训练-微调 | 不需要 | 未标注+标注数据 | 预训练模型 | 几乎所有NLP任务 | 利用大规模数据,泛化能力强 | 预训练成本高,微调需要标注数据 |
提示学习 | 不需要 | 少量/无标注数据 | 预训练模型 | 分类、生成、推理 | 少样本/零样本学习,接近人类语言理解 | 提示设计复杂,对复杂任务泛化能力有限 |
在自然语言处理(NLP)中,Fine-Tuning是用于将预训练的语言模型适应于特定任务或领域。Fine-Tuning的基本思想是采用已经在大量文本上进行训练的预训练语言模型,然后在小规模的任务特定文本上继续训练它。
出现了一些问题:
① 下游任务的目标和预训练的目标差距过大,可能导致过拟合。
② 当前预训练语言模型(PLM)规模变得越来越大,在消费级硬件上进行全量微调(Full Fine-Tuning)变得不可行。
③ 下游任务的目标和预训练的目标差距过大,可能导致过拟合。
解决方法:Prompt-Tuning, 通过添加模板的方法来避免引入额外的参数,从而让模型可以在小样本(few-shot)或者零样本(zero-shot)场景下达到理想的效果。
二、Prompt-Tuning发展相关
首先,我们要了解提示词Prompt是怎么构成的?
① 指令(Instryction) ② 上下文 (Context)③ 角色(Role) ④ 格式指示(Format Indicator) ⑤ 范例(Example) ⑥ 约束条件(Constraint) ⑦ 思考步骤(Chain-of-Thought, CoT)
1. Prompt-Tuning定义
Prompt-Tuning是一种针对超大规模参数模型的微调方法,通过设计合适的模板或指令(Prompt)来引导模型完成特定任务,而无需对模型所有参数进行微调。对于参数量超过10亿的模型,Prompt-Tuning的增益通常高于标准Fine-tuning。通过添加模板的方法来避免引入额外的参数,从而让模型可以在小样本(few-shot)或者零样本(zero-shot)场景下达到理想的效果。
prompt-tuning执行步骤:
1.构建模版(Template) ;2.标签词映射(Verbalizer) ;3.训练
Prompt Tuning的发展历程:
① 从In-Context Learning(ICL上下文学习)到Prompt Tuning(微调):Prompt Tuning的灵感来自于In-Context Learning,但它通过训练 Prompt Tokens,实现了更好的性能和参数效率。
② 从Hard Prompt(硬提示)到Soft Prompt(软提示):Prompt Tuning使用可学习的向量作为Prompt,而不是自然语言文本,从而避免了人工设计Prompt的困难。
③ 从单层Prompt到多层Prompt:Prefix-Tuning在预训练模型的每一层都添加Prompt Tokens,从而更好地控制模型的行为。
④ 从手工设计到自动化搜索:研究人员开始探索如何自动化Prompt Engineering,以进一步提高Prompt Tuning的效率和效果。
2.In-Context Learning (上下文学习)
In-Context Learning(ICL)最早在GPT-3中提出,旨在从训练集中挑选少量的标注样本,设计任务相关的指令形成提示模板,用于指导测试样本生成相应的结果。它是一种不进行模型参数训练的学习方式,通过在输入中提供示例来引导模型。
Zero-shot (零样本学习): 仅给出任务描述,直接让预训练模型进行预测。例如:“这个任务要求将中文翻译为英文。销售->” 模型预测“sell”。
One-shot (单样本学习): 在任务描述后提供一个示例作为指导。例如:“这个任务要求将中文翻译为英文。你好->hello, 销售->” 模型预测“sell”。
Few-shot (少样本学习): 提供多个示例(通常10-100条)作为指导。例如:“这个任务要求将中文翻译为英文。你好->hello, 再见->goodbye, 购买->purchase, 销售->” 模型预测“sell”。
优缺点
优点:
零样本或少样本学习: 无需或只需少量标注数据即可解决新任务。
快速适应: 通过更换示例即可快速适应不同任务。
简单易用: 无需训练模型,只需选择合适的示例。
缺点:
性能受示例质量影响大: 示例的选择对模型性能有显著影响,需要人工精心选择或算法自动选择。
对模型规模要求高: ICL的性能通常随模型规模增大而提升,在小参数量模型上效果会下降很多。
上下文长度限制: 输入文本长度受LLM上下文长度限制,无法提供过多示例。
推理成本高: 每次推理都需要将示例输入模型,增加了推理成本。
尽管ICL在大型模型上表现出色,但其对模型规模的要求和推理成本促使了后续Prompt-Tuning等方法的提出。
3. PET模型
PET启发于文本分类任务,并且试图将所有的分类任务转换为与MLM一致的完形填空任务。
PET是一种结合提示工程和监督学习的半监督训练方法,专门设计用于在标注数据稀缺(Few-Shot)的情况下,充分利用大型预训练语言模型(如BERT, RoBERTa等)的强大能力。
PET的核心思想是将下游任务重构为预训练模型最熟悉的“完形填空”问题,从而在少量有标签数据上进行微调,并结合大量无标签数据生成“软标签”(soft labels)来增强训练。
两个重要组件(Pattern-Verbalizer-Pair):
Pattern(模板)与Verbalizer(标签词映射)
P: 模板——每条样本或每个任务的模版都可能不一样
V: 标签词映射表——预测的词, 基于标签词映射表查询出词对应的类别等
PET的训练过程分为三个主要阶段:
模式设计与模型微调:
输入: 少量标注数据和一组手动设计的PVP。
过程: 为每个模式P,将输入x转换为完形填空问题P(x)。使用预训练语言模型对每个模式单独进行微调,优化模型预测
[MASK]
位置的Verbalizer词。微调时,使用交叉熵损失更新模型参数,基于少量标注数据的真实标签。输出: 为每个模式生成一个微调后的模型,形成一个模型集成。
无标注数据软标签生成:
输入: 大量无标注数据和微调后的模型集成。
过程: 对无标注数据应用所有模式,生成完形填空问题。使用模型集成预测每个样本的
[MASK]
位置概率,计算Verbalizer词的软标签。通过加权平均或其他集成方法,生成最终的软标签数据集。输出: 一个包含软标签的无标注数据集。
最终监督训练:
输入: 少量标注数据(硬标签)和无标注数据(软标签)。
过程: 使用联合数据集(硬标签 + 软标签),训练一个最终的分类器。通常在模型的输出层(classifier head)上使用交叉熵损失进行监督训练。
输出: 一个适配下游任务的最终模型。
PET的挑战在于如何自动选择或构建合适的PVP,因为不同的PVP组合会对结果产生显著影响。
4.Prompt-Oriented Fine-Tuning(POFT,基于提示的微调)
将下游目标任务转换为适应预训练模型的预训练任务,然后在这个转换后的任务形式上,利用标注数据进行全量微调,以达到更好的性能来适应预训练模型的学习体系。
POFT的核心步骤和工作原理
POFT的主要思想类似于PET中的“模式”和“标签映射”,但它更侧重于将这种模式化的输入用于全量微调,而不是仅仅用于知识蒸馏或少样本学习。
定义任务模式 (Task Patterns): 将下游任务的输入和输出,转换为一种包含空白(
[MASK]
或其他特殊标记)的自然语言句子模板。例如,情感分类中,将“这部电影太棒了!”转换为“这部电影太棒了!这是一部[MASK]
的电影。”定义标签映射 (Verbalizer): 对于任务的每个标签,将其映射到预训练语言模型词汇表中的一个或多个具体词汇。例如,积极 → 好, 棒, 优秀;消极 → 差, 烂, 糟糕。
构造训练样本: 将所有有标签的训练数据,根据定义的模式和标签映射进行转换。输入变成模式化的句子,模型的训练目标是在空白处生成正确的Verbalizer词汇。
全量微调预训练语言模型: 在这些模式化、转换后的训练数据上,对整个预训练语言模型进行全量微调。微调的目标函数通常是交叉熵损失,旨在最大化模型在空白处预测正确Verbalizer词汇的概率。这实际上是回归到预训练语言模型预训练时的语言模型目标(如掩码语言模型或文本生成)。
区别于Prompt Engineering: POFT在这里更新模型的所有参数,而不仅仅是Prompt向量。
区别于传统Fine-tuning: POFT是让预训练语言模型通过预测词汇来完成任务,更接近其预训练的方式。
推理阶段: 对于新的输入,同样通过模式进行转换。将转换后的输入送入微调后的预训练语言模型。模型会在空白处生成最可能的词汇。通过Verbalizer,将这些预测的词汇反向映射回任务的原始标签或答案。
POFT的特点
POFT方法中,预训练模型参数是需要更新的,本质是Prompt-Tuning + Fine-Tuning的结合体。该方法在Bert类相对较小的模型上表现较好,但是随着模型越来越大,如果每次针对下游任务,都需要更新预训练模型的参数,资源成本及时间成本都会很高。因此,后续陆续提出了不更新预训练模型参数,单纯只针对Prompt进行调优的方法,即Hard Prompt(离散提示)和Soft Prompt(连续提示)。
Soft Prompt方法是Prompt-Tuning发展中的一个重要方向,它将模板变为可训练的参数,使得模型能够自适应地在语义空间中寻找合适的向量来代表模板中的每一个词,从而增加了模型的泛化能力。
5.Soft Prompt的核心思想
与Hard Prompt(离散提示)使用固定的自然语言文本作为提示不同,Soft Prompt使用连续的、可学习的向量序列作为提示。这些向量序列被称为“伪标记”(Pseudo Token),它们仅代表一个抽象的token,并没有实际的语义含义,本质上是可学习的向量。
Soft Prompt的工作原理
假设针对分类任务,给定一个输入句子x,连续提示的模板可以定义为T=[x],[v1],[v2],...,[vn][MASK]
,其中[vn]
就是伪标记。在训练过程中,只有这些伪标记对应的向量表征参数会随着训练进行更新,而预训练模型本身的参数保持不变。通过这种方式,模型可以在连续的向量空间中寻找合适的伪标记,以更好地引导模型完成特定任务。
Soft Prompt的优势
自适应性: 不同的任务和数据可以自适应地学习到最合适的提示向量,避免了人工设计Hard Prompt的复杂性和局限性。
泛化能力: 通过在连续空间中学习提示,模型能够更好地泛化到未见过的数据和任务。
参数效率: 相比于全量微调,Soft Prompt仅引入少量可训练参数,大大降低了计算和存储成本。
三、Prompt-Tuning方法
1.Instruction-Tuning (指令学习)
Instruction-Tuning(指令学习)是Prompt-Tuning的一种应用和发展,它强调通过明确的自然语言指令来引导大型语言模型完成特定任务,尤其适用于对大规模模型进行微调以提高其泛化能力。
① Instruction-Tuning的核心思想
Instruction-Tuning的本质是告诉模型需要做什么任务,输出什么内容。它通过为各种类型的任务定义指令并进行训练,来提高模型对不同任务的泛化能力。与Prompt-Tuning的核心思想一样,指令学习也是去发掘语言模型本身具备的知识。
② Prompt与Instruction的区别
特征 | Prompt | Instruction |
---|---|---|
引导方式 | 依赖模型隐式推断任务(易歧义) | 明确任务类型、输出格式(降低歧义,更适合复杂任务) |
激发能力 | 激发语言模型的补全能力 | 激发语言模型的理解能力 |
示例 | “带朋友去了一家餐厅,她吃的很开心。这家餐厅太___了!”(模型需生成补全词) | “判断以下文本的情感倾向,选择最合适的选项:\n文本:'带朋友去了一家餐厅,她吃的很开心。'\n选项:A=正面, B=中性, C=负面”(模型直接选择选项) |
指令学习通过给出更明显的指令/指示,让模型去理解并做出正确的action。
③ Instruction-Tuning的实现
数据收集: 收集或生成大量的指令数据,每条数据包含一个自然语言指令和一个相应的输出。指令数据应该覆盖各种任务类型和语言风格。
微调: 在收集到的指令数据上对LLM进行微调。微调的目标是使模型能够根据指令生成相应的输出。
④ Instruction-Tuning的优缺点
优点:
提高泛化能力: 可以提高模型对未见过的任务的泛化能力。
提高零样本学习能力: 可以提高模型在没有示例的情况下解决新任务的能力。
增强指令遵循能力: 使模型更好地理解和执行各种指令。
缺点:
需要大量的指令数据: 指令数据的质量和数量对性能有很大影响。
数据收集成本高: 收集高质量的指令数据需要大量的人工或自动生成成本。
微调成本高: 在大型LLM上进行微调需要大量的计算资源。
2. Chain-of-Thought (CoT) 思维链
思维链(Chain-of-Thought,CoT)是一种改进的提示策略,由Google在论文《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》中首次提出。它旨在提高大型语言模型在复杂推理任务中的性能,如算术推理、常识推理和符号推理。
① CoT的核心思想
CoT是一种离散式提示学习方法,更具体地说,它是在大模型下的上下文学习(即不进行训练,将示例添加到当前样本输入的前面,让模型一次输入这些文本进行输出完成任务)的基础上,增加了中间的推导提示。这意味着模型在给出最终答案之前,会先生成一系列中间推理步骤,从而模拟人类的思考过程。
② CoT的分类
CoT主要分为两种类型:
Few-shot CoT: 在Prompt中提供少量包含推理步骤的示例,引导模型在推理时也生成中间步骤。
Zero-shot CoT: 无需提供示例,仅通过在Prompt中添加“让我们一步一步地思考”或类似指令,即可激发模型生成推理链。
③ CoT的优缺点
优点:
提高复杂推理能力: 可以显著提高模型在需要进行复杂推理的任务上的性能,例如数学问题、常识推理等。
增强可解释性: 通过生成推理步骤,可以更好地理解模型的推理过程。
缺点:
需要人工设计CoT示例: 设计有效的CoT示例需要一定的经验和技巧(对于Few-shot CoT)。
对模型规模要求高: CoT方法的性能通常随着模型规模的增大而提升。
推理成本高: 需要生成推理步骤,增加了推理成本。
四、大模型参数高效微调方法(PEFT)(Parameter-Efficient Fine-Tuning)
PEFT(Parameter-Efficient Fine-Tuning)参数高效微调方法是目前大模型在工业界应用的主流方式之一。它旨在解决全量微调(Full Fine-Tuning)在计算和存储成本上的高昂问题,同时力求达到与全量微调相当的性能。
PEFT的核心思想
PEFT的核心思想是:
冻结大部分预训练模型的参数: 只训练少量额外的参数,从而大大减少了计算和存储成本。
利用预训练模型的知识: 通过微调少量参数,使模型能够适应下游任务,同时保留大部分预训练的知识。
PEFT的优势
高效适应: 使预训练语言模型(PLM)高效适应各种下游应用任务,而无需微调预训练模型的所有参数。
资源节约: 大幅降低了计算和存储成本,使得大模型在消费级硬件上进行微调变得可行。
避免灾难性遗忘: 由于大部分预训练参数被冻结,有助于保留模型在预训练阶段学到的通用知识。
PEFT的分类
PEFT方法可以根据其在模型中引入可训练参数的位置和方式进行分类,主要包括:
Prefix-Tuning
Prompt-Tuning
Adapter
LoRA(Low-Rank Adaptation)
1. Prefix-Tuning
Prefix-Tuning是2021年提出的一种PEFT方法,它旨在通过在输入token之前构造一段任务相关的伪tokens(Prefix)来微调大型语言模型,同时固定Transformer中的大部分参数。
① Prefix-Tuning的核心思想
Prefix-Tuning的核心思想是在Transformer模型的每一层内部,注入一个可学习的“前缀”。这些前缀被添加到Attention机制中的Key(K)和Value(V)向量的计算中。你可以想象,模型的每一层都有一个“小秘书”,这个秘书会根据你给他的“指示”(前缀),来调整它看到的信息(Key和Value),从而影响这一层乃至后续层的注意力计算和信息流动,最终引导模型生成期望的输出。
② Prefix-Tuning的任务形式
Prefix-Tuning在输入前添加前缀,即z=[Prefix,x,y]
,其中Pidx
为前缀序列的索引,|Pidx|
为前缀的长度。前缀索引对应着由θ
参数化的向量矩阵Pθ
,维度为|Pidx|×dim(hi)
。
需要注意的是,由于直接更新Prefix的参数会导致训练不稳定,作者在Prefix层前面加了MLP结构(多层感知机,Multilayer Perceptron)(相当于将Prefix分解为更小维度的Input与MLP的组合后输出的结果),训练完成后,只保留Prefix的参数。
③ Prefix-Tuning与P-Tuning和Prompt-Tuning的区别
与P-Tuning的区别: Prefix-Tuning是将额外的embedding加在开头,而P-Tuning位置不固定;Prefix-Tuning通过在每个层都添加可训练参数,通过MLP初始化,而P-Tuning只在输入的时候加入embedding,并通过LSTM+MLP初始化。
与Prompt-Tuning的区别: Prefix-Tuning是在每个层都添加可训练参数,而Prompt Tuning只在输入层加入了prompt tokens。
2. Adapter Tuning
Adapter Tuning是2019年谷歌研究人员在论文《Parameter-Efficient Transfer Learning for NLP》中首次提出的针对BERT的PEFT微调方式,拉开了PEFT研究的序幕。
① Adapter Tuning的核心思想
Adapter是一种轻量级的模块,可以学习到特定任务的知识,而不会影响预训练语言模型的原始参数。不同于Prefix Tuning这类在输入前添加可训练prompt参数,以少量参数适配下游任务,Adapter Tuning则是在预训练模型内部的网络层之间添加新的网络层或模块(即“适配器” Adapter)来适配下游任务。当模型训练时,固定住原来预训练模型的参数不变,只对新增的Adapter结构进行微调。
② Adapter Tuning的模型结构
Adapter模块通常包含以下结构:
Down-project层: 将高维度特征映射到低维特征。
非线性层: 在低维空间进行非线性变换。
Up-project层: 将低维特征映射回原来的高维特征。
Skip-connection结构: 也称为残差连接,确保在最差的情况下能够退化为identity,有助于训练的稳定性和性能。
通过这种方式,Adapter Tuning在保持预训练模型大部分参数不变的情况下,有效地引入了任务特定的知识,实现了参数高效的微调。
3. LoRA (Low-Rank Adaptation)
LoRA(Low-Rank Adaptation)是一种参数高效的微调技术,由微软推出,旨在解决Adapter Tuning引入额外计算和Prefix Tuning优化困难的问题。它是目前最通用、效果最好的微调方法之一。
① LoRA的产生背景
随着大型语言模型(LLM)的参数量爆炸式增长(从百亿到万亿),全量微调(Fine-tuning)面临着巨大的挑战:
高昂的存储成本: 每个下游任务都需要保存一个完整的模型副本。
巨大的计算资源需求: 训练数十亿甚至数万亿参数的模型需要大量的GPU内存和计算时间。
灾难性遗忘: 在小样本数据上对整个模型进行微调可能导致模型忘记其在预训练时学到的通用能力。
② LoRA的核心思想
LoRA的核心思想是对大型模型的权重矩阵进行隐式的低秩转换,即通过一个较低维度的表示来近似表示一个高维矩阵或数据集。具体来说,它在预训练语言模型(PLM)的特定线性层(如自注意力机制中的Q、K、V投影层和前馈网络)旁边,并行地注入一对小的、可训练的低秩分解矩阵,而冻结PLM的原有参数。通过只训练这些低秩矩阵,LoRA能够在显著减少可训练参数的同时,达到与全量微调相媲美的性能。
③ LoRA的原理
LoRA技术冻结预训练模型的权重,并在每个Transformer块中注入可训练层(称为低秩分解矩阵),即在模型的Linear层的旁边增加一个“旁支”A和B。它将权重更新矩阵ΔW
分解为两个低秩矩阵A和B的乘积,即ΔW=A×B
,其中A的维度为d×r
,B的维度为r×d
,r
远小于d
(模型的原始维度)。
矩阵A初始化: 使用随机高斯分布初始化,使其具有一定的初始随机性,促进模型学习。
矩阵B初始化: 初始化为全零矩阵,确保在训练开始时,LoRA模块对模型输出的影响为零,避免对预训练权重产生冲击。
④ LoRA的优势
参数高效: 显著减少了需要训练的参数量,降低了计算和存储成本。
性能优异: 在参数效率与性能之间取得了最佳平衡,成为当前大模型微调的主流方法之一。
避免推理延迟: 相较于Adapter Tuning,LoRA不会引入额外的推理延迟。
避免序列长度限制: 相较于Prefix Tuning,LoRA不会减少用于处理下游任务的序列长度。
多任务一键切换:不同任务训练不同的A/B,使用时像换"插件"一样加载。
不损伤原模型能力:原模型参数冻结,避免全参数微调导致的"知识遗忘”。