论文名称:Reformer: The Efficient Transformer
论文下载:https://arxiv.org/abs/2001.04451
论文年份:ICLR2020
论文被引:706(2020/04/20)
论文代码:https://github.com/google/trax/tree/master/trax/models/reformer

ABSTRACT

Large Transformer models routinely achieve state-of-the-art results on a number of tasks but training these models can be prohibitively costly, especially on long sequences. We introduce two techniques to improve the efficiency of Transformers. For one, we replace dot-product attention by one that uses locality-sensitive hashing, changing its complexity from O(L2) to O(L log L), where L is the length of the sequence. Furthermore, we use reversible residual layers instead of the standard residuals, which allows storing activations only once in the training process instead of N times, where N is the number of layers. The resulting model, the Reformer, performs on par with Transformer models while being much more memory-efficient and much faster on long sequences.

大型 Transformer 模型通常会在许多任务上获得最先进的结果,但训练这些模型的成本可能非常高,尤其是在长序列上。

我们介绍了两种技术来提高 Transformer 的效率。

  • 一方面,我们将点积注意力替换为使用局部敏感哈希的方法,将其复杂度从 O(L2)O(L^2)O(L2) 更改为 O(LlogL)O(L log L)O(LlogL),其中 LLL 是序列的长度。
  • 此外,我们使用可逆残差层而不是标准残差,这允许在训练过程中只存储一次激活而不是 N 次,其中 N 是层数。

由此产生的模型,Reformer,与 Transformer 模型的性能相当,同时在长序列上内存效率更高,速度更快

1 INTRODUCTION

Transformer 架构(Vaswani et al., 2017)广泛用于自然语言处理,并在许多任务上产生最先进的结果。为了获得这些结果,研究人员已经求助于训练更大的 Transformer 模型。

  • (Shazeer et al., 2018)报告的最大配置中,每层的参数数量超过 0.5B,
  • (Al-Rfou et al., 2018)中的层数达到 64 层。
  • Transformer 模型也用于越来越长的序列。在 (Liu et al., 2018) 和处理其他形式(如音乐 (Huang et al., 2018) 和图像 (Parmar et al., 2018))时,单个样本中多达 11000 个文本标记被处理,甚至较长的序列很常见。

这些大规模的长序列模型产生了很好的结果,但资源紧张到一些人认为这种趋势正在破坏 NLP 研究的地步。许多大型 Transformer 模型实际上只能在大型工业研究实验室中进行训练,而使用模型并行训练的此类模型甚至无法在单个 GPU 上进行微调,因为它们的内存要求即使对于单个训练步骤也需要多加速器硬件设置

大型 Transformer 模型是否从根本上需要如此巨大的资源,或者它们只是效率低下?考虑以下计算:报告的最大 Transformer 层中使用的 0.5B 参数占 2GB 内存。嵌入大小为 1024 和批量大小为 8 的 64K 标记的激活占 64K × 1K × 8 = 0.5B 浮点数,需要另外 2GB 内存。如果我们的内存使用只是每层,那么即使在单个加速器上长度为 64K 的序列上,我们也应该相当容易地适应大型 Transformer。此外,用于训练 BERT 的整个语料库只需要 17GB 来存储。为什么我们甚至无法在单台机器上微调这些模型?

上述估计仅包括每层内存和输入激活成本,并未考虑 Transformer 中以下主要内存使用来源。

  • N 层模型中的内存比单层模型大 N 倍,因为需要存储激活以进行反向传播。
  • 由于中间前馈层的深度 dffd_{ff}dff​ 通常远大于注意力激活的深度 dmodeld_{model}dmodel​,因此它占内存使用的很大一部分。
  • 注意长度为 LLL 的序列在计算和内存复杂度上都是 O(L2)O(L^2)O(L2),因此即使是 64K 标记的单个序列也会耗尽加速器内存。

