也来盘点一些最近的非 Transformer 工作

date
Jun 2, 2022
Last edited time
Mar 27, 2023 08:52 AM
status
Published
slug
也来盘点一些最近的非Transformer工作
tags
DL
summary
一些MLP类工作
type
Post
Field
Plat

Synthesizer

要解读上述 MLP 相关的工作,就不得不提到去年五月 Google 发表在《Synthesizer: Rethinking Self-Attention in Transformer Models》的 Synthesizer。而事实上,如果你已经了解了 Synthesizer,那么上面列表中的好几篇论文都可以一笔带过了。
在之前的博客《Google 新作 Synthesizer:我们还不够了解自注意力》中,我们已经对 Synthesizer 做了简单的解读。撇开缩放因子不说,那么 Attention 的运算可以分解为
, 
其中 是输入序列的变换,这个了解 Self Attention 的读者应该都清楚,不再详写。Synthesizer 则是对几种 的新算法做了实验,其中最让人深刻的一种名为 Random,就是将整个 B当作一个参数矩阵(随机初始化后更新或者不更新)。
notion image
Synthesizer 的 “预训练 + 微调” 实验结果。实验的 baseline 是 T5,其中 “R” 即为 Random 模式,相当于 MLP。
在 Random 的情况下,Attention 矩阵不再是随样本变化的了,也就是所有样本公用同一个 Attention 矩阵,但是它依然能取得不错的效果,这在当时确实对大家对 Attention 的固有理解造成了强烈冲击。Synthesizer 的实验相当丰富,包括 “机器翻译”、“自动摘要”、“对话生成”、“预训练 + 微调” 等,可以说,上面列罗的多数论文,实验都没有 Synthesizer 丰富。

MLP-Mixer

论文《MLP-Mixer: An all-MLP Architecture for Vision》所提出来的 MLP-Mxier,其实就是 Synthesizer 的 Random 模式并去掉了 softmax 激活,也就是说,它将 设为可训练的参数矩阵,然后直接让 。模型就这样已经介绍完了,除此之外的区别就是 MLP-Mxier 做 CV 任务而 Synthesizer 做 NLP 任务而已。
notion image
notion image
MLP-Mixer 的部分实验结果
对了,为啥这模型叫 MLP-Mxier 呢,因为作者把这种直接可训练的 Attention 模式起了个名字叫做 “token-mixing MLP”,把原来的 FFN 改叫做 “channel-mixing MLP”(以前叫做 Position-wise FC),不管叫啥,反正就是号称只是 MLP,所以模型也叫做 MLP-Mxier。
而事实上,笔者认为这个更标准的叫法是窗口为 1 的一维卷积,但不管是这篇论文还是之前的《Attention Is All You Need》,都是宁愿把这些常规操作自己另起个名字,也要选择性地减少甚至无视与卷积的联系,可谓是为了 “A Good Title Is All You Need” 而煞费苦心了。
其实这一点也遭到了 LeCun 的批评,如果真的是标准的 MLP,那应该要将输入展平为一个一维向量,然后再接变换矩阵~

External Attention

从类比的角度看,Synthesizer 的 Random 模式或者 MLP-Mxier,相当于将 Attention 中的 都设为参数矩阵了,而《Beyond Self-attention: External Attention using Two Linear Layers for Visual Tasks》所提出的 External Attention,则是把 设为(固定大小的)参数矩阵了,实验任务同样是 CV 的。
本来这也没什么,毕竟深度学习就是效果为王,效果好了就能成文。但是个人认为 External Attention 很多说法就禁不住推敲的。
首先,它把自己称为 “两个线性层”,刻意淡化它跟 Attention 的联系(说出它是 Attention 的特例很丢人?);然后它又说 “通过引入两个外部记忆单元(也就是设为参数的 ),隐式地学习了整个数据集的特征”,这种说法也不能算错,然而其实任意模型的任意参数都可以这样解释,这并不是 External Attention 的特性;还有它说能实现线性的复杂度,那得固定 , 的长度,这种情况下其实应该跟也同样是线性复杂的 LinFormer 比比才更有说服力(论文比了 Performer,但是 Performer 的降低复杂度思路是不一样的,LinFormer 更有可比性)。
抛开这些文字上的不说,External Attention 的工作机制似乎有点迷。不难想到 External Attention 对每个特征的编码是孤立的,如果换到 NLP 来说,那就是说每个词都独立编码的,根本不与上下文产生联系,所以肯定是不 work 的,那为什么在 CV 中会 work 呢?

Stack of FFN

至于论文《Do You Even Need Attention? A Stack of Feed-Forward Layers Does Surprisingly Well on ImageNet》,其实跟 MLP-Mixer 是高度重合的,不过它写起来就实在多了。它就是将输入过一个常规的 FFN,然后将输出转置,再过一个 FFN,最后转置回来,这样如果本身就熟悉 Transformer 的话,我们很快就清楚它做了啥。
  • 这里的Stack of FFN 和上文的 MLP-Mixer 都是 Synthesizer 的随机情况

