作者:潘梓正,莫纳什大学博士生 主页:zizhengpan.github.io
(最近看到有些问题[1]说为什么Transformer中的FFN一直没有很大的改进。)
Transformer的基本单位就是一层block这里,一个bolck包含 MSA + FFN,目前公认的说法是,
Attention 作为token-mixer做spatial interation。
FFN(又称MLP)在后面作为channel-mixer进一步增强representation。
从2017年至今,过去绝大部分Transformer优化,尤其是针对NLP tasks的Efficient Transformer都是在Attention上的,因为文本有显著的long sequence问题。安利一个很好的总结Efficicent Transformers:A survey[2],来自大佬Yi Tay[3]。到ViT上又有一堆attention[4]改进,这个repo一直在更新,总结的有点多,可以当辅助资料查阅。
而FFN这里,自从Transformer提出基本就是一个 Linear Proj + Activation + Linear Proj的结构,整体改动十分 incremental。

Transformer Block示意图 + FFN内部
经历了ReLU,GeLU,Swish,SwiGLU等等,基本都是empirical observations,但都是为了给representation加上非线性变换做增强。
ReLU 对pruning挺有帮助,尤其是过去对CNN做pruning的工作,激活值为0大致意味着某个channel不重要,可以去掉。相关工作可查这个repo[5]。即便如此,ReLU造成dead neurons,因此在Transformer上逐渐被抛弃。
GeLU 在过去一段时间占比相当大,直到现在ViT上使用十分广泛,当然也有用Swish的,如MobileViT[6]。
Gated Linear Units 目前在LLM上非常流行,其效果和分析源于GLU Variants Improve Transformer[7]。如PaLM和LLaMA都采用了SwiGLU,谷歌的Gemma使用GeGLU。
不过,从个人经验上来看(偏CV),改变FFN中间的activation function,基本不会有极大的性能差距,总体的性能提升会显得incremental。NLP上估计会帮助reduce overfitting, improve generalization,但是与其花时间改这个地方不如好好clean data。。。目前来说。
说白了就是一个matrix multiplication,已经几乎是GPU上的大部分人改model的时候遇到的最小基本单位。dense matrix multiplication的加速很难,目前基本靠GPU更新迭代。
不过有一个例外:小矩阵乘法可以结合软硬件同时加速,比如instant-ngp的tiny cuda nn,64x64这种级别的matrix multiplication可以使得网络权重直接放到register,激活值放到shared memory,这样运算极快。

Source: https://github.com/nvlabs/tiny-cuda-nn
但是这对今天的LLM和ViT来讲并不现实,最小的ViT-Tiny中,FFN也是个192 x(4x192)这种级别,更不用说LLM这种能>10000的。
那为什么Linear Projection 在 Transformer里就需要这么大?
常见的说法是Knowledge Neurons。tokens在前一层attention做global interaction之后,通过FFN的参数中存放着大量training过程中学习到的比较抽象的knowledge来进一步update。目前有些studies是说明这件事的,如:
问题来了,如果FFN存储着Transformer的knowledge,那么注定了这个地方不好做压缩加速:

Source: Zhang et.al, Accelerating Very Deep Convolutional Networks for Classification and Detection
当然不是。
我们想改动一个model or module的时候,无非是两个动机:1)Performance。2)Efficiency。
性能上,目前在NLP上可以做Gated MLP[11], 如Mamba[12]的block中,或者DeepMind的新结构Griffin[13]。

Source: Griffin: Mixing Gated Linear Recurrences with Local Attention for Efficient Language Models
但是难说这个地方的性能提升是不是来自于更多的参数量和模型复杂度。
在CV上,有个心照不宣的trick,那就是加depthwise convolution引入locality,试过的朋友都知道这个地方的提升在CV任务上有多明显,例如CIFAR100上,DeiT-Ti可以涨接近10个点这样子。。。

但是呢,鉴于最原始的FFN依然是目前采用最广泛的,并且conv引入了inductive bias,破坏了原先permutation invariant的sequence(因为卷积要求规整的shape,width x height)。大规模ViT训练依然没有采用depthwise conv,如CLIP, DINOv2, SAM, etc。
效率上,目前最promising是改成 **Mixture-of-Expert (MoE)**,但其实。。。GPT4和Mixtral 8x7B没出来之前基本是Google在solo,没人关注。当然现在时代变了,Mixtral 8x7B让MoE起死回生。最近这个地方的paper相当多,简单列几个自己感兴趣的:
目前这个阶段,没人知道一周以后会有什么大新闻,就像Sora悄无声息放出来,一夜之间干掉U-Net,我也没法说什么结构是最有效的。
总体上,目前没有任何结构能真的完全beat Transformer,Mamba 目前 也不行,如这篇[17]发现 copy and paste不太行,scaling和in-context能力也有待查看。
考虑到未来扩展,优秀的结构应该满足这么几个东西,个人按重要性排序:
Hallucination问题我反倒觉得不是大问题,毕竟人也有幻觉,比如对于不知道的,或自以为是的东西很自信的胡说一通,强推Hinton怼Gary Marcus这个视频[19]。我现在写的东西再过几年回来看,说不定也是个Hallucination。。。
https://twitter.com/i/status/1754439023551213845
总结: FFN因为结构最简单但是最有效,被大家沿用至今。相比之下,Transformer改进的大部分精力都在Attention这个更明显的bottleneck上,有机会再写个文章聊一聊这里。
一些个人观点,不代表完全正确,欢迎交流讨论~
引用链接
[1] : https://www.zhihu.com/question/646160485
[2] : https://arxiv.org/abs/2009.06732
[3] : https://www.yitay.net/
[4] : https://github.com/cmhungsteve/Awesome-Transformer-Attention
[5] : https://link.zhihu.com/?target=https%3A//github.com/he-y/Awesome-Pruning
[6] : https://link.zhihu.com/?target=https%3A//arxiv.org/abs/2110.02178
[7] : https://arxiv.org/abs/2002.05202
[8] Transformer Feed-Forward Layers Are Key-Value Memories: https://aclanthology.org/2021.emnlp-main.446/
[9] Knowledge Neurons in Pretrained Transformers: https://aclanthology.org/2022.acl-long.581/
[10] : https://ieeexplore.ieee.org/document/7332968
[11] : https://arxiv.org/abs/2105.08050
[12] : https://arxiv.org/abs/2312.00752
[13] : https://arxiv.org/abs/2402.19427
[14] : https://arxiv.org/abs/2308.00951
[15] : https://arxiv.org/abs/2312.09979
[16] : https://arxiv.org/abs/2401.06066
[17] : https://arxiv.org/abs/2402.01032
[18] : https://commoncrawl.org/
[19] : https://twitter.com/tsarnick/status/1754439023551213845
参考:青稞AI