Press "Enter" to skip to content

Transforms优化性能的新方法

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

简要介绍一下NLPs最先进架构的前景发展

 

 

照片:Jocelyn Moraleson Unsplash

 

现在是2017年,”注意力是你所需要的一切 “这篇论文为NLP提供了一个新的有希望的架构:Transformer。四年后–在深度学习领域是永恒的–Transformer仍然是最先进的架构,被用于各种NLP任务。但世界并没有停滞不前–至少在这个领域是这样,还有许多论文拿起了Transformer,并为进一步发展提供了新的方法。我想在这里讨论一些有前途的。

 

我们将从已经在2019年发表的论文开始:” Transformer XL: Attentive Language Models Beyond a Fixed-Length Context “。接下来的论文将是 ” Reformer。高效转化器 “,然后才是最近的文章(2021年6月)。” 包装。Towards 2x NLP BERT Acceleration “将被讨论。

 

还有很多关于Transformer的有前途的论文,但我不得不做一个选择,以便这篇文章不会超出范围。我希望我没有对任何一篇论文的作者 不公平!

 

Transformer-XL。超越固定长度语境的关注性语言模型

 

本文讨论了Transformer在处理没有固定长度的文本方面的有限能力。标准的Transformer使用一个最大长度、截断和填充来处理不同的序列长度。同时,这种固定的长度是扩展的依赖性学习的障碍,在这种情况下,注意力机制会掌握超过这个限制的连接。

 

虽然短期的依赖性可能不会对大多数用例造成问题,但由于截断及其不尊重语义边界的特性,固定长度的限制可能会降低性能。作者将此称为_上下文碎片_化。

 

他们的解决方案听起来很简单:通过不从头开始计算隐藏状态,最后一个状态可以作为当前片段的记忆状态。有了这种经常性的联系,信息就不会丢失,而会从一个状态传到另一个状态。这显然可以解决语义信息丢失的问题,并导致长期的依赖性。

 

与虚构的转化器相比,其变化可以在注意层中找到。键和值将由前段的缓存来扩展。我不打算谈更多的细节。但我强烈推荐你阅读Transformer XL论文中的_Segment-Level Recurrence with State Reuse_ 一章。

 

在注意层中使用先前片段的缓存需要一些额外的改变。作者提出的问题是:” [……]当我们重复使用状态时,如何才能保持位置信息的一致性? “(Dai, et al. 2019)。虽然在默认的变形金刚中,序列顺序是由位置编码提供的。当使用缓存时,前一个状态的位置编码(我们刚刚谈到的)没有被考虑在内。这就导致了性能不佳。为了解决这个问题,作者的方法是只对隐藏状态中的相对位置信息进行编码,并将其注入注意力分数中。从他们的角度来看,这种方法更加直观。

 

例如,当查询向量qτ,i关注关键向量 k τ,≤i时,它不需要知道每个关键向量的绝对位置来识别片段的时间顺序。 (Dai, et al. 2019)

 

相对距离就足够了,查询向量可以通过它们的不同距离来区分元素。此外,绝对位置也可以从相对距离中得到。请在原始论文中阅读更多这方面的内容。

 

总结一下:通过缓存前一个片段来改进注意力机制,似乎是一个很有希望的步骤。不仅如此,它还能增加长期的依赖性,而且还能对抗因分割文本而出现的_上下文_断裂问题。

 

 

照片:Jocelyn Moraleson Unsplash

 

改革者。高效的转化器

 

变换器是具有大量参数的巨大模型。从头开始训练它们,现实上只能由行业或平等的大公司来做。幸运的是,我们可以使用像BERT这样的预训练模型。但即使是24层版本的BERT也很难在单个GPU系统上进行训练。如果我们不希望最终这种模型只能由大的合作机构来训练和运行,变形金刚需要变得更有效率。

 

Kitaev、Kaiser和Levshaya–_Reformer_论文的作者,介绍了三个应该解决上述问题的变化。

使用可逆层,为整个模型只存储一份激活的副本。这将使存储激活所需的内存减少_N倍。_
在前馈层内分割激活并将其作为块处理,有助于减少这些层所需的内存。前馈层通常要比注意力层等广泛得多,因此要负责高内存的使用。
使用对位置敏感的散列注意,将注意层内部的因子从_O(L²)_ 变为_O(L log L)_

作者确信,”_[……]这些技术[……]与标准变形器相比,对训练过程的影响可以忽略_不计”(Kitaev, et al. 2020)。我将谈论第一个和最后一个想法–在我看来,它们是最有趣的。为了不至于走得太远,第二种方法将不再讨论。

 

可逆变压器

 

在他们的论文中。 可逆的残余网络工作。G omez等人提出了_可逆残差网络_ (RevNets)。这个想法是,每一个激活都可以从下一层恢复,在反向传播过程中不需要存储–用计算换取更多的内存。残差层(也叫跳过连接)执行一个在单一输入和单一输出上操作的函数。

 

 

