百度
360搜索
搜狗搜索

transformer decoder,GPT和GPT2详细介绍

本文目录一览: Transformer中Decoder的Embedding layers架构设计、运行流程和数学原理是什么?

Transformer
解释下这个结构图。首先,Transformer模型也是使用经典的encoder-decoder架构,由encoder和decoder两部分组成。
用Nx框出来的,就是我们encoder的一层。encoder一共有6层这样的结构。
用Nx框出来的,就是我们decoder的一层。decoder一共有6层这样的结构。
输入序列经过word embedding和positional embedding相加后,输入到encoder中。
输出序列经过word embedding和positional embedding相加后,输入到decoder中。
最后,decoder输出的结果,经过一个线性层,然后计算softmax。

Transformer模型解析记录

整个Transformer模型由Encoder和Decoder两部分组成。Encoder负责对输入数据的编码,而Decoder负责对编码后的数据进行解码。
Encoder由N个结构相同,参数不共享的模块组成,每个模块又由多头自注意力层和全连接层组成,其中多头自注意力层和全连接层都加上了残差连接和layer normalization。
Decoder与Encoder结构类似,相比于Encoder,Decoder部分多了一个 Multi-Head Attention ,第一个 Multi-Head Attention 采用Masked操作,第二个 Multi-Head Attention 的 K 和 V 使用Encoder的输出,而Q使用上一个Decoder block的输出。 Decoder的输出通过一个线性层和softmax输出下一个翻译单词的概率。
Encoder由N个结构相同,参数不共享的的Layer组成(论文中N=6),也即图1左侧的单元,最左边有个“Nx”。 每个Layer由 Multi-Head Attention 和 Feed-Forward 两个sub_layer组成。其中每个sub_layer都加了残差连接(Residual Connect)和归一化(Normalization)操作。则每个sub_layer的输出可表示为:
Muti-Head Attention从结构上来看就是通过h个不同的线性变换将输入 投影到h个不同的 组合,最后将h个不同的Attention结果拼接起来,最后经过一个Liner层得到Muti-Head Attention的输出。
其中, 、
Muti-Head Attention输出的维度是
关于Attention的详细介绍,可以参考之前文档:
Feed Forward也称Position-wise feed-forward networks,该层主要提供非线性变换。之所以是position-wise是因为过线性层时每个位置i的变换参数是一样的。
该层比较简单,是一个两层的全连接层,第一层的激活函数为 Relu,第二层不使用激活函数,对应公式为:
问 :Attention输出之后的结果会和 相乘来进行维度变换,那这里为什么又要增加一个2层的FFN网络呢? 答 :FFN网络的加入给模型增加了非线性(Relu激活函数),增加了模型的表现能力。当然去掉FFN层也是可以的,只不过效果上会差些。
Decoder是图1的右半部分,与左半部分的Encoder类似,但又存在一些区别。
Decoder比Encoder多了一个Multi-Head Attention,第一个Multi-Head Attention采用Masked操作,因为在生成任务中,前面的词语是看不到后面词语的信息的,因此需要加入Masked来避免信息泄露。第二个Multi-Head Attention输入的 是根据Encoder的输出编码矩阵映射而来,而 是根据上一个Decoder的输出映射而来。
最后有一个 Softmax 层计算下一个翻译单词的概率。
模型在解码的过程中需要注意的是训练和预测不一样。 在训练时,解码是一次全部decode出来,用上一步的ground truth来预测(mask矩阵也会改动,让解码时看不到未来的token); 而预测时,因为没有ground truth了,需要一个个预测。
上面简单介绍了 Encoder 和 Decoder 模块,下面简单介绍一下Transformer的Position Embedding。
引入Position Embedding主要是为了弥补Transformer模型对位置信息的不足,将Position Embedding与token Embedding相加后,即可保留各个token的位置信息。
论文作者提出了两种添加位置信息的的方法: 一种方法是直接用不同频率的正余弦函数直接计算各个token的位置id,公式如下:

