Transformer提效之路——一文梳理各种魔改版本Transformer

本文深入探讨Transformer模型,从基本结构到效率优化,介绍9篇顶会论文,包括稀疏Attention、长文本应用和运行效率改进。Transformer在NLP和CV领域的广泛应用,以及其Attention计算效率问题,激发了多种优化方法,如Longformer的稀疏Attention,Transformer-XL的片段交互,以及Reformer和Linformer的线性复杂度解决方案。
摘要由CSDN通过智能技术生成

如果觉得我的算法分享对你有帮助,欢迎关注我的微信公众号“圆圆的算法笔记”,更多算法笔记、算法交流,以及世间万物的学习记录~

Transformer目前已经成为NLP领域的主流模型,Bert、GPT都是基于Transformer模型结构。同时,Transformer在CV领域也逐渐取得大范围的应用。对Transformer模型结构的深入细致了解非常必要。然而,Transformer的Attention计算代价较高,随着序列长度的增加计算量显著提升。因此,业内出现了很多Transformer魔改工作,以优化Transformer的运行效率。本文首先介绍了Transformer模型的基本结构,然后详细介绍了9篇针对Transformer效率优化、长序列建模优化的顶会论文。

1. Transformer基本原理

Transformer是由Attention Is All You Need(NIPS 2017)这篇论文中提出的,这篇论文提出的原始模型是一个Encoder-Decoder结构,后来的GPT等模型沿用了该结构,而Bert只用了Encoder部分。下面我们对这篇文章介绍的基础Transformer结构进行详细介绍。如果对Transformer结构已经非常了解的同学,可以直接看第二节对Transformer效率优化工作的汇总。

Transformer的整体结构如下图所示,分为Encoder、Decoder两个部分。我们来看一下输入数据是怎么在模型中流转的。

  • 输入:假设输入序列长度为T,则Encoder输入的维度为[batch_size, T],经过embedding层、position encoding等流程后,生成[batch_size, T, D]的数据,D表示模型隐层维度;

  • Encoder:这个数据会经过N个模块,每个模块的结构都是相同的,为Multi-head Attention->Add->LayerNorm->Feed Forward->Add->LayerNorm。Multi-head Attention在T这个维度上,计算每两个位置元素的Attention值,会汇聚再次得到每个位置的Embedding,输出维度仍然为[batch_size, T, D]。Add层将Multi-head Attention的输出结果和输入结果相加,类似于一个残差网络。Feed Forward会用一个比较大的中间层维度将上一层的隐藏维度扩大,然后再缩小,如用一个全连接从[batch_size, T, D]变为[batch_size, T, 4*D],再变回到[batch_size, T, D],主要为了增加模型容量。最终经过N个模块,Encoder的输出维度仍然为[batch_size, T, D]。

  • Decoder:Decoder的输入也经过类似的变换得到[batch_size, T', D],T'是Decoder输入长度。之后会进入多个相同结果的模块,每个模块为Self Multi-head Attention->Add->LayerNorm->Cross Multi-head Attention->Add->LayerNorm->Feed Forward->Add Norm。Self Multi-head Attention,表示Decoder序列上的元素内部做Attention,和Encoder是一样的。Cross Multi-head Attention,是Decoder每个位置和Encoder各个位置进行Attention,类似于传统的seq2seq中的Attention,用来进行Decoder和Encoder的对齐。

下面我们重点介绍一下Transformer结构的核心部分:多头注意力机制。其实多头注意力机制并不复杂,主要就是下面这个公式:

​输入假设是[batch_size, T, D],首先将它用3个不同的全连接映射成Q、K、V三个不同的向量,维度仍然为[batch_size, T, D]。然后假设有k个head,那么我们将向量转换维度:[batch_size, T, D] -> [batch_size, T, k, D/k] -> [batch_size, k, T, D/k],这相当于把后续的Attention分别做k次,同时又没有增加模型的隐藏维度带来计算开销增大。然后就套用上面的公式,pair对进行Q和K的点积计算+softmax得到attention分,再和V相乘得到每个位置元素的结果。我们来看一下代码的实现,传入的是经过全连接和head变化处理好的Q、K、V,维度都是[batch_size, k, T, D/k]。另外一个需要注意的点为什么要除以根号dk,因为Q和K的内积结果,随着其维度变大&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值