今天分享一篇 delta tuning 方向的经典论文 Adpter tuning,是一篇比较早的工作,2019 年的 ICML。
作者来自 Google Research 和 Jagiellonian University。
Introduction
作者在标题里用的说法是 parameter-efficient,这个词语碰瓷的是 fine-tune 方法。当时 BERT 刚出不久,基本统治了 NLP 所有任务。然后 pretrain + fine-tune 的 manner 是主流的思路,但这个作者发现:
- fine-tune 需要调整所有的参数,对于 N 个任务,最后要存储
的参数,对于云服务器很不友好。 - fine-tune 需要调整所有参数,对于算力的需求也比较大。
作者想要寻找有没有比 fine-tune 更好的方法,做到:
- 在下游任务有良好的表现
- 对于多个任务不用同时需求所有数据集 (这个是对比一般的 transfer 方法, 对于多个任务的一般 embedding 需要同时需求所有任务的训练集)
- 对于每个任务,不需要很多的参数
作者想到了 adpter tuning 的方法,只用多训练大约 3% 的参数,就能在 GLUE benchmark 达到正常 BERT 的 99% 的水平,可以说是非常 parameter-efficient 了
方法
adpter 的作用和优势很多,方法却非常的简单。在这里,作者一般性的考虑了 transformer block
对于一般的 transformer block 一般是前面是一个 self-attention/cross-attention,加一个 feed-forward,然后是一个残差链接,接着一个 layerNorm,再接一个 feed-forward,然后是一个残差链接,接 layerNorm
作者在这个过程中间插入了一些小的 adpter 层,在训练中只有绿色的部分是可训练的,别的部分的参数被锁定 (BERT 的预训练参数)
实现中和设计中有几个很重要的细节:
- 插入的 adpter 层在 feed-forward 后面,在残差链接前面,因此不影响 transformer block 残差链接在深度上的的效果
- adpter 层本身是含有 skip-connection 的,因此全 0 初始化的 adpter 层对 transformer block 来说相当于不变。这一点很重要,因为训练的初期模型相当于和原模型保持一致,对训练的稳定性非常重要。
- 作者在训练中让 transformer bolck 的 layerNorm 层是不锁参的 (用的 pair-wise muliply norm),这样的好处是
对于 adpter 层来说,为了减小参数量,用了所谓的 feed-forward-down 和 feed-forward-up 方法,使得中间变量的维度变得很小,SiLu 激活函数连接。
作者提到,还有另外一些 adpter 层的设计方法,和这种设计方法的表现十分接近,本文就强调了这种设计,其他的设计还类似于:
- adding a batch/layer normalization to the adapter
- increasing the number of layers per adapter
- different activation functions, such as
- inserting adapters only inside the attention layer
- adding adapters in parallel to the main layers, and possibly with a multi- plicative interaction.
总体而言,这边文章的关键不在 adpter 具体的设计 (设计背后的理论我在几天后也许有的论文分享中会有更详细的探讨),而在于这种方法本身,parameter-efficient 训练,或者现在叫 delta tuning 方法的灵感。
主实验
这篇论文的实验设计其实还挺好的,作者在包括 GLUE benchmark 在内的多个任务中,用 BERT 作为锁参的” 大模型 “来对比正常的 BERT fine-tune, Variable fine-tune 和非 BERT SOTA 的结果
作者行文用了很多的数据来表示:adpter 方法和 fine-tune 基本没有任何区别,效果只下降了一点点点点
对比实验
在这一部分,作者对 adpter 训练方法的特性做了很多的探索,可以引发人非常多的思考,同时这一部分的实验设计更是非常巧妙:
移除 adpter
正常 adpter 是在每一层都有的,作者试着单独一处某一层的、或者移除一些层的 adpter 看效果
这个热力图的横纵坐标的跨度对应的层的 adpter 被移除了,对角线代表只移除一个 adpter,右上角代表所有的都移除。这个图其实很有意思:
- 对角线的表现基本没有下滑,这代表单独一层的 adpter 其实没有起什么作用,也就是说 adpter 层的参数和全 0 没啥区别。另一点上,对角线右下角 (上层) 的表现下降更多一些,说明上层的 layer 对模型的表现更重要
这一点有些佐证了” 大模型前面层表征通用知识,后面层表征细粒度知识 “的论点,因为后面的 adpter 对下游任务的帮助更大
- 当移除的数量增大时,表现下滑的很快,这说明 adpter 层其实是共同起作用的,并且起的作用各不相同。这其实正可以说明 adpter 层是非常 parameter-efficient 的了
鲁棒性
作者在这里探索了 adpter 层参数的表示是不是鲁棒的,也就是把正常训好的 adpter 参数叠加一个高斯噪声。
当高斯噪声不大时 (
另一方面,作者探索了 adpter 层参数对表现的影响:其实用比较小的 adpter 就能达到差不多的表现。这个论点也许可以用 intrinsic dimension 的角度衡量,后面我也许会写论文阅读笔记。
我的思考
总体而言,作者在 pre-train 刚出半年多,就想到、对比了 fine-tune manner,可见科研思路的敏锐。
同时,作者的 adpter 主打小参数,因此设计的一些鲁棒性方面的附加实验也非常好
既然通过给 basebone 模型添加一些参数,可以实现媲美 fine-tune 的效果;那么只训练 basebone 模型的一点参数,或者把运算方式进行一些改变,能不能获得媲美 fine-tune 的效果呢?
v1.5.2