另一种方法是直接学习出一个Position Embedding。
通过实验发现,两种方法结果差不多,最后作者选择了第一种方法。
Transformer 与 RNN 不同,可以比较好地并行训练。
Transformer 本身是不能利用单词的顺序信息的,因此需要在输入中添加位置 Embedding,否则 Transformer 就是一个词袋模型了。
Transformer 的重点是 Self-Attention 结构,其中用到的 Q, K, V矩阵通过输出进行线性变换得到。
Transformer 中 Multi-Head Attention 中有多个 Self-Attention,可以捕获单词之间多种维度上的相关系数 attention score。
Transformer 模型详解 (推荐) 【NLP】Transformer模型原理详解 【经典精读】Transformer模型深度解读

Transformer

Transformer是第一个完全依靠自我注意力来计算其输入和输出的表征模型,而不使用序列对齐的RNNs或卷积的转换模型,它的主要目的是通过训练找到文本最适合的语义表征向量。

整体架构:编码器-解码器结构,堆叠式自关注和点对点的全连接层。

Encoder:输入单词的向量,经过位置编码,然后进入一个统一的结构,这个结构可以循环很多次,也就是说有很多层,每层可以分为自注意层和全连接层。

Decoder:输入前缀信息和编码器输出的词向量,加入位置编码,然后进入一个可以循环多次的模块(三层)。

注意函数:将一个查询和一组键值对映射到一个输出,其中查询Q、键K、值V和输出都是向量,它们也可以打包成矩阵方便实际应用。计算输出的矩阵为:

其中dk为查询向量(键)的维度,Q和K的维度一定相同,但V与Q,K的维度不一定相同。除以根号dk的原因是为了使QKT的值不过度增加,导致softmax函数反向传播时发生梯度消失,这个值是一个经验值。

最常用的注意函数是加法注意力和点积(乘法)注意力,其中点积注意力在实践中更快,更节省空间。

多头注意使模型能够共同注意来自不同位置的不同表征子空间的信息,通俗的说,也就是不同层次的注意力是该单词在不同方面的理解和其他单词对其的影响力。在单头注意的情况下,平均化会抑制这一点。在多头注意力中,采用8个平行的注意层(头),由于每个头的维度减少,总的计算成本与全维度的单头注意力相似。

Encoder输入的是单词的向量,这里对其进行随机初始化,但设为Trainable,在训练过程中不断对词向量的值进行改进,即End2End训练方式。

需要注意的是,输入模型的整个Embedding是词向量和位置向量直接相加后的结果,位置编码在下面介绍。

由于模型中不含有递归和卷积,为了使模型能够利用序列的顺序,必须注入一些关于序列中标记的相对或绝对位置的信息。为此,我们可以在编码器和解码器堆栈底部的输入嵌入中加入“位置编码”。

这里选择不同频率的正弦函数或者余弦函数。

例如,位置编码会根据位置加入一个正弦波,每个维度的波的频率和便宜量是不同的。

批处理对象:保存用于训练的src和目标句子,构建掩码。

首先对词向量进行随机初始化,再通过模型不断对向量进行调整。

1、批量和屏蔽

创建一个通用的训练和评分函数来跟踪损失。传递通用的损失计算函数,处理参数更新。

2、训练循环

3、训练数据和批处理

4、正规化

标签平滑化?KL div loss

1、使用了Attention机制,将序列中的任意两个位置之间的距离缩小为一个常量;

2、具有更好的并行性。

与Transformer模型的不同点:

1、输入:三个部分,分别为token embedding(随机初始化), position embedding(不是正余弦函数,而是直接从0开始编号), segment embedding(断句)。有两种符号,普通单词和特殊符号。

2、MLM:掩码语言模型, 用于预训练任务,其中无监督目标函数有AR, AE

相关链接

Self-Attention和Transformer - machine-learning-notes

https://baijiahao.baidu.com/s?id=1380070835729&wfr=spider&for=pc&qq-pf-to=pcqq.group

BART 详解

一切都得从 Transformer 说起。Transformer 左半边为 Encoder,右半边为 Decoder。我们将 Encoder 输入的句子称为 source,Decoder 输入的句子称为 target
Encoder 负责将 source 进行 self-attention 并获得句子中每个词的 representation,最经典的 Encoder 架构就是 BERT,通过 Masked Language Model 来学习词之间的关系,另外还有 XLNet, RoBERTa, ALBERT, DistilBERT 等等。但是单独 Encoder 结构 不适用于生成任务

