当前位置:首页> AI教程> 探索新型Transformer变种:BigBird

探索新型Transformer变种:BigBird

释放双眼,带上耳机,听听看~!
本文探讨了新型Transformer变种BigBird,介绍了其稀疏注意力机制以及在NLP任务中的应用和性能优势。

零、前言:

📕欢迎访问

个人博客: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!(灵感来源于图的稀疏化方法)

“大鸟”的稀疏注意力机制可以提高需要较长上下文的任务的性能。其复杂性是线性的而非二次的。

“大鸟”主要由三个部分组成:

  • 在序列的所有部分上出现的一组(gg个)全局token的集合
  • 所有与ww个本地相邻token集合相关的token
  • 所有标记都属于rr个随机标记的集合

“大鸟”的三个主要贡献:

  • BigBird满足所有已知的全变换的理论性质,特别是添加额外的记号,允许将所有连续序列表示为线性个内积的序列函数,并且在标准精度下是图灵完备的。这也就意味着,一切可以计算的问题,BigBird都能计算,理论上,它能够用来解决任何算法。
  • BigBird的扩展上下文有利于各种NLP任务。
  • 一种新的基于注意力机制的模型应用:提取基因组序列(如DNA)的上下文表示。

我们不妨来看一看,各种不同的Transformer变种的效率:

圈越大,时间复杂度越高;

纵坐标越小,空间复杂度越高;

横坐标越大,性能越好;

探索新型Transformer变种:BigBird

BigBird相关工作:

相关工作这一部分主要概括了两条限制Transformer的依赖关系,的研究方向(加逗号是为了断句,方便理解)。

  1. 对于长度限制,最简单的方法是使用滑动窗口;更复杂的方法通常重复调用Transformer块,即每次提供不同的上下文。

  2. 讨论完全的注意力机制是否是必要的,不完全的注意力机制可以减少内存和计算需求。

除此之外,Longformer引入了局部滑动窗口和少量全局遮罩来减少计算,并将BERT扩展到更长的序列任务。BigBird与Extended Transformers Construction工作密切相关,后者旨在为Transformer编码文本结构。其广泛使用全局令牌来实现目标。

探索新型Transformer变种:BigBird

注意力机制的示意图如上所示,白色表示注意力不集中;

从左到右分别是r = 2的随机注意力、w = 3的滑动窗口注意力、g = 2的全局注意力以及将之合并的”大鸟”。

这三种注意力机制结合起来为什么就能接近BERT的全注意力机制呢?我们以图释之:

BigBird:

探索新型Transformer变种:BigBird

BERT:

探索新型Transformer变种:BigBird

二、林子大了,什么鸟都有:

稀疏注意力到底在做什么?

BigBird使用稀疏注意力机制,这说明注意力机制是逐个token应用的,而不是像BERT那样,只对整个输入进行一次应用。

探索新型Transformer变种:BigBird

如图所示,有额外的向左平移和向右平移的句子,就是顶部的them Vasudev is proting BigBird...这些;

这是计算滑动注意力时所需要的,而滑动注意力又是BigBird稀疏注意力的一个重要组成部分,也就是图中黄色的那些。

蛋白质是牛肉的八倍?

BigBird能够处理比以前长8倍的序列。利用 BigBird 及其稀疏注意力机制,研究小组将 BERT 的复杂度O(n2)O(n^2)降到O(n)O(n)

这说明,原来的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比很多模型的性能更好。

探索新型Transformer变种:BigBird

21世纪是生物的世纪?

深度学习在基因组学数据处理中的应用越来越多。编码器将 DNA 序列的片段作为输入,用于诸如甲基化分析、预测非编码变体的功能效应等任务。这些任务以DNA序列片段作为输入,既然是序列,那么BigBird想必可以派上用场,果不其然,甚至因为DNA中的许多功能效应是高度非局部的,也就是偏向于更长的范围,所以长序列的处理显得尤为重要。

大显身手!Google搜索引擎:

2019年,BERT出现的时候,Google第一时间就把BERT集成到其搜索引擎中,来理解用户的输入,从而为用户呈现更多、更相关的内容了;2020年,”大鸟”飞来,很快啊!Google马上就又放了进去。

三、鸟师傅,你是做什么工作的:

再看稀疏注意力:

在一般的完全注意力,例如BERT中,序列为X=x1,x2,…,xnX=x_1, x_2,…,x_n,由稠密向量Q,K,VQ,K,V计算的注意力为Z=Softmax(QKT)Z=Softmax(QK^T)

在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时,QV的块如下所示:

探索新型Transformer变种:BigBird