我们介绍了使用以下技术解决这些问题的 Reformer 模型:

  • 可逆层(Reversible layers),首先在 Gomez 等人 (2017) 中引入,允许在整个模型中仅存储单个激活副本,因此 N 因子消失了。
  • 在前馈层内拆分激活并以块的形式处理它们,可以消除 dffd_{ff}dff​ 因子并节省前馈层内的内存。
  • 基于局部敏感哈希(locality-sensitive hashing,LSH)的近似注意力计算将注意力层中的 O(L2)O(L^2)O(L2) 因子替换为 O(LlogL)O(L log L)O(LlogL),因此允许对长序列进行操作

我们研究了这些技术,并表明与标准 Transformer 相比,它们对训练过程的影响可以忽略不计。拆分激活实际上只影响实现;它在数值上与 Transformer 中使用的层相同。应用可逆残差而不是标准残差确实会改变模型,但对我们试验过的所有配置的训练影响可以忽略不计。最后,注意力中的局部敏感哈希是一个更重要的变化,它可以影响训练动态,这取决于使用的并发哈希的数量。我们研究了这个参数,并找到了一个既能有效使用又能产生非常接近完全注意力的值。

我们对一个合成任务、一个长度为 64K 的文本任务 (enwik8) 和一个长度为 12K 的图像生成任务 (imagenet-64 generation) 进行实验。在这两种情况下,我们都表明,Reformer 与使用完整 Transformer 获得的结果相匹配,但运行速度更快,尤其是在文本任务上,并且内存效率提高了几个数量级。

2 LOCALITY-SENSITIVE HASHING ATTENTION

点积注意力(Dot-product attention)。 Transformer 中使用的标准注意力是缩放的点积注意力。输入由维度 dk 的查询和键以及维度 dv 的值组成。计算查询与所有键的点积,按 √dk 缩放,并应用 softmax 函数来获得值的权重。在实践中,一组查询的注意力函数是同时计算的,打包到矩阵 Q 中。假设键和值也打包到矩阵 K 和 V 中,输出矩阵定义为:

多头注意力(Multi-head attention)。在 Transformer 中,不是使用 dmodel 维度的键、值和查询执行单个注意函数,而是用不同的、学习到的线性投影将查询、键和值分别线性投影 h 次到 dk、dk 和 dv 维度。注意力被并行应用于查询、键和值的每个投影版本,产生 dv 维输出值。这些被连接并再次投影,产生最终值。这种机制被称为多头注意力。

记忆高效的注意力(Memory-efficient attention)。为了计算注意力机制的内存使用,让我们关注公式 1 中的注意力计算。假设 Q、K 和 V 都具有形状 [batch size, length, dmodel]。主要问题是 QKTQK^TQKT 项,其形状为 [batch size, length, length]。在实验部分,我们在长度为 64K 的序列上训练模型——在这种情况下,即使批量大小为 1,这是一个 64K × 64K 矩阵,在 32 位浮点数中需要 16GB 内存。这是不切实际的,并且阻碍了将 Transformer 用于长序列。但需要注意的是, QKTQK^TQKT 矩阵不需要在内存中完全具体化。确实可以为每个查询 qiq_iqi​ 分别计算注意力,只在内存中计算一次 softmax(qiKT√dk)Vsoftmax( \frac{q_i K^T}{√dk} )Vsoftmax(√dkqi​KT​)V,然后在需要梯度时在反向传递中重新计算它。这种计算注意力的方式可能效率较低,但它只使用与长度成正比的内存。我们使用这种内存高效的注意力实现来运行实验部分中介绍的全注意力基线

Where do Q, K, V come from? 上面描述的多头注意力对键、查询和值进行操作,只得到一个形状为 [batch size, length, dmodel] 的激活张量 A——例如,来自于将句子中的标记嵌入到向量中。

为了从 A 构建 Q、K 和 V,Transformer 使用 3 个不同的线性层将 A 投影到具有不同参数的 Q、K 和 V。对于具有 LSH 注意力的模型,我们希望查询和键(Q 和 K)是相同的。这很容易通过使用相同的线性层从 A 到 Q 和 K 来实现,并为 V 使用单独的层。我们称这种行为的模型为 shared-QK Transformer。事实证明,共享 QK 不会影响 Transformer 的性能,即使我们额外归一化键 K 的长度,正如我们在实验第 5 节中展示的那样。

