有哪些令你印象深刻的魔改transformer?

自从transformer 出现之后,NLP领域出现了很多基于transformer的改进,例如non-autoregressive transfor…
被浏览
1,397,682

创建时间:2019-10-10  10:20:21

最后编辑:2019-10-10  10:22:11

75 个回答

godweiyang 等 1650 人赞同了该回答
  1. Self-Attention with Relative Position Representations
    1. 提出了相对位置编码,建模词与词之间的相对位置关系而不是绝对位置关系,使得transformer可以适应没有见过的长度:一个在长度为128的序列上训练的语言模型,可以在长度为256的序列上推断并且不会有性能损失,相比之下用sin/cos的绝对位置编码性能会有显著下降。
    2. 为了节省计算量,每层所有head共享相同的encoding。
    3. 性能相较普通transformer有若干提升,速度略有下降。
    4. 给后续的文章提供了很多改进的机会:相对位置可以看做词与词之间的一种relation,而相对位置编码套在图网络的框架中实际上是一种建模relation的message function。词和词之间还有很多其它的relation(coref, dependency, pos tagging, kg中的relation),可以用来给transformer嵌入外部知识,可能会对相应的下游任务有帮助。
  2. Transformer-XL
    1. 提出了一种新的相对位置编码,性能比上文中的编码方式略有提升,参数量增大。
    2. 提出使用跨相邻两个segment的attention来建模长程依赖。
    3. 模型本身只能用于单向建模,后续的XLNet为了使其具有建模双向上下文的能力定义了permutation language modeling。
  3. Dynamic Conv
    1. 早期的CNN on text系列工作对于kernel中的每个相对位置使用固定的权重,限制了其表达能力。
    2. 本文提出了Dynamic Conv结构,旨在根据当前词的表示动态调整卷积权重,更具体地:
      1. 对于所有位置,用同一个函数f:RdRH×kf: \mathbb{R}^{d} \rightarrow \mathbb{R}^{H\times k} 来把当前位置表示 xix_i 映射到 Wi=f(xi)W_i=f(x_i) ,然后对 WiW_i 在kernel size的维度做softmax,作为可分离卷积的权重。
      2. self-attention可以看做Wi=f(xi,{x1,,xn})W_i=f(x_i, \{x_1, \cdots, x_n\}) ,需要每个词对其它所有的词表示做dot-product算出 WiW_i ,而dynamic conv只需要用当前的词表示。
    3. 所提到的,本文的亮点在于不使用词之间两两交互的attention(backward过程中有类似attention的交互,这是一个大家可以挖掘的点)也可以获得类似/超过transformer的效果。
      1. MUSE结合了Self-Attention和Dynamic Conv,在每个transformer block中同时使用FFN,Dynamic Conv和Self-Attention,在翻译任务上取得了更好的效果。
  4. Universal Transformer
    1. transformer固定层数限定了其表达能力。
    2. 不固定层数的transformer如何适应没有见过的层数?共享每层的网络权重。
    3. 除了positional encoding以外,使用了layer encoding来建模不同层的偏置。
    4. Adaptive Computation Time的思想引入transformer,每个layer之后用一个网络来predict每个词需不需要halt,有些词需要经过更多的层来获得一个较好的表示。
    5. 需要注意这篇文章的机器翻译实验中并没有使用词级别ACT,所以词级别ACT的使用对于大规模的任务需要警惕。
  5. DiSAN
    1. 此文投稿时间与Transformer问世只差两个月,可以看做同期工作,文章没有太多transformer的影子,将纯self-attention结构用于NLI/分类任务上,直至目前仍然是很强的baseline。
    2. 提出了multi-dimensional attention,与multi-head attention有类似之处,
    3. 普通的self-attention无法建模语序,区别于transformer使用的positional encoding,此文提出使用自左到右和自右到左两个单向的attention mask来建模语序(可以看做两个方向的causal transformer)。
      1. ablation study验证了这种建模方式的有效性。
    4. 在不使用交互的情况下在SNLI有85.7的test acc,属于当时的state-of-the-art。
    5. 不同于transformer,此文不stack self-attention layer,然而未来大家都已经看到了。
  6. Star-Transformer
    1. 老师组的工作,同时维护每个词的表示和一个global的表示,思路类似于视觉中的Squeeze-and-Excitation Networks
    2. 限制每个词attend到邻域和global表示,全局表示attend到每个词,迭代地更新词级别的表示和global的表示,复杂度为O(n)。
      1. ablation study验证了局部attention和全局attetion的必要性。
    3. 由于更新global表示与更新词级别表示用了两套参数,因此删除了网络中的FFN以平衡参数量。
    4. 在中小型数据集上有比transformer显著更好的泛化性能和推断速度。
    5. 从图网络的视角来看,把clique简化为了star + ring。
  7. Set-Transformer
    1. 此文试图将transformer应用于无顺序的数据(例如集合)中。
    2. 大家能想到的一种最简单的方法是去掉positional encoding,也就是这篇文章中提到的SAB(Set Attention Block)。
    3. 但是普通的SAB的计算复杂度为O(n^2 d),当集合中元素数量很多时候计算代价很大,本文提出了ISAB(Induced Set Attention Block):
      1. 每个self-attention block中维护m个inducing points(可以看做对原来n个元素的表示做了一个压缩),将原来的n->n的self-attention拆成二段式n->m->n:首先用inducing points对原来的n个元素表示做self-attention,之后再用n个元素的表示对这m个inducing points(压缩之后的表示)做self-attention,时间复杂度为O(nmd)。
      2. 尚不清楚此算法对于文本类型的效果如何,一个可能的尝试是用在文档级别翻译的encoder-decoder attention中。
  8. Gaussian Transformer
    1. 观察发现attention通常对近距离的词权重较大,远距离的词权重较小。
    2. 对self-attention模块增加了一个高斯先验: x^i=jsoftmax(xiTxjdi,j2)xi\hat{x}_i = \sum_j \mathrm{softmax}(x_i^T x_j - d_{i,j}^2) x_i
    3. 设计了一套交互式基于transformer的NLI结构:三层encoder+三层带交互的encoder,在SNLI上取得了89.2的test acc,式目前不使用EMLO/BERT的SOTA。
  9. Augmenting Self-attention with Persistent Memory
    1. 做过仔细的profiling的同学会发现,transformer中FFN的计算代价很高(无论是显存还是速度)。
    2. 直接去掉FFN对transformer性能影响极大。
    3. 这篇文章去掉FFN的同时在self-attention层中加入了persistent(与文本本身无关,属于模型的参数) key/value,使得新模型在参数量上与使用FFN的transformer相匹配,性能不降。
    4. 实际上每层需要1024组persistent memory,开销不小,需要后续改进。
  10. Large Memory Layers with Product Keys
    1. 同样来自FAIR,思路是用大的key/value字典来代替FFN。
    2. 字典体积很大,memory size=1024^2,使用了二分subspace的方法降低查询代价。
    3. 使用了faiss做高效的similarity search。
    4. 由于参数/计算量大,只在12层transformer中的第六层和第十二层把FFN改成key-value layer.
    5. 思路上与word embedding流行年代的multi-sense embeddingmemory network有类似之处,有兴趣的同学们可以考虑在key-value layer引入外部知识,比如knowledge embedding。
  11. Adaptive Attention Span in Transformers
    1. 观察发现大部分层/head的attention集中在局部。
    2. 同样将Adaptive Computation Time 的思想引入transformer中,动态地学习每个attention head的context length。
    3. 使用相对低的计算代价建模长程上下文,在字符级语言模型上效果显著优于transformer-xl。
    4. adaptive的方法通常需要对参数比较敏感,其它任务上的性能有待考证。
  12. InDIGO
    1. 来自 ,使用transformer做非自左到右的解码。
    2. 句子的绝对位置和相对位置都不再确定,如何建模位置信息?
    3. 使用更”模糊“的相对位置编码:x在y的左边,x在y的右边,x是y。
      1. 该相对位置编码是insertion-invariant的。
      2. 为什么work?可以参考relative positional encoding原文中的clip_dist=1的情形。
    4. 大量的实验来探究不同解码方式生成的质量。
    5. 同期还有两篇研究非自左到右编码的文章:Insertion Transformer (log(n)步解码), Non-Monotonic Sequential Text Generation (对transformer本身没有改动)。
  13. Levenshtein Transformer
    1. 同样来自Jiatao。
    2. 普通的transformer每层更新每个词的表示。
    3. Levenshtein Transformer每层对句子进行一个编辑,具体分为三步:
      1. 删除token
      2. 在句子中加placeholder
      3. 预测每个placeholder对应的词。
    4. 用RL优化每层output和target的levenshtein distance。
    5. 未来有很多的可能性,令人充满遐想,比如 提过的human-in-the-loop。
  14. Tree-Transformer
    1. 用Transformer来做unsupervised parsing,尝试从文本中学习结构。
    2. 在每个Transformer layer中都把整段文本分成一系列成分。
    3. 对attention加上mask,对每个词而言,超出当前所在成分的权重置为0。
    4. 如何分出成分?每个位置预测link probability代表其与后一个词在同一个成分中的概率,设置一个threshold用来分段。
    5. 直接这样做模型倾向于将整句分到同一个成分中,因此设计了neighbor attention。
    6. 如何保证Transformer layer从下层到上层学出的成分组成一棵合法的树?设计了hierarchical constraint。
    7. 提出了从pre-trained Tree-Transformer中构建成分树的算法,使用BERT中的MLM loss做训练,并在unsupervised parsing上评测。
    8. 同在EMNLP 19中有一篇立意类似的文章PALM
  15. Tensorized Embedding
    1. WikiText-103这类数据集,词表很大(267735),embedding占据了总参数的大部分。
    2. 本文试图分解(vocab_size=I1 * I2* ... In, d=J1 * J2 * ... Jn)这个矩阵:
      1. (I1 * I2 * ...* In, J1 * J2 * ...* Jn) -> (I1 * J1 * r1), (I2 * J2 * r1 * r2), ... (In * Jn * rn),其中r*为预设的秩。
      2. 思路上与三年前的LightRNN接近,但是LightRNN有一个用最小费用最大流求word reallocation的过程,本文缺失了这一过程,因此可能对初始词表的排布有一定要求。
    3. 显著降低了embedding的参数量,并将其应用于Transformer-XL,性能不降/略有提升。
    4. 在CTR任务上也有一定效果。
  16. Bi-BloSAN
    1. 此文是DiSAN原版人马做的拓展,试图将self-attention拓展至长文本。
    2. 将self-attention分解为局部和全局,先将文本分块,再依次进行intra-block self-attention和inter-block self-attention。
    3. 在SNLI和SQuAD上验证了有效性。
    4. 影响力不够大的原因:
      1. (主要)选择了DiSAN而不是Transformer作为backbone,名字不好读。
      2. 仍然是单层结构不能stack。
      3. SNLI句子平均长度只有14,没有必要节省self-attention的开销,效果相比DiSAN没有显著提升;SQuAD上性能与LSTM类似。
  17. Sparse Transformer
    1. 解决transformer应用于生成长序列开销大的问题。
    2. 对于image,每个像素attend当前行和当前列。
    3. 对于文本,首先将文本分成固定长度(stride)的块,第i个块中的第j个词attend第i个块中的前(j-1)个词和前i-1个块中的最后c(常数)个词。
    4. 时间复杂度为n sqrt(n),思路无比接近上文(citation is missing)。
    5. 对于>=1维的情形,提出了新的positional encoding: (i, j) -> e1(i) + e2(j)。
    6. 基于blocksparse,在tensorflow上有高效的实现。
  18. BP-Transformer
    1. 解决transformer应用于长文本开销大的问题。
    2. 维护log(n)个层次的表示:第k个层级的第i个节点建模[i*2^k, (i+1)*2^k)这个span,一共2n个节点。底层节点可用于词级别任务,顶层节点可用于分类。
    3. span级别节点直接attend词级别的表示,词级别的节点按照相对距离由近到远attend低层级到高层级的表示,计算复杂度为n log n,可用于长文本建模。
    4. 可同时用于单向和双向建模,在长文本的语言模型,分类和翻译上有着不错的性能。
    5. 由于引入了更多的节点(*2)增大了FFN上的开销,对于短文本速度没有优势。
  19. Compressive Transformer
    1. 为了建模长程依赖,Transformer-XL将当前segment的表示和上一个segment的表示作为memory。
    2. 此文认为把历史都压缩在上一个segment的表示中不妥,提出了维护一组memory和一组compressive memory,较远的memory压缩成compressive memory。
      1. 压缩的方式可以是各种花式conv/pooling。
    3. 提出了新的用于评测长序列建模的benchmark:PG-19,平均篇章长度达到69K。
  20. Reformer
    1. 同样试图解决transformer计算量过大的问题。
    2. query和key表达的含义有一定冗余,本文合并query和key(此处用qk来表示),这样attention score大的词对相应的qk的距离会更近。
    3. 使用local sensitive hashing来对qk分桶并排序,每个桶内只attend当前桶和之前的桶,减小attention的计算开销。
    4. 使用可逆网络降低显存开销(这是本文最漂亮的一个点)
      1. 普通的残差网络形式为y = x + f(x),无法从y中倒推出x。
      2. revnet的形式是y1 = x1 + f(x2),y2 = x2 + g(y1)
      3. 倒推可得x2 = y2 - g(y1), x1 = y1 - f(x2)
      4. 本文选择f为attention,g为ffn,并且声明此做法可以不降性能。
    5. 为什么可以降显存,因为不用存每层的activation——可以在backward的时候从更高层的activation中恢复出来(当然带来了一些额外的计算开销,速度变慢),因此显存占用几乎与layer数无关,不明白的可以去看Training Deep Nets with Sublinear Memory CostThe Reversible Residual Network: Backpropagation Without Storing Activations
    6. 在enwik8上性能离state-of-the-art有一定距离,那么reformer优势是什么呢?
      1. 在没有位置先验(比如集合,图,multi-agent)的数据类型上,LSH仍然可以work。以上提到的其它结构均依赖于locality bias,需要原数据有位置信息(比如图片,文字,语音)。
    7. 随着未来transformer越来越深,可逆网络的应用可能会成为趋势。(p.s. revnet的训练额外开销巨大,在框架对其优化之前不要对reformer的速度有什么期待)
  21. TODO: Jiatao的一系列新工作:depth-adaptive, disco, monotic multihead attention……