可逆层对两个输入进行工作。

 

 

与这些方程(并通过子层进行逆转)。

 

 

在可逆_变换器_ 的背景下_,_ 这意味着前馈层_(G_)和注意力层_(F_)在可逆块中被结合起来。

 

Y₁ = X₁ + Attention(X₂) and Y₂ = X₂ + FeedForward(Y₁)

 

通过这种实现方式,不再需要存储激活,因此可以节省内存。即使这意味着需要稍多的计算。

 

位置敏感的散列注意

 

转化器的核心是注意力机制。不是没有原因的,最初的论文被称为_Attention is all you need。_ 因此,开发出使这个机制更有效的方法只是时间问题。

 

在标准的Transformer中,使用的是缩放点乘法的注意力。

 

 

输入包含查询和键以及值。所有查询和键的点积在被缩放之前被计算。之后,应用softmax函数。最后,中间矩阵和值矩阵的矩阵乘法产生注意分数。

 

作者正在寻找一种更有内存效率的关注机制,并提出了_位置敏感散列关注(LSH) 的想法。其目的是将复杂性从_O(L²) 降低到_O(L log L)。_ 粗略地说,这种算法的目的是将数据点分组到所谓的桶中,从而使彼此接近的数据点得到相同的哈希值–概率很高。与其他散列技术相比,散列碰撞被最大化,而不是最小化。在最近的邻居的帮助下,我们可以把注意力集中在与查询相近的键上。

 

下面你可以看到论文中提出的LSH注意力。

 

 

单个查询位置i的方程式

 

_P “_指的是 “_i “_所处的集合,” z “ 表示分区函数。 LSH 背后的想法是,集合_P_的元素 ,被限制为关注单个散列桶的元素。

 

 

LSH 作为完全关注的一个近似值,有能力通过增加计算成本来减少内存的使用–随着哈希数量的增加而增加。我们希望这将使大型转化器更容易使用–不仅是在多个GPU上运行的机构。

 

包装。迈向2倍NLP BERT加速

 

正如已经讨论过的,预训练BERT由于其对计算能力的大量需求,只对大型工业或研究机构可行。本文作者Kosec、Fu和Krell希望通过去除填充物来提高效率,从而减少这一障碍。他们提出了一种算法,利用维基百科的数据集,将预训练的速度提高了2倍。

 

处理填充符号可以被看作是一种计算的浪费。文本长度分布越广,这个过程中损失的计算量就越多。包装方法希望完全填充每个序列长度,因此对填充的需求就消失了。这个想法是基于这样的假设:序列是可以互换的,所以顺序并不重要。包装的方法是一个经典的编程问题(bin-packing或cutting stock问题)。由于该问题是NLP特有的,因此提出了两种算法。

最短包装优先直方图包装法(SPFHP
非负最小二乘直方图包装(NNLSHP)。

了解这些算法的细节并不重要,更重要的是分析打包引起的问题。作者们通过详细解决这些问题,做得很好。让我们来谈一谈它们。

 

顾名思义,BERT(Bidirectional Encoder Representations from Transformers)利用的是双向的自我关注。然而,打包–为了填满语段而不给填充物留出空间–会产生没有相应序列的语段。像GPT3这样具有随意注意的语言模型不会面临这个问题,因为它们只注意到以前的标记。该论文为注意力层引入了一个掩码,以防止不同序列之间的污染。让我们看一下文章中提供的一些代码。

 

mask = np.array([[1, 1, 1, 2, 2]]) # input

 

#for use with softmax:

 

这个实现创造了一个块状对角线的掩码,减少了填充,可以简单地由_numpy_等框架实现_。_

 

包装面临的另一个挑战是关于损失和精确度的计算。在BERT中,交叉熵损失是按序列计算的。当使用打包时,损失将不再为序列计算。该模型将收敛到一个不同的最佳状态。为了解决这个问题,作者的想法是。

 

“为了实现每个序列的损失,我们通过使用每个标记的损失,有效地’解压’了传入的对数和标签。我们计算属于第一个序列的所有标记的损失,然后是属于第二个序列的所有标记,以此类推” (Kosec, et al. 2021)。

 

文中有一个很好的代码例子,解释了他们的实现方式–请看。

 

与其他两篇文章不同,打包方法旨在优化预训练。即使这个过程可能需要大量的时间和金钱,但这里显示的改进是有希望的。

 

现在我们已经看了各种改进Transformer的方法,不得不说,所有这些方法都是优化性能而不是优化质量输出的独家想法。这可能是由于我的选择,也是由于Transformer作为一个有前途的架构越来越多地只为大公司所用,或者至少是由他们创造。GTP3是这方面的一个典范例子。

 

我希望这些描述是可以理解的,也是容易理解的。所解释的一些概念并不是特别容易理解,所以解释本身并不是最直接的任务。谢谢你读到最后。下次见–再见。

 

Be First to Comment

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注