处理长文本序列的Transformer变种(二)

处理长文本序列的Transformer变种(二)

栗友们,大家好!我是Zarc

上期和大家分享了处理长文本序列的Transformer变种——Transformer-XL,它针对Transformer在处理长文本序列时存在的问题进行了改进,提出了状态复用的块级别循环相对位置编码,这种改进极大提升了模型的速度和精度。

本期将会和大家分享另外一种处理长文本序列的Transformer变种——Reformer,简单来说,Reformer主要引入了局部敏感哈希注意力和可逆Transformer技术,有助于减少模型的内存占用,进一步提升了模型对长文本的处理能力。Reformer模型是在Transformer上的部分模块上进行了改进,模型结构图如下:

处理长文本序列的Transformer变种(二)
reformer主要结构图



01


局部敏感哈希注意力


首先,在介绍局部敏感哈希注意力之前,需要明白两个问题:

  1. 单独计算查询和键的必要性

    在传统Transformer中,输入的向量通过三组不同的全连接层分别映射到查询、键和值,并计算查询向量和键向量之间的注意力值,最终将注意力值和值向量加权求和得到输出向量。那么,查询向量()和键向量()能否合二为一?也就是说只需要使用一个全连接层得到查询或者键向量,另一个全连接层得到值向量。作者通过实验论证,这种查询向量和键向量相同的Transformer与传统的Transformer相比没有太大的性能差异。因此,Reformer采用了 共享的Transformer,减少了注意力机制的计算。

  2. 全局注意力计算的必要性

    在传统的Transformer中,注意力矩阵的维度是 ,也就是一个以序列长度 为边长的方阵。也就是说,注意力矩阵的计算复杂度是随着序列长度呈平方级增长的,而这会极大限制模型对长文本的处理能力。

    同时需要考虑的就是是否每个单词之间都需要计算注意力值?首先每个词与序列中的其他词之间的关联程度都不是均匀分布,而是只会对其中的一小部分词有较强的关联关系;另外实际上注意力机制中更关心的是经过 函数激活后的值,而不是激活前的值。通过 函数得到的结果主要取决于数值较大的若干元素,因此并不需要将所有的词都参与到注意力计算当中去。如果只计算那些与当前查询关联度最高的几个词,就可以极大降低注意力的计算量

局部敏感哈希

上面两个问题似乎提供了一种降低模型复杂度的思路,但是想要高效地计算与每个词关联度最高的 个词并不简单,这里Reformer引入了局部敏感哈希技术来解决高维空间下寻找最近邻元素的问题。局部敏感哈希的目标是设计一个哈希函数 ,使得在向量 的周围的向量能够以较高概率具有一样的哈希值,而较远的向量具有不一样的哈希值。

处理长文本序列的Transformer变种(二)
局部敏感哈希在二维空间上的示例

上图是来自于Reformer论文原文,解释了如何在二维空间内进行局部敏感哈希:

  • 首先,将高维空间的两个向量 在二维空间内做投影,得到一组节点 。图中给出了两种情况:其中一组的夹角较大,表示两个向量的相似度较低;而另一组的夹角较小,表示两个向量的相似度较高。图中的正方形区域被四种颜色分割成四个区域,也就是四个桶。
  • 然后,以随机角度 (这个地方可以看做一次哈希)旋转节点 ,可以看到夹角较大的一组节点落到了两个不同的区域:区域{0,3},而夹角较小的一组节点落到了同一个区域:区域{0}。
  • 最后,继续旋转随机角度 ,从上图可以发现,那些夹角较大的一组节点每次都会落到不同的区域中,那些夹角较小的一组节点更容易落到同一个区域中。

也就是说,经过局部敏感哈希,可以将关联性较强的键,以较大概率分到同一个桶中。根据上文所提到的,只需要对桶内的所有元素进行注意力的计算就能够达到近似完整注意力机制的目的,可以极大降低注意力计算的复杂度。

注意力计算

在实际应用中,通常使用并行计算加快模型的计算速度,但是由于每个桶内包含的数量并不相同,并且为了得到与每个键最相似的键的集合,Reformer这里选择了排序,如图所示:

处理长文本序列的Transformer变种(二)
局部敏感哈希注意力计算示例

位于最上方的第一行是整个输入序列,这里可以看作是查询向量,也可以认为是键向量()。接下来,利用局部敏感哈希对向量进行分桶(其中同颜色表示相同的桶,具有相同的哈希值)。下一步通过桶排序将相同桶号的向量放在一起,并且按照预先设置的块大小(这里是4)进行分块,通过上图可以看到第 1 个块和第 4 个块内的元素都享有相同的哈希值,而第 2 个块和第 3 个块包含了两种不同的哈希值。最后进入注意力计算环节,每个元素只会与当前和前一个块中具有相同哈希值的元素计算注意力

多轮局部敏感哈希

哈希的过程实际上是进行了一个信息压缩,局部敏感哈希的最理想情况下是相似的向量都被放入相同的桶中,但实际上在进行哈希的过程中仍然会存在小概率的失败,让相似的向量没有放到一个桶中,因此Reformer通过使用多轮局部敏感哈希来进一步降低错误率,作者通过实验验证,使用多轮敏感哈希计算注意力可以显著提升注意力的准确性。



02


可逆Transformer


为了进一步降低模型的内存占用空间,Reformer中引入了可逆Transformer技术,它主要是受到可逆残差网络的启发,主要思想是在任意一层的激活值都可以通过后续层的激活值进行还原。因此,当模型在进行后向梯度计算时,不再需要保存每一个中间层的激活值,只需要通过从顶层到底层的可逆计算就能够获得相应的值,其实我认为这种可逆残差网络就是一种时间换空间的思想,同时在这种可逆Transformer中还引入了分块机制,进一步降低了前馈神经网络的内存占用,感兴趣的读者可以阅读原文《REFORMER: THE EFFICIENT TRANSFORMER[1]》,不过有一说一,原文只有十二页,很多内容一笔带过,让我看起来也是一知半解,更多细节可以看这篇文章——知乎:Reformer详解[2]

这期关于Transformer的介绍到这里就结束了,下期将为栗友们带来本系列的最后一期——介绍模型Longformer和BigBird。

最后,文章中有任何问题,希望大家不吝赐教,感谢感谢!

最后最后,关注六只栗子,面试不迷路!

参考资料

[1]

REFORMER: THE EFFICIENT TRANSFORMER: https://arxiv.org/pdf/2001.04451.pdf

[2]

知乎:Reformer详解: https://zhuanlan.zhihu.com/p/105123890


作者    Zarc

编辑   一口栗子  



原文始发于微信公众号(六只栗子):处理长文本序列的Transformer变种(二)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/88570.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!