近年来改进transformer的工作层出不穷,此处只列举一些个人比较感兴趣的工作,如有疏漏,不吝赐教。

御币Soft 等 1076 人赞同了该回答

本教程来自复旦大学邱锡鹏教授报告《A Tutorial of Transformers》bilibili.com/video/BV1s

1 引子

  • 目前Transformer模型在深度学习各领域/任务上大放异彩:
  • Transformer模型的提出来源于2017年谷歌团队在NIPS上发表的论文
Vaswani, Ashish, et al. "Attention is All you Need." NIPS. 2017 :
  • 其基本结构如下图:
  • 本教程将围绕Transformer及其变种模型进行介绍:
  • 基础知识学习与本教程相关综述文章可参考如下:
Tianyang Lin, Yuxin Wang, Xiangyang Liu, Xipeng Qiu,A Survey of Transformers, arxiv.org/abs/2106.0455

2 Transformer背景

2.1 语言表示学习

  • 过去使用知识图谱(KG)结合一些规则来表述语言的含义
  • 现在使用词嵌入(word embedding)的方式,将词汇向量化。具有相似含义的词汇位于高维空间的邻近位置

2.2 NLP中的通用模型

  • 在自然语言处理(NLP)中,为了捕获词语间的上下文关系,一般会将一句话输入到设计的上下文编码器中,后接针对不同任务(例如:文本翻译、文本分类)所设计的模型,以解决具体问题。通用的模型结构如下图所示:
    • 大的方向有两个:①如何设计上下文编码器,此处被称为模型驱动;②如何合理利用数据计算模型参数,此处被称为数据驱动。

举一个具体的例子:序列到序列(Sequence-to-Sequence, Seq2Seq)的代表任务--翻译模型,通常采用如下图所示的结构:

  • 编码器学习一种语言(英文)某句话中的上下文信息;
  • 解码器结合另外一种语言(中文)右移动数据与编码器学习到的输入信息,预测输出。
    • 此处右移意为编码器在进行当前位置词翻译时,只能结合当前位置之前的预测输出,不能结合当前位置的输出,例如,在翻译"学"这个字的时候,只能结合"Machine Learning"与“机器”来进行翻译。


  • 模型训练结束后,若要对某句话进行翻译,则以自回归的方式多次运行解码器,依顺序预测每个位置的输出。
    • 例如,在对”Machine Learning“进行翻译时,模型根据”Machine Learning“与起始符"$",首先预测出"机"这个字。然后根据”Machine Learning“与"$机"预测出“机器”。依次循环直至预测出停止符号为止,完成语句翻译。

2.3 如何设计语言模型?

  • 结合自然语言的属性:
    • 序列性:一句话的本质为符号序列;
    • 层次性:长短语又短短语和词构成;
    • 递归:动词短语可能由好多级动词短语构成。


  • 以上属性导致语义的构成存在以下两个特点
    • 长程的依赖关系,如当句子比较长,句首/句尾词存在相关性;
    • 一词多义


  • 一词多义也可由上下文关系确定词的含义,所以语言模型的核心就是考虑长程的依赖关系。

2.3.1 在Transformer之前的主流神经网络模型

  • 在使用神经网络对可变长度向量序列进行建模时,可使用的模型如下:
    • 1)CNN,卷积网络具有层间局部连接的特点,导致其建模上下文关系时,范围受限(视觉中的感受野限制)。虽然可以堆叠层数,扩展上下文建模范围,但是深度网络会使得模型训练变得相对困难(梯度消失等)。
    • 2)RNN,循环网络在跨一层时,使得隐藏层可相互影响,理论上可对长序列进行建模。但是由于训练的困难(时间步上的梯度消失),导致其学习上下文信息范围受限。

2.3.2 如何直接建模长程依赖?

  • 返回到原始的全连接网络
  • (在教程中由全连接转向Transformer的思路)在传统的全连接网络学习完成后,参数是固定值,如果此时,某句话右移一个词(例如,句首添加一个词“啊”),可能句子本身意思并没有大的变化。但是如果还使用原来学习好的固定参数对右移后的句子进行预测时,权重和输入就会错位,产生错误的预测。为了解决这一问题,就需要动态地根据当前输入,生成网络权重,这种根据输入变化的动态权重即为注意力。
  • 注意力机制:此处所说的注意力为自注意力,计算包括以下两部分
    • 1)计算注意力分布 \boldsymbol {\alpha}
      \begin{aligned} \alpha_{n} &=p(z=n \mid \boldsymbol{X}, \boldsymbol{q}) \\ &=\operatorname{softmax}\left(s\left(\boldsymbol{x}_{n}, \boldsymbol{q}\right)\right) \\ &=\frac{\exp \left(s\left(\boldsymbol{x}_{n}, \boldsymbol{q}\right)\right)}{\sum_{j=1}^{N} \exp \left(s\left(\boldsymbol{x}_{j}, \boldsymbol{q}\right)\right)} \end{aligned}\\ ​ 其中 s\left(\boldsymbol{x}_{n}, \boldsymbol{q}\right) 为计算查询向量 \boldsymbol{q} 与每个位置相似度/相关程度的得分函数,可以是计算内积。
    • 2)使用注意力对输入进行加权平均
      \begin{aligned} \operatorname{att}(\boldsymbol{X}, \boldsymbol{q}) &=\sum_{n=1}^{N} \alpha_{n} \boldsymbol{x}_{n} \\ &=\mathbb{E}_{\boldsymbol{z} \sim p(z \mid \boldsymbol{X}, \boldsymbol{q})}\left[\boldsymbol{x}_{z}\right] \end{aligned}
  • 注意力计算图如下所示:

在语言模型中应用注意力机制

  • 计算“The”上下文表示的方法
  • 因计算注意力时没有使用出输入语句以外的信息,所以这种注意力被称为自注意力

Query-Key-Value (QKV) 模型

  • 进一步添加模型参数,扩充模型容量。实际使用的计算自注意力方法为:对输入向量序列,乘以线性矩阵(可学习参数)W_q,W_k,W_v分别生成每个位置的查询向量\boldsymbol{q}、键向量\boldsymbol{k}、值向量\boldsymbol{v}\bf Q, K作内积、归一化得到每个位置关于所有位置的注意力矩阵,然后乘以\bf V即得到输入序列经过自注意力后的序列表示。计算图如下所示:

多头自注意力(MHSA)

  • 自注意力跨层计算时,输入可以并行的经过几组注意力模型,再次扩充模型容量。一组注意力即称为一个"head",多组计算模式被称为多头自注意力Multi-head Self-Attention,模型结构如下图所示
  • 将自注意力机制堆叠多层后,即构成多层自注意力网络,如下图所示

3 Transformer