注意力得分q1,q2,q3,qn−2,qn−1,qnq_1,q_2,q_3,q_{n-2},q_{n-1},q_n计算过程:

q1q_1a1a_1来表示:a1=Softmax(q1×KT)a_1=Softmax(q_1 × K^T)q1q_1代表第一个块,gig_i代表第ii个块

探索新型Transformer变种:BigBird

当计算a2a_2时,事情就变得没那么简单了,需要加上另外两种块,即a2=Softmax(q2×concat(k1,k2,k3,k5,k7))a_2=Softmax(q2×concat(k1, k2, k3, k5, k7))

探索新型Transformer变种:BigBird

类似地,来到q3q_3

探索新型Transformer变种:BigBird

倒数第二个,qn−1q_{n-1}

探索新型Transformer变种:BigBird

最后,也如初见,an=Softmax(qn×KT)a_n=Softmax(q_n × K^T)

探索新型Transformer变种:BigBird

整体效果图:

探索新型Transformer变种:BigBird

这就是稀疏注意力中最难的部分了。

实事求是:

纸上谈兵显然是行不通的,我们需要数据支撑,稀疏注意力到底为什么好:

探索新型Transformer变种:BigBird

嗯!显然好!

大鸟大鸟,实战见分晓!

像这样,就可以使用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使用广义注意力机制和稀疏随机图概念描述模型,以减少自注意机制的复杂度。

  1. 用广义注意力机制描述BigBird模型,该机制用于Transformer的每个层。广义注意力机制由有向图D表示:

    • D的节点集是输入序列中的记号;
    • D的弧表示注意力机制将考虑的内积。
  2. 如果D是完全有向图,可以恢复完全二次注意力机制。为简化表达,BigBird操作D的邻接矩阵A,即使D可能是稀疏的。A(i,j) = 1表示查询i attend到键j,否则为0。当A是全1矩阵时,导致二次复杂度,因为所有记号都attend每个其他记号。

  3. 将自注意视为完全连接图允许利用现有图论来减少其复杂度。减少自注意的二次复杂度问题可以视为图稀疏问题。

  4. 稀疏随机图注意机制应具有两个理想条件:节点间平均路径长度小和局部性概念。

  5. 随机图是展开器,可以在许多不同的上下文中近似完全图,包括在其谱属性方面。

2. Erdos-Rényi随机图模型:

在这个模型中,每条边都是独立选定的,出现的概率是固定的。在只有Θ(n)条边的随机图中,任意两个节点之间的最短路径是对数级的。因此,这样的随机图在谱上近似完全图,其第二特征值远离第一个特征值。这一属性导致随机游走在图中的混合时间很快,这暗示信息可以在任意一对节点之间快速流动。因此,BigBird提出了稀疏注意力,其中每个查询仅关注r个随机键。

3. 相邻内积与聚类系数:

大多数NLP和计算生物学中的上下文都具有较高的局部性参考。这意味着一个记号可以从其相邻记号中获取大量信息。BigBird研究自注意模型时得出结论,相邻内积对于NLP任务极其重要。在图论术语中,聚类系数是局部连接性的度量,当图包含许多完全图或近完全图时,聚类系数较高。简单的Erdos-Rényi随机图没有高的聚类系数,但小世界图具有高聚类系数。因此,BigBird定义了滑动窗口注意力,使查询在宽度为w的自注意中attend到i - w/2i + w/2之间的键。

四、结论与尾声:

BigBird是一个线性相关的稀疏注意机制,有理论保证和实践检验,是序列到序列函数的通用近似器,并且是图灵完备的。

在理论上:

  • BigBird使用额外的全局令牌来保留模型的表达能力。
  • BigBird通过移动到稀疏注意机制来减少计算,但同时确实也会产生一些其他的成本。

在实际上:

BigBird在许多NLP任务上取得了最先进的性能,如问答和长文档分类。

BigBird进一步引入了基于注意机制的DNA上下文语言模型,并对下游任务进行调优,如启动子区域预测和预测非编码变异的效果。

最后,BigBird虽好,但是正如其名,太Big了,这里是指代码量,实现起来实在是比较复杂。

本网站的内容主要来自互联网上的各种资源,仅供参考和信息分享之用,不代表本网站拥有相关版权或知识产权。如您认为内容侵犯您的权益,请联系我们,我们将尽快采取行动,包括删除或更正。
AI教程

TensorFlow基础知识:图像分类的基本概念和具体实现步骤

2023-12-18 15:11:14

AI教程

数字信号处理中的采样和重构

2023-12-18 15:22:14

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索