哈希注意力(Hashing attention)。对于 LSH 注意力,我们从形状 [batch size, length, dmodel] 的两个张量 Q=K 和 V 开始。我们保持多头机制不变,并专注于公式 1 中的注意力计算。如前所述,主要问题是 QKTQK^TQKT 项,其形状为 [batch size, length, length]。但请注意,我们实际上只对 softmax(QKT)softmax(QK^T)softmax(QKT) 感兴趣。由于 softmax 由最大的元素支配,对于每个查询 qi 我们只需要关注 K 中最接近 qi 的键。例如,如果 K 的长度为 64K,那么对于每个 qi,我们只能考虑一小部分,比如 32 或 64 个最接近的键。这样效率更高,但是我们如何在键中找到最近的邻居呢?

局部敏感哈希(Locality sensitive hashing)在高维空间中快速找到最近邻居的问题可以通过局部敏感哈希(LSH)来解决如果附近的向量以高概率获得相同的哈希,而远处的向量没有得到相同的哈希,则将每个向量 x 分配给哈希 h(x) 的哈希方案称为局部敏感。在我们的例子中,我们实际上只要求附近的向量以高概率获得相同的哈希,并且哈希桶具有相似大小的高概率

图 1:角度局部敏感哈希使用球面投影点的随机旋转通过 argmax 在有符号轴投影上建立桶。在这个高度简化的 2D 描述中,两个点 x 和 y 不太可能为三个不同的角度哈希共享相同的哈希桶(上),除非它们的球形投影彼此接近(下)。

我们通过采用如下随机投影来实现这一点(参见图 1)。为了得到 b 个哈希值,我们首先固定一个大小为 [dk,b/2][d_k, b/2][dk​,b/2] 的随机矩阵 R。然后我们定义 h(x)=argmax([xR;−xR])h(x) = arg max([xR; -xR])h(x)=argmax([xR;−xR]) 其中 [u;v][u; v][u;v] 表示两个向量的连接。该方法是一种已知的 LSH 方案(Andoni et al., 2015),易于实现并应用于批量向量。

LSH 注意力(LSH attention)。了解了我们的 LSH 方案和哈希注意力的概念,现在形式化本文中使用的 LSH 注意力。我们首先针对一次单个查询位置 iii 重写正常注意力的方程 (1)

符号 PiP_iPi​ 表示位置 iii 处的查询所关注的集合,zzz 表示分区函数(即 softmax 中的归一化项)。为清楚起见,我们也省略了 √dk 的缩放。

出于批处理目的,我们通常在更大的集合 Pi~={0,1,...,l}⊇Pi\tilde{P_i} = \{0, 1, . . . , l\} ⊇ P_iPi​~​={0,1,...,l}⊇Pi​,同时屏蔽不在 PiP_iPi​ 中的元素:

可以将 LSH 注意力视为限制目标项的集合 PiP_iPi​,即可以关注的查询位置,只允许在单个哈希桶内进行注意力

图 2(a-b)显示了全注意力与哈希变体的示意图比较。

  • (a) 部分描述了全注意力的注意力矩阵通常是稀疏的,但计算没有利用这种稀疏性
  • 在 (b) 中,查询和键已根据其哈希桶进行排序。由于相似的项很有可能落在同一个桶中,因此可以通过只允许每个桶内的注意力来近似完整的注意力模式

【直接进行 HASH 分桶存在的两个问题】:

  • 此公式中的哈希桶的大小往往不均匀,这使得跨桶的批处理变得困难
  • 此外,一个桶中查询的数量和键的数量可能不相等——事实上,一个桶有可能包含许多查询但没有键

