谷歌浏览器插件
订阅小程序
在清言上使用
所有文章 > 正文

Ladder Side-Tuning:预训练模型的“过墙梯”

作者: PaperWeekly

浏览量: 540

时间: 2022-06-27 11:27

本文主要介绍了同时具备参数高效和训练高效特点的一种大模型微调方法——Ladder Side-Tuning。

PaperWeekly 原创  

作者 | 苏剑林
单位 | 追一科技
研究方向 | NLP、神经网络
如果说大型的预训练模型是自然语言处理的“张良计”,那么对应的“过墙梯”是什么呢?笔者认为是高效地微调这些大模型到特定任务上的各种技巧。除了直接微调全部参数外,还有像 Adapter [1]、P-Tuning 等很多参数高效的微调技巧,它们能够通过只微调很少的参数来达到接近全量参数微调的效果。然而,这些技巧通常只是“参数高效”而并非“训练高效”,因为它们依旧需要在整个模型中反向传播来获得少部分可训练参数的梯度,说白了,就是可训练的参数确实是少了很多,但是训练速度并没有明显提升。
最近的一篇论文《LST: Ladder Side-Tuning for Parameter and Memory Efficient Transfer Learning》[2] 则提出了一个新的名为“Ladder Side-Tuning(LST)”的训练技巧,它号称同时达到了参数高效和训练高效。是否真有这么理想的“过墙梯”?本来就让我们一起来学习一下。

论文链接:https://www.aminer.cn/pub/62a94e065aee126c0f9c02cd


1、方法大意
其实 LST 这把“过墙梯”的结构,用原论文的 Figure 2 就可以清晰地说清楚了:

LST与Adaper、P-tuning的对比图


反向传播,也就是求模型梯度,是从输出层向输入层逐步计算的,因此反向传播的深度/计算量,取决于最靠近输入层的参数深度,跟可训练的参数量没有太必然的联系。对于 Adapter 来说,它在每一层后面都插入了一个小规模的层,虽然其余参数都固定了,只有新插入的层可训练,但每一层都新层,所以反向传播要传到输入层;对于 P-tuning来说,本质上它是只有在 Embedding 层中有少量可训练参数,但 Embedding 层是输入层,因此它的反向传播也要贯穿整个模型。因此,这两种方案能提升的训练效率并不多。至于 LST,它是在原有大模型的基础上搭建了一个“旁支”(梯子),将大模型的部分层输出作为旁枝模型的输入,所有的训练参数尽在旁枝模型中,由于大模型仅提供输入,因此反向传播的复杂度取决于旁枝模型的规模,并不需要直接在原始大模型上执行反向传播,因此是可以明显提升训练效率的。


2、实验效果

原论文做了不少 LST 的实验,包括 NLP、CV 的,下面是 LST 在 GLUE 数据集上的效果:

LST在GLUE上的实验结果可以看到,LST 确实具备了参数高效和训练高效的特点,能够在较小的训练参数和训练成本的情况下,达到一个不错的微调效果。特别是最后两行的实验结果,体现出了 LST 在有限训练资源下微调大模型的可能性。


笔者在中文的 CLUE 任务上也做了简单尝试,参考代码为:Github:https://github.com/bojone/LST-CLUE
注意,原论文的“梯子”是用跟 Adapter 中的 MLP 层来搭建的,而笔者上述实现直接用了 Transformer 一样的“Attention + FFN”组合,可训练的参数量控制在 100 万左右,约为 base 版的 1.2%,或者 large 版的 0.4%,梯子的初始化直接用随机初始化,最终在验证集的效果如下:

可以看到,实验结果没有原论文的英文实验那么乐观(当然不排除是笔者自己的实现不够好),但训练效率确实有明显提升(平均来说提升一倍左右)。整个实验下来,笔者的感觉是对于比较常规、一般难度的分类任务,LST 能取得相近的效果,但对于比较困难的任务,比如阅读理解等,LST 会有非常明显的下降。当然,其实应该不只是LST有这个问题,大部分号称参数高效的微调方法估计都有这个问题,因为这些方法的实验任务多数都只是 GLUE,GLUE 其实全都是相对简单的分类任务...

3、延伸思考

从“事后诸葛亮”来看,其实 LST 也算不上多高明的做法,本质上就是把预训练模型固定住,然后把其输出层和部分中间层的结果作为补充输入来训练一个新的小模型,理解到这一点之后,想必很多读者已经在脑海中酝酿着自己的相似方案了。不过,LST 真正的意义在于告诉我们可以这样做,并且给出了一个可行的参考方案,以及实验证明了它确实是大模型的一个有效利用方案。
有类似研究经验的读者会发现,LST 新增的“梯子”分支的初始化是个问题,如果完全随机初始化的话,可能会有训练上的困难,效果效果会不理想。这一点原论文也提到了,它提供了一个截取大模型矩阵权重来作为小模型矩阵初始化的方案,从而提升了 LST 的最终效果,其细节可以在论文中找到,至于笔记自己的实现,就纯粹是简单验证 LST 的有效性,所以就偷懒没实现这一步。
进一步想,既然 LST 新增的“梯子”分支存在初始化难题,而 LST 确实是微调大模型的有效方案,那么未来我们在训练新的大模型时,是不是就可以事先把这个“梯子”也预留好呢?也就是说,我们直接把这个“梯子”作为预训练模型的一部分做大规模的预训练,后面微调的时候,就只微调“梯子”,这样就可以实现高效地微调大模型,又不用担心初始化问题?
从形式上来看,笔者觉得 LST 跟《BERT-of-Theseus:基于模块替换的模型压缩方法》中介绍的 BERT-of-Theseus 挺相似的,只不过一个目的是蒸馏小模型,还是需要用到大模型来反向传播;而 LST 目的则是提升训练效率,不需要大模型来反向传播,但推理时需要用到大模型来前向传播。可以说两者有点互补了。

4、文章小结
本文主要介绍了同时具备参数高效和训练高效特点的一种大模型微调方法——Ladder Side-Tuning。

扫码微信阅读
[关于转载]:本文转载于 PaperWeekly,仅用于学术分享,有任何问题请与我们联系:report@aminer.cn。