NLP之林大到什么 "大鸟 "都有 - BigBird丨论文解读
零、前言:
????欢迎访问:
个人博客:conqueror712.github.io/
知乎:www.zhihu.com/people/soeu…
Bilibili:space.bilibili.com/57089326
掘金:juejin.cn/user/129787…
????观前小剧场:
Q:既然上次我们知道了ELMo、BERT都是芝麻街的东西,那还有什么吗?我觉得这样的命名好有趣!
A:当然!不妨来看看2020年的一篇大鸟,呃不对,是论文——BigBird吧!
一、这是什么鸟?看一下:
一句话解释「大鸟」BigBird:
通过稀疏的注意力机制,将对序列长度的二次依赖减少到线性。
基于此,相较于BERT,可以处理更长的上下文信息,大大提高了各种NLP任务的性能。
BigBird出现的目的和意义:
虽然BERT是近年来NLP中最成功的深度学习模型之一,但是由于其全注意力机制,会存在对序列长度的二次依赖,从而不能很好地处理较长的上下文信息。
而BigBird采用稀疏的注意力机制,突破了全注意力机制的局限,使得可以处理更长的上下文信息。(怎么感觉和上面说的一样)
BigBird背景铺垫与介绍:
Transformer的广泛应用使得现代NLP模型性能大大优于以前的序列模型,如LSTM,主要是因为自注意力机制的引入,这使得我们可以对输入序列的每个令牌去并行的评估,而不是像LSTM等循环神经网络的顺序依赖性。这样做的好处是可以充分利用GPU和TPU这种现代SIMD硬件加速器的全部功能,从而可以让我们在空前规模的大数据集上训练NLP模型,而这一过程往往是通过预训练以及对下游任务的微调进行的。
但是,正如矛盾是对立而统一的一样,这种改进并不是没有代价的,完全自注意力机制的计算和内存开销是序列长度的平方,这降低了它们对更大上下文的任务的直接适用性,最典型的大上下文例子就是QA和文档分类与摘要。如果非要做的话,就会将大字符串拆分更小的段,这种内容碎片化也会导致上下文的严重丢失,从而使其应用程序受到限制。
那么,我们有没有一种可能,可以通过更少的内积实现一个完全二次型的自注意力机制呢?这样稀疏的自注意力机制能否保留原始网络的表现力和灵活性呢?
答案就是"大鸟"——BigBird!(灵感来源于图的稀疏化方法)
"大鸟"的稀疏注意力机制可以提高需要较长上下文的任务的性能。其复杂性是线性的而非二次的。
"大鸟"主要由三个部分组成:
- 在序列的所有部分上出现的一组(个)全局
token
的集合 - 所有与个本地相邻
token
集合相关的token
- 所有标记都属于个随机标记的集合
"大鸟"的三个主要贡献:
- BigBird满足所有已知的全变换的理论性质,特别是添加额外的记号,允许将所有连续序列表示为线性个内积的序列函数,并且在标准精度下是图灵完备的。这也就意味着,一切可以计算的问题,BigBird都能计算,理论上,它能够用来解决任何算法。
- BigBird的扩展上下文有利于各种NLP任务。
- 一种新的基于注意力机制的模型应用:提取基因组序列(如DNA)的上下文表示。
我们不妨来看一看,各种不同的Transformer变种的效率:
圈越大,时间复杂度越高;
纵坐标越小,空间复杂度越高;
横坐标越大,性能越好;
BigBird相关工作:
相关工作这一部分主要概括了两条限制Transformer的依赖关系,的研究方向(加逗号是为了断句,方便理解)。
-
对于长度限制,最简单的方法是使用滑动窗口;更复杂的方法通常重复调用Transformer块,即每次提供不同的上下文。
-
讨论完全的注意力机制是否是必要的,不完全的注意力机制可以减少内存和计算需求。
除此之外,Longformer引入了局部滑动窗口和少量全局遮罩来减少计算,并将BERT扩展到更长的序列任务。BigBird与Extended Transformers Construction工作密切相关,后者旨在为Transformer编码文本结构。其广泛使用全局令牌来实现目标。
注意力机制的示意图如上所示,白色表示注意力不集中;
从左到右分别是r = 2的随机注意力、w = 3的滑动窗口注意力、g = 2的全局注意力以及将之合并的"大鸟"。
这三种注意力机制结合起来为什么就能接近BERT的全注意力机制呢?我们以图释之:
BigBird:
BERT:
二、林子大了,什么鸟都有:
稀疏注意力到底在做什么?
BigBird使用稀疏注意力机制,这说明注意力机制是逐个token
应用的,而不是像BERT那样,只对整个输入进行一次应用。
如图所示,有额外的向左平移和向右平移的句子,就是顶部的them Vasudev is proting BigBird...
这些;
这是计算滑动注意力时所需要的,而滑动注意力又是BigBird稀疏注意力的一个重要组成部分,也就是图中黄色的那些。
蛋白质是牛肉的八倍?
BigBird能够处理比以前长8倍的序列。利用 BigBird 及其稀疏注意力机制,研究小组将 BERT 的复杂度降到。
这说明,原来的BERT只能处理512个token
的输入序列,现在BigBird可以处理4096个token
,整整八倍!
然而事实上,BigBird带给我们的惊喜远不止如此,在BigBird的论文中,使用的是4096这一数值,然而实际上的效果可以达到更大的 16K以上!
一较高下?
用GPT-3举例(2020年还没有GPT-3.5,更别说GPT-4了),BigBird的预训练集远不如GPT-3大,因为GPT-3的训练参数为1750亿,但如下表所示,BigBird比很多模型的性能更好。
21世纪是生物的世纪?
深度学习在基因组学数据处理中的应用越来越多。编码器将 DNA 序列的片段作为输入,用于诸如甲基化分析、预测非编码变体的功能效应等任务。这些任务以DNA序列片段作为输入,既然是序列,那么BigBird想必可以派上用场,果不其然,甚至因为DNA中的许多功能效应是高度非局部的,也就是偏向于更长的范围,所以长序列的处理显得尤为重要。
大显身手!Google搜索引擎:
2019年,BERT出现的时候,Google第一时间就把BERT集成到其搜索引擎中,来理解用户的输入,从而为用户呈现更多、更相关的内容了;2020年,"大鸟"飞来,很快啊!Google马上就又放了进去。
三、鸟师傅,你是做什么工作的:
再看稀疏注意力:
在一般的完全注意力,例如BERT中,序列为,由稠密向量计算的注意力为;
在BigBird注意力计算中,这样的过程只在个别的query向量和key向量之间计算。
那么,更多的是什么呢?
设:b, r, s, g
分别为block_size, num_random_blocks, num_sliding_blocks, num_global_blocks
;
当b = 4, r = 1, s = 3, g = 2
时,Q
和V
的块如下所示:
注意力得分计算过程:
由来表示:,代表第一个块,代表第个块
当计算时,事情就变得没那么简单了,需要加上另外两种块,即
类似地,来到:
倒数第二个,:
最后,也如初见,:
整体效果图:
这就是稀疏注意力中最难的部分了。
实事求是:
纸上谈兵显然是行不通的,我们需要数据支撑,稀疏注意力到底为什么好:
嗯!显然好!
大鸟大鸟,实战见分晓!
像这样,就可以使用BigBird模型了!
from transformers import BigBirdModel
# 从预先训练的检查点装载BigBird
model = BigBirdModel.from_pretrained("google/BigBird-roberta-base")
# 这将初始化模型的默认配置,即attention_type = "block_sparse", num_random_blocks = 3, block_size = 64
# 但是您可以使用任何检查点*地更改这些参数
# 这3个参数只会更改每个查询token将要参加的token数量
model = BigBirdModel.from_pretrained("google/BigBird-roberta-base", num_random_blocks=2, block_size=16)
# 通过将attention_type设置为"original_full"
# BigBird将依赖于n^2复杂度的全部注意力
# 这样,BigBird与BERT的相似度达到99.9%
model = BigBirdModel.from_pretrained("google/BigBird-roberta-base", attention_type="original_full")
一个问答任务的例子:
from transformers import BigBirdForQuestionAnswering, BigBirdTokenizer
import torch
device = torch.device("cpu")
if torch.cuda.is_available():
device = torch.device("cuda")
# 从预训练的权重中初始化BigBird模型,并在其顶部随机初始化头部
model = BigBirdForQuestionAnswering.from_pretrained("google/BigBird-roberta-base", block_size=64, num_random_blocks=3)
tokenizer = BigBirdTokenizer.from_pretrained("google/BigBird-roberta-base")
model.to(device)
dataset = "torch.utils.data.DataLoader object"
optimizer = "torch.optim object"
epochs = ...
# 极小的训练循环
for e in range(epochs):
for batch in dataset:
model.train()
batch = {k: batch[k].to(device) for k in batch}
# 前向传播
output = model(**batch)
# 反向传播
output["loss"].backward()
optimizer.step()
optimizer.zero_grad()
# 将最终权重保存在本地目录中
model.save_pretrained("<YOUR-WEIGHTS-DIR>")
# 推至Hub
from huggingface_hub import ModelHubMixin
ModelHubMixin.push_to_hub("<YOUR-WEIGHTS-DIR>", model_id="<YOUR-FINETUNED-ID>")
# 使用微调模型进行推理
question = ["How are you doing?", "How is life going?"]
context = ["<some big context having ans-1>", "<some big context having ans-2>"]
batch = tokenizer(question, context, return_tensors="pt")
batch = {k: batch[k].to(device) for k in batch}
model = BigBirdForQuestionAnswering.from_pretrained("<YOUR-FINETUNED-ID>")
model.to(device)
with torch.no_grad():
start_logits, end_logits = model(**batch).to_tuple()
# 用你想要的策略解码start_logits, end_logits
BigBird的架构的细节部分:
注:这一部分推荐阅读原论文,笔者的翻译水平有限(笑)。
原文链接:arxiv.org/abs/2007.14…
1. 使用广义注意力机制来描述BigBird模型:
BigBird使用广义注意力机制和稀疏随机图概念描述模型,以减少自注意机制的复杂度。
-
用广义注意力机制描述BigBird模型,该机制用于Transformer的每个层。广义注意力机制由有向图
D
表示:-
D
的节点集是输入序列中的记号; -
D
的弧表示注意力机制将考虑的内积。
-
-
如果
D
是完全有向图,可以恢复完全二次注意力机制。为简化表达,BigBird操作D
的邻接矩阵A
,即使D
可能是稀疏的。A(i,j) = 1
表示查询i attend
到键j
,否则为0。当A
是全1矩阵时,导致二次复杂度,因为所有记号都attend
每个其他记号。 -
将自注意视为完全连接图允许利用现有图论来减少其复杂度。减少自注意的二次复杂度问题可以视为图稀疏问题。
-
稀疏随机图注意机制应具有两个理想条件:节点间平均路径长度小和局部性概念。
-
随机图是展开器,可以在许多不同的上下文中近似完全图,包括在其谱属性方面。
2. Erdos-Rényi随机图模型:
在这个模型中,每条边都是独立选定的,出现的概率是固定的。在只有Θ(n)
条边的随机图中,任意两个节点之间的最短路径是对数级的。因此,这样的随机图在谱上近似完全图,其第二特征值远离第一个特征值。这一属性导致随机游走在图中的混合时间很快,这暗示信息可以在任意一对节点之间快速流动。因此,BigBird提出了稀疏注意力,其中每个查询仅关注r
个随机键。
3. 相邻内积与聚类系数:
大多数NLP和计算生物学中的上下文都具有较高的局部性参考。这意味着一个记号可以从其相邻记号中获取大量信息。BigBird研究自注意模型时得出结论,相邻内积对于NLP任务极其重要。在图论术语中,聚类系数是局部连接性的度量,当图包含许多完全图或近完全图时,聚类系数较高。简单的Erdos-Rényi随机图没有高的聚类系数,但小世界图具有高聚类系数。因此,BigBird定义了滑动窗口注意力,使查询在宽度为w
的自注意中attend到i - w/2
到i + w/2
之间的键。
四、结论与尾声:
BigBird是一个线性相关的稀疏注意机制,有理论保证和实践检验,是序列到序列函数的通用近似器,并且是图灵完备的。
在理论上:
- BigBird使用额外的全局令牌来保留模型的表达能力。
- BigBird通过移动到稀疏注意机制来减少计算,但同时确实也会产生一些其他的成本。
在实际上:
BigBird在许多NLP任务上取得了最先进的性能,如问答和长文档分类。
BigBird进一步引入了基于注意机制的DNA上下文语言模型,并对下游任务进行调优,如启动子区域预测和预测非编码变异的效果。
最后,BigBird虽好,但是正如其名,太Big了,这里是指代码量,实现起来实在是比较复杂。