这些天冲浪 🏄 了一下 Arxiv,粗翻了一下二月之后 public 的 NLP 文章(有很大一部分是准备投 ICML 的)。
也拜读了 张驰原 dalao 的新作《Exploring the Memorization-Generalization Continuum in Deep Learning》. (实验真的做的很漂亮,但感觉有点 data-special 不知道能不能推广到 NLP)
今天来讨论一下段楠老师和周明老师的这篇《K-Adapter: Infusing Knowledge into Pre-Trained Models with Adapters》
Adapter
为了讲清楚这篇文章,我们先来看下什么是 Adapter
Parameter-Efficient Transfer Learning for NLP. ICML 2019.
Motivation
在这个 large pre-trained 模型盛行的时代,Fine-tune 可谓是再正常不过的操作。
但实际上 Fine-tune 是一个代价很大的操作,虽然它一般能带来很好的效果。
试想一下,虽然我们用了 Adam 来随机采样一些 train data 来估计全局的梯度,用了很小的 lr.
但实际上在每一个 batch 中,对于庞大的预训练模型的每一个参数我们都需要更新.
每一个 epoch, 还得存储所有被更新的参数, 完全没有复用性, 这是很低效的。
对于低资源的移动端或者高用户特异性的服务提供商 Pass, 这个问题尤为突出。
除了这一点之外:
- Cloud Service (Pass)
- 使用 Multi-task 来 fine-tune 时, 如果增加新的任务,则需要重新训练过所有之前的子任务(需要相应的数据).
- 而使用 连续学习则会在 re-training 的时候遗忘之前学到的知识.
- 希望能在尽可能减少参数的情况下, 提高性能,接近 Multi-task 的结果.
Detail
于是一个很直观的想法, 能不能把最后的 task-special layer 放到模型中间,然后冻住预训练模型参数.
- 每一个 Transformer 结构都有两个 Adapter 模块, 嵌在 LN 之前. 12 × 2
- 预训练的 Bert 参数固定(Attention, FFN, 除了 Layer Normalization 参数不固定)
- 每个 Adapter 由两个 FFN, 一个非线性函数组成, 和一个残差连接组成.
- 残差连接用于保证参数随机初始化时,模型输出与预训练模型输出一致.
- 这样一个 Adapter 模型需要 (dm+m) + (dm+d)参数
- 而因为 LN 输入发生了较大的变化,在这里对 LN 的参数也进行 fine-tune, 实际上这部分参数量很小( y = x − E [ x ] V a r [ x ] + ϵ ∗ γ + β y=\frac{x - \mathrm{E}[x]}{ \sqrt{\mathrm{Var}[x] &#