Decoder 如下图所示,输入与输出之间差一个位置,主要是模拟在 Inference 时,不能让模型看到未来的词,这种方式称为 AutoRegressive ,常见的基于 Decoder 的模型通常是用来做序列生成的,例如 GPT, CTRL 等等。但是单独 Decoder 结构仅基于左侧上下文预测单词,无法学习双向交互

训练阶段,Encoder 端使用双向模型编码 被破坏的文本 ,然后 Decoder 采用自回归的方式计算出原始输入;测试阶段或者是微调阶段,Encoder 和 Decoder 的输入都是 未被破坏的文本

BART 使用标准的 Transformer 模型,不过做了一些改变:
BART 作者尝试了不同的方式来破坏输入:
序列分类任务中,编码器和解码器的输入相同,解码器 token 的最终隐藏状态被输入到多类别线性分类器中。BART 在解码器最后额外添加了一个 token,如下图所示,该 token 位置的输出可以被认为是该句子的 representation
由于 BART 具备自回归解码器,因此它可以针对序列生成任务进行直接微调,如问答或者文本摘要
作者采用新的随机初始化 Encoder 替换 BART 编码器的 Embedding 层。该模型以端到端的方式进行训练,即训练一个新的编码器将外来词映射到输入。新的编码器可以使用不同于原始 BART 模型的词汇。其中随机初始化 Encoder 的训练分两步,均需要将来自 BART 模型输出的交叉熵损失进行反向传播。第一步,作者冻结 BART 的大部分参数,仅更新随机初始化的 Encoder、BART 位置嵌入和 BART 编码器第一层的自注意力输入投影矩阵。第二步,作者将所有模型参数进行少量迭代训练
从上表可以看出,貌似带上 Document Rotation 或 Sentence Shuffling 效果都不是太好,可以这么理解,假如模型在训练的时候看到的句子顺序都是乱的,它可能就认为这个世界的句子顺序都是乱的,当你做测试的时候,输入的句子是正序的,可能模型就不知所措了。实际上 Text Infilling 可以看作是 Token Masking+Token Deletion,所以 Text Infilling 效果这么好也可以理解

阅读更多 >>>  transformer代码详解,transform encoder

图解什么是 Transformer

