背景
1 本质是大模型训练/调优成本过高,才有了高效微调
2 通过in-context learning就能取得不错的成果,为什么还要微调——Hard Prompt
2.1 早期,各种尝试,总结最优实践
2.2 后期,提示词模板化
随着模型的变化,Prompt也会有变化
2.3 Prompt Template for AutoGPT:Made by LangChain
完成复杂任务
- 基于指令选择不同的模型
- 将指令拆解成多个子任务,拆解后检查小任务是否完成
-
100~200行代码
Bert(2018)
主要方案,上游预训练,下游微调
问题:预训练和微调都需要加载全部参数,需要大量GPU,训练成本高;寻人网需要重新微调
Adatper Tuning:PEFT (Parameter-Efficient Transfer Learning for NLP)
摘要:在自然语言处理(NLP)中,使用预训练模型进行微调是一种有效的迁移学习方法。然而,这种方法在面对大量下游任务时,参数效率低下,因为每个任务都需要全新的模型。为此,本文提出了一种名为adapter的模块化方法。Adapter模块能够生成紧凑且可扩展的模型,每个任务只需要增加少量可训练参数,而且新任务可以无需重新训练已存在的任务。原始网络的参数保持不变,实现了高度的参数共享。为了验证adapter的有效性,我们将最近提出的BERT Transformer模型应用于26个不同的文本分类任务,包括GLUE基准测试。结果显示,使用adapter可以达到接近最佳的性能,同时每个任务只增加了少量参数。在GLUE基准测试中,adapter的性能与完全微调的模型相差仅0.4%,而参数增加量仅为每个任务的3.6%。相比之下,微调则需要为每个任务训练100%的参数。综上所述,adapter是一种高效的迁移学习方法,可以应用于在线任务流,避免为每个新任务训练全新的模型。这种方法通过参数共享和少量可训练参数的增加,实现了高性能的迁移学习。
1 对每个Transformer进行改造,增加两个Adapter
2 使用skip-connection,(能够解决梯度消失),保证模型能力不退化,兜底
3 Adapter学习降维后的特征
4 需要加载整个模型,将模型都放到显存里面
Adapter Tuning实验结果:
Prefix Tuning(2021)
目标还是降低成本
1 Fine-tuning是全部参数调试,Prefix-tuning只调试Prefix模块
2 不需要加载全部参数,大模型可以被微调了
3 Prefix 是一个小的网络
4 Prefix 训练有难度
5 在不同场景效果都不错,摘要生成,表格识别等
6 Prefix在哪些层也要设计和调试
Prompt Tuning(2021)
1 Prefix Tuning的简化版本
2 还是简化成本
3 独立一个外部模型
4 不同的任务可以放在一起微调
5
P-Tuning v1(2021)
将Prompt转换为可学习的Embedding Layer
近年来,预训练语言模型(PLM)在自然语言理解(NLU)领域取得了显著进展。PLM通过不同的预训练目标,如掩码语言建模、自回归语言建模、seq2seq和排列语言建模进行训练。PLM的性能可以通过提示(prompting)进一步增强。提示利用手动编写的提示模式作为语言模型的额外输入,使PLM在小型标注数据集上微调或在下游任务上进行直接推理。然而,初步研究表明,手动离散提示可能导致性能不稳定,例如更改提示中的单个单词可能会导致性能大幅下降。为了解决这一问题,我们提出了新颖的P-Tuning方法。P-Tuning采用可训练的连续提示嵌入与离散提示进行连接。实验表明,P-Tuning不仅通过最小化不同离散提示之间的差距来稳定训练,而且在LAMA和SuperGLUE等广泛的NLU任务上实现了显著的性能提升。P-Tuning对冻结和调用的语言模型都有效,适用于完全监督和少量样本设置。我们的方法提供了一种通用的框架,可用于各种不同的预训练语言模型和任务。此外,P-Tuning可以轻松地集成到现有的自然语言处理工具中,以加速研究和开发过程。
P-tuning是一种改进预训练语言模型的方法,通过使用连续的prompt嵌入与离散的prompt进行连接,以提高模型在自然语言理解任务上的性能和稳定性。这种方法的主要思想是通过训练prompt嵌入来最小化不同离散prompt之间的性能差距,从而稳定训练过程并提高性能。P-tuning在各种自然语言理解任务上表现出了显著的效果
1 P-Tuning直接对嵌入层进行优化,调Embedding层的模型参数
2 将原有的Prompt提示信息,通过Encoder转换为Embendding的一部分;
3 在知识探测类任务中效果好
伪提示(P-Tuning)是一种使用连续提示嵌入的方法,旨在改进和稳定模型的表现。以下是伪提示的一个例子:
题目:英国的首都是什么?
提示:在给定的上下文中(蓝色区域,“英国”),目标是填写(红色区域,"[MASK]")。在图2(a)中,提示生成器只接收离散的奖励。相反,在图2(b)中,连续的提示嵌入和提示编码器可以通过可微分的方式进行优化。
在这个例子中,伪提示是通过将任务重新表述为填充空白的方式,将标注的数据(包括输入x和标签y)组织成一系列文本令牌。例如,一个可能的提示模板是"The capital of [D0] is [MASK]",其中[D0]是一个离散的提示令牌,用于指示问题的上下文。通过这种方式,可以将任务转换为一种可微分的格式,使得模型的表现可以通过反向传播进行优化。
然而,离散提示令牌往往非常不稳定,这可能会导致模型的表现下降。因此,伪提示使用连续的提示嵌入来改善和稳定模型的表现。通过将提示嵌入到模型中,可以使得模型能够更好地理解和生成文本,从而提高模型的性能。
作者认为直接通过虚拟token引入prompt存在两个问题:
离散性:如果用预训练词表的embedding初始化,经过预训练的词在空间分布上较稀疏,微调的幅度有限,容易陷入局部最优。这里到底是局部最优还是有效信息prior其实很难分清
整体性:多个token的连续prompt应该相互依赖作为一个整体
针对这两个问题,作者使用双向LSTM+2层MLP来对prompt进行表征, 这样LSTM的结构提高prompt的整体性,Relu激活函数的MLP提高离散型。这样更新prompt就是对应更新整个lstm+MLP部分的Prompt Encoder。下面是p-tuning和离散prompt的对比
相比Prefix Tuning,P-Tuning加入的可微virtual token,但仅限于输入层,没有在每一层都加;另外,virtual token的位置也不一定是前缀,插入的位置是可选的。这里的出发点实际是把传统人工设计模版中的真实token替换成可微的virtual token。
参考:http://lihuaxi.xjx100.cn/news/1450561.html?action=onClick
P-tuning v2
之前提到的Prompt Tuning,是只冻结大语言模型的参数来优化连续Prompts,这样可以大大减少每个任务的存储和训练时的内存使用,但是Prompt Tuning论文中表明当模型规模超过100亿个参数时,提示优化可以与全量微调相媲美。但是对于那些较小的模型(从100M到1B),提示优化和全量微调的表现有很大差异,这大大限制了提示优化的适用性。虽然在GLUE和SuperGLUE 基准测试上表现出一定的优势,然而在较难的硬序列标记任务(即序列标注)的有效性尚未得到验证。
基于此,作者提出了P-tuning v2,它利用深度提示优化(如:Prefix Tuning),对Prompt Tuning和P-Tuning进行改进,作为一个跨规模和NLU任务的通用解决方案。
与P-tuning相比,该方法在每一层都加入了Prompts tokens作为输入,而不是仅仅加在输入层,这带来两个方面的好处:
- 更多可学习的参数(从P-tuning和Prompt Tuning的0.01%增加到0.1%-3%),同时也足够参数高效。
- 加入到更深层结构中的Prompt能给模型预测带来更直接的影响。