Prompt-Tuning方法

发布于:2025-04-14 ⋅ 阅读:(26) ⋅ 点赞:(0)

Fine-Tuning

Fine-Tuning属于一种迁移学习方式,在自然语言处理(NLP)中,Fine-Tuning是用于将预训练的语言模型适应于特定任务或领域。Fine-Tuning的基本思想是采用已经在大量文本上进行训练的预训练语言模型,然后在小规模的任务特定文本上继续训练它。

“I like the Disney films very much.”

如果对此进行一个情感判断,Fine-Tuning就要

  1. 把句子喂进 BERT 模型;
  2. 拿出 [CLS] 位置的向量表示;
  3. 接个分类器(比如 MLP)去判断是“positive”还是“negative”;
  4. 用很多带标签的数据去训练整个模型或最后几层。

从中我们可以发现Fine-Tuning需要额外加分类器,要微调很多参数,训练成本高,使用prompt-Tuning可以解决这个问题,

prompt-Tuning

基于Fine-Tuning的方法是让预训练模型去迁就下游任务,而基于Prompt-Tuning的方法可以让下游任务去迁就预训练模型, 其目的是将Fine-tuning的下游任务目标转换为Pre-training的任务。

我们不加分类器,只动模型最擅长的“填空”技能,步骤如下:
还是那这个例子

步骤1:构建模板(Template)

我们把原句子“包装”成一个带空格的填空题,比如:

It was [MASK].
然后再把它拼到原句后面:
[CLS] I like the Disney films very much. [SEP] It was [MASK]. [SEP]
模型看到这个句子时会觉得:“啊!我又要做我熟悉的任务了——填空。

步骤2:标签词映射(Verbalizer)

填空题填什么?我们设定好几个可选答案,比如:
填 “great” → 我们就认为是 positive
填 “terrible” → 我们就认为是 negative
这个“把词映射成分类”的过程叫 Verbalizer。
🔁 相当于说:填空题里填的词 → 映射成标签

步骤3:训练

我们不需要再加分类器了,只让模型微调一下它最后的“填空预测”部分(MLM Head),比如它预测 [MASK] 的词是哪个词的概率更大。
这样:
参数动得很少(避免过拟合);
效果依旧不错(因为模型一直在做自己最擅长的事);
数据少也能训(只改输入模板,不改结构)。

超大规模参数模型Prompt-Tuning方法

上下文学习方法的应用(In-Context Learning)

旨在从训练集中挑选少量的标注样本,设计任务相关的指令形成
提示模板,用于指导测试样本生成相应的结果.
在这里插入图片描述

指令学习方法的应用(Instruction-Tuning)

其实Prompt-Tuning本质上是对下游任务的指令,简单的来说:就是告诉模型需要做什么任务,输出什么内容. 上文我们提及到的离散或连续的模板,本质上就是一种对任务的提示.因此, 在对大规模模型进行微调时, 可以为各种类型的任务定义指令, 并进行训练,来提高模型对不同任务的泛化能力.

Prompt- tuning VS Instruction-tuning
在这里插入图片描述
Prompt为第一种模式,Instruction为第二种. 很明显:做判别比做生成更容易

Instruct-Tuning的形式(以电影评论二分类举例):

在对电影评论进行二分类的时候,最简单的提示模板(Prompt)是“. It was
[mask].”,但是其并没有突出该任务的具体特性,我们可以为其设计一个能够突出该任务特性的模板(加上Instruction),例如“The
movie review is . It was
[mask].”,然后根据mask位置的输出结果通过Verbalizer映射到具体的标签上。这一类具备任务特性的模板可以称之为指令Instruction

模板设计(任务指令式):

这是一条关于电影的评论,请判断其情感倾向是正面还是负面。评论内容如下:“{评论}”。总体评价是[MASK]。

示例样本 
原始评论:特效不错,但是剧情很拉胯,看到一半就想退出了。
Prompt:这是一条关于电影的评论,请判断其情感倾向是正面还是负面。评论内容如下:"特效不错,但是剧情很拉胯,看到一半就想退出了。"。总体评价是[MASK]。
Verbalizer(可以更细化):
	“好” → 正面
	“一般” / “还行” → 中性(可选扩展)
	“差” → 负面