Transformer 是 Google 团队在 17 年 6 月提出的 NLP 经典之作, 由 Ashish Vaswani 等人在 2017 年发表的论文 Attention Is All You Need 中提出。
Transformer 在机器翻译任务上的表现超过了 RNN,CNN,只用 encoder-decoder 和 attention 机制就能达到很好的效果,最大的优点是可以高效地并行化。
Transformer 是一种基于 encoder-decoder 结构的模型,
在 Encoder 中,
在 Decoder 中,
下面我们具体看一下其中这几个概念,这里主要参考 Jay Alammar,他在 The Illustrated Transformer 中给出了很形象的讲解。
例如我们要进行机器翻译任务,输入一种语言,经过 Transformer,会输出另一种语言。
Transformer 的 encoder 由 6 个编码器叠加组成, decoder 也由 6 个解码器组成, 在结构上都是相同的,但它们不共享权重。
每一个 encoder 都分为两个子层:
每一个 decoder 也具有这两个层,但还有一个注意力层,用来帮助解码器关注输入句子的相关部分
首先使用嵌入算法将输入的 word 转换为 vector, 最下面的 encoder ,它的输入就是 embedding 向量, 在每个 encoder 内部, 输入向量经过 self-attention,再经过 feed-forward 层, 每个 encoder 的输出向量是它正上方 encoder 的输入, 向量的大小是一个超参数,通常设置为训练集中最长句子的长度。
在这里,我们开始看到 Transformer 的一个关键性质, 即每个位置的单词在 encoder 中都有自己的路径, self-attention 层中的这些路径之间存在依赖关系, 然而在 feed-forward 层不具有那些依赖关系, 这样各种路径在流过 feed-forward 层时可以并行执行。
Positional Encoding 是一种考虑输入序列中单词顺序的方法。
encoder 为每个输入 embedding 添加了一个向量,这些向量符合一种特定模式,可以确定每个单词的位置,或者序列中不同单词之间的距离。
例如,input embedding 的维度为4,那么实际的positional encodings如下所示:
在下图中,是20个单词的 positional encoding,每行代表一个单词的位置编码,即第一行是加在输入序列中第一个词嵌入的,每行包含 512 个值, 每个值介于 -1 和 1 之间,用颜色表示出来。
可以看到在中心位置分成了两半,因为左半部分的值由一个正弦函数生成,右半部分由余弦函数生成,然后将它们连接起来形成了每个位置的编码向量。
当然这并不是位置编码的唯一方法,只是这个方法能够扩展到看不见的序列长度处,例如当我们要翻译一个句子,这个句子的长度比我们训练集中的任何一个句子都长时。
例如我们要翻译:”The animal didn't cross the street because it was too tired” 这句话 这句话中的“it”是指什么?它指的是 street 还是 animal? 这对人类来说是一个简单的问题,但对算法来说并不简单。
而 Self-Attention 让算法知道这里的 it 指的是 animal
当模型在处理每个单词时,self-attention 可以帮助模型查看 input 序列中的其他位置,寻找相关的线索,来达到更好的编码效果。它的作用就是将对其他相关单词的“understanding”融入我们当前正在处理的单词中。
例如上图中,在第5层时,我们就知道 it 大概指的是 animal 了。
第一步,为编码器的每个输入单词创建三个向量, 即 Query vector, Key vector, Value vector 这些向量通过 embedding 和三个矩阵相乘得到, 请注意,这些新向量的尺寸小于嵌入向量。它们的维数为64,而嵌入和编码器输入/输出向量的维数为512.它们不一定要小,这是一种架构选择,可以使多头注意力计算(大多数)不变。 将x1乘以WQ得到Query向量 q1,同理得到Key 向量 和, Value 向量 这三个向量对 attention 的计算有很重要的作用
第二步,是计算一个得分 假设我们要计算一个例子中第一个单词 “Thinking” 的 self-attention,就需要根据这个单词,对输入句子的每个单词进行评分,这个分数决定了对其他单词放置多少关注度。 分数的计算方法是, 例如我们正在考虑 Thinking 这个词,就用它的 q1 去乘以每个位置的 ki
第三步和第四步,是将得分加以处理再传递给 softmax 将得分除以 8(因为论文中使用的 key 向量的维数是 64,8 是它的平方根) 这样可以有更稳定的梯度, 然后传递给 softmax,Softmax 就将分数标准化,这样加起来保证为 1。 这个 softmax 分数决定了每个单词在该位置bbei表达的程度。 很明显,这个位置上的单词将具有最高的softmax分数,但有时候注意与当前单词相关的另一个单词是有用的。
第五步,用这个得分乘以每个 value 向量 目的让我们想要关注单词的值保持不变,并通过乘以 0.001 这样小的数字,来淹没不相关的单词
第六步,加权求和这些 value 向量
这就是第一个单词的 self-attention 的输出 得到的向量接下来要输入到前馈神经网络,在实际实现中用矩阵乘法的形式完成
论文中还增加一种称为 multi-headed 注意力机制,可以提升注意力层的性能
它使得模型可以关注不同位置
虽然在上面的例子中,z1 包含了一点其他位置的编码,但当前位置的单词还是占主要作用, 当我们想知道“The animal didn’t cross the street because it was too tired” 中 it 的含义时,这时就需要关注到其他位置
这个机制为注意层提供了多个“表示子空间”。下面我们将具体介绍,
1. 经过 multi-headed , 我们会得到和 heads 数目一样多的 Query / Key / Value 权重矩阵组 论文中用了8个,那么每个encoder/decoder我们都会得到 8 个集合。 这些集合都是随机初始化的,经过训练之后,每个集合会将input embeddings 投影到不同的表示子空间中。
2. 简单来说,就是定义 8 组权重矩阵,每个单词会做 8 次上面的 self-attention 的计算 这样每个单词会得到 8 个不同的加权求和 z
3. 但在 feed-forward 处只能接收一个矩阵,所以需要将这八个压缩成一个矩阵 方法就是先将8个z矩阵连接起来,然后乘一个额外的权重矩阵WO
下图显示了在例句中,it 的不同的注意力 heads 所关注的位置,一个注意力的焦点主要集中在“animal”上,而另一个注意力集中在“tired”,换句话说,it 是 “animal”和“tired”的一种表现形式。 当然如果选了8个层,将所有注意力 heads 都添加到图片中,就有点难以解释了。
这里有一个细节,
即在每个 encoders 和 decoders 里面的 self-attention, ffnn,encoders-decoders attention 层,都有 residual 连接,还有一步 layer-normalization
下面我们看一下 Decoder 部分
1. 输入序列经过编码器部分,然后将最上面的 encoder 的输出变换成一组 attention 向量 K和V 这些向量会用于每个 decoder 的 encoder-decoder attention 层,有助于解码器聚焦在输入序列中的合适位置
重复上面的过程,直到 decoder 完成了输出,每个时间步的输出都在下一个时间步时喂入给最底部的 decoder,同样,在这些 decoder 的输入中也加入了位置编码,来表示每个字的位置。
2. 解码器中的 self attention 层与编码器中的略有不同 在解码器中,在 self attention 的 softmax 步骤之前,将未来的位置设置为 -inf 来屏蔽这些位置,这样做是为了 self attention 层只能关注输出序列中靠前的一些位置。
Encoder-Decoder Attention 层的工作方式与 multiheaded self-attention 类似,只是它用下面的层创建其 Queries 矩阵,从编码器栈的输出中获取 Keys 和 Values 矩阵。
3. 解码器最后输出的是一个向量,如何把它变成一个单词,这就要靠它后面的线性层和 softmax 层 线性层就是一个很简单的全连接神经网络,将解码器输出的向量映射成一个更长的向量。 例如我们有 10,000 个无重复的单词,那么最后输出的向量就有一万维。 每个位置上的值代表了相应单词的分数。
softmax 层将这个分数转换为了概率。
我们选择概率最大的所对应的单词,就是当前时间步的输出。
学习资源: https://arxiv.org/pdf/1706.03762.pdf https://jalammar.github.io/illustrated-transformer/ https://ai.googleblog.com/2017/08/transformer-novel-neural-network.html