3.1 模型结构

  • Transformer即是基于自注意力构建的模型
    • 核心模块:自注意力
    • 除了自注意力模型还包括:
      • 位置表示
      • 层归一化
      • 残差/远跳连接
      • 逐位前馈神经网络
  • Transformer编码器如下图左所示:
    • 编码器子层1:输入语句经过嵌入表示变为向量序列,与位置编码相加,经过多头自注意力,残差连接&层归一化;
    • 编码器子层2:逐位置前馈神经网络(Transformer原文使用2层),残差连接&层归一化。
  • Transformer解码器如下图右所示
    • 输入部分与编码器相同,区别为计算注意力时,添加mask,屏蔽掉当前位置后面的位置(保持自回归性质);
    • 计算第二层解码器时,结合编码器输出作为\bf K V,以第一注意力层为\bf Q,后再接残差连接与层归一化,逐位前馈神经网络;
    • 最后接线性层与Softmax进行输出的预测。
    • 在模型使用方面:
      • 文本分类仅使用编码器;
      • 文本翻译使用整个模型;
      • 语言模型,预测后面的词汇仅使用解码器。

3.2 模型复杂度分析

  • 以下分析模型的两个主要模块,乘法计算次数与模型参数量
  • T为输入序列长度,D为模型维度(此处假设词向量维数与模型维数都是D,即W_q尺寸为D\times D)
  • Transformer原文的多头自注意力层在计算注意力矩阵的每个元素时,都进行了D次乘法(D维向量相乘)。注意力矩阵大小为T\times T,则进行的乘法次数为T^2\cdot D。模型参数为W_i^Q\in\mathbb{R}^{d_{model}\times d_k},W_i^K\in\mathbb{R}^{d_{model}\times d_k},W_i^V\in\mathbb{R}^{d_{model}\times d_v},W^O\in \mathbb{R}^{hd_v\times d_{model}},i=1,\dots,h,原文使用h=8头注意力,d_{model}=8*d_k=8*d_v=512W^O为多头注意力融合后的输出线性投影矩阵。计算自注意力参数量为4D^2
  • Transformer原文逐位线性层,使用先升高维度为4D再降低维度到D的两层网络。则对于T个位置共计算8T\cdot D^2次乘法,参数量为两个线性层的权重元素数8D^2
  • 对于短序列数据T\leq D,模型瓶颈由逐位前馈神经网络决定;
  • 对于长序列数据T>D,模型瓶颈由自注意力决定,从这里可以看出对于长序列Transformer模型复杂度为序列长度的平方,现阶段当序列长度大于512时,认为序列过长,使用Transformer就复杂度比较高了。
与其他神经网络模型复杂度对比
  • T为输入序列长度,D为数据维度,K为卷积核尺寸,则几种模型复杂度如下图所示:
  • 上表解释:当某层特征尺寸为(仅考虑单个样本)[1,T,D],要求经过神经网络一层后特征尺寸不变。
    • 使用全连接网络(FFN)时,跨层特征都具有连接,参数尺寸为[DT,DT],乘法次数为T^2\cdot D^2
    • 使用卷积网络(CNN)时,每个卷积核都要对T个位置进行KD次乘法,共有D个卷积核,总乘法次数为K\cdot T\cdot D^2
    • 使用循环神经网络(RNN)时,对T个时间步,每步进行D\times D次乘法(全连接),总乘法次数为T\cdot D^2
    • 可并行化操作方面:自注意力、全连接、卷积都可并行操作,时间复杂度为\mathcal O(1),对于循环神经网络则需要在每个时间步上依次运算,模型不具有并行性,时间复杂度为\mathcal{O}(T);
    • 全局感受野所需网络层数:对于自注意力、全连接网络,跨一层后的特征来源于上一层所有特征的融合,具有单层网络就全局感受野;对于卷积网络,跨一层后的特征,最多可以感受上一层的K个位置特征,假设经过n层可获得全局感受野,则K^n=T,即所需n=\log_K(T)层;对于循环神经网络,此处理解是,跨一个时间步为一层,对整个序列建模需要T层网络。


  • 自注意力的优点:
    • 具有全局感受野,不用像CNN那样叠很多层才能完整获取输入信息。跨一层连接即可融合全局特征,适合建模长序列;
    • 比RNN并行性好,适合发挥GPU并行计算能力;
  • 自注意力的缺点:自注意力矩阵所带来的的序列长度平方复杂度。


与其他模型结构上的对比

CNN:局部连接与参数共享(平移不变性)

RNN:时间维上共享参数;依赖Markov结构(常见为一阶马尔科夫)

Transformer:无结构先验信息(小数据集上容易过拟合);排序不变性,为了建模语句中词语出现的先后顺序,需要引入位置编码。

Transformer与图神经网络:Transformer:可看成是一个全连接的有向图网络(带有自身节点的连接);并且连接关系完全由数据驱动给出。

4 Transformer变种模型

因Transformer强大的性能,它被用于许多任务上。并且在改进模型结构,提升计算效率方面有一些工作,这些内容包括在以下三个方面:

  • 1)在提升模型计算效率方面,使用轻量化的注意力(例如稀疏注意力),或者将长文档输入切分为几个片段,分别学习,然后组合。
  • 2)在模型泛化方面,原始模型在小数据集上容易过拟合,有一些工作是在模型中引入一些正则化,例如加入卷积结构;或是使用预训练方式,在大数据集上先预训练,然后迁移到下游任务上微调。
  • 3)在模型自适应方面,修改Transformer解决其他任务,如对社交网络、知识图谱类数据进行建模。


本教程中,分别对变种模型按照其改进方法分为以下几类:

  • 1)针对模块级进行修改:FFN、归一化、注意力、位置编码
  • 2)对模型整体架构进行修改
  • 3)预训练模型
  • 4)任务迁移
  • 各变种模型提出时间:


5 模块级改进

5.1 自注意力部分

  • 自注意力机制是Transformer模型的核心,但是其拥有复杂度,不便于处理长序列。教程中首先介绍了降低自注意力计算复杂度的相关工作。

5.1.1原子级的稀疏注意力模式:

  • global:另外加两个虚拟位置(token或像素),跨层计算时,新加位置与全局所有节点都有连接,只计算与新加位置连接的注意力。通过2层自注意力,则所有节点可认为是互相连接的,如下图(a);
  • band:只计算注意力矩阵的主对角线附近值,即认为上下文关系只包含相邻位置(与CNN类似,但此处权值不共享),如下图(b)所示;
  • dilated:只计算注意力矩阵的主对角线附近值,与上一种情况类似,此处认为上下文关系只包含附近的间隔位置(类比膨胀卷积),如下图(c)所示;
  • random:随机的只计算自注意力矩阵上的一些位置,某种意义上,这种结构也可被认为单层网络就具有全局感受野,如下图(d)所示;
  • block local:只计算自注意力矩阵主对角线块内元素,即认为上下文关系是分块的、局部的,如下图(e)所示;
  • 近些年提出的一些稀疏注意力模型即是将上述几个基础模式进行组合,一些代表模型如下:
  • 教程中选择上图第一个模型Star Transformer进行介绍,其引入额外的全局节点并且稀疏化了节点之间的连接,稀疏前后的图对比如下所示:
    • 复杂度方面,因为此处考虑的都是长序列L>D的情况,计算量集中在全局节点上,一个全局节点与T个节点相连接,每条边(因为本质是有向图)上要计算2D次乘法,总的复杂度为\mathcal{O}(2TD)
    • 因为施加了先验的局部稀疏化连接,模型不需要额外的位置表示;同时稀疏连接降低了模型复杂度,适合小数据集。
  • BERT证明即使没有稀疏化注意力,额外的全局节点对Transformer也是有益的。
Qipeng Guo, Xipeng Qiu, Pengfei Liu, Yunfan Shao, Xiangyang Xue, Zheng Zhang. Star-Transformer, NAACL 2019, arxiv.org/pdf/1902.0911

5.1.2 另外三种比较复杂的稀疏注意力模型

  • BPT:二分Transformer,对相邻节点进行细粒度(低语义级)关注,对较远节点进行粗粒度(高语义级)关注,如下图(a)
  • Zihao Ye, Qipeng Guo, Quan Gan, Xipeng Qiu, Zheng Zhang. BP-Transformer: Modelling Long-Range Context via Binary Partitioning, arxiv.org/abs/1911.0407
    微软新提出的 Focal Self-Attention(FSA)基本和这个原理一样,是搬到图像上做的arxiv.org/abs/2107.0064

  • block local (2D):对于图像类数据,进行类似于卷积操作的局部关注,如下图(b)
  • axial (2D):仅对某位置进行全局关注,如下图(c)

5.1.3 基于内容的稀疏注意力

  • 使用一些低计算复杂度的方法,过滤出具有高相似度键-值对Reformer (Kitaev et al., ICLR 2020) 中使用的是局部敏感哈希LSH,对token进行分类排序,然后在同类内进行前向attend,如下图所示:

5.1.3 基于内容的稀疏注意力

  • 使用一些低计算复杂度的方法,过滤出具有高相似度键-值对Reformer (Kitaev et al., ICLR 2020) 中使用的是局部敏感哈希LSH,对token进行分类排序,然后在同类内进行前向attend,如下图所示:
  • Routing Transformer (Roy et al., TACL 2020) 则是对键值对进行聚类,同类别的注意力都用聚类中心计算出的注意力

5.1.4 线性化的注意力

  • 原模型中计算注意力时,乘法运算次数为\mathcal{O}(T^2),为序列长度平方复杂度。现改为先计算\bf K,V的内积(将softmax换成两个非线性函数\phi(\cdot)的内积),再与\bf Q相乘,计算复杂度就会线性化变为\mathcal{O}(T)。如下图所示(右上此处应该也是\mathcal{O}(T^2)):

此处以Performer模型为例,此处将原始softmax后的自注意力矩阵,看成是经过kernel trick计算出的内积,并且人工构造出基函数将其拆分开。

\mathrm{K}(\mathbf{x}, \mathbf{y})=\mathbb{E}\left[\phi(\mathbf{x})^{\top} \phi(\mathbf{y})\right]\\, 下图的L为上文中的序列长度T > Choromanski K, Likhosherstov V, Dohan D, et al. Rethinking attention with performers. arXiv preprint arXiv:2009.14794, 2020 $$

5.1.5 选取代表性query的方法

对查询向量聚类,选取一些具有代表性的值计算自注意力,对于没有计算到得了查询-键对复用代表性的注意力值或使用均匀分布,如下图。

  • 代表模型为Clustered Attention (Vyas et al., 2020)与Informer (Zhou et al., AAAI 2021)
  • Informer中的基本假设是:如果某些query产生了均匀分布的自注意力,则对这些query计算注意力是冗余的。(可以结合图模型进行理解,均匀的注意力意思是当前节点的值要替换为所有节点的平均值,这种替换会掩盖掉原始数据特征,不利于模型训练)
  • Informer中计算注意力矩阵某行最大值与平均值的差距,用来衡量这行注意力是否为冗余的\bar{M}\left(\mathbf{q}_{i}, \mathbf{K}\right)=\max _{j}\left\{\frac{\mathbf{q}_{i} \mathbf{k}_{j}^{\top}}{\sqrt{d}}\right\}-\frac{1}{L_{K}} \sum_{j=1}^{L_{K}} \frac{\mathbf{q}_{i} \mathbf{k}_{j}^{\top}}{\sqrt{d}}
  • 此处有个疑问是:在模型训练初始阶段,\bf Q,K,V都是接近随机值,此时的注意力矩阵也接近随机,如何衡量是否冗余。