Pre-trained CNN

事实上,CNN 才是最早尝试(在 Seq2Seq 任务中)取代 RNN 的模型,Facebook 的《Convolutional Sequence to Sequence Learning》其实更早发表,只不过很快就被 Google 的《Attention Is All You Need》抢了风头,后来 GPT、BERT 等模型发布之后,Transformer 类模型就成了当前主流,CNN 很少被深入研究了。
论文《Are Pre-trained Convolutions Better than Pre-trained Transformers?》则帮助我们验证了 “CNN + 预训练” 的有效性。论文结果显示,不管是直接用下游数据监督训练,还是先预训练然后微调,基于膨胀卷积或动态卷积的 CNN 模型都略优于 Transformer 模型,并且在速度上 CNN 模型还更加快。对了,这篇论文已经中了 ACL2021,所以这篇论文的成文其实更早,只不过这个月才放出来而已。
notion image
不管有无预训练,CNN 都体现出了自己的优势
这篇论文给我们的主要启发是:预训练改进与模型改进不应该混为一谈,预训练技术本身往往能给各种模型都带来提升,不应该一提到预训练就想到 Transformer,也不应该只把预训练跟 Transformer 结合。事实上,笔者之前也比较喜欢 CNN,曾通过 “膨胀门卷积(DGCNN)” 的设计在多个任务上取得不错的效果,而这篇论文则再次肯定了 CNN 的价值。不过尽管如此,笔者可能依然不会投入主要精力转向 CNN 的研究。
首先,理论上来说,CNN 就无法捕捉足够远的长程依赖,这是根本缺陷,虽然通过膨胀卷积等方式,可以快速增大 CNN 的感受野,但也只是比较大,不是 Transformer 理论上的一步到位;其次,如果单纯看提高效率角度,Transformer 本身也有很多优化空间,如果只是为了执行效率而转向 CNN,那这个理由似乎不那么有说服力;还有,Transformer 的 的复杂度本身也带来更多的折腾空间(比如像 UniLM),可以玩出更多的花样(比如像 K-BERT)。
总的来说,我们不能否定 CNN 的价值,但如果当前已经比较专注 Transformer 了,那么就没必要分出太多精力去转向 CNN 了。

ResMLP

至于 Facebook 在《ResMLP: Feedforward networks for image classification with data-efficient training》提出的 ResMLP,跟前述的 MLP-Mixer 和 Stack of FFN 也没有本质区别,其文字描述也跟 Stack of FFN 很相似,忽略细微的细节差异,甚至可以认为它们三个就是同一个模型。最后,ResMLP 的实验任务同样是 CV 的。

FNet

就笔者看来,《FNet: Mixing Tokens with Fourier Transforms》所提出的 FNet,是列表的七篇论文中最有意思的一篇。某种意义上来说,FNet 也是 MLP-Mixer 的一个特例,但它是一个非常有意思的特例:MLP-Mixer 的注意力矩阵是直接参数优化而来的,FNet 的参数矩阵是直接通过傅立叶变换得到的!所以,FNet 的 “注意力层” 是没有任何优化参数的!
其实我们也可以从注意力的角度来理解 FNet。抛开归一化因子不看,那么注意力运算大致可以写为:
这里的 本来是 的矩阵,FNet 说: 可以换成 矩阵:
是的,你没看错,它就是要将它粗暴地换成 组成的 矩阵。当然,这样一来越到后面 就指数爆炸了。为了避免这种情况,FNet 就改为
也就是搞成虚指数就不会爆炸了!就这么粗暴,这就得到了基于傅立叶变换的 FNet。
以上不是很懂. 但是以下懂了
原论文对序列长度和特征维度两个方向都做了傅立叶变换,然后只保留实数部分, 即 ,就用这个运算取代了自注意力。对于傅立叶变换的实现,我们有称之为 “快速傅立叶变换(FFT)” 的算法,效率是 ,所以 FNet 也能有效处理长序列。
很显然,相较于经典 Transformer,这里只是使用傅里叶层替换了自注意力层。傅里叶层计算公式如下: 总体来说是先沿着特征向量的维度进行傅里叶变换,而后沿着序列的维度再进行一次,最后只取实数部分。先是把 Embedding 变换到频域,再到前向层做乘法,考虑到傅里叶变换的卷积特性:
即频域上的乘法相当于时域上的卷积,所以这种变换本质上是对输入进行了一个大卷积核的卷积
notion image
FNet 的部分效果如下表。其实从预训练和下游任务的效果上来看,FNet 并没有什么优势,不过它在 Long-Range Arena(一个测试模型长程能力的评测榜单)上的效果倒是不错。
notion image
FNet 的 “预训练 + 微调” 实验结果
notion image
FNet 的 Long-Range Arena 实验结果
当然,FNet 这么粗暴的做法能行本来就已经是个奇迹了,它给我们带来的最大冲击无疑是:就这样都行?傅立叶变换为什么能行?笔者也不知道答案。网上有些评论说,这说明了注意力机制其实就是一种坐标基的变换,而傅立叶变换也是一种基的变换,两者的作用是类似的。这个说法确实有点本质的感觉,在 ICLR2021 中也有篇论文《Is Attention Better Than Matrix Decomposition?》用 SVD 代替 Attention 也能取得不错的效果,这说明基变换的说法确实存在(SVD 也是一种基变换),但是基变换的同时如何保持时序性、哪种基变换更适合,这些问题完全没有头绪。
又考虑到傅里叶变换具有对偶性,所以叠加 N 个 block 之后,信息不断进行傅里叶变换与逆变换,所以作者描述傅里叶层使输入在频域与时域间来回变换,或者也可以理解为在反复进行卷积与乘法,这样便充分融合了各个 token 的信息。