阅读更多 >>>  transformer代码详解,transform encoder

GPT的auto-regressive语言模型架构在信息表示方面有什么架构上的缺陷?具体如何改进?

1) GPT
在Bert 之后,OpenAI 的 GPT-2 就是其中之一。它在文本生成上有着惊艳的表现,其生成的文本在上下文连贯性和情感表达上都超过了人们对目前阶段语言模型的预期。仅从模型架构而言,GPT-2 并没有特别新颖的架构,它和 transformer 的 Decoder 类似。相比较于GPT-1,GPT -2 使用了更大的预料,更大和更深的模型。
从transformer的decoder里移除了decoder对encoder的attention部分。也就是消除掉了seq2seq的过程。
GPT是一个语言模型,每一个时刻只能看见当前时刻前面时刻的信息,是一个auto regressive的过程。
GPT2,hidden state的大小有变化,根据层数的多少有small,medum,large,extra large的划分。
GPT的训练过程是交叉式的预测下一个单词,测试的时候是输入一个句子生成另外一个句子。
GPT的预训练就是训练一个语言模型。而bert的预训练是masked language model和nsp的任务。
GPT由多个decocer block组成,每一个decoder block由masked self-attention和feed forward neural network组成。
一个timestamp的hidden state经过线性层转换为vocab size大小的embedding, 然后经过softmax,算出每个词汇的概率,找出其中概率最大的词作为预测输出,然后下一个时刻的词作为真实输出,计算两者的cross entropy来训练模型。
每一个timestamp后面的位置都mask掉,设置一个负无群大的值,做softmax的时候,该位置的值就为0。
2)总结
transformer decoder的构造
预训练的时候做语言模型的训练
GPT2用更多更深的block
BERT是做NLU,generation做不了
GPT天生就是语言模型,非常适合做generation的任务,在bert里能做的在gpt里也可以做
除了GPT-2 ,GPT-3依旧延续自己的单向语言模型训练方式,只不过把模型尺寸增大到了1750亿,并且使用45TB数据进行训练
1) GPT
在Bert 之后,OpenAI 的 GPT-2 就是其中之一。它在文本生成上有着惊艳的表现,其生成的文本在上下文连贯性和情感表达上都超过了人们对目前阶段语言模型的预期。仅从模型架构而言,GPT-2 并没有特别新颖的架构,它和 transformer 的 Decoder 类似。相比较于GPT-1,GPT -2 使用了更大的预料,更大和更深的模型。
从transformer的decoder里移除了decoder对encoder的attention部分。也就是消除掉了seq2seq的过程。
GPT是一个语言模型,每一个时刻只能看见当前时刻前面时刻的信息,是一个auto regressive的过程。
GPT2,hidden state的大小有变化,根据层数的多少有small,medum,large,extra large的划分。
GPT的训练过程是交叉式的预测下一个单词,测试的时候是输入一个句子生成另外一个句子。
GPT的预训练就是训练一个语言模型。而bert的预训练是masked language model和nsp的任务。
GPT由多个decocer block组成,每一个decoder block由masked self-attention和feed forward neural network组成。
一个timestamp的hidden state经过线性层转换为vocab size大小的embedding, 然后经过softmax,算出每个词汇的概率,找出其中概率最大的词作为预测输出,然后下一个时刻的词作为真实输出,计算两者的cross entropy来训练模型。
每一个timestamp后面的位置都mask掉,设置一个负无群大的值,做softmax的时候,该位置的值就为0。
2)总结
transformer decoder的构造
预训练的时候做语言模型的训练
GPT2用更多更深的block
BERT是做NLU,generation做不了
GPT天生就是语言模型,非常适合做generation的任务,在bert里能做的在gpt里也可以做
除了GPT-2 ,GPT-3依旧延续自己的单向语言模型训练方式,只不过把模型尺寸增大到了1750亿,并且使用45TB数据进行训练

