Press "Enter" to skip to content

你应该了解的 NLP发展新趋势(实现方法总结)

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

云智慧 AIOps 社区是由云智慧发起,针对运维业务场景,提供算法、算力、数据集整体的服务体系及智能运维业务场景的解决方案交流社区。该社区致力于传播 AIOps 技术,旨在与各行业客户、用户、研究者和开发者们共同解决智能运维行业技术难题,推动 AIOps 技术在企业中落地,建设健康共赢的AIOps 开发者生态。

 

本期我们有幸邀请到南加州大学硕士生、云智慧智能研究院算法实习生蔺同学,为我们介绍 NLP 是如何走向了 prompt 与 adapter,在讲述 prompt 与 adapter 的原理、具体实现方法及优点后,还对它们进行了区分对比。下面让我们一起来学习吧~

 

一、NLP 如何发展走向了 prompt 与 adapter

 

 

模型训练的发展

 

 

NLP(自然语言处理)模型通常用监督学习的方法训练。监督学习指模型仅在标注好的目标任务数据集上进行训练,由于带标记的样本数量不足以支撑模型学习到高质量的潜在特征,早期的 NLP 模型依赖于特征工程。特征工程指人们根据领域先验知识预先定义特征,这些特征帮助模型具有一定程度的归纳偏置(inductive biases),如下图中 a 所示。

 

深度神经网络模型的出现,推动特征学习与模型训练共同进行,因此研究的焦点转移到模型的结构上,模型具有的归纳偏置由其结构决定,例如 RNN 与 CNN 根据归纳偏置的不同,分别适用于文本与图像领域(下图 b)

 

BERT(Bidirectional Encoder Representations from Transformers)的出现,令 NLP 模型的学习方式发生了巨大变化,全监督的方法不再流行,取而代之的方法是预训练(pre-train)与微调(fine-tuning)。

 

预训练是用一个固定的模型结构作为语言模型(Language Model, LM)并进行预训练,训练方式是对句子中的一部分词语进行遮掩(mask)或替换,再用模型预测正确的词语(BERT)。预训练是一种无监督的方法,可直接在没有标注的数据集上训练并建模语言的通用特征。通过预训练得到的语言模型会进一步适配到不同下游任务,根据任务特定的目标函数进行微调。在预训练与微调的方法下,研究的重点转为如何设计一个合理的目标函数,使得模型在预训练阶段和微调阶段能够更好地学习到语言的通用特征(下图 c)。

 

 

 

预训练语言模型的局限性

 

 

尽管在预训练语言模型上以微调的方式适应下游任务,已经是一种非常流行且效果非常好的方法,但是这种方法在微调阶段需要更新并存储所有语言模型的参数。当我们构建并实际使用预训练语言模型的 NLP 系统时,每一个下游任务都需要存储一份原语言模型微调过后的参数。考虑到预训练语言模型的参数都非常大,例如 GPT-2 有 774M 参数,BERT-base 也有 110M 参数,为每个下游任务都保存一个模型将需要不小的空间开销(如下图所示)。

 

 

 

二、prompt 的原理与实现方法

 

受 GPT 模型启发,学者们提出了 prompt 方法,避免不同下游任务都对预训练语言模型中参数进行调整。具体来说,通过对下游任务的输入进行修改形成统一形式的 prompt,prompt 再作为预训练语言模型输入,使得不同下游任务可以共用一个固定不变的参数预训练语言模型。其思路是,通过构建适合下游任务与语言模型的 prompt,尽可能发挥语言模型在预训练过程中学习到的知识。例如,BERT 在预训练过程中学习到的知识是合理补全不完整句子的能力,GPT-3 学习到的知识是根据已有句子进行合理续写的能力。

 

 

下面以一个具体例子来说明 prompt 是如何实现的。如上图所示,当进行情感分类任务时,输入是”I Love Paris”,通过在输入的后面添加”I am ____”构成一个 prompt,再将其输入到预训练语言模型中,因为 prompt 的形式与模型预训练输入的形式相同,这就要求模型完成预训练任务——补全句子或续写句子,这里的 prompt 要求模型选择可能性最大的词(通常是情感类的词,例如 good)补全句子,之后可以根据模型填充的词进一步进行分类。

 

通过选择合适的 prompt,就能控制模型的行为,即控制模型对于可能性最大的词的判断。一个合理的 prompt 是得到正确结果的前提,如下图所示,三种不同的 prompt 虽然语义相似,但是第一个却不能得到正确的结果。通过 prompt,预训练语言模型自身就可以完成下游任务的预测,从而不同下游任务可以共用一个预训练语言模型的参数。

 

 

同时,prompt 还能更好地适应 few-shot(小样本),甚至 zero-shot(零样本)的情况。当我们仅给模型输入以自然语言形式的任务描述和示例时,模型依然可以进行预测,而这一过程没有梯度的更新,如下图所示。

 

 

