This is my reading note for [ICLR 2019] Parameter-Efficient Transfer Learning for NLP.
Abstract
微调大型预训练模型是 NLP 中一种有效的传输机制。 但是如果下游任务太多,就不可能给每一个任务都 fine-tune 再存参数(效率太低了!)这篇论文给出了另外的方案:加一个 adapter 模块。换下游任务的时候只需要调 adapter 里面的参数就可以了,而不是把整个模型里面的参数全给调了。
Adapter modules yield a compact and extensible model; they add only a few trainable parameters per task, and new tasks can be added without revisiting previous ones. The parameters of the original network remain fixed, yielding a high degree of parameter sharing.
we transfer the recently proposed BERT Transformer model to 26 diverse text classification tasks, including the GLUE benchmark.
作者用 BERT 做了 26 个下游任务,跑了 GLUE BENCHMARK.
Adapters attain near state-of-the-art performance, whilst adding only a few parameters per task. On GLUE, we attain within 0.4% of the performance of full fine-tuning, adding only 3.6% parameters per task. By contrast, fine-tuning trains 100% of the parameters per task.
Adapters 基本上靠近 SOTA 了,同时只加了一丢丢参数。GLUE 跑分在 full fine-tuning 的0.4%以内,但只加了 3.6%参数。 full fine-tuning 肯定是每次都要把参数全 train 掉的。
补课:啥是 fine-tuning?https://www.zhihu.com/question/40850491
Introduction
-
从预训练模型的迁移在许多 NLP 任务上产生了强大的性能
-
BERT 是一种在具有无监督损失的大型文本语料库上训练的 Transformer 网络,在文本分类和抽取式问答方面取得了SOTA性能
-
在本文中,我们讨论了在线设置,其中任务以流的形式到达。
-
目标是建立一个在所有这些方面都表现良好的系统,但无需为每项新任务训练一个全新的模型。
-
任务之间的高度共享对于云服务等应用程序特别有用,在这些应用程序中,需要训练模型来解决客户按顺序到达的许多任务。 为此,我们提出了一种迁移学习策略,可以产生紧凑且可扩展的下游模型。
-
紧凑模型的意思就是多任务处理的时候换任务只需要换一点参数就可以解决新的task。
-
可扩展模型是那种可以逐步训练来解决新任务的模型,不会忘记以前的任务。
我们的方法在不牺牲性能的情况下产出这样的模型。
-
NLP 中最常见的两种迁移学习技术是基于特征的迁移和微调。 相反,我们提出了一种基于adapter模块的替代传输方法。 基于特征的迁移涉及预训练实值嵌入向量。 这些嵌入可能位于单词、句子或段落级别。 然后将嵌入馈送到自定义下游模型。 微调包括从预先训练的网络复制权重并在下游任务上调整它们。 最近的工作表明,微调通常比基于特征的迁移更好。
基于特征的迁移和微调都需要为每个任务设置一组新的权重。 如果网络的较低层在任务之间共享,则微调的参数效率更高。 然而,我们提出的适配器调整方法的参数效率更高。 图 1 展示了这种权衡。 x 轴显示每个任务训练的参数数量; 这对应于解决每个额外任务所需的模型大小的边际增加。
从这个图上可以看到效果:基于适配器的调优比 fine-tuning 训练少两个数量级的参数,同时性能差不多。
Adapters 是加在 pre-trained network 层间的模块。
Adapter 和 feature-based fine-tuning 的不同
- Feature-based 需要弄一个 new function\(χ_v\). fine-tuning 时需要训练原参数w.
- adapter tuning 只需要 tune v 就可以了
Adapter-based tuning relates to multi-task and continual learning.
- Multi-task 可以产生紧凑模型
- Multi-task 需要同时访问所有任务(为什么?)而 adapter-based tuning 不需要。
- continual learning systems 目标是从一个无限长的任务流中学习。(挑战:网络在 retrain 之后会忘记之前的任务)
- adapter-based:任务之间不交互(只有 adapter 部分的参数不一样)其他的共享参数是冻结的。->这意味着该模型使用少量特定于任务的参数对先前的任务具有完美的记忆。
Adapter tuning for NLP
-
We present a strategy for tuning a large text model on several downstream tasks.
-
Our strategy has three key properties:
-
it attains good performance
-
it permits training on tasks sequentially, that is, it does not require simultaneous access to all datasets
-
it adds only a small number of additional parameters per task.
-
These properties are especially useful in the context of cloud services, where many models need to be trained on a series of downstream tasks, so a high degree of sharing is desirable.
为了实现这个特性,我们提出了一个 bottleneck adapter module. 用 adapter 做 tuning 需要向模型里放一点新参数,这些新参数在下游任务里面训练。
在对深度网络进行 vanilla 微调时,会对网络的顶层进行修改。
这是必需的,因为上游和下游任务的标签空间和损失不同。
adapter module 执行更通用的架构修改,以将预先训练的网络重新用于下游任务。 具体来说呢,adapter module 调整涉及将新层注入原始网络。 原始网络的权重保持不变,而新的adapter module层的权重是随机初始化的。正常 fine-tuning中,新的顶层和原始权重是共同训练的。 而在adapter module调整中,原始网络的参数被冻结,因此可能被许多任务共享。
Adapter Module 的两个特点:参数少和 near-identity initialization。
Adapter Module 需要做得很小,这样总模型大小随着 task 增多不会增加太快。
near-identity initialization 是为了模型魔改后还能稳定训练,同时训练开始的时候原网络不受影响。训练的时候 adapter 才会被激活,进而影响整个网络的激活分布。如果你用不到 adapter 也可以直接 ignore 它们。(感觉有点像 plug-in)
在第 3.6 节中,我们观察到一些特定的adapter对网络的影响比其他adapter更大。 我们还观察到,如果初始化偏离恒等函数太远,模型可能无法训练。
Instantiation for Transformer Networks
我们在 text Transformers 上操作一下 adapter-based tuning. Transformers 在很多领域都是 SOTA 级别。
这篇论文在 2017 年的 standard Transformer 上做了实例化(我 blog 中那个)。
adapter 的架构很多,这篇论文弄了一个比较简单的设计,还试了下更复杂的设计,但最后实验发现效果都差不多。
上图就是我们的 adapter 架构,和加了 adapter 的 transformer 架构。
Transformer 的每一层都包含两个主要的子层:注意力层和前馈层。 两个层后面紧跟着一个投影,将特征大小映射回层输入的大小。
-
跳过连接(skip-connection)应用于每个子层。
-
每个子层的输出被送入Layer Norm。
-
我们在每个子层之后插入两个串行adapter。
-
适配器总是直接应用于子层的输出,在投影回输入大小之后,但在添加回跳跃连接之前。 然后将适配器的输出直接传递到下一层规范化。
看下 Figure 2 的右边部分。为了限制参数的数量,我们提出了一个瓶颈架构。 adapter 首先将原始 d 维特征投影到较小的维度 m,应用非线性(nonlinearity),然后再投影回 d 维度。 每层添加的参数总数(包括偏差)为 2md + d + m(这玩意咋算的?)。 通过设置 m«d,我们限制了每个任务添加的参数数量; 在实践中,我们使用了大约 0.5 - 8% 的原始模型参数。 瓶颈维度 m 提供了一种简单的方法来权衡性能与参数效率。 adapter 模块本身在内部具有跳过连接。 使用跳跃连接,如果投影层的参数被初始化为接近零,则模块被初始化为近似恒等函数。
除了适配器模块中的层,我们还为每个任务训练新的层规范化参数。 这种技术类似于条件批量标准化 (De Vries et al., 2017)、FiLM (Perez et al., 2018) 和自调制 (Chen et al., 2019),也产生了参数有效适应 一个网络; 每层只有 2d 个参数。 然而,单独训练层归一化参数不足以获得良好的性能,请参见第 3.4 节。
Experiments
下面展示 Adapter 做到了在文本任务上 parameter efficient transfer.
Reference
NLP|谈谈预训练模型中的Adapter结构:https://codewithzichao.github.io/2020/07/02/NLP-%E8%B0%88%E8%B0%88BERT%E4%B8%AD%E7%9A%84Adapter%E7%BB%93%E6%9E%84/
NLP的“第四范式”之Prompt Learning总结:44篇论文逐一梳理:https://blog.csdn.net/c9Yv2cf9I06K2A9E/article/details/120944308
Parameter-Efficient Transfer Learning for NLP *2:https://zhuanlan.zhihu.com/p/261298193
论文笔记 - NLP 预训练模型综述: https://zhuanlan.zhihu.com/p/139015428
Further Reading
论文阅读 | Pre-trained Models for Natural Language Processing: A Survey:https://www.cnblogs.com/shona/p/12546820.html