Transformer详解,输入部分(词嵌入、位置编码)

由图可知:
inputs和带标签的输入分别进encoder和decoder
Positional Encoding
线性层
softmax层
由N个编码器堆叠而成
每个编码器有两个子层相连接
第一个子层->多头 自注意力机制 和规范化层以及一个残差连接
第二个子层->全连接层和规范化层以及一个残差连接
由N个解码器堆叠而成
每个编码器有三个子层相连接
第一个子层->一个多头 自注意力机制 层和规范化层以及一个残差连接
第二个子层->多头 注意力机制 和规范化层以及一个残差连接
第三个子层->全连接层和规范化层以及一个残差连接
目的是为了将目标文本的 数字表示 ->向量表示,为了在高维空间捕捉词汇间的关系
效果如下
在Transformer编码器中没有针对词汇位置信息的处理,故需要在embedding层后加入位置编码器,将 词汇位置不同可能会产生不同语义的信息 加入到嵌入张量中(embedding),用来弥补位置信息的缺失。

transformer 计算量 参数量分析

transformer最近非常火,同时也在各个任务上基本上都达到了state of art,swin transformer更是降维打击,在各个任务上点数大幅碾压。之前transformer最被人诟病的是从NLP迁到cv领域的计算量和参数量大大增加,导致图片级别的transformer成了有钱人的游戏,本文我们就来一步一步分析一下transformer每一步的计算量和参数量,为什么会计算量参数量大大增加。

首先来看一下transformer的结构,结构第一次是论文: Attention is all you need ?提出的,包含encoder和decoder两个部分,encoder把输入的信息进行注意力学习之后作为query和key传到decoder中,整个encoder和decoder的模块,包含的结构有multi-head-attention和feed-forword是之前卷积神经网络中没有接触过的,其中multi-head-attention是transformer的核心,接下来我们先详细解释一下multi-head-attention的具体结构以及在detr里面的实现过程。

multi-head-attention的输入是query,key,value;其中query,key首先通过矩阵相成得到一个attention矩阵,然后attention矩阵value再矩阵相乘得到加了attention信息的feature。在detr中,query,key,value都是来源于backbone提取出的特征,唯一不同的是query,key在特征的基础上加上了位置编码信息(之后详细介绍),这样得到的attention信息就是和位置有关的;