【本文的解决方案】:

  • 为了缓解这些问题,首先通过设置 kj=qj∣∣qj∣∣k_j = \frac{q_j} {||q_j||}kj​=∣∣qj​∣∣qj​​ 来确保 h(kj)=h(qj)h(k_j) = h(q_j)h(kj​)=h(qj​)

  • 接下来,按存储桶编号对查询进行排序,并在每个存储桶中按序列位置排序;这定义了排序后 i→sii → s_ii→si​ 的排列。在排序的注意力矩阵中,来自同一桶的对将聚集在对角线附近(如图 2c 所示)。我们可以采用批处理方法,其中 mmm 个连续查询的块(排序后)相互关注,一个块返回(图 2d)。按照之前的符号,这对应于设置:

    如果最大值 ∣Pi∣<m|Pi| < m∣Pi∣<m,然后 Pi⊆Pi~P_i ⊆ \tilde{P_i}Pi​⊆Pi​~​。在实践中,我们设置 m=2lnbucketsm = \frac{2l}{ n_{buckets}}m=nbuckets​2l​(其中 lll 是序列长度)。平均桶大小是 lnbuckets\frac{l}{n_{buckets}}nbuckets​l​,我们假设桶增长到两倍大小的概率足够低。 LSH attention的整个过程总结在图2中。

多轮 LSH 注意力(Multi-round LSH attention)。使用哈希,总是有很小的可能性相似的项仍然落在不同的桶中。这种概率可以通过使用 nroundsn_{rounds}nrounds​ 不同的哈希函数 {h(1),h(2),...}\{h^{(1)}, h^{(2)}, . . .\}{h(1),h(2),...} 进行多轮哈希来降低。这样:

多轮的情形本质上涉及并行执行 N 轮 LSH 注意;该程序的详细信息在附录 A 中进行了描述。

共享 QK 注意力的因果掩码(Causal masking for shared-QK attention)。在 Transformer 解码器中,掩码(由公式 3 中的 m(j,Pi)m(j, P_i)m(j,Pi​) 表示)用于防止位置进入未来。为了在 LSH attention 中实现掩码,我们将每个查询/键向量与位置索引相关联,使用用于排序查询/键向量的相同排列重新排序位置索引,然后使用比较操作来计算掩码

虽然不允许关注未来,但 Transformer 的典型实现确实允许关注自己的位置。这种行为在共享 QK 公式中是不可取的,因为查询向量与自身的点积几乎总是大于查询向量与另一个位置的向量的点积。因此,我们修改掩码以禁止标记(token)关注自身,除非标记(token)没有其他有效的注意力目标(例如序列中的第一个标记)

2.1 ANALYSIS ON A SYNTHETIC TASK

为了验证 LSH 注意力的性能并研究其行为,我们从以下合成任务开始:复制一系列符号。在此任务中,每个训练和测试示例的形式为 0w0w,其中 w∈{1,...,N}∗w ∈ \{1, . . . , N\}^∗w∈{1,...,N}∗ 是从 1 到 N 的符号序列(我们在实验中使用 N = 127)。下面给出了长度为 3 的单词 w 的样本。

为了研究 LSH 注意,我们在上述形式的样本上训练了一个语言模型,其中每个 w 的长度为 511(因此整个输入 0w0w 的长度为 1024)。由于这是一项语言建模任务,我们总是在给定所有先前符号的情况下预测下一个符号,但我们掩盖(mask)了损失和准确性,只考虑输入后半部分的位置,即那些实际可以预测的位置

上述任务可以通过 1 层 Transformer 模型完美解决(准确率为 100%,损失为 0)。但请注意,它需要非局部注意力查找,因此任何依赖于有限跨度的稀疏注意力的模型都无法解决它。为了使训练变得容易和快速,但与 NLP 中使用的模型相似,我们使用 dmodel=dff=256d_{model} = d_{f f} = 256dmodel​=dff​=256 和 4 个 head 的 1 层 Transformer。我们在 4 种不同的设置下对其进行 150K 步训练:全注意力,nroundsn_{rounds}nrounds​ 分别为 1,2,4 的 LSH 注意力。

从表 2 中总结的结果中,我们看到经过充分注意力训练的模型可以立即与 LSH 注意力一起使用,但会损失一些准确性。当使用 LSH 注意从头开始训练时,使用 4 个哈希训练的模型也达到了几乎完美的准确性。有趣的是,当使用 8 个哈希进行评估时,准确性变得完美。当使用 2 或 1 个哈希进行评估时,它会下降。使用较少哈希训练的模型显示出更差的结果,但即使是仅使用 1 个哈希训练的模型在使用 8 个哈希进行评估时也表现得几乎完美。

3 REVERSIBLE TRANSFORMER

