Transformer系列(机器学习)
Transformer
(将被称为“vanilla Transformer”
以区别于其他增强版本;Vaswani
等人,2017
年)模型具有编码器-解码器架构,这在许多NMT
模型中很常见。后来简化的 Transformer
在语言建模任务中表现出色,例如在仅编码器的BERT
或仅解码器的GPT
中。
符号
符号 | 含义 |
---|---|
模型大小/隐藏状态维度/位置编码大小。 | |
多头注意力层中的头的数量。 | |
输入序列的段长度。 | |
模型中注意力层的总数;不考虑MoE 。 |
|
输入序列中的每个元素都被映射到形状为 |
|
键权重矩阵。 | |
查询权重矩阵。 | |
值权重矩阵。通常我们有 |
|
每个头的权重矩阵 | |
输出权重矩阵。 | |
嵌入输入的查询。 | |
嵌入输入的键。 | |
嵌入输入的值。 | |
查询、键、值矩阵中的行向量, |
|
第 |
|
长度为 |
|
查询 |
|
位置编码矩阵,其中第 |
注意力机制与自注意力机制
注意力是神经网络中的一种机制,模型可以通过选择性地关注给定的一组数据来学习做出预测。注意力的量由学习到的权重作为量化,因此输出通常为加权平均值。
自注意力是一种注意力机制,模型利用对同一样本的其他部分观察结果对数据样本的一部分进行预测。从概念上讲,它与非局部均值非常相似。注意,自注意力是置换不变的;它是对集合的操作。
注意力/自注意力有多种形式,Transformer
依赖于缩放点积注意力:给定一个查询矩阵
对于查询和键向量
多头自注意力
多头自注意力模块是Transformer
中的关键组件。多头机制不是只计算一次注意力,而是将输入拆分成更小的块,然后并行计算每个子块上的缩放点积注意力。单个注意力输出只是简单地连接起来并线性变换为预期的维度。
在这里
编码器-解码器架构
编码器生成基于注意力机制的表示,能够从上下文中定位特定信息。它由6
个模块的堆栈组成,每个模块包含两个子模块、一个多头自注意力层和一个逐点全连接前馈网络。逐点意味着它对序列中的每个元素应用相同的线性变换(具有相同的权重)。这也可以看作是过滤器大小为1
的卷积层。每个子模块都有一个残差连接和层规范化。所有子模块都输出相同维度的数据Transformer
解码器的功能是从编码表示中检索信息。该架构与编码器非常相似,不同之处在于解码器包含两个多头注意子模块,而不是相同的重复模块中都有一个。第一个多头注意子模块被屏蔽,以防止位置关注未来。
位置编码
由于自注意力操作具有排列不变性,因此使用适当的位置编码为模型提供顺序信息非常重要。位置编码vanilla Transformer
考虑了两种类型的编码:
正弦位置编码
正弦位置编码定义如下,给定token
位置
这样,位置编码的每个维度都对应于不同维度中不同波长的正弦波,从
学习位置编码
学习到的位置编码为每个元素分配一个学习到的列向量,该向量对其绝对位置进行编码(Gehring
等人,2017
年),而且每层都可以通过不同的方式学习这种编码(Al-Rfou
等人,2018
年)。
相对位置编码
Shaw
等人(2018
年)将相对位置信息纳入
Transformer-XL
(Dai
等人,2019
年)提出了一种基于键和查询点积重参数化的相对位置编码。为了保持位置信息在各个段之间连贯流动,Transformer-XL
对相对位置进行编码,因为知道位置偏移量就足以做出良好的预测,即
Transformer-XL
对上述四个项重新参数化如下:
- 代替
使用相对位置编码 。 - 代替
具有两个可训练参数 (内容)和 (表示位置)有两个不同的术语。 - 将
分裂成两个矩阵, 为内容信息, 为位置信息。
旋转位置嵌入
旋转位置嵌入(RoPE
;Su
等人,2021
)使用旋转矩阵对绝对位置进行编码,并将每个注意层的键和值矩阵与其相乘,以在每一层注入相对位置信息。当将相对位置信息编码到第RoPE
)利用欧几里得空间中的旋转操作,将相对位置嵌入构建为简单地将特征矩阵旋转与其位置索引成比例的角度。
给定一个向量
当推广到更高维空间时,RoPE
将
在论文中
Transformer改进
Transformer
模型在推理时的输入序列长度上限取决于训练的上下文长度。单纯增加上下文长度会导致时间和空间的大量消耗(
上下文内存
原始Transformer
的注意力持续时间是固定且有限的。该模型在每个步骤更新只能关注同一段中的元素,并且没有信息可以跨越固定长度分段移动。这种上下文分段会导致以下几个问题:
- 该模型无法捕捉比较长的依赖关系。
- 在没有上下文或者上下文很稀少的情况下,很难预测每个片段中的前几个
token
。 - 评估的代价是昂贵的。每当片段向右移动一位时,新的片段都会从头开始重新处理,尽管有很多重叠的
token
。
Transformer-XL
(Dai
等人,2019
年;“XL”
表示“超长”)修改了架构,使用附加内存复用了段之间的隐藏状态。通过不断使用先前段的隐藏状态,将段之间的循环连接引入到模型中。
让我们标记隐藏状态
请注意,键和值都依赖于扩展的隐藏状态,而查询仅使用当前步骤的隐藏状态。连接操作Transformer-XL
需要使用相对位置编码,因为如果我们对绝对位置进行编码,则前一个段和当前段将被分配相同的编码,这是我们不希望看到的。Compressive Transformer
(Rae
等人,2019
年)通过压缩过去的记忆来扩展Transformer-XL
,以支持更长的序列。它明确添加了大小为
内存和压缩内存都是FIFO
队列。模型上下文长度为
- 内核的池化最大或平均和步幅大小
。 - 具有内核和步幅大小的一维卷积
(需要了解额外的参数)。 - 扩张卷积(需要学习其他参数)。
- 经常使用的内存。
Compressive Transformer
还有两个额外的训练损失:
- 自动编码损失(无损压缩目标)衡量我们压缩记忆-重建原始记忆的能力。
- 注意力重建损失(有损目标)重建基于内容的注意力对记忆与压缩记忆的注意力,并最小化差异:
翻转压缩函数
Transformer-XL
的内存大小为Transformer
的时间为
外部存储器
对于kNN-LM
(Khandelwal
等人,2020
年)通过单独的token
概率,可以得到kNN
模型。kNN
模型建立在外部键值存储之上,该存储可以存储任何大型预训练数据集或OOD
新数据集。此数据存储经过预处理以保存大量数据(上下文的LM
嵌入表示、下一个token
),并且最近邻检索发生在LM
嵌入空间中。由于数据存储可能非常庞大,我们需要依靠库进行快速密集向量搜索,例如FAISS
或ScaNN
。索引过程仅发生一次,并且在推理时很容易实现并行性。在推理时,下一个token
的概率是两个预测的加权和:
SPALM
运行kNN
搜索获取k
具有相关上下文的token
。对于每个token
,我们可以获得预训练LM
提供的相同嵌入表示。表示为token
嵌入
在这里S
形的;token
之间共享的词嵌入矩阵。不同于kNN-LM
,没有发现最近距离对检索到的token
的聚合有帮助。在训练期间,长期记忆中的关键表示保持不变,由预训练的LM
产生,但值编码器(又称词嵌入矩阵)会进行更新。Memorizing Transformer
(Wu
等人,2022
年)添加了一个kNN
增强注意力层位于仅解码器的Transformer
的顶部堆栈附近。这个特殊的层维护着过去键值对的Transformer-XL
样式FIFO
缓存。局部注意力和kNN
机制。kNN
查找返回顶部k
(键,值)对用于输入序列中的每个查询,然后通过自注意力堆栈对其进行处理,以计算检索到的值的加权平均。两种类型的注意力与可学习的门控参数相结合。为了防止值幅度出现较大的分布偏移,缓存中的键和值都经过了规范化。Memorizing Transformer
在实验中发现了以下现象:
- 一些实验观察,使用较小内存训练模型,然后使用较大内存进行微调比从头开始使用较大内存进行训练效果更好。
- 较小的
Memorizing Transformer
内存中只有8k
的token
,其困惑度可以与vanilla Transformer
相媲美,且可训练参数相比高5
倍。 - 增加外部存储器的大小可以获得一致的增益,最高可达
262K
。 - 非记忆
Tronsformer
在使用内存的情况下可以进行微调。
距离增强注意力评分
Distance Aware Transformer
(DA-Transformer
;Wu
等人,2021
年)和具有线性偏差的注意力机制(ALiBi;Press
等人,2022
年)类似 — 为了鼓励模型在比模型训练的更长的上下文中进行推断,我们可以根据键token
和查询token
之间的距离,将位置信息明确地附加到每对注意力分数上。请注意,vanilla Transformer
中默认的位置编码只会向输入序列添加位置信息,而后来改进的编码机制会改变每一层的注意力分数,例如旋转位置嵌入,它们的形式与距离增强注意力分数非常相似。DA-Transformer
(Wu
等人,2021
年)将每一层的注意力得分乘以可学习的偏差,该偏差由键和查询之间的距离函数表示。不同的注意力头使用不同的参数来区分对短期和长期的不同偏好。给定两个位置,DA-Transformer
使用以下加权函数来改变自注意力分数:
在这里ALiBi
(Press
等人,2022
年)不使用乘数,而是在查询关键字注意力得分上添加了一个常数偏差项,该偏差项与成对距离成比例。偏差引入了强烈的近因偏好,并惩罚距离太远的关键字。惩罚在不同的头中以不同的速率增加。
在这里DA-transformer
不同,
ALiBi
在训练期间对上下文长度为1024
的1.3B
模型进行了训练,并在推理时推测为2046
。
参数复用
Universal Transformer
(Dehghani
等人,2019
年)将Transformer
中的自注意力机制与RNN
中的循环机制相结合,旨在从Transformer
捕获的长期依赖关系和RNN
的学习归纳偏差中获益。Universal Transformer
不是固定数量的层,而是使用自适应计算动态的调整步数。如果我们固定步数,Universal Transformer
相当于一个跨层共享参数的多层Transformer
。从高层次来看,通用Transformer
可以看作是一个循环函数,用于学习每个token
的隐藏状态表示。循环函数在token
位置之间并行演化,位置之间的信息通过自注意力机制共享。
给定长度的输入序列
在这里affine transformation
+ ReLU
由两种位置(每一行的
在自适应版本的Universal Transformer
中,循环步骤的数量ACT
动态确定。每个位置都配备了动态ACT
停止机制。一旦每个token
循环块停止,它就会停止进行更多循环更新,而只是将当前值复制到下一步,直到所有块都停止或模型达到最大步数限制。
自适应建模
自适应建模是指能够根据不同的输入调整计算量的机制。例如,有些token
可能只需要局部信息,因此需要较短的注意力跨度;或者有些token
相对比较容易预测,不需要经过整个注意力栈进行处理。
自适应注意力
Transformer
的一个关键优势是能够捕获长期依赖关系。根据上下文,模型可能更喜欢在某些时候关注更远的事物,或者一个注意力头可能具有与不同的注意力模式。如果注意力跨度可以灵活调整其长度,并且只在需要时关注更远的事物,那么这将有助于降低计算和内存成本,以支持模型中更长的最大上下文大小。这就是自适应注意力跨度的动机。Sukhbaatar
等人(2019
年)提出了一种寻求最佳注意力跨度的自注意力机制。假设不同的注意力头可能会在同一上下文窗口内分配不同的分数,因此最佳跨度将针对每个注意力头单独进行训练。
鉴于第token
,我们需要计算这个token
和其注意力范围内其他键之间的注意力权重
在这里
软遮罩函数应用于注意力权重中的softmax
元素:
在上面的等式中,Transformer
实验中,Sukhbaatar
等人(2019
)发现一个普遍趋势,即较低层不需要非常长的注意力跨度,而较高层中的少数注意力头可能使用较长的跨度。自适应注意力跨度还有助于大大减少FLOPS
数值,尤其是在具有许多注意力层和较大上下文长度的大型模型中。
深度自适应Transformer
在推理时,我们自然会认为某些token
更容易预测,因此不需要像其他token
那样多的计算量。因此,我们可能只通过有限数量的层来处理其预测,以在速度和性能之间取得良好的平衡。深度自适应Transformer
(Elabyad
等人,2020
年)和置信自适应语言模型(CALM
;Schuster
等人,2022
年)都受到这一想法的启发,并学习预测不同输入token
所需的最佳层数。深度自适应Transformer
将输出分类器附加到每一层,以根据该层的激活产生退出预测。分类器权重矩阵可以每层不同,也可以跨层共享。在训练期间,模型会采样不同的退出序列,以便使用不同层的隐藏状态优化模型。学习目标结合了在不同层预测的似然概率,
自适应深度分类器输出参数分布为oracle
分布进行训练
- 序列特定的深度分类器:同一序列的所有标记共享相同的出口。它取决于序列的编码器表示的平均值。给定一个输入序列
,长度为 ,分类器采用 作为输入和输出多项分布, 为层数。 在这里 是狄拉克德尔塔(单位脉冲)函数, 是一个正则化项,用于鼓励较低层退出。 - 特定于token的深度分类器(多项式):每个
token
用不同的出口块解码,根据第一个解码器隐藏状态进行预测 : - 特定于token的深度分类器(类似几何):每个
token
每层都有一个二进制出口预测分布 。RBF
内核 用于平滑预测,以纳入当前决策对未来时间步长的影响。𝟙
在推理时,需要校准做出退出决策的置信度阈值。深度自适应Transformer
通过网格搜索在验证集上找到这样的阈值。CALM
(Schuste
r等人,2022
年)使用测试(LTT
)框架(Angelopoulos
等人,2021
年)来识别有效阈值的子集,并选择最小值作为推理的阈值。除了训练每层退出分类器外,CALM
还探索了其他自适应深度预测方法,包括softmax
激活(即前两个softmax
输出之间的差异)和隐藏状态饱和(即softmax
激活可带来最佳的推理加速。
高效的注意力
普通Transformer
的计算和内存成本随序列长度呈二次方增长,因此很难应用于非常长的序列。Transformer
架构的许多效率改进都与自注意力模块有关-使其更便宜、更小或运行速度更快。
稀疏注意力模式
固定局部上下文
降低自我注意力成本的一个简单方法是将每个标记的注意力范围限制在局部上下文中,这样自我注意力就会随着序列长度线性增长。该想法由Image Transformer
(Parmer
等人,2018
年)提出,它将图像生成表述为使用编码器-解码器Transformer
架构的序列建模:
- 编码器生成源图像的上下文、每个像素通道表示。
- 解码器自回归生成输出图像,每个时间步、每个像素一个通道。
我们将要生成的当前像素的表示token
为查询Image Transformer
引入了两种类型的局部,如下图所示。
- 1D局部注意力:输入图像按光栅扫描顺序展平,即从左到右、从上到下。然后将线性的图像划分为不重叠的查询块。上下文窗口由与查询块相同的像素组成
以及在此查询块之前生成的固定数量的附加像素。 - 2D局部注意力:图像被划分为多个不重叠的矩形查询块。查询像素可以关注同一记忆块中的所有其他像素。为了确保左上角的像素也可以具有有效的上下文窗口,记忆块分别向上、向左和向右扩展固定量。
步进上下文
Sparse Transformer
(Child
等人,2019
年)通过稀疏矩阵分解引入了分解式自注意力,从而可以在高达16,384
的序列长度上训练具有数百层的密集注意力网络,否则这在现代硬件上是不可行的。给定一组注意力连接模式
注意,尽管token
关注过去的所有位置。在分解自注意力机制中,集合Sparse Transformer
提出了两种类型的分形注意力机制。下图以二维图像输入为例,更容易理解这些概念。
- 带步长的步进注意力
这适用于图像数据,因为结构与步幅对齐。在图像上面,每个像素都会关注所有先前的 按光栅扫描顺序关注像素(自然覆盖图像的整个宽度),然后这些像素关注同一列中的其他像素(由另一个注意连接子集定义)。 - 固定注意力。一小部分
token
汇总了之前的位置,并将该信息传播到所有未来的位置。
在这里Transformer
架构中,有三种方法可以使用稀疏分解注意力模式:
- 每个残差块是一种注意力类型,然后将它们交错,
,在这里 是当前残差块的索引。 - 设置一个单独的主管,负责所有分解后的主管负责的位置,
。 - 使用多头注意力机制,但与原始 Transformer 不同,每个头可能采用上面提出的模式
1
或2
,该选项通常效果最佳。
Sparse Transformer
还提出了一系列变化,以便将Transformer
训练到数百层,包括梯度检查点、在后向传递期间重新计算注意力和FF
层、混合精度训练、高效的块稀疏实现等。分块注意力(Qiu et al
. 2019
) 引入了一个稀疏块矩阵,只允许每个token
关注一小部分其他token
。每个注意力矩阵的大小为
Blockwise Attention
的实际实现将QKV
存储为块矩阵,每个矩阵的大小为
在这里QKV
块矩阵中的行。每个Blockwise Attention
能够将注意力矩阵的记忆复杂度从
ETC
(扩展Transformer
构造;Ainslie
等人,2019
年)、Longformer
(Beltagy
等人,2020
年)和Big Bird
(Zaheer
等人,2020
年)模型在构建注意力矩阵时结合了局部和全局组合。所有这些模型都可以从现有的预训练模型中初始化。ETC的全局-局部注意力机制(Ainslie
等人,2019
年)接受两个输入,(1)长输入token
,g2g、g2l、l2g
和l2l
。由于l2l
注意力部分可能非常大,因此它被限制在固定大小的注意力范围半径内l2l
矩阵可以重塑为g2g
注意力片段的格式如下:
在这里
ETC
的另一个更新是整合了CPC
(对比预测编码)任务,使用NCE 损失进入预训练阶段,除了MLM
任务之外:当一句话被掩盖时,它的表征应该和它周围上下文的表征相似。全局输入ETC
的构造如下:假设长输入(例如句子)中有一些片段,每个片段都附加一个辅助标记以学习全局输入。相对位置编码用于用标记位置标记全局片段标记。发现在一个方向上的硬掩码(即,前后标记的标记不同)可以在某些数据集中带来性能提升。
Longformer
中的注意力模式包含三个部分:
- 局部注意力:与
ETC
类似,局部注意力由固定大小的滑动窗口控制 。 - 预选
token
的全局注意力:Longformer
为一些预选token
(例如[CLS]token
)分配了全局注意力跨度,也就是说,关注输入序列中的其他token
。 - 扩张注意力机制:固定大小的扩张滑动窗口
以及扩张尺寸的间隙 ,类似于Sparse Transformer
。
Big Bird
与Longformer
非常相似,既配备了局部注意力机制,又配备了一些具有全局注意力范围的预选token
,但Big Bird
用一种新机制取代了扩张注意力机制,即所有token
都关注一组随机token
。这种设计的动机是,注意力模式可以看作是有向图,而随机图具有信息能够在任意一对节点之间快速流动的特性。Longformer
在较低层使用较小的窗口大小,在较高层使用较大的窗口大小。消融研究表明,这种设置比反向或固定大小的配置效果更好。较低层没有扩大的滑动窗口,无法更好地学习使用直接的局部上下文。Longformer
还有一个分阶段的训练程序,其中最初使用小窗口大小训练模型以从局部上下文中学习,然后在后续的训练阶段增加窗口大小并降低学习率。
基于上下文注意力
Reformer
(Kitaev
等人,2020
年)提出的改进旨在解决vanilla Transformer
中的以下痛点:
- 自注意力模块内的二次方时间和内存复杂度。
层比单层模型大 倍,因为我们需要存储反向传播的激活。- 中间的
FF
层通常相当大。
提出了两项主要改进:
- 用局部敏感哈希(
LSH
)注意力机制代替点积注意力机制,从而降低复杂度 到 。 - 用可逆残差层替换标准残差块,这样可以在训练期间仅存储一次激活,而不是
倍(即与层数成正比)。
在softmax
之后才会做出很大贡献。对于每个查询Reformer
将局部敏感哈希(LSH
)纳入其注意力机制中。哈希方案Reformer
采用这样的哈希方案,给定一个固定的随机矩阵
在LSH
注意力机制中,查询只能关注同一哈希桶中的位置,
- 完全注意力的注意力矩阵通常很稀疏。
- 使用
LSH
,我们可以根据哈希桶对要对齐的键和查询进行排序。 - 设置
( ),这样在一个bucket
中就有相等数量的键和查询,更容易进行批处理。有趣的是,这种“shared-QK”
配置不会影响Transformer
的性能。 - 应用批处理,其中
连续的查询被分组在一起。
Reformer
的另一项改进是使用可逆残差层(Gomez
等人,2017
年)。可逆残差网络的动机是设计一种架构,使得任何给定层的激活都可以从下一层的激活中恢复,仅使用模型参数即可。因此,我们可以通过在反向传播期间重新计算激活来节省内存,而不是存储所有激活。给定一个层
Reformer 将同样的思想应用到 Transformer 中,结合了注意力机制(
通过对前馈计算进行分块,可以进一步减少内存:
通过对前馈计算进行分块,可以进一步减少内存:
由此产生的可逆Transformer
不需要在每一层存储激活。Routing Transformer
(Roy
等人,2021
年)也基于上下文的键和查询聚类。它不使用LSH
之类的静态哈希函数,而是利用在线EMA
(指数移动平均)更新集群质心。在Routing Transformer
的实验中,一些最佳配置仅在模型的最后两层和一半的注意力头中启用路由注意力,而另一半则使用局部注意力。他们还观察到局部注意力是一个非常强大的基线,更大的注意力窗口总是会带来更好的结果。
低秩注意力
Linformer
(Wang
等人,2020
年)用低秩矩阵近似整个注意力矩阵,将时间和空间复杂度降低到线性。Linformer
不使用昂贵的SVD
来识别低秩分解,而是添加了两个线性投影
可以采用其他技术来进一步提高Linformer
的效率:
- 投影层之间的参数共享,例如头部、键值和层(跨所有层)共享。
- 使用不同的
在不同的层上,因为较高层的头部往往具有更倾斜的分布(较低的等级),因此我们可以使用较小的 在更高层。 - 使用不同类型的投影;例如均值/最大池化、带核和步幅的卷积层
。
随机特征注意力(RFA;Peng
等人,2021
年)依赖于随机特征方法(Rahimi & Recht,2007
) 用低秩特征图来近似自注意力中的softmax
操作,以实现线性时间和空间复杂度。Performers
(Choromanski
等人,2021
年) 还采用了随机特征注意,并改进了内核构造,以进一步降低内核近似误差。
RFA
背后的主要定理来自(Rahimi & Recht
, 2007
),
然后我们可以编写如下注意力函数,其中
因果注意RFA
在时间步骤中有token
)仅关注较早的键和值RNN
:
在这里Performer
使用正随机特征图修改随机特征注意,以减少估计误差。它还保持随机采样
基于强化学习的Transformer
自注意力机制避免将整个过去压缩为固定大小的隐藏状态,并且不会像RNN
那样遭受梯度消失或爆炸的影响。强化学习任务肯定可以从这些特性中受益。然而,即使在监督学习中训练Transformer
也相当困难,更不用说在强化学习环境中了。毕竟,单独训练LSTM
代理可能相当具有挑战性。Gated Transformer-XL
(GTrXL;Parisotto
等人,2019
)是将Transformer
用于强化学习的一种尝试。GTrXL
在Transformer-XL
的基础上进行了两项改进,成功实现了训练的稳定:
- 层归一化仅适用于残差模块中的输入流,而不适用于快捷方式流。这种重新排序的一个主要好处是允许原始输入从第一层流到最后一层。
- 残差连接被
GRU
风格(门控循环单元;Chung
等,2014
)门控机制取代。
门控函数参数被明确初始化为接近恒等映射-这就是为什么存在
决策Transformer
(DT;Chen
等人 2021
) 将强化学习问题表述为条件序列建模的过程,输出以期望回报、过去状态和动作为条件的最佳动作。因此,使用Transformer
架构变得非常简单。决策Transformer
适用于策略强化学习,其中模型只能访问由其他策略收集的固定轨迹集合。为了鼓励模型学习如何行动以实现期望的回报,它会向模型提供期望的未来回报Transformer
的输入序列:
添加并训练三个线性层,分别用于返回、状态和动作,以提取token
嵌入。预测头学习预测token
MSE
。在他们的实验中,预测状态或返回动作并没有发现有助于提高性能。实验将DT
与几种RL
算法基线进行了比较,结果显示:
- 在低数据环境下,
DT
比行为克隆更有效率。 DT
可以很好地模拟回报分布。- 拥有长上下文对于获得良好的结果至关重要。
DT
可以与稀疏奖励一起工作。