5.1.5 选取代表性key的方法

与上一点相对应的是选取代表性key(压缩key的数量)的方法,代表模型为

  • Memory Compressed Attention (Liu et al., ICLR 2018) 卷积压缩
  • Set Transformer 引入全局节点
  • Linformer 线性变换压缩
  • Poolingformer (Zhang et al., ICML 2021) 池化窗口压缩

模型举例: 以Memory Compressed Attention (MCA) 为例

Peter J. Liu, Mohammad Saleh, Etienne Pot, Ben Goodrich, Ryan Sepassi, Lukasz Kaiser, and Noam Shazeer. Generating Wikipedia by SummarizingLong Sequences, ICLR 2018

使用带步长的卷积压缩\bf K,V的长度。

5.1.6 自注意力矩阵的性质

  • 另外一个点是:Transformer原模型自注意力矩阵通常是低秩的假设(T>D),因为T\times T的自注意力矩阵是由两个T\times DD\times T矩阵乘积得来。这里或许可以将自注意力矩阵进行低秩+稀疏表示,也可以缩减模型复杂度。
  • 从语言学的角度理解自注意力矩阵的性质:
    • 稀疏性:直接上讲,L的单词所组成的句子,词语之间的依赖关系应该远小于L^2;
    • 局部性:绝大多数单词的关系都是局部性的;
    • 低秩性:词语间的长程依赖关系常以多对一的情形出现,例如语句中的中心词汇与其他词关系较强。剩余词关系较弱。


  • 检查预训练模型中自注意力矩阵的性质
    • 对BERT模型在SNLI数据集上训练结果的自注意力矩阵进行统计结果如下:
      • 下图(a)大部分矩阵是低秩稀疏的;图(b), (c)显示随着序列增长,自注意力矩阵秩增加、稀疏度增加(图上稀疏度指标越低,矩阵越稀疏)
  • 将以上分析纳入对原模型自注意力矩阵的限制上,使用低秩与局部关注约束注意力矩阵,构造低秩的Transformer:
Qipeng Guo, Xipeng Qiu, Xiangyang Xue, Zheng Zhang. Low-Rank and Locality Constrained Self-Attention for Sequence Modeling, IEEE/ACM Transactions on Audio, Speech, and Language Processing, 2019,12. ieeexplore.ieee.org/doc
  • 结合先验信息的注意力矩阵,代表性工作有以下几类:
    • 1)建模局部性:在某些attention点上,添加高斯分布平滑注意力
      • Local Transformer (Yang et al., 2018)
      • Gaussian Transformer (Guo et al., 2019)


    • 2)先验来自于浅层注意力:在当前层复用其层注意力,类似于GCN谱方法不同层信息交互都是使用重整化图拉普拉斯矩阵
      • Predictive Attention Transformer (Wang et al., 2020)
      • RealFormer (He et al., 2020)
    • 3)任务相关的先验
      • Conditionally Adaptive Multi-Task Learning (Pilault et al., ICLR2021)


    • 4)只用先验注意力
      • 均匀分布:Average Attention Network (Zhang et al., ACL 2018)
      • 高斯分布:Hard-Coded Gaussian Attention (You et al., ACL 2020)
      • 可学习的:Random Synthesizer (Tay et al., ICML 2021)
  • 模型举例:以Local Transformer为例,在每个query计算的注意力基础上添加一个高斯分布,然后再归一化,
    • G_{i j}=-\frac{\left(j-p_{i}\right)^{2}}{2 \sigma^{2}}

5.1.7 改进多头机制的方法

  • 1)建模多头之间的行为:为了避免多个头学到相同的注意力,在模型中添加正则化方法,鼓励同层多头注意力多样化
    • Li et al., Multi-Head Attention with Disagreement Regularization, EMNLP 2018
    • Talking-head Attention (Sukhbaatar et al., 2020)
    • Collaborative multi-head Attention (Cordonnier et al., 2020)


  • 2)自适应注意力范围:
    • Adaptive Attention Span (Sukhbaatar, ACL 2019)
    • Multi-scale Transformer (Guo et al., AAAI 2020)
  • 3)动态路由机制聚合多头信息
    • Li et al., Information Aggregation for Multi-Head Attention with Routing-by-Agreement, NAACL 2019
    • Gu and Feng, Improving Multi-head Attention with Capsule Networks, NLPCC 2019


  • 4)其他的一些改进
    • Multi-query Attention (Shazeer, 2019):为了提升计算效率,多头之间共享键-值对;
    • Bhojanapalli et al., Low-Rank Bottleneck in Multi-head Attention Models, ICML 2020: establish that head dimension should be decoupled from the number of heads。

模型举例:Multi-scale Transformer,

  • 在注意力模型中,有的注意力关注上一层的局部特征(下图A,类似卷积窗口),有的关注上一层的所有特征(下图B)对应建模长程依赖关系。
  • 对BERT模型训练结果注意力关注范围进行统计:
    • 从下图(a)可以看到,有的头(head 2,3)更多关注局部信息,有的头(head 1)则局部、全局特征都关注;
    • 从下图(b)可以看到,第1层的注意力更多关注局部信息,第6层、12层中,关注局部的头比例会下降。
  • 可将以上信息作为先验引入到模型设计中,在同层上配置不同比例的局部/全局头,在不同层上设计不同关注范围的头。
    • 例如,随着网络的走向深层,局部关注范围的头数量减小,全局关注范围的头数量增加

5.2 位置编码部分

在Transformer模型的自注意力部分,只关注了数据的内容信息,没有关注数据中的位置、顺序信息。例如,一句话中词语交换位置,句子含义可能发生显著变化,为了引入token的位置信息,在原始的模型中,使用的是人工设计、根据位置计算出的正余弦编码。下面介绍关于位置编码的改进相关工作。

  • 1)绝对位置
    • 固定正弦编码(原始模型)
    • 可学习的位置编码(BERT)
    • 可学习的正弦编码
  • 2)相对位置
    • Shaw et al., 2018
    • Transformer-XL
    • T5
  • 3)其他表示:考虑旋转不变性等
    • TUPE
    • Roformer
  • 4)隐含的表示:引入CNN/RNN等具有位置信息的模型
    • 复杂编码
    • R-Transformer
    • CPE

模型举例:Transformer-XL 相对位置编码,在原有\boldsymbol{q,k}计算注意力的基础上,引入相对位置编码\boldsymbol{R}_{i-j}并且添加一些参数矩阵\boldsymbol{W}

Zihang Dai, Zhilin Yang, Yiming Yang, Jaime Carbonell, Quoc Le, and Ruslan Salakhutdinov. Transformer- XL: Attentive Language Models beyond a Fixed-Length Context. ACL 2019

模型举例:Roformer 对query和key乘以旋转位置编码,使得模型编码绝对位置信息,但具有平移不变性

Jianlin Su, Yu Lu, Shengfeng Pan, Bo Wen, and Yunfeng Liu. RoFormer: Enhanced Transformer with Rotary Position Embedding. 2021. arXiv:2104.09864

5.3 层归一化部分

  • 1)层归一化(LN)的位置(区别如上图)
    • Pre-LN:训练更加稳定
    • Post-LN:训练可能会发散,需要学习率的热启动(warm-up),收敛时,性能更好
  • 2)替换LN的方法
    • 自适应归一化:AdaNorm
    • 放缩的\ell_2归一化
    • PowerNorm(PN)
  • 3)无需归一化的Transformer
    • ReZero-Transformer

模型举例:ReZero-Transformer 在残差连接中添加一个0初始化参数\alpha,可加快模型收敛速度,能够训练深层模型(128层)

Thomas Bachlechner, Bodhisattwa Prasad Majumder, Huanru Henry Mao, Garrison W. Cottrell, and Julian J. McAuley. ReZero is All You Need: Fast Convergence at Large Depth. 2020

5.4 逐位前馈神经网络

  • 1)激活函数
    • ReLU, GELU (Gaussian Error Linear Unit), GLU (Gated Linear Unit)
  • 2)增大FFN模型容量
    • Product-key memory layer (Lample et al., NeurIPS 2019)
    • Mixture-of-Experts (Gshard, Switch Transformer, Hash Layer)
  • 3)删去FFN
    • all-Attention layer (Sukhbaatar et al., 2019): 将FFN融入注意力模块
    • Yang et al., On the Sub-layer Functionalities of Transformer Decoder, finding of EMNLP 2020: 指出在编解码Transformer中解码器的FFN可删去,也不会影响性能

模型举例:Product-key memory使用key, value为参数的模块替换原模型中的FFN

Guillaume Lample, Alexandre Sablayrolles, Marc’Aurelio Ranzato, Ludovic Denoyer, and Hervé Jégou. Large Memory Layers with Product Keys. NeurIPS 2019

6 模型整体架构的改进

6.1 轻量化变种

  • Light Transformer (Wu et al., ICLR 2020) :将自注意力替换为卷积与注意力的组合
  • Funnel Transformer :对输入序列长度降采样,处理后再上采样回原长度
  • DeLighT:简化了注意力与FFN
  • 模型举例:在输入时对数据进行DeLighT transformation,先升维,再降维。在FFN中则改为先降维再升维,减小了FFN参数量。与原模型对比如下图
Sachin Mehta, Marjan Ghazvininejad, Srinivasan Iyer, Luke Zettlemoyer, and Hannaneh Hajishirzi. 2020. DeLighT: Very Deep and Light-weight Transformer. arXiv:2008.00623

6.2 基本模块之间的连接

  • Realformer, Predictive Attention Transformer: 不同层上复用注意力信息
  • Transparent Attention: 每层编码器输出都与解码器相连(原模型只有编码器最后一层的输出与解码器连接)
  • Feedback Transformer: 添加从上层到下层的信息传输路径
  • 模型举例:Transparent Attention 将每层编码器输出加权求和,送入解码器。(相当于多了跨层路径,利于梯度反向传播)
Ankur Bapna, Mia Chen, Orhan Firat, Yuan Cao, and Yonghui Wu. Training Deeper Neural Machine Translation Models with Transparent Attention. EMNLP 2018


6.3 自适应计算时间

  • 设计一些条件判断结构,自适应的选择是否使用某些模块

模型举例:Universal Transformer 在模块循环迭代时,添加了动态终止条件


6.4 循环与分层