如上节所示,只要近似值可以接受,注意力的复杂性可以从长度的平方降低到线性。但是从表 1 可以清楚地看出,每个字段都以 b⋅nh⋅lb·n_h·lb⋅nh​⋅l 项开头:b⋅nh⋅l⋅dkb·n_h·l·d_kb⋅nh​⋅l⋅dk​ 或 b⋅l⋅dmodelb·l·d_{model}b⋅l⋅dmodel​ 成本是不可避免的。事实上,每一层之前的激活已经是 b⋅l⋅dmodelb·l·d_{model}b⋅l⋅dmodel​ 的大小,所以 nln_lnl​ 层的整个模型的内存使用至少是 b⋅l⋅dmodel⋅nlb·l·d_{model}·n_lb⋅l⋅dmodel​⋅nl​。更糟糕的是:在 Transformer 的前馈层内,它上升到 b⋅l⋅dff⋅nlb·l·d_{ff}·n_lb⋅l⋅dff​⋅nl​。在大的 Transformer 中,通常设置 dffd_{ff}dff​ = 4K 和 nln_lnl​ = 16,所以当 lll = 64K 时,这又会使用 16GB 内存。

在本节中,我们将展示如何降低这一成本,首先使用可逆层处理 nln_lnl​ 部分,然后展示分块如何允许我们处理 dffd_{ff}dff​ 问题。表 3 总结了每种方法对内存和时间复杂度的影响。

RevNets。Gomez et al. (2017) 引入了可逆残差网络,该网络表明它们可以代替ResNets进行图像分类。主要思想是允许仅使用模型参数从下一层的激活中恢复任何给定层的激活。当反向传播从网络的输出进行到其输入时,各层可以一个接一个地反向,而不必检查用于反向传递的中间值。正常残差层执行函数 x→yx →yx→y,该函数对单个输入进行操作并产生单个输出,其形式为 y=x+F(x)y = x + F (x)y=x+F(x),而可逆层对成对的输入/输出进行操作:(x1,x2)→(y1,y2)(x_1,x_2) → (y_1,y_2)(x1​,x2​)→(y1​,y2​),并遵循以下等式:

可以通过减去(而不是添加)残差来反转层:

Reversible Transformer。我们通过在 revnet 块内结合注意力和前馈层,将 RevNet 思想应用于 Transformer。在上面的符号中,F 成为注意力层,而 G 成为前馈层。请注意,Layer Normalization (Ba et al., 2016) 在残差块内移动

Reversible Transformer 不需要在每一层中存储激活,因此摆脱了 nln_lnl​ 项。在第 5 节中,我们展示了当使用相同数量的参数时,它的性能与普通 Transformer 相同;我们通过让 x1x_1x1​ 和 x2x_2x2​ 都具有大小 dmodeld_{model}dmodel​ 来实现这一点

分块(Chunking)。虽然可逆性涵盖了 nln_lnl​ 项,但较厚的层仍然可以使用大量内存。特别是前馈层可以使用维度 dffd_{ff}dff​ = 4K 或更高的中间向量。但是,前馈层中的计算在序列中的位置之间是完全独立的,因此可以将计算分成 c 个块

该层通常通过对所有位置并行执行操作来进行批处理,但是一次操作一个块会减少内存。 (8) 中的反向计算和反向传递也被分块。除了前馈层之外,对于具有大词汇量的模型(超过 dmodeld_{model}dmodel​ 词类型),我们还在输出处分块对数概率,并一次计算序列部分的损失

分块、大批量和参数重用(Chunking, large batches and parameter reuse)。通过分块和可逆层,我们在整个网络中用于激活的内存与层数无关。参数的情况并非如此,尽管它们的数量随着层数的增加而增加。虽然这个问题得到了解决,因为我们可以在该层不计算时将层参数与 CPU 内存交换。在标准的 Transformer 中,这将是低效的,因为内存到 CPU 的传输速度很慢。不过,Reformer 中的批量大小乘以长度要大得多,因此使用参数完成的计算量分摊了它们的传输成本。

4 RELATED WORK