gMLP / aMLP

最后《Pay Attention to MLPs》所给我们带来的 gMLP、aMLP 是比较常规的新结构探索工作,算是 MLP-Mixer 的增强版。gMLP 的 g 是 “gate” 的意思,简单来说 gMLP 就是将 MLP-Mixer 跟门控机制结合起来,而 aMLP 的 a 是 “attention” 的意思,它将 attention 与 gMLP 结合起来。
具体来说,gMLP 大致是如下运算:
简单来说,就是将输入沿着特征维度分为两半,然后将其中一半传入 MLP-Mixer,作为另一半的 gate。而 aMLP 则是将 MLP-Mixer 和一个简单的单头 Self Attention 结合来作为 gate:
论文做的实验比较全面,包括 CV 和 NLP 的。从论文所报告的效果来看,gMLP 略差于标准的 Self Attention,而 aMLP 则是普遍优于 Self Attention,这进一步肯定了门控机制的价值。只不过不管是 gMLP 还是 aMLP,人工堆砌的味道太重了,要水一篇 paper 还可以,但个人认为没有给模型的发展方向带来什么新的启发。
notion image
gMLP,aMLP 的 NLP 部分实验结果

前路在何方

通过以上阅读,我们可以知道,MLP-Mixer、Stack of FFN、ResMLP 这三个模型,事实上可以看成是去年的 Synthesizer 的一个特例,甚至从技术上来说,它们还不如 Synthesizer 的内容丰富,因此真算不上什么有意思的工作;至于它的改进版 gMLP / aMLP,则是非常常规的结构炼丹工作,只要算力足够我们都可以去做,所以也确实没什么意思;External Attention 号称两个线性层,事实上就是 Attention 的变式,其生效机制和实验对比也不够明朗;比较有意思的就是 CNN 预训练和 FNet 这两个工作了,一个让我们解耦了 “预训练改进” 和“模型改进”两个概念,一个提出的傅立叶变换也有效给我们带来了较大的思想冲击。
整体而言,这些工作离成熟还远得很,最多是初步验证了有效性,连优雅也说不上。比如,除了 FNet,这些所谓的 “all in MLP” 的模型,都没有办法比较优雅处理变长输入,像 MLP-Mixer、Stack of FFN、ResMLP 纯粹在(固定大小的)图像上实验,所以不用考虑这个问题,像 Synthesizer / gMLP / aMLP 虽然做了 NLP 的实验,但看上去都是强行截断的,算不上漂亮。所以,这系列工作一定程度上是开拓了新的思路,但其实带来了更多有待解答的问题。
那么我们要不要跟呢?个人认为没必要投入多少精力进去,平时大致关注一下就行了。抛开前面说的优雅性问题不说,这些工作的实用性本身就值得商榷。像将 Attention 换成 MLP 的改进,最大的优点无非就是提速,没错,是会快一点,但理论复杂度还是 ,这说明其实没有本质改进,况且提速的同时通常还会降低一点性能。如果单从 “提速并降低一点性能” 的追求来看,Transformer 可做的工作也非常多(最直接的就是减少一两层),没必要换成 MLP,而换成 MLP 探索自由度降低了不少。当然,从 “拓荒” 的学术角度来看,多角度尝试各种新模型是有意义的,但这也不宜掺入过多的人造因素在里边,不然就变成了一个在结构上过拟合任务的过程了,难登大雅之堂。
此外,对于 NLP 来说,我们可能比较关心的是 “预训练 + 微调” 这一块的性能,而很遗憾,从 Synthesizer 开始的一系列 NLP 实验表明,将 Attention 换成 MLP 后的模型也许在某个任务上能取得有竞争性的结果,但是其迁移性往往不好,也就是说可能单看预训练效果还不错,但是 “预训练 + 微调” 多数就比不上 Transformer 了。这也不难理解,因为它们把 Attention 矩阵参数化,那么该矩阵更有可能跟具体任务强相关了,不像 Transformer 那样自适应生成的 Attention 矩阵那样具有更好的适应能力。

© Lazurite 2021 - 2024