此处介绍的模型思路是将长序列分割为多个短序列,进行分别处理,然后基于表示缓存整合信息

代表模型包括

  • Dai et al., Transformer-XL: Attentive Language Models beyond a Fixed-Length Context, 2019
  • Rae et al., Compressive Transformers for Long-Range Sequence Modelling, 2020
  • Wu et al., Memformer: The Memory-Augmented Transformer, 2020
  • Yoshida et al., Adding Recurrence to Pretrained Transformers for Improved Efficiency and Context Size, 2020

模型举例:Transformer-XL在训练阶段,每个片段分别进行学习,下一个片段的会关注上一个片段的信息;测试阶段注意力路径如下图绿色线所示。通过分片段的学习,可使得Transformer学习非常长的序列表示。

Zihang Dai, Zhilin Yang, Yiming Yang, Jaime Carbonell, Quoc Le, and Ruslan Salakhutdinov. Transformer- XL: Attentive Language Models beyond a Fixed-Length Context. ACL 2019


Compressive Transformer 与Transformer-XL类似,此处是将之前片段的表示压缩到记忆单元中,在进行新的片段表示学习时,直接关注压缩记忆内容,使得模型当前可以关注到更早的片段信息。

Jack W. Rae, Anna Potapenko, Siddhant M. Jayakumar, Chloe Hillier, and Timothy P. Lillicrap. Compressive Transformers for Long-Range Sequence Modelling. ICLR 2020


  • 层次化 Hierarchical Transformers 分别使用不同 Transformer对不同片段进行表示学习,然后对这些表示继续使用Transformer学习,构成如下金字塔结构。代表模型为:
    • HIBERT (Zhang et al., ACL 2019)
    • TENER (Yan et al., 2019)
    • Transformer in Transformer (Han et al., 2021)

模型举例:HIBERT

Xingxing Zhang, Furu Wei, and Ming Zhou. HIBERT: Document Level Pre-training of Hierarchical Bidirectional Transformers for Document Summarization. ACL 2019


6.5 替代模型:

自注意力+前馈神经网络的结构是最优的吗?此方面代表模型为:

  • 神经网络架构搜索(NAS):Evolved Transformer; DARTSformer
  • 结构顺序重排:Sandwich Transformer
  • 神经ODE:Macaron Transformer

模型举例:Evolved Transformer 搜索出的神经网络结构,在一些任务上性能高于原始模型

7 预训练模型

  • Transformer没有结构性的归纳偏置,使得其容易在小数据集上过拟合。避免过拟合的方法之一是使用预训练模型。知名的NLP预训练模型包括:
    • 只训练编码器:BERT, RoBERTa, BigBird
    • 只训练解码器:GPT系列
    • 编码器解码器:BART, T5, Switch Transformer


  • 按照预训练模型是否与上下文相关、模型架构、预训练方式,这些模型可按照下图方式分类
  • 一些扩展预训练模型:
Pre-trained Models for Natural Language Processing: A Survey, arxiv.org/abs/2003.0827


模型举例:BERT只训练Transformer的编码器,自从BERT出现后,Transformer成为NLP预训练模型的主体结构。BERT基于以下两种自监督学习方式训练:

  • 带掩膜的语言模型(MLM)
  • 下句话的预测(NSP)
Jacob Devlin, Ming-Wei Chang, Kenton Lee, and Kristina Toutanova. BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding. HLT-NAACL 2019


GPT只训练Transformer的解码器,训练基于完成语言建模任务--最大化数据似然

Alec Radford, Karthik Narasimhan, Tim Salimans, and Ilya Sutskever. Improving language understanding by generative pre-training. 2018


T5训练完整的Transformer,也是基于预测屏蔽掉输入语句中的词汇

Colin Raffel, Noam Shazeer, Adam Roberts, Katherine Lee, Sharan Narang, Michael Matena, Yanqi Zhou, Wei Li, and Peter J. Liu. 2020. Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer. arXiv:1910.10683


8 其他领域应用

  • 自然语言处理NLP Transformer, BERT, Compressive Transformer, TENER, FLAT
  • 计算机视觉CV Image Transformer, DETR, ViT, Swin Transformer, ViViT
  • 音频Audio Speech Transformer, Streaming Transformer, Reformer-TTS, Music Transformer
  • 多模态Multimodal VisualBERT, VLBERT, VideoBERT, M6, Chimera, DALL-E, CogView


8.1 Vision Transformer (ViT)

  • 把图像拆分为16x16的小块,每个小块当成一个token,使用Transformer对图像进行表示学习,在不同图像任务上都去得了不错的进展。
Dosovitskiy, Alexey, et al. "An image is worth 16x16 words: Transformers for image recognition at scale." arXiv preprint arXiv:2010.11929 (2020)


8.2 MusicBERT

  • 输入数据的一些特征,作线性变换后接位置编码,之后使用Transformer对音乐信号进行表示学习。
Zeng, Mingliang, et al. "MusicBERT: Symbolic Music Understanding with Large-Scale Pre-Training." arXiv preprint arXiv:2106.05630 (2021).


8.3 NLP 命名实体识别NER

  • 识别句子中词的词性、类别需要关注词与词之间的有向距离,例如,Inc.之前很可能是某组织名字,in后很可能是时间或地点。

对Transformer模型的两点观察:

  • 1)原模型的位置编码不能反映有向距离;
  • 2)原模型的注意力被平滑以关注更多词汇,但在NER中,稀疏注意力可能是更合适的。

模型举例:TENER提出带有方向性的位置编码方式

  • R_{t}, R_{-t}=\left[\begin{array}{c} \sin \left(c_{0} t\right) \\ \cos \left(c_{0} t\right) \\ \vdots \\ \sin \left(c_{\frac{d}{2}-1} t\right) \\ \cos \left(c_{\frac{d}{2}-1} t\right) \end{array}\right],\left[\begin{array}{c} -\sin \left(c_{0} t\right) \\ \cos \left(c_{0} t\right) \\ \vdots \\ -\sin \left(c_{\frac{d}{2}-1} t\right) \\ \cos \left(c_{\frac{d}{2}-1} t\right) \end{array}\right]
  • 去掉注意力矩阵对维度的归一化\sqrt{D_k},以使得注意力更加sharp
  • 模型结构如下图:
  • 结果如下
Hang Yan, Bocao Deng, Xiaonan Li, Xipeng Qiu. TENER: Adapting Transformer Encoder for Named Entity Recognition, arxiv.org/abs/1911.0447


在视频讲座中还列举了一些Transformer的其他应用:

  • 中文NER
  • 与知识图谱结构化数据结合: Word-knowledge Graph
    • Tianxiang Sun, Yunfan Shao, Xipeng Qiu, Qipeng Guo, Yaru Hu, Xuanjing Huang, Zheng Zhang, CoLAKE: Contextualized Language and Knowledge Embedding, COLING 2020, arxiv.org/abs/2010.0030
  • 多模态应用:VL-BERT

9 总结

  • 本短教程综述文章中对Transformer变体模型的分类总结
  • 未来方向:
    • 深度学习模型发展历史: CNN \rightarrow RNN \rightarrow Transformer \rightarrow ?
    • 目前对于Transformer改进工作包括
      • 计算效率
      • 突破序列长度限制
      • 避免过拟合
      • 预训练模型
    • 未来可能的研究方向
      • Transformer模型容量显著高于CNN/RNN,关于其理论解释有待研究
      • 替代模型
      • 通用的多模态模型
  • 最后在视频中邱老师还介绍了他们组开源的中文自然语言处理框架fastNLP

\Large \text{ Make Transformer Great Again!} \\

本教程链接

bilibili.com/video/BV1s


本教程slides

valser.org/webinar/slid

欢迎关注“深度无监督学习”

真诚赞赏,手留余香
还没有人赞赏,快来当第一个赞赏的人吧!
398 人赞同了该回答

Transformer,还是有很大让人印象深刻的魔改方案的。

之前有过一些总结,在这里回答一下,

(一)Attention 以及 Self-Attention

1.Attention

  • 是神经网络中的一种机制:模型可以通过选择性地关注给定的数据集来学习做出预测。Attention的个数是通过学习权重来量化的,输出则通常是一个加权平均值。

2.Self-Attention

  • 是一种注意机制,模型利用对同一样本观测到的其他部分来对数据样本的剩下部分进行预测。从概念上讲,它感觉非常类似于non-local的方式。还要注意的是,Self-attention是置换不变的;换句话说,它是对集合的一种操作。

而关于attention和self-attention存在非常多的形式,我们之前常见的Transformer是依赖于scaled-dot-product的形式,也就是:给定query矩阵Q, key矩阵K以及value矩阵V,那么我们的输出就是值向量的加权和,其中,分配给每个值槽的权重由Quey与相应Key的点积确定。

(二)Multi-Head Self-Attention

multi-head self-attention是Transformer的核心组成部分,和简单的attention不同之处在于,Multihead机制将输入拆分为许多小的chunks,然后并行计算每个子空间的scaled dot product,最后我们将所有的attention输出进行拼接。

(三)Transformer

Transformer,很多时候我们也称之为"vanilla Transformer", 它有一个encoder-decoder的结构,decoder的Transformer可以在语言建模的时候获得非常好的效果。

Encoder-Decoder结构

Encoder生成一个基于attention的表示,能够从一个大的上下文中定位一个特定的信息片段。它由6个身份识别模块组成,每个模块包含两个子模块、一个multihead self-attention和一个point-wise全连接前馈网络。

按point-wise来说,这意味着它对序列中的每个元素应用相同的线性变换(具有相同的权重)。这也可以看作是滤波器大小为1的卷积层。每个子模块都有一个剩余连接和layer normalization。所有子模块输出相同维度的数据。

Transformer的decoder功能是从encoder的表示中抽取信息。该结构与encoder非常相似,只是decoder包含两个多头注意子模块,而不是在每个相同的重复模块中包含一个。第一个多头注意子模块被屏蔽,以防止位置穿越。

Positional Encoding

因为self-attention操作是permutation不变的,所以使用正确的位置编码是非常重要的,此处我们使用如下的位置编码来提供order信息,位置编码,我们可以直接将它们加入到我们到vanilla Transformer中,

  • (2).Learned positional encoding,对每个学习得到对列向量,对每个绝对位置进行编码。

辅助Loss

为了取得更好的效果,我们一般会加入辅助loss,

  • 除了在序列末尾只生成一个预测之外,还要求每个immediatge位置能做出正确的预测,迫使模型预测给定的较小上下文(例如,上下文窗口开头的前几个tokens)。
  • 每个中间Transformer也用于进行预测。随着训练的进行,较低层的权重对总损失的贡献越来越小。
  • 序列中的每个位置可以预测多个目标,即,对未来token的两个或多个预测。