(Vaswani et al., 2017) 中提出的 Transformer 模型已广泛用于自然语言任务。

  • 音乐乐谱 (Huang et al., 2018)
  • 图像 (Parmar et al., 2018; Ramachandran et al., 2019)。
  • 超大型语言模型的自监督训练(Devlin et al., 2018; Radford et al., 2019)。

鉴于现有技术序列模型的巨大计算要求,人们越来越关注寻找方法来减少 Transformer 模型的内存占用和计算要求。

  • 精度降低和梯度检查点 (Sohoni et al., 2019) 等标准方法
  • Transformer 模型的自注意力机制的更有效版本 (Sukhbaatar et al., 2019a;b)。

特别是,利用注意力层中的稀疏性已被证明是卓有成效的。

  • OpenAI 引入了稀疏 Transformer (Child et al., 2019),它利用了注意力的分解稀疏表示
  • (Lample et al., 2019)使用 product-key attention 来增加键空间也被用于减少前馈层中的内存需求,而不会损失性能。

据我们所知,局部敏感哈希 (LSH) 之前并未直接应用于 Transformer 注意力层。但是以前使用带有神经网络的外部存储器的工作已经处理了大尺寸的内存。

  • 内存网络的最初实现(Weston et al., 2014)和后来的扩展工作(Bordes et al., 2015; Chandar et al., 2016)使用了数百万大小的内存。这样做的代价是必须在训练之前固定内存
  • 此外,由于在训练开始时模型不太可能正确查询内存,因此使用强监督来鼓励模型查询有用的内存位置。这些提示要么作为任务的额外监督信息给出,要么像 Hill et al. (2015) 的启发式地确定。
  • Santoro et al. (2016) 已经删除了之前固定内存的要求。以内存大小为代价,后来被 Rae et al. (2016) 缓解。上一篇论文考虑了使用近似最近邻的内存查找,包括 LSH 和随机 kd 树,但仅适用于外部内存中的查找

5 EXPERIMENTS

在本节中,我们展示了展示上述技术的实验结果。我们逐一分析这些技术,以明确哪些组合会对性能产生影响。我们首先展示可逆层和共享查询键空间不会影响性能,然后继续分析哈希注意力,最后分析完整的 Reformer 模型。

我们在 imagenet64 和 enwik8-64K 任务上进行了实验,后者是 enwik8 的变体,被分块为 216 = 64K 个标记的子序列。我们使用 3 层模型进行消融,以便与具有高内存使用并执行完全 O(l2)O(l^2)O(l2) 注意力的常规 Transformer 进行比较。所有实验的 dmodel = 1024,dff = 4096,nheads = 8,总批大小为 8 个序列。我们使用 Adafactor 优化器 (Shazeer & Stern, 2018) 来训练这些模型。我们还根据 Vaswani et al. (2017) 的超参数评估了 WMT 2014 英德翻译任务。所有实验的训练在 8 个设备(8 个 GPU 或 8 个 TPU v3 内核)上并行进行。

Effect of sharing QK。我们首先考虑共享 QK 注意力对常规 Transformer 模型的影响。 Shared-QK attention 设置 kj=qj∣∣qj∣∣k_j = \frac{q_j}{||q_j||}kj​=∣∣qj​∣∣qj​​ 并防止标记关注自己(除非没有其他上下文可用)。在图 3 的左侧,我们绘制了常规和共享 QK 注意力的困惑曲线(perplexity curves)。共享查询键空间的性能并不比常规注意力差;事实上,对于 enwik8,它的训练速度似乎稍快一些。换句话说,我们并没有通过切换到共享 QK 注意力来牺牲准确性

Effect of reversible layers。在图 3 右侧的两个图中,我们比较了常规 Transformer 与第 3 节中描述的可逆模型。这两个模型具有相同的参数计数,并且学习曲线也似乎几乎相同。这些结果表明,可逆 Transformer 中的内存节省不会以牺牲准确性为代价