backbone输出的feature纬度是NxCxHxW,通过reshape以及transpose得到HWxNxC的纬度,然后再各自通过一个CxC的全连接层,此处他们三个的权值不共享,所以参数量是3xCxC,计算量是3xHWxCxC。

接下来是multi-head的过程,multihead的原理是把C维的channel分成多个head,每个head学习不同方面的attention信息,同时参数量和计算量也不会额外增加;在detr中,C=256,head的数量是8,所以每个head是32维度。接下来,query,key,value都经过reshape,以及transpose之后变成了NhxHWxD,然后key再transpose一次,变成NhxDxHW,query和key通过torch.bmm(batch matrix-matrix)的操作,得到NhxHWxHW的tensor,这个bmm的计算量是CxHWxHW,而得到的这个tensor包含了每个feature和其他feature的attention关系(HWxHW);接下来经过scale(1/ )的计算,原因: transformer为什么要经过scale ,乘以mask,再过一下softmax,就得到了feature的attention关系图,然后把这个attention矩阵和value再进行torch.bmm的操作,得到经过attention的feature map,再过一次全连接,得到transformer的输出。可以看到整个过程包含两次bmm的计算,四次全连接的计算,总体的计算量:

参数量是4xCxC。

可以看到最大的计算量在和HW有平方关系的矩阵计算bmm,而这两次计算主要是对每个feature计算和其他HW个feature的关系,所以swin transformer为了解决这个问题,提出了只计算local window里面WxW个feature,每个feature和其他WxW个feature的关系,因此计算的复杂度是HWxWxW,在swin transformer里面,W设置为7,具体的可以等swin transformer code release之后具体讲述。 swin transformer

Transformer最全解析(attention is all you need)

Transformer出自google,被广泛应用于NLP的各项任务中,在transformer基础上改进优化的BERT模型在2019年11项NLP任务中表现SOTA。 论文原文: https://arxiv.org/pdf/1706.03762.pdf 《attention is all you need》
在处理变长的序列问题时,一般的做法是利用卷积神经网络或循环神经网络。
无论卷积还是循环神经网络其实都是对变长序列的一种“局部编码”:卷积神经网络显然是基于N-gram的局部编码;而对于循环神经网络,由于梯度消失等问题也只能建立短距离依赖。
Attention可以理解为一种序列聚焦方法,基本思想是对序列分配注意力权重,把注意力集中在最相关的序列上。 Attention 机制实质上就是一个寻址过程,通过给定一个任务相关的查询 Query 向量 Q,通过计算与 Key 的注意力分布并附加在 Value 上,从而计算 Attention Value,这个过程实际上是 Attention 缓解神经网络复杂度的体现,不需要将所有的 N 个输入都输入到神经网络进行计算,而是选择一些与任务相关的信息输入神经网络,与 RNN 中的门控机制思想类似。
用X = [x_1, · · · , x_N ]表示N 个输入样本;通过线性变换得到为查询向量序列,键向量序列和值向量序列:
所谓self-attention自注意力机制,即其注意力概率分布来自网络自身的输入的变换,而传统attention的注意力概率分布来自外部。
Transformer模型中采用了 encoer-decoder 架构,论文中encoder层由6个encoder堆叠在一起,decoder层也一样。
每一层的encoder和decoder的结构如下图所示:
transformer模型中缺少一种解释输入序列中单词顺序的方法,它跟序列模型还不不一样。为了处理这个问题,transformer给encoder层和decoder层的输入添加了一个额外的向量Positional Encoding,维度和embedding的维度一样,这个向量采用了一种很独特的方法来让模型学习到这个值,这个向量能决定当前词的位置,或者说在一个句子中不同的词之间的距离。这个位置向量的具体计算方法有很多种,论文中的计算方法如下:
其中pos是指当前词在句子中的位置,i是指向量中每个值的index,可以看出,在偶数位置,使用正弦编码,在奇数位置,使用余弦编码。最后把这个Positional Encoding与embedding的值相加,作为输入送到下一层。
在每个编码器中的每个子层(自注意力、前馈网络)的周围都有一个残差连接,并且都跟随着一个“层-归一化”步骤。
Normalization有很多种,但是它们都有一个共同的目的,那就是把输入转化成均值为0方差为1的数据。我们在把数据送入激活函数之前进行normalization(归一化),因为我们不希望输入数据落在激活函数的饱和区。
mask 表示掩码,它对某些值进行掩盖,使其在参数更新时不产生效果。Transformer 模型里面涉及两种 mask,分别是 padding mask 和 sequence mask。其中,padding mask 在所有的 scaled dot-product attention 里面都需要用到,而 sequence mask 只有在 decoder 的 self-attention 里面用到。
原论文中说到进行Multi-head Attention的原因是将模型分为多个头,形成多个子空间,可以让模型去关注不同方面的信息,最后再将各个方面的信息综合起来。其实直观上也可以想到,如果自己设计这样的一个模型,必然也不会只做一次attention,多次attention综合的结果至少能够起到增强模型的作用,也可以类比CNN中同时使用 多个卷积核 的作用,直观上讲,多头的注意力 有助于网络捕捉到更丰富的特征/信息 。
seq2seq缺点 :这里用代替这个词略显不妥当,seq2seq虽已老,但始终还是有其用武之地,seq2seq最大的问题在于 将Encoder端的所有信息压缩到一个固定长度的向量中 ,并将其作为Decoder端首个隐藏状态的输入,来预测Decoder端第一个单词(token)的隐藏状态。在输入序列比较长的时候,这样做显然会损失Encoder端的很多信息,而且这样一股脑的把该固定向量送入Decoder端,Decoder端不能够关注到其想要关注的信息。
Transformer优点 :transformer不但对seq2seq模型这两点缺点有了实质性的改进(多头交互式attention模块),而且还引入了self-attention模块,让源序列和目标序列首先“自关联”起来,这样的话,源序列和目标序列自身的embedding表示所蕴含的信息更加丰富,而且后续的FFN层也增强了模型的表达能力,并且Transformer并行计算的能力是远远超过seq2seq系列的模型,因此我认为这是transformer优于seq2seq模型的地方

