大规模语言模型高效参数微调--P-Tuning 微调系列

P-Tuning

该方法的提出主要是为了解决这样一个问题:大模型的 Prompt 构造方式严重影响下游任务的效果。比如:GPT-3 采用人工构造的模版来做上下文学习(in context learning),但人工设计的模版的变化特别敏感,加一个词或 者少一个词, 或者变动位置都会造成比较大的变化。同时, 近来的自动化搜索模版工作成本也比较高, 以前这种 离散化的 token 的搜索出来的结果可能并不是最优的, 导致性能不稳定。于是, P-Tuning (论文:GPT Understands, Too) 设计了一种连续可微的 virtual token (同 Prefix-Tuning 类似),成功地实现了模版的自动构建。不仅如此, 借 助 P-tuning ,GPT 在 SuperGLUE 上的成绩首次超过了同等级别的 BERT 模型, 这颠覆了一直以来“GPT 不擅长 NLU”的结论,也是该论文命名的缘由。

P-Tuning 将 Prompt 转换为可以学习的 Embedding 层, 并用 MLP+LSTM 的方式来对 Prompt Embedding 进行 一层处理。相比 Prefix Tuning,P-Tuning 加入的可微的virtual token,但仅限于输入层, 没有在每一层都加;另外, virtual token 的位置也不一定是前缀, 插入的位置是可选的。这里的出发点实际是把传统人工设计模版中的真实 token 替换成可微的 virtual token。

大规模语言模型高效参数微调--P-Tuning 微调系列_第1张图片

在左图中, 提示生成器仅接收离散奖励;相反, 在右图中, 伪提示 (pseudo prompts) 和提示编码器可以 以可微分的方式进行优化。

在一般场景下, 给定一个 token 序列, 通过随机 MASK 若干个 token,并进行自监督训练, 预测 MASK 部 分的词;在预测阶段(例如分类), 则输入的是整个文本序列, 预测 [CLS] 对应的类别。如果在 prompt-based 场 景下, 则通常将下游任务转化为 Mask Language Model 任务, 因此此时不需要引入额外的参数, 但需要明确一个 prompt 模板。作者认为一个模板 T 就可以表示为一个 token 序列:

其中 x 表示一个input text ,y 表示真实标签(或对应的词,输入时被替换为 [MASK])。

传统的使用离散的 prompt 搜索方法是直接将模板 T 的每个 token 映射为对应的 embedding,然后为整个模 板生成一个得分。而在 P-tuning 中, 则将模板中的 Pi 映射为一个可训练的参数 hi ,此时这部分的 token 则称为 pseudo token (有的工作也叫做 soft-prompt、virtual token 等)。在优化过程中, 认为这部分 pseudo token 也存在序 列关系, 因此使用双向 LSTM 对模板 T 中的 pseudo token 序列进行表征, 则可以使用梯度下降法更新连续的参 数。

P-tuning 的具体代码细节可以简单描述为:

  • 输入一个句子,以及预先设计的一个离散的模板:The Disney film is good! It was [MASK].; 先使用 BERT 的分词工具分词,并获得 input ids 、position ids 、attention masks 等;

  • 对输入的 template 中, 挑选一个(或多个) token 作为 pseudo token :The Disney film is good! [pseudo] was [MASK]. 其初始化可以直接使用原本的 token embedding;

  • 对所有的 pseudo token Pi ,喂入一层 LSTM,并获得每个 pseudo token 输出的隐状态向量 hi ;

  • 将整个句子喂入 BERT embedding layer,对于 pseudo token 部分的 token embedding,则使用 hi 进行替换,最后喂入 MLM 中获得 [MASK] 位置的预测结果。

其中 ContinuousPrompt 的 pytorch 的代码如下:

大规模语言模型高效参数微调--P-Tuning 微调系列_第2张图片

P-Tuning v2

P-Tuning 等方法存在几个主要的问题:

  • 缺乏规模通用性:Prompt Tuning 论文中表明当模型规模超过 100 亿个参数时, 提示优化可以与全量微调相 媲美。但是对于那些较小的模型(从 100M 到 1B),提示优化和全量微调的表现有很大差异, 这大大限制 了提示优化的适用性。

  • 缺乏任务普遍性:尽管 Prompt Tuning 和 P-tuning 在一些 NLU 基准测试中表现出优势, 但提示调优对硬序 列标记任务(即序列标注)的有效性尚未得到验证。

  • 缺少深度提示优化: 在 Prompt Tuning 和 P-tuning 中,连续提示只被插入 transformer 第一层的输入 embedding 序列中, 在接下来的 transformer 层中, 插入连续提示的位置的 embedding 是由之前的 transformer 层计算出 来的, 这些会带来优化挑战, 因为序列长度的限制, 导致可调参数的数量是有限的;同时, 输入 embedding 对模型预测只有相对间接的影响。