Reversible layers in machine translation。我们还在编码器-解码器 Transformer 模型的上下文中评估可逆层,用于从英语到德语的机器翻译。我们首先使编码器和解码器在基于 Transformer 的架构中完全可逆,并看到生成的模型训练 100K 步时,与原生 Transformer 的性能相当。我们还评估了更多步骤和更大模型的训练。Reformer 模型非常节省内存,因此对于后两个实验,我们不需要通过在整个模型中共享嵌入和输出投影权重矩阵来节省内存。结果如表 4 所示。我们在此设置中不应用 LSH 注意力,因为示例是单个句子,并且句子往往相对较短。我们典型的 LSH 注意配置在哈希和排序后使用 128 个标记块,而 WMT14 测试集中的样本都短于 128 个标记。

LSH attention in Transformer。LSH 注意力是完全注意力的近似值,如图 4 所示,随着哈希数量的增加,它变得更加准确。在 nrounds = 8 时,它几乎已经完全匹配了注意力。模型的计算成本随着哈希的数量而增长,因此可以根据可用的计算预算来调整这个超参数。此外,如表 2 所示,可以在评估时增加哈希的数量以产生更准确的结果。在图 5 的右半部分,我们绘制了不同注意力类型的速度与序列长度的关系,同时保持标记的总数固定。我们看到,虽然常规注意力在较长的序列长度上变得更慢,但 LSH 注意力速度保持不变

Large Reformer models。为了验证 Reformer 确实可以在单核上拟合大型模型并在长序列上快速训练,我们在 enwik8 和 imagenet64 上训练了多达 20 层的大型 Reformer。如图 5 所示,这些模型适合内存和训练。在这种情况下,我们无法训练 Transformer 基线,因为它们太慢且需要大量内存,但我们看到层数有明显改善。 enwik8 上的 12 层模型经过 20K 步训练,dropout 率为 0.1,在测试集上达到 1.19 bits/dim。我们还对 12 层的 Reformer 模型进行了更长时间的训练,并进行了进一步的调整和改进,我们在 enwiki8 测试集上达到了 1.05 bits/dim。

6 CONCLUSION

Reformer 将 Transformer 的建模能力与可以在长序列上高效执行的架构相结合,并且即使对于具有大量层的模型,内存使用量也很小。我们相信这将有助于大型、丰富参数化的 Transformer 模型变得更加广泛和可访问。此外,处理长序列的能力为在许多生成任务中使用 Reformer 开辟了道路。除了生成非常长的连贯文本外,Reformer 还可以将 Transformer 模型的强大功能带到其他领域,如时间序列预测、音乐、图像和视频生成。

A MULTI-ROUND LSH ATTENTION

在本节中,我们将更详细地描述我们的 LSH 注意力机制的多哈希版本。我们首先重复正文中的等式(3),它描述了具有稀疏性的注意力的一般公式:

LSH 注意力的每一轮都会产生一个向量 oi(r)o^{(r)}_ioi(r)​ ,它可以独立于其他轮次计算,除了包含一项 Ni,jN_{i,j}Ni,j​ 以避免在构建 Pi(r)P^{(r)}_iPi(r)​ 集的并集时重复计算元素。在我们的实现中,我们将 Ni,jN_{i,j}Ni,j​ 因子折叠到掩码项 mi,j(r)m^{(r)}_{i,j}mi,j(r)​ 中。

我们还修改了 mi,j(r)m^{(r)}_{i,j}mi,j(r)​ 以引入 i=ji = ji=j 的特殊情况。添加这种情况是因为标准 Transformer 中的因果掩码允许位置 iii 关注自身,这在共享 QK 公式中是不可取的。我们将掩码设置为一个大但有限的值,以禁止就地注意,除非在标记没有其他有效注意目标。例如,序列中的第一个标记只关注它自己,因为没有可用的先前上下文