GPT和GPT2

GPT用的是transformer decoder fine-tuning的输入:最后一个词的向量。
GPT采用单向transformer可以解决Bert无法解决的生成文本任务。
一个字一个字往出蹦的形式
通常我们会用特定的网络结构去给任务建模,构建通用NLP模型,对p(output | input, task)建模。output ,input, task三者都用向量表示。
把第二阶段替换由Finetuning有监督,换成了无监督做下游任务,因为它扔进去了好多任务数据,且有提示词。 问题1 :GPT2把第二阶段的Finetuning做有监督地下游NLP任务,换成了 无监督地做下游任务 。为什么这样做?一种看法认为,只是GPT作者想说明在第一阶段Transformer学到了很多通用的包含各个领域的知识。 问题2:为什么GPT 2.0仍然固执地用单向语言模型,而不是双向语言模型呢? Bert的论文认为,Bert的有效性主要是因为使用了双向语言模型。 1.生成内容后续单词这种模式,单向语言模型更方便; 2、想证明通过增加数据量和模型结构,单向模型未必输双向模型。 问题3:GPT2训练好的语言模型,如何无监督适应下游任务,比如文本摘要,怎么知道是在做文本摘要任务呢? 首先,所有任务都采取相同的往出蹦字的输出模式。GPT2.0给出了一种新颖的生成式任务的做法,就是一个字一个字往出蹦,然后拼接出输出内容作为翻译结果或者摘要结果。GPT-2的输入也会加入提示词,比如输入格式是 文本+TL;DR:,GPT-2模型就会知道是做摘要工作了。

阅读更多 >>>  transformer代码详解,transform encoder

网站数据信息

"transformer decoder,GPT和GPT2"浏览人数已经达到21次,如你需要查询该站的相关权重信息,可以点击进入"Chinaz数据" 查询。更多网站价值评估因素如:transformer decoder,GPT和GPT2的访问速度、搜索引擎收录以及索引量、用户体验等。 要评估一个站的价值,最主要还是需要根据您自身的需求,如网站IP、PV、跳出率等!