(四)ACT(Adaptive Computation Time)

Adaptive Computation Time是一种动态决定递归神经网络需要多少计算步骤的机制

最终状态和输出的mean-field的update:

避免对每个输入进行不必要的思考,ACT增加了ponder cost

用此来鼓励中间计算步骤的小的次数。

(五)Improved Attention Span

提高Attention Span的目的是使可用于self-attention的上下文更长、更有效、更灵活。

1. Longer Attention Span(Transformer-XL)

vanilla Transformer有一个固定的和有限的注意广度。在每个更新步骤中,该模型只能处理同一段中的其他元素,并且没有任何信息可以在分离的固定长度段之间流动。也就是说层数固定不够灵活,同时对于算力需求非常大,导致其并不适合处理超长序列。

这种context segmentation会导致几个问题:

  • 模型不能捕获非常长期的依赖关系;
  • 在没有上下文或上下文很薄的情况下,很难预测每个片段中的前几个tokens。
  • 评估是昂贵的。每当segment右移一位时,新的segment就会从头开始重新处理,尽管有很多重叠的tokens。

Transformer-XL解决来上下文的segmentation问题:

  • 对于segments之间的隐藏状态进行重复使用;
  • 使用位置编码使其适用于重新使用的states;

Hidden state Reuse:

key和value依赖于扩展的隐藏状态,同时query仅仅只依赖于当前步的隐藏状态,是序列长度的维度的concatenation操作。

2. Relative Positional Encoding

为了处理这种新的attention span的形式,Transformer-XL提出了一种新的位置编码。如果使用相同的方法对绝对位置进行编码,则前一段和当前段将分配相同的编码,这是不需要的。

3. Adaptive Attention Span

Transformer的一个关键优势是能够捕获长期依赖关系。根据上下文的不同,模型可能更愿意在某个时候比其他人更进一步地注意;或者一个attention head可能有不同于另一个attention head的注意模式。如果attention span能够灵活地调整其长度,并且只在需要时再往回看,这将有助于减少计算和内存开销,从而在模型中支持更长的最大上下文大小(这就是Adaptive Attention Span的动机)。

后来Sukhbaatar等人提出了一种self-attention机制以寻找最优的attention span,他们假设不同的attention heads可以在相同的上下文窗口中赋予不同的分数,因此最优的span可以被每个头分开训练。

soft mask函数应用于注意权重中的softmax元素:

在具有自适应注意广度的Transformer实验中,Sukhbatar等人发现了一个普遍趋势,即较低层不需要很长的注意广度,而较高层的一些attention heads可能会使用非常长的注意广度。适应性attention span有助于大大减少失败的次数,特别是在一个有许多注意层和大上下文长度的大模型中。

4. Localized Attention Span (Image Transformer)

Transformer最初用于语言建模。文本序列是一维的,具有明确的时间顺序,因此attention span随着上下文大小的增加而线性增长。

然而,如果我们想在图像上使用Transformer,我们还不清楚如何定义上下文的范围或顺序。Image Transformer采用了一种图像生成公式,类似于Transformer框架内的序列建模。此外,图像Transformer将self-attention span限制在局部邻域内,因此模型可以放大以并行处理更多的图像,并保持可能性损失可控。

encoder-decoder架构保留用于image-conditioned生成:

  • encoder生成源图像的上下文化的每像素信道表示;
  • decoder自回归地生成输出图像,每个时间步每像素一个通道。
  • (1).1D Local Attention:输入图像按光栅扫描顺序(即从左到右、从上到下)展平。然后将线性化后的图像分割成不重叠的查询块。上下文窗口由与相同的查询块中的像素和在此查询块之前生成的固定数量的附加像素组成。
  • (2).2D Local Attention:图像被分割成多个不重叠的矩形查询块。查询像素可以处理相同内存块中的所有其他像素。为了确保左上角的像素也可以有一个有效的上下文窗口,内存块将分别向上、左和右扩展一个固定的量。

(六)Less Time and Memory Cost

如何减少计算和内存的消耗。

1. Sparse Attention Matrix Factorization (Sparse Transformers)

  • 一般Transformer的计算和存储开销随序列长度呈二次增长,因此很难应用于很长的序列。

Sparse Transformer

引入分解的self-attention,通过稀疏矩阵分解,我们可以将训练上百层的dense的attention网络,这样序列长度就可以到达16384.

Sparse Factorized Attention

Sparse Transformer提出了两类分解的attention,

Use Factorized Self-Attention in Transformer

存在三种方式使用sparse factorized attention模式的方法:

稀疏Transformer还提出了一套改进方案,将Transformer训练到上百层,包括梯度检查点、在backward pass的时候重新计算attention和FF层、混合精度训练、高效的块稀疏实现等。

2. Locality-Sensitive Hashing (Reformer)

Reformer模型旨在解决Transformer中的下面几个痛点:

  • 具有N层的模型中的内存比单层模型中的内存大N倍,因为我们需要存储反向传播的activations。
  • 中间FF层通常相当大。
  • 长度为L的序列上的注意矩阵通常在记忆和时间上都需要O(L*L)的内存和时间;

Reformer进行了两种改变:

Locality-Sensitive Hashing Attention

Reversible Residual Network

Reversible Residual Network的动机是设计一种结构,使任何给定层的激活都可以从下一层的激活中恢复,只需使用模型参数。因此,我们可以通过在backprop期间重新计算激活来节省内存,而不是存储所有激活。

(七)Make it Recurrent (Universal Transformer)

Universal Transformer将Transformer中的自我注意与RNN中的循环机制结合起来,旨在受益于Transformer的长期全局receptive field和RNN的学习inductive偏差。

Universal Transformer使用自适应计算时间动态调整步长。如果我们固定步数,一个通用变换器就相当于一个多层变换器,具有跨层共享的参数。

在较高的层次上,Universal Transformer可以看作是学习每个token的隐藏状态表示的递归函数。递归函数在标记位置之间并行演化,位置之间的信息通过self-attention进行共享。

Transition(·)可以是一个 separable convolution或者fully-connected neural network。

在Universal Transformer的自适应版本中,循环步数由ACT动态确定。每个位置都配有一个动态停止机制。一旦每令牌循环块停止,它将停止进行更多的循环更新,而只是将当前值复制到下一步,直到所有块停止或直到模型达到最大步长限制。

(八)Stabilization for RL (GTrXL)

Self-attention避免了将整个过去压缩成一个固定大小的隐藏状态,并且不像RNN那样受到梯度消失或爆炸的影响。强化学习任务肯定能从这些特质中受益。然而,即使在有监督学习中,也很难训练Transformer,更不用说在RL环境中了。毕竟,稳定和训练一个LSTM代理本身可能是相当具有挑战性的。

Gated Transformer-XL (GTrXL)是使用Transformer到RL中的一次尝试,GTrXL可以在Transformer-XL上成功稳定的训练。

  • layer normalization应用于residual模块中的输入流,而不应用于shortcut流。这种重新排序的一个关键好处是允许原始输入从第一层流到最后一层。
  • Residual连接被GRU样式选通机制取代。
真诚赞赏,手留余香
还没有人赞赏,快来当第一个赞赏的人吧!
刘斯坦 等 91 人赞同了该回答

LLM大行其道的时代,Transformer成为了当下最流行的模型结构,没有之一。为了达到加速或提效的目的,在vanilla Transformer的基础上,业界探索了针对不同组件的各种改进。


一、Self-Attention

1.1. Sparse Attention

标准的Attention,其计算复杂度和空间复杂度都是 \mathcal O(n^2) 级别的( n 是序列长度)。本质原因,在于序列中的任意两个token之间都要计算相关度,得到一个 n^2 大小的Attention矩阵:

事实上,对于训练好的Transformer而言,其Attention矩阵经常是稀疏的。因此,若要降低复杂度,一种很直接的思路就是减少相关度的计算,即,认为每个token只跟序列内的一部分token相关(可以理解为特征选择),按某种预定义的pattern来进行token间的相关度计算,这便是Sparse Attention的基本原理。公式化如下:

\hat A_{i,j}=\begin{cases} q_ik_j^T\quad if\ token\ i\ attend\ to\ token\ j\\ -\infty\quad if\ token\ i \ does \ not \ attend \ to \ token\ j \end{cases}\\其中, -\infty 无需存储。

根据决定稀疏连接的不同方式,我们可以将Sparse Attention分为Position-based、Content-based。

Part I. Position-based Sparse Attention

Attention矩阵按照某种预定义的稀疏pattern进行计算,这些pattern大都是基于一些原子pattern组合而来,我们把这些原子pattern分为5类:

  • Global Attention:为了避免模型的长程依赖能力退化过多,增加一些全局token
  • Band Attention(Sliding window Attention or Local Attention):大部分数据都带有局部性,因此限制token仅与相邻节点连接
  • Dilated Attention:参考dilated CNNs做法,通过增加空隙以获得更大的感受野,而不增加复杂度
  • Random Attention:通过随机采样,提升非局部的交互
  • Block Local Attention:将输入序列划分为不重叠的block,仅在block内部进行连接

现有的Sparse Attention方法,基本都是通过对以上原子pattern进行组合来实现的:

Part II. Content-based Attention

根据输入内容来确定稀疏连接,例如根据query和key的相似度进行K-means聚类,query仅与同cluster内的key进行连接;又或者,采用哈希方法对query和key进行分桶,query仅与同一个桶内的key进行连接。

Part III. 其它

Sparse Attention由于存在稀疏化,如何保证信息不丢失?主要有这么几种方式:

  • 不同的head采用不同的原子pattern,组合使用
  • 使用Global Attention,间接获得不相连节点的信息
  • 使用Random Attention,可获得标准Attention的近似性能(随机图近似完全图)

1.2. Linearized Attention

标准Attention可形式化如下:(简单起见,省略了缩放因子)Attention(\mathbf Q, \mathbf K, \mathbf V)=softmax(\mathbf Q \mathbf K^T)\mathbf V\\其中, \mathbf Q \in \mathbb R^{n \times d_k},\mathbf K \in \mathbb R^{n \times d_k},\mathbf V \in \mathbb R^{n \times d_k} 。不难推出,以上操作的计算复杂度为 \mathcal O(n^2) 。若去掉softmax操作,那么根据矩阵乘法的结合律,我们可以以 \mathbf Q (\mathbf K^T\mathbf V) 的顺序完成计算,从而将复杂度降至 \mathcal O(n)