【时序】Reformer:局部敏感哈希(LSH)实现高效 Transformer 论文笔记相关推荐

  1. 【算法】局部敏感哈希 LSH 的 Python 实现

    一.哈希算法 普通的哈希算法:把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值. 最理想的是所有不同的输入都可以映射到散列值,但是存在这种可能性的.当不同的输入映射到相同的散列值时, ...

  2. mysql 查找相似数据_局部敏感哈希LSH(Locality-Sensitive Hashing)——海量数据相似性查找技术...

    一. 前言 最近在工作中需要对海量数据进行相似性查找,即对微博全量用户进行关注相似度计算,计算得到每个用户关注相似度最高的TOP-N个用户,首先想到的是利用简单的协同过滤,先定义相似性度量(cos,P ...

  3. 如何使用局部敏感哈希(LSH)算法进行特征降维?

    这篇博客只关注局部敏感哈希的降维过程,也不涉及理论证明. 1. 局部敏感哈希算法 1.1 算法简介   传统的哈希(Hashing)算法通过映射函数将记录的存储位置与记录的关键字关联起来,实现记录的快 ...

  4. 【时序】Informer:用于长序列预测的高效 Transformer 论文笔记

    论文名称:Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting 论文下载:https://a ...

  5. 局部敏感哈希(lsh)包安装成功

    我们需要安装一个lsh包 直接 pip install lsh 报错 error: Microsoft Visual C++ 14.0 is required. Get it with "M ...

  6. transformer中attention计算方式_Reformer: 局部敏感哈希、可逆残差和分块计算带来的高效...

    最近要开始使用Transformer去做一些事情了,特地把与此相关的知识点记录下来,构建相关的.完整的知识结构体系, 以下是要写的文章,本文是这个系列的第九篇: Transformer:Attenti ...

  7. 局部敏感哈希(Locality Sensitive Hashing)二三问[2]

    #写在前面的话 今天的这一章有几个目的,一是回答一下各位网友在各大博客上提出的问题,然后其他博主没有回答的问题.二是纠正一些别人在写局部敏感哈希时候出现的错误.就是这么贴心有没有. #假装自己是正文的 ...

  8. 局部敏感哈希算法(Locality Sensitive Hashing)

    from:https://www.cnblogs.com/maybe2030/p/4953039.html 阅读目录 1. 基本思想 2. 局部敏感哈希LSH 3. 文档相似度计算 局部敏感哈希(Lo ...

  9. 【王喆-推荐系统】线上服务篇-(task4)局部敏感哈希

    学习总结 (1)上一个task我们提到用embedding召回,快速过滤商品,缩小候选集.但是embedding相似度如果都用余弦计算,当数据量很大时计算量很大.所以提出用[局部敏感哈希LSH]解决高 ...

最新文章

  1. 如果你现在学Android---学习使用Kotlin进行Android开发
  2. Dapr微服务应用开发系列5:发布订阅构建块
  3. 又是一年国庆假期最后一天
  4. php 匹配非数字,正则表达式 - 获取匹配和非获取匹配
  5. System.IO.FileNotFoundException 找不到指定的模块问题解决
  6. 使用 URL 读取网络资源
  7. wps word新建页背景由淡蓝色变回白色
  8. 爬虫基础_01——正则
  9. P2142 高精度减法
  10. CSP 201809-2 买菜
  11. 广告电商系统开发功能只订单处理
  12. 计算机应用基础差错解释,计算机应用基础名词解释:差错
  13. html 设置卯位置,周易基础知识:十二地支之卯木
  14. nas与文件服务器对比,NAS网络存储设备为什么能取代文件服务器
  15. 教你怎样操作编辑PDF文件,修改PDF上的文字
  16. Action Game Maker 游戏开发工具介绍
  17. 线性代数(8): 生成空间与空间的基
  18. SQL Server数据分组
  19. 并发编程--线程同步之 synchronized关键字(一)
  20. 英雄联盟游戏服务器IP

热门文章

  1. Windows 入门 AI 视觉处理 --- 搭建姿势识别应用 之 利用NVIDIA Maxine识别人体姿势
  2. java写轮播图,Android零基础入门第49节:AdapterViewFlipper图片轮播
  3. 2023 节日头像框制作生成微信小程序源码 附流量主
  4. mysql处理Latin 中文繁体字乱码解决方案
  5. 相约QCon北京2013大会,图灵全程为您准备好图书
  6. C#开发学习~~~Console.WriteLine()
  7. 依赖属性之“风云再起”五
  8. 如何处理 “公司代码 XXXX 和成本控制范围 XXXX 在不同的会计科目表中”报错
  9. 2022化工自动化控制仪表培训试题及答案
  10. css动画制作幻灯片