prompt 虽然在参数共享和 few-shot 方面有着很好的表现,但其在下游任务的表现上较差。对于 SuperGLUE 任务,使用 prompt 方法的 GPT-3 模型得分是 71.8,而参数量仅是其十分之一的 T5-XXL 模型却能取得 89.3 的得分。归根到底,不对预训练语言模型中的参数进行调整只能取得相对不错的成绩,而无法使模型完全学习到不同下游任务。那幺,有没有什幺办法是 prompt 和微调两个方法的折中呢?

 

三、adapter 的原理与实现方法

 

为了在 prompt 与 fine-tuning(微调)方法之间找到一个平衡,adapter 被提了出来。adapter 主要通过在预训练语言模型中添加额外参数的方式适配下游任务,不需要为每一个下游任务都训练一个全新的模型。具体来说,如果我们希望用 BERT 适配一个任务,首先在 BERT 的每一层中添加 adapter,作为特定下游任务的可训练参数,然后将原本 BERT 的参数冻结不进行训练。这样,在具体下游任务微调过程中,只有 adapter 的参数进行了修改,原本属于 BERT 的参数则保持不变。

 

adapter 的结构有很多,最简单的结构由一个下采样层和一个上采样层组成。为了限制参数量,通常下采样的维度很小,如果将模型原本 d 维的特征下采样为 m 维,则每个 adapter 中的参数量为 2md+d+m。如果 m<<d,< span=””>则 adapter 的参数量仅为原模型的 0.5%-8%。我们还可以通过调整 m 的大小,对模型表现和性能进行取舍。

 

 

adapter 的具体形式与添加位置可以有多个变种,这里选择最简单的一种进行介绍。如上图所示,adapter 只包含两层全连接层,首先对输入进行下采样,再对下采样后的数据上采样回原始维度,需要注意的是这里还使用了残差连接。BERT 中每层 transformer encoder 添加两个 adapter,分别位于自注意力机制后面与 FFN(feedforward network)后面。这样就构成了一个包含 adapter 的 BERT 模型,可以用于下游任务的微调了。实验证明,adapter 中的参数非常高效:只需要 adapter 中少量的可训练参数,就可以达到 fine-tuning 方式中训练大量参数的效果,如下图所示。

 

 

adapter 的优势在于,因为只有少量参数被修改,adapter-based tuning 得到的模型参数与原预训练语言模型的参数很相似,避免了适配下游任务过程中的过拟合和泛化性差两个问题。固定原 BERT 的参数还极大的缓解了遗忘问题,实验表明,adapter-based tuning 得到的模型相比于 fine-tuning 得到的模型,每层的输出都更接近于原始 BERT 中对应层的输出,从而更好地规则化(regularization)数据。

 

除了效果好外,adapter-based tuning 过程更加稳定,对学习率的变化不敏感。下图对比了不同学习率下模型最终效果的分布,可以看到 adapter 方法的结果更加稳定,方差更小。

 

 

四、prompt 与 adapter 的区分

 

prompt 与 adapter 的核心都在于将预训练语言模型适配到不同下游任务的同时,尽量减少预训练参数的修改,毕竟预训练语言模型的参数量都非常大。两者的区别主要在于如何改变模型原本的行为。

 

prompt 方式将模型视为一个黑盒,不对模型进行修改,而是通过构建新的输入,将原始输入包含起来作为其子序列,通过模型的自注意力机制改变模型对于原始输入的表示,可以形象的理解为,prompt 不改变模型,而是告诉模型一些额外信息,让模型的行为发生变化。

 

adapter 方式则将模型拆开来,为其添加新的组件,新的组件只针对一个特定的下游任务,而其他部分则可以共享。可以形象的理解为,BERT 是吸尘器的主机,更换不同的吸头就如同更换不同的 adapter,以此实现不同的功能。

 

五、总结

 

虽然 BERT 的出现开启了 NLP 的新时代,但巨大的参数量使其难以扩展到不同的下游任务。在这样的背景下,prompt 与 adapter 的出现了顺应发展的要求,同时,prompt 还展现了预训练语言模型的惊人潜力,极有可能成为后 BERT 时代一个新的发展方向。

 

开源福利

 

云智慧已开源数据可视化编排平台 FlyFish 。通过配置数据模型为用户提供上百种可视化图形组件,零编码即可实现符合自己业务需求的炫酷可视化大屏。 同时,飞鱼也提供了灵活的拓展能力,支持组件开发、自定义函数与全局事件等配置, 面向复杂需求场景能够保证高效开发与交付。

 

点击下方地址链接,欢迎大家给 FlyFish 点赞送 Star。参与组件开发,更有万元现金等你来拿。

 

GitHub 地址: https://github.com/CloudWise-OpenSource/FlyFish

 

Gitee 地址: https://gitee.com/CloudWise/fly-fish

 

万元现金福利: http://bbs.aiops.cloudwise.com/t/Activity

 

Be First to Comment

发表评论

您的电子邮箱地址不会被公开。