Bert不完全手册9. 长文本建模 BigBird & Longformer & Reformer & Performer

这一章我们来唠唠如何优化BERT对文本长度的限制 。BERT使用的Transformer结构核心在于注意力机制强大的交互和记忆能力 。不过Attention本身O(n^2)的计算和内存复杂度,也限制了Transformer在长文本中的应用 。
之前对长文档的一些处理方案多是暴力截断,或者分段得到文本表征后再进行融合 。这一章我们看下如何通过优化attention的计算方式,降低内存/计算复杂度,实现长文本建模 。Google出品的Efficient Transformers: A Survey里面对更高效的Transformer魔改进行了分类,这一章我们主要介绍以下5个方向:

  1. 以Transformer-XL为首的片段递归
  2. Longformer等通过稀疏注意力,降低内存使用方案
  3. Performer等通过矩阵分解,降低attention内积计算复杂度的低秩方案
  4. Reformer等可学习pattern的注意力方案
  5. Bigbird等固定pattern注意力机制

Bert不完全手册9. 长文本建模 BigBird & Longformer & Reformer & Performer

文章插图
Transformer-xl
  • paper: Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context
  • github:https://github.com/kimiyoung/transformer-xl
  • Take Away: 相对位置编码 + 片段递归机制
    Bert不完全手册9. 长文本建模 BigBird & Longformer & Reformer & Performer

    文章插图
为了突破Transformer对固定长度建模的限制,Transformer-xl提出了相对位置编码和片段递归的方案,后续也被XLNET沿用~
  1. 片段递归
片段递归的思路其实很早就有,不过之前的方案多是保留上一个片段的last hidden state,作为当前片段的补充信息 。而Transformer-xl则是直接保留并cache了上个片段的所有hidden state,和当前片段进行拼接,梯度更新时只更新当前片段的隐藏层 。
具体的Attentenion计算中如下,\(\tau\)是片段,\(n\)是hidden layer,\(\circ\)是向量拼接,\(SG()\)是不进行梯度更新的意思 。于是当前片段Q,K,V是由上个片段的隐藏层和当前片段的隐藏层拼接得到 。每个片段完成计算后会把隐藏层计算结果进行存储,用于下个片段的计算,用空间换时间,既避免了重复计算,又使得新的片段能保留大部分的历史片段信息 。这里的历史片段信息并不一定只使用T-1,理论上在内存允许的情况下可以拼接更多历史片段~
Bert不完全手册9. 长文本建模 BigBird & Longformer & Reformer & Performer

文章插图
  1. 相对位置编码
片段递归如果和绝对位置编码一起使用会存在问题,因为不同片段相同位置的绝对位置编码相同,模型无法区分它们来自不同的片段 。因此作者提出了相对位置编码 。之前在讨论绝对位置编码不适用于NER任务时有分析过相对位置编码>>中文NER的那些事儿5. Transformer相对位置编码&TENER代码实现,这里我们再回顾下~
Bert不完全手册9. 长文本建模 BigBird & Longformer & Reformer & Performer

文章插图
绝对位置编码是直接加到词向量上,在Attention计算中进行交互 。把内积展开可以得到如上形式,包括4个部分:Query和Key的纯语义交互,各自的位置信息和语义的交互,以及反映相对距离的位置交互 。
Bert不完全手册9. 长文本建模 BigBird & Longformer & Reformer & Performer

文章插图
Transformer-XL的相对位置编码和以上的展开形式基本一一对应,也使用了三角函数的编码方式,只需要两点调整