论文P-Tuning v2: Prompt Tuning Can Be Comparable to Fine tuning Universally Across Scales and Tasks中,利用深度提示优化,对 Prompt Tuning 和 P-Tuning 进行改进,作为一个跨规模和 NLU 任务的通用解决方案,该方法在每一层都加入了 Prompts tokens 作为输入,而不是仅仅加在输入层,这带来两个方面的好处:

  • 更多可学习的参数(从 P-tuning 和 Prompt Tuning 的 0.01% 增加到 0. 1%-3%),同时也足够参数高效。

  • 加入到更深层结构中的 Prompt 能给模型预测带来更直接的影响。

大规模语言模型高效参数微调--P-Tuning 微调系列_第3张图片

从 P Tuning 到P Tuning v2 ,图中橙色块表示可训练的提示向量,蓝色块表示冻结的预训练模型参数。

P-Tuning V2具体做法基本同 Prefix Tuning,可以看作是将文本生成的 Prefix Tuning 技术适配到NLU 任务中, 然后做了 一些改进:

移除重参数化的编码器。以前的方法利用重参数化功能来提高训练速度和鲁棒性(如:Prefix Tuning 中的 MLP 、P-Tuning 中的 LSTM)。在 P-tuning v2 中, 作者发现重参数化的改进很小, 尤其是对于较小的模型, 同时还会影响模型的表现。

  • 针对不同任务采用不同的提示长度。提示长度在提示优化方法的超参数搜索中起着核心作用。在实验中, 我们发现不同的理解任务通常用不同的提示长度来实现其最佳性能, 这与 Prefix-Tuning 中的发现一致, 不 同的文本生成任务可能有不同的最佳提示长度。

  • 引入多任务学习。先在多任务的 Prompt 上进行预训练, 然后再适配下游任务。多任务学习对我们的方法来 说是可选的, 但可能是相当有帮助的。一方面, 连续提示的随机惯性给优化带来了困难, 这可以通过更多 的训练数据或与任务相关的无监督预训练来缓解;另一方面, 连续提示是跨任务和数据集的特定任务知识 的完美载体。我们的实验表明,在一些困难的序列任务中,多任务学习可以作为 P-tuning v2 的有益补充。

  • 回归传统的分类标签范式, 而不是映射器。标签词映射器(Label Word Verbalizer) 一直是提示优化的核心 组成部分, 它将 one-hot 类标签变成有意义的词, 以利用预训练语言模型头。尽管它在 few-shot 设置中具 有潜在的必要性, 但在全数据监督设置中, Verbalizer 并不是必须的。它阻碍了提示调优在我们需要无实际 意义的标签和句子嵌入的场景中的应用。因此, P-Tuning v2 回归传统的 CLS 标签分类范式, 采用随机初 始化的分类头(Classification Head)应用于 tokens 之上,以增强通用性,可以适配到序列标注任务。

为了获得连续 prompt,设计了 PrefixEncoder 模块, 下面是 pytorch 的代码实现示例:

大规模语言模型高效参数微调--P-Tuning 微调系列_第4张图片

两种微调方式对比

本文针对讲述了来自清华大学的团队发布的两种参数高效 Prompt 微调方法 P-Tuning 、P-Tuning v2,可以简 单的将 P-Tuning 认为是针对 Prompt Tuning 的改进, P-Tuning v2 认为是针对 Prefix Tuning 的改进。

大规模语言模型高效参数微调--P-Tuning 微调系列_第5张图片

PLM 模块代表了一个特定的 PLM 子层, 例如注意力或 FFN,图中橙色块表示可训练的提示向量, 蓝色 块表示冻结的预训练模型参数。

ps: 欢迎扫码关注公众号^_^.

大规模语言模型高效参数微调--P-Tuning 微调系列_第6张图片

你可能感兴趣的:(大语言模型,机器学习,人工智能,深度学习)