进一步,我们将标准Attention等价为下式: Attention(\mathbf Q,\mathbf K, \mathbf V)_i=\frac{\sum_{j=1}^nsim(\mathbf q_i,\mathbf k_j)\mathbf v_j}{\sum_{j=1}^nsim(\mathbf q_i,\mathbf k_j)}\\若直接去掉softmax,则 sim(\mathbf q_i, \mathbf k_j)=\mathbf q_i \mathbf k_j^T ,但是内积无法保证非负性。因此,我们基于核函数的思想,采用以下替换: sim(\mathbf q_i,\mathbf k_j)=\phi(\mathbf q_i)\varphi(\mathbf k_j)^T ,当满足 \phi =\varphi ,就相当于计算核函数定义下的内积,例如,有的论文选择 \phi(x)=\varphi(x)=elu(x) + 1

1.3. Multi Query Attention & Grouped Query Attention

MQA和GQA都是加速推理的技巧,在此之前,我们先了解一下KV Cache。

Part I. KV Cache

KV Cache,说到底也是一种Cache,其核心思想依然是用空间换时间,可以在不影响计算精度的前提下,加速推理。目前,各大推理框架都已实现并将其进行了封装且默认开启。

Transformer的Decoder由于自回归式的结构,推理时的每个step,都需要用到之前step的所有token,为避免重复计算,我们考虑每个step缓存当前计算的key/value结果,这样之后的step便可直接读取缓存结果而免于计算。以上,便是KV Cache的原理。

然而,天下没有免费的午餐,KV Cache的使用受限于缓存大小。简单推导可得出Cache所需缓存为: 2*2*b*s*d_{model}*n_{layers}\\其中,b为batch_size,s为序列长度,假定参数用半精度存储。以GPT-3-175B为例,若batch_size=1,序列长度为100,则Cache需要缓存 2*2*100*12288*96=472MB 。目前最好的卡H100的SRAM缓存大概是50MB,A100则为40MB,因此,KV Cache只能进一步放到HBM中,而HBM的读写速度较之SRAM,差了一个数量级,继而导致推理速度降低。

于是,MQA和GQA便可派上用场了。

Part II. MQA & GQA

标准的Attention,我们称之为Multi-head——query、key、value均有相同数量的多个head。MQA与GQA的做法是,减少key、value对应的head数量——前者仅保留一个head,后者则将query分成多个group,同group内的key、value共享一个head。

MQA和GQA的好处是显而易见的:减少head数量,KV Cache所需缓存也随之减少,SRAM因此满足需求,需要读取的key、value数量也减少,继而降低latency;另外,KV Cache减少,可以增大batch_size,从而增加吞吐量。(较之MHA,计算量变化不大)

要使用MQA和GQA,可以在预训练的时候就加上(from scratch,如PaLM),也可采用GQA论文中提出的Uptraining方式:在MHA的checkpoint基础上,将key、value的投影矩阵进行mean pool操作,转为MQA/GQA格式,再用少量预训练语料进行额外训练。

MQA与GQA,孰优孰劣呢?按照GQA论文中的说法,从头训练的MQA会带来训练的不稳定性,采用Uptraining方式会有所缓解,而采用Uptraining方式训练的GQA则未体现出该问题。另外,MQA虽然能够加速推理但是会带来效果的损失(尤其对于LLM而言,其head数量也在增长,MQA直接将head数量减少到1未免太过激进),而GQA则可看做是MHA与MQA之间的trade-off,实验表明,它可以达到近乎MHA的效果以及MQA的推理速度。尤其是,LLM由于参数量大幅增长,其内存带宽受限问题可能没有那么严重,因此无需过分减少head数量。因此,对于LLM而言,GQA或许是一个更好的选择。Meta开源的LLaMA2,采用的便是GQA。

1.4. Flash Attention

Part I. Flash Attention

Transformer之所以在扩充context window的路上充满挑战,很重要的原因在于其核心组件self-attention的计算复杂度和空间复杂度都是 \mathcal O(N^2) 级别的( N 是序列长度)。

有一些方法,采用了近似Attention的思路,如Sparse Attention、Low Rank Attention等,将Attention的计算复杂度降至线性或近线性,然后却并没有得到广泛的应用。主要原因在于,它们都聚焦于减少计算量(FLOP),而忽略了IO读写的内存访问开销。在现代GPU中,计算速度早已超越了内存访问速度,对于Attention而言,除了大矩阵乘法是计算带宽受限(compute-bound)的,其他操作(计算softmax,dropout,mask)都是内存带宽受限(memory-bound)的。因此,计算量的减少,并没有带来运行时间(wall-clock time)的减少。

首先解释一下GPU的内存分级。

如下图左所示,GPU的内存由多个不同大小和不同读写速度的内存组成。内存越小,读写速度越快。以A100-40GB为例,SRAM分布在108个流式多处理器上,每个处理器的大小为192K,合计 192 * 108 KB=20,736KB=20MB。HBM(High Bandwidth Memory),也就是我们常说的显存,大小为40GB。SRAM的读写速度为19TB/s,而HBM的读写速度只有1.5TB/s,不到SRAM的1/10。上面讲到Attention是内存受限的,因此,减少对HBM的读写次数,有效利用更高速的SRAM来进行计算,是非常重要的。

Flash Attention,可以加速训练并且有助于提升模型的long context能力。它基于tilling(分块计算)和重计算的方式,实现了“Fast and Memory-Efficient Exact Attention with IO-Awareness”:

  • Fast(加快计算):Flash Attention并没有减少计算量,而是从IO感知出发,减少了HBM访问次数,从而实现wall-clock speedup(2-4x)
  • Memory-Efficient(节省显存):Flash Attention通过引入统计量,改变注意力机制的计算顺序,避免了实例化注意力矩阵 P,S\in R^{N\times N},将空间复杂度从 \mathcal O(N^2) 降至 \mathcal O(N)
  • Exact Attention(精确注意力):与近似注意力方法不同,Flash Attention与标准Attention的结果完全等价

下面简要介绍Flash Attention的实现细节,主要参考自回旋托马斯x:FlashAttention:加速计算,节省显存, IO感知的精确注意力

给定输入 Q,K,V\in R^{N\times d} ,计算得到注意力输出 O\in R^{N\times d} ,过程如下:S=\tau QK^{\top}\in R^{N\times N}\\S^{masked} = MASK(S)\in R^{N\times N}\\P=softmax(S^{masked})\in R^{N\times N}\\P^{dropped}=dropout(P,p_{drop})\in R^{N\times N}\\O=P^{dropped}V\in R^{N\times d}\\其中, \tau 是softmax的缩放因子,典型的比如 \frac{1}{\sqrt{d_k}} 。MASK操作将输入中的某些元素置为 -\infty ,计算softmax后就变成了0,其他元素保持不变;causal-lm结构和prefix-lm结构的主要差别就是MASK矩阵不同。dropout(x,p)逐点作用在 x 的每个元素上,以 p 的概率将该元素置为0,以 1-p 的概率将元素置为 \frac{x}{1-p}

GPU执行操作的典型方式分为三步:1. 每个kernel将输入数据从低速的HBM中加载到高速的SRAM中;2. 在SRAM中进行计算;3. 计算完毕后,将计算结果从SRAM中写入到HBM中。

为了降低对HBM的读写次数,可以通过kernel融合的方式,将多个操作融合为一个操作,在高速的SRAM中完成计算,避免反复读写HBM。但SRAM的大小有限,不可能一次性计算完整的Attention,因此必须进行分块计算,使得分块所需的内存不超过SRAM的大小。这便是tilling的思想。

矩阵乘法和逐点操作(scale,mask,dropout)的分块计算是容易实现的,难点在于softmax的分块计算,论文中对此有详细介绍,此处不赘述。

tiling分块计算使得我们可以用一个CUDA kernel来执行Attention的所有操作:从HBM中加载输入数据,在SRAM中执行所有的计算操作(矩阵乘法,mask,softmax,dropout,矩阵乘法),再将计算结果写回到HBM中。避免了反复地从HBM中读写数据。

为了后向传递计算梯度,前向计算时通常需要将某些中间结果写回到HBM中,这会产生额外的HBM读写次数,减慢运行时间。因此,Flash Attention没有为后向传递保存很大的中间结果矩阵。

在标准的Attention实现中,后向传递计算 Q,K,V 的梯度时,需要用到 N\times N 的中间矩阵 S,P ,但这两个矩阵并没有保存下来。这里便用到了重计算——基于保存的两个统计量,后向传递时在高速的SRAM上快速地重新计算重新计算注意力矩阵 S,P 。较之标准Attention从HBM读取很大的中间注意力矩阵的方法,尽管重计算增加了额外的计算量,却依然要快得多。

Part II. Flash Attention-2

在Flash Attention的基础上,作者提出了优化后的v2版本,速度进一步提升2倍。优化点包括:

  • tweak the algorithm to reduce the number of non-matmul FLOPs
  • parallelize the attention computation, even for a single head, across different thread blocks to increase occupancy
  • within each thread block, distribute the work between warps to reduce communication through shared memory

1.5. Paged Attention

来自UC Berkeley的团队开源了一个项目vLLM,该项目主要用于加速LLM推理和服务。vLLM的核心,便是PagedAttention,作为一种新颖的Attention算法,它可以高效管理Attention中的key、value。无需更改任何模型架构,以PagedAttention加持的vLLM,其吞吐量比原生HF Transformers高出24倍。

如之前所述,KV Cache是加速推理的常用做法,但它存在以下问题:

  • Large:对于LLaMA-13B的单个序列,它占用高达1.7GB的内存
  • Dynamic:它的大小取决于序列长度,而序列长度具有高度可变和不可预测的特点;也因此,对KC Cache的高效管理面临巨大挑战,我们发现,现有系统由于碎片化和过度预留而浪费了60% - 80%的内存。

为了解决上述问题,引入了PagedAttention,这是一种受到操作系统中经典的虚拟内存和分页思想启发的Attention算法。与传统的Attention不同,PagedAttention允许将连续的key、value存储在非连续的内存空间中。具体而言,PagedAttention将每个序列的KV Cache分成多个块,每个块包含固定数量的token的key、value。在Attention计算过程中,PagedAttention Kernel高效地识别和获取这些块,采用并行的方式加速计算。

PagedAttention还有另一个关键优势:高效的内存共享。例如,在并行采样中,需要由同一Prompt生成多个输出序列,因此,Promp的计算和内存可以在输出序列之间共享。

推理时,PagedAttention基于分块内存和共享内存的方式,做到了高效的内存管理,减少了内存占用,因此可以增大batch_size,提升吞吐量。

当然,除了PagedAttention外,vLLM还用了continuous batching技术,进一步提升吞吐量。

二、Norm

vanilla Transformer中用到了Layer Normalization,准确来说是Post-LN。LN的使用,是为了降低对模型初始化的要求,使得训练更加稳定。此处的改进,一类是针对“Post”,另一类是针对“LN”。

2.1. Pre-Norm

“Pre”和“Post”指的是Norm所处的位置,二者的区别如下图:(Nrom以LN为例)

公式化如下:

Pre-Norm:\qquad x_{t+1}=x_t+F_t(Norm(x_t))\\ Post-Norm:\qquad x_{t+1} = Norm(x_t+F_t(x_t))\\有研究成果表明,Pre-Norm较之Post-Norm,更加易于训练,但在训练充分的情况下,Post-Norm能达到更好的效果。LLM由于训练难度大,因而使用Pre-Norm的较多。

2.2. RMS Norm

与一般的LN对比,RMS Norm(Root Mean Square Layer Normalization)的主要区别在于,去除了减掉均值的部分。

LN的计算公式如下:

\bar a_i = \frac{a_i-\mu}{\sigma}g_i,\quad \mu=\frac{1}{n}\sum_{i=1}^{n}a_i,\quad \sigma=\sqrt{\frac{1}{n}\sum_{i=1}^{n}(a_i-\mu)^2}\\

RMS Norm的计算公式如下: \bar a_i = \frac{a_i}{RMS(\mathbf a)}g_i,\quad RMS(\mathbf a)=\sqrt{\frac{1}{n}\sum_{i=1}^{n}a_i^2}\\

按论文中的描述,RMS Norm效果可与LN等价,且计算简单速度更快。

2.3. Deep Norm

Deep Norm在Post-LN的基础上做了以下改进:

  • 在进行LN之前,以参数 \alpha 增大输入
  • 在Xavier初始化过程中,以参数 \beta 减小部分参数的初始化范围

按论文中的描述,Deep Norm兼具Post-LN的良好性能及Pre-LN的训练稳定性,作者借此将Transformer的深度扩充到了1000层。

GLM-130B采用的便是Deep Norm。

三、Activation

激活函数用于FFN模块,vanilla Transformer采用的是ReLU,GPT采用了GeLU(关于GeLU,可参考Pikachu5808:深度学习最佳实践)。

最近的LLM,大多采用GLU(Gated Linear Units)的变体,尤其是GeGLU和SwiGLU,它们的形式如下:

GLU(x,W,V,b,c)=\sigma (xW+b) \otimes (xV+c)\\ GeGLU(x,W,V,b,c)=GeLU(xW+b)\otimes (xV+c)\\ SwiGLU(x,W,V,b,c,\beta)=Swish_{\beta}(xW+b)\otimes (xV+c)\\其中, Swish_{\beta}(x)=x\sigma (\beta x)

GLU的效果更好,但是增加了额外的权重矩阵,为了保证模型整体参数量不变,一般会将FFN的中间维度降至 \frac{2}{3}\cdot4d=\frac{8d}{3}

四、Position Embedding

不同于CNN、RNN等模型,Self-Attention和FFN均无法捕捉token间的位置关系(permutation equivariant),因此Transformer需要位置编码。

当然,由于Decoder的Self-Attention存在mask操作,因此Decoder-only结构的Transformer是可以感知位置信息的,近来也有研究表明,移除位置编码后,语言模型任务的性能有所提升。

4.1. 绝对位置编码

vanilla Transformer采用的是sinusoidal位置编码——基于定义好的三角函数来计算编码向量:

PE(pos,2i)=sin(pos/10000^{2i/d_{model}})\\ PE(pos,2i+1)=cos(pos/10000^{2i/d_{model}})\\

在原论文中,作者还实验了另一种可学习的位置编码:将位置编码作为可训练参数,随训练过程更新。不过,结果表明,较之sinusoidal位置编码,这种编码方式并没有带来效果的提升,而且不具备外推性,因此作者最终选定了sinusoidal位置编码。

以上两种绝对位置编码,最开始提出的使用方式都是加在token embedding上,不过,随着输入信号逐层传递,位置信息可能会在偏上层的layer中损失掉。近来有成果表示,将位置编码加在每个Transformer Layer的输入中,效果更好。

4.2. 相对位置编码

绝对位置编码,考虑的是各个独立token的位置信息;相对位置编码,考虑的则是进行Attention计算时的query、key之间的相对位置信息。由于自然语言一般更依赖于相对位置,所以相对位置编码通常也有着优秀的表现。

相对位置编码的引入,一般会从query、key之间的向量内积展开式出发,典型的如XLNET、T5、DeBERTa都采用了各自的相对位置编码方式。

关于相对位置编码,读者可以参考让研究人员绞尽脑汁的Transformer位置编码 - 科学空间|Scientific Spaces

4.3. RoPE

RoPE给每个token乘上一个表达绝对位置信息的旋转矩阵,经过Attention计算后,query和key之间attention score将只与二者的相对位置有关,因此,这是一种同时融合绝对位置与相对位置的编码方式。具体细节,读者可以参考Transformer升级之路:2、博采众长的旋转式位置编码 - 科学空间|Scientific Spaces

PaLM、LLaMA采用的都是RoPE。

4.4. ALiBi

ALiBi的提出是为了提升Transformer的外推性,做到所谓的“Train Shot, Test Long”。与相对位置编码类似,ALiBi的做法是在attention score中减去一个偏置项,该偏置项与query、key之间的距离相关。与T5中采用的相对位置编码不同,ALiBi中的偏置项是预定义的,无需可训练参数。原论文显示,ALiBi比sinusoidal位置编码、RoPE、T5 bias具备更优的外推性。

BLOOM采用的便是ALiBi,并且因此提升了训练稳定性。


参考文献

[1] 为节约而生:从标准Attention到稀疏Attention - 科学空间|Scientific Spaces

[2] arxiv.org/pdf/2106.0455

[3] ccZ:SPARSE TRANSFORMER浅析

[4] Transformer综述 - GiantPandaCV

[5] 线性Attention的探索:Attention必须有个Softmax吗? - 科学空间|Scientific Spaces

[6] arxiv.org/pdf/2305.1324

[7] Young:大模型推理性能优化之KV Cache解读

[8] 为什么现在大家都在用 MQA 和 GQA?

[9] 回旋托马斯x:FlashAttention:加速计算,节省显存, IO感知的精确注意力

[10] arxiv.org/pdf/2205.1413

[11] arxiv.org/pdf/2307.0869

[12] heyguy:记录Flash Attention2-对1在GPU并行性和计算量上的一些小优化

[13] vllm.ai/

[14] PagedAttention(vLLM):更快地推理你的GPT - 掘金

[15] arxiv.org/pdf/1910.0746

[16] 冯良骏:昇腾大模型|结构组件-1——Layer Norm、RMS Norm、Deep Norm

[17] arxiv.org/pdf/2203.0055

[18] 人工智能:大模型中常见的3种Norm

[19] arxiv.org/pdf/2002.0520

[20] 让研究人员绞尽脑汁的Transformer位置编码 - 科学空间|Scientific Spaces

[21] Transformer升级之路:2、博采众长的旋转式位置编码 - 科学空间|Scientific Spaces

[22] arxiv.org/pdf/2303.1822

[23] 让研究人员绞尽脑汁的Transformer位置编码 - 科学空间|Scientific Spaces

以上为本文的全部参考文献,对原作者表示感谢。

62 人赞同了该回答

最近看了一篇关于关于新闻推荐的文章,主要是解决活跃用户访问新闻内容过长导致推荐不及时的问题,与阿里的ETA模型解决的问题相似(阿里ETA(End-to-End Target Attention)模型)。这篇是2022年微软亚洲研究院发表的文章,对于与超长新闻浏览历史相关的活跃用户来说,及时推荐仍然是不够的,主要原因是用户浏览新闻内容太长导致。为了解决这个问题,文中从一个独特的视角来处理有效的新闻推荐问题。作者认为用户的兴趣可以完全被那些具有代表性的关键词所捕获,而不是依赖于整个输入(即用户曾经浏览过的新闻文章的集合)。基于此,作者提出了GateFormer模型。在GateFormer用户侧有两个部分,首先对输入的每一篇新闻文章进行门控处理,主要作用是从中选择top-K的信息性的关键词;然后将选择的关键词拼接并通过transformer编码生成用户embedding。然而,在GateFormer的新闻侧直接通过transformer编码候选新闻embedding。最后根据用户embedding和新闻embedding计算点击率(相当于双塔模型)。

对于GateFormer模型中的门控模块(Gating Module),有以下三点特性:

  1. 个性化的。当过滤用户侧的输入时,门控模块估计每个单词的重要性,也就是用户的潜在兴趣;如果一个单词与用户的兴趣有强烈的相关性,则门控模块将优先选择该单词。这样,我们才能最大限度地保留那些对新闻推荐真正重要的关键词。
  2. 轻量级的。我们知道门控模块需要检查整个输入,我们用微小的网络组件来实现它,如单层CNN或GRU。通过这样做,来自门控操作的额外时间成本几乎可以忽略transformer产生的计算成本。
  3. 考虑到输入数据过滤不受监控,将门控模块设计为与transformer模块级联的可微元件;因此,可以通过端到端的学习来选择合适的关键词来获得最优的推荐性能。

GateFormer模型

GateFormer模型主要可以分为两个部分,一部分是通过门控选择用户浏览的的每个新闻的top-K个关键词,然后对选择的关键词拼接,再经过transformer模块编码成用户embedding,另外一部分是直接让候选的新闻通过transformer编码成新闻embedding,具体示意图如下:

对于GateFormer模型最重要是门控模块,它主要可以分为用户兴趣编码和关键词选择两部分,下面分别进行描述:

  1. 用户兴趣编码
    每篇新闻S_i的第j个单词embedding(文中的\boldsymbol{e}^i_j)都会经过单层CNN网络产生一个上下文感知embedding(context-aware embedding),也就是文中的 \boldsymbol{h}^i_j,然后通过加权求和的方式计算出每一篇新闻S_i的embedding,也就是文中的的\boldsymbol{h}_i。之后再通过单层LSTM计算出用户兴趣embedding,也就是文中的 \boldsymbol{u}^g(不是用户embedding)。
  2. 关键词选择
    每篇新闻都会选择top-K个用户感兴趣的关键词,文中根据余弦的方式计算新闻S_i的第j个单词重要性r^i_j,即:
    r^i_j=cos(\boldsymbol{u}^g,\boldsymbol{h}^i_j)\\
    然后从每篇新闻中选择top-K个重要性高的单词embedding(文中的\boldsymbol{e}^i——来自\boldsymbol{e}^i_j,不是\boldsymbol{h}^i_j),再对每篇新闻中选择的top-K个根据重要性归一化,最后将每篇文章选择的top-K个归一化的embedding拼接送入transformer中编码成用户embedding。

实验

这一部分主要就是为了验证GateFormer模型不仅牛掰而且计算快。文中采用了两个数据集,即:MIND和DBLP。下面是MIND数据集的实验结果:

通过上面实验结果表,GateFormer模型在AUC、MRR和NDCG指标都比较好,同时inference效率也比较快。