总结

Instruction-Tuning 就是:用自然语言的“任务指令 + 输入 + 问题”去微调模型,让它能根据这些不同模板理解任务目的,并正确作答。为了提高泛化能力,我们给每个任务设计多个语言风格的模板。
在这里插入图片描述
template1
这是自然语言问句式,非常直观。

<前提>
Based on the paragraph above, can we conclude that <假设>?
Options: yes / no

template2
更像考试题的风格。

<前提>
Can we infer the following:
<假设>
Options: yes / no

template3
更完整清晰,适合模型理解。

Read the following and determine if the hypothesis can be inferred from the premise:
Premise: <前提>
Hypothesis: <假设>
Options: yes / no

思维链方法的实现(Chain-of-Thought)

思维链(CoT)是一种改进的提示策略,用于提高LLM 在复杂推理任务中的性能,如算术推理、常识推理和符号推理。
思维链是一种离散式提示学习,更具体地,大模型下的上下文学习(即不进行训练,将例子添加到当前样本输入的前面,让模型一次输入这些文本进行输出完成任务),相比于之前传统的上下文学习(即通过x1,y1,x2,y2,…xtest作为输入来让大模型补全输出ytest),思维链多了中间的推导提示.

Chain-of-Thought理解

求解一个数学题为例, 理解cof思想:

**prompt**
问:罗杰有5个网球。他又买了两盒网球,每盒有3个网球他现在有多少网球?
答:罗杰一开始有5个网球,2盒3个网球,一共就是2*3=6个网球。5+6=11。答案是11。
问:食堂有 23 个苹果,如果他们用掉 20个后又买了6个。
他们现在有多少个苹果?
**outputp**
答:食堂原来有 23 个苹果,他们用掉 20个,所以还有23-20=3个。他们又买了6个,所以现在有6+3=9个。答案是9

Chain-of-Thought分类

在这里插入图片描述

PEFT大模型参数高效微调方法原理

PEFT方法分类:

  1. Prefix/Prompt-Tuning
    在模型的输入或隐层添加k个额外可训练的前缀伪tokens,只训练
    这些前缀参数
  2. Adapter-Tuning
    将较小的神经网络层或模块插入预训练模型的每一层,这些新插入
    的神经模块称为adapter(适配器),下游任务微调时也只训练这
    些适配器参数.
  3. LoRA
    通过学习小参数的低秩矩阵来近似模型权重矩阵W的参数更
    新,训练时只优化低秩矩阵参数

LoRA方法是目前最通用、同时也是效果最好的微调方法之一

LoRA

低秩适应(Low-Rank Adaptation)是一种参数高效的微调技术,其核心思想是对大型模型的权重矩阵进行隐式的低秩转换,也就是:通过一个较低维度的表示来近似表示一个高维矩阵或数据集.

LoRA 原理

在这里插入图片描述

LoRA 伪代码实现
input_dim = 768 # 例如,预训练模型的隐藏大小
output_dim = 768 # 例如,层的输出大小
rank = 8 # 低秩适应的等级'r'
 W = ... # 来自预训练网络的权重,形状为input_dim x output_dim
 W_A = nn.Parameter(torch.empty(input_dim, rank)) # LoRA权重A
 W_B = nn.Parameter(torch.empty(rank, output_dim)) # LoRA权重B初始化LoRA权重
nn.init.kaiming_uniform_(W_A, a=math.sqrt(5))
 nn.init.zeros_(W_B)
 def regular_forward_matmul(x, W):
 h = x @ W
 return h
 def lora_forward_matmul(x, W, W_A, W_B):
 h = x @ W # 常规矩阵乘法
h += x @ (W_A @ W_B) * alpha # 使用缩放的LoRA权重,alpha缩放因子
return h

网站公告

今日签到

点亮在社区的每一天
去签到