Transformer论文解读和Bert模型架构


(主要用于自己学习记录,没完成的部分等我逐步更新哈)

Attention is all you need论文

Abstract

​ 之前的序列到序列模型需要CNN或RNN。本文提出了新的网络架构,免除了递归和卷积。具有并行性,且训练时间更少,在两个机器翻译任务上具有更好的性能,并且证明了可以推广到其他领域。

Introducntion

解释了RNN模型:递归模型通常沿着输入和输出序列的符号位置进行因子计算。在计算时间内将位置与步骤对齐,它们生成一个隐藏状态ht序列,作为前一个隐藏状态ht - 1和位置t输入的函数。这种固有的顺序性限制了训练样本内部的并行化,在序列较长时,这个问题变得更加严重。完全基于注意力机制来得到输入和输出之间的全局依赖。避免了循环,可以并行化计算,在八块P100 GPU 上训练十二小时后在翻译任务上达到了SOTA(State-of-the-Art)。

Background

减少序列计算的目标也成就了 Extended Neural GPU [16],ByteNet[18],和ConvS2S[9]的基础,它们都使用了卷积神经网络作为基础模块,并行计算所有输入和输出位置的隐藏表示。在这些模型中,将来自两个任意输入或输出位置的信号关联起来所需的操作数,随位置间的距离而增长,ConvS2S为线性增长,ByteNet为对数增长。这使得学习远距离位置之间的依赖性变得更加困难[12]. 在Transformer中,这种情况被减少到了常数次操作,虽然代价是由于平均 注意力加权位置信息降低了有效分辨率我们用多头注意力抵消这种影响。

self-attention,有时也叫做内部注意力,是一种注意力机制,它将一个序列的不同位置联系起来,以计算序列的表示。self-attention 已经成功的运用到了很多任务上,包括阅读理解、抽象摘要、语篇蕴涵和学习任务无关的句子表征等。

Transformer是第一个完全依赖于self-attetion来计算其输入和输出表示而不使用序列对齐的RNN或卷积的转换模型,在下面的章节中,我们将描述Transformer,motivate ,self-attention以及其模型的优势

Model Architecture

大多数有竞争力的序列转换模型都有encoder-decoder结构构。这里,encoder将符号表示的输入序列映射成一个连续表示的序,然后解码器以一次生成一个字符的方式生成输出序列(单向模型:在生成每个位置的输出时只能依赖于已经生成的左侧部分的内容,而不能直接访问右侧的信息。这是因为在生成序列的过程中,每个位置的输入都是通过先前位置的输出经过自注意力机制和前馈神经网络进行计算得到的。这种从左到右的单向生成方式使得Transformer在解码过程中不能直接访问未生成的部分,因此被称为单向模型。
  Transformer遵循这个总体架构,使用堆叠的self-attention层、point-wise和全连接层,分别用于encoder和decoder,如图1的左半部分和右半部分所示。

在这里插入图片描述

3.1Encoder and Decoder Stacks

Encoder: 由N(N=6)个完全相同的layer堆叠而成.每层有两个子层第一层是multi-head self-attention机制,第二层 是一个简单的、位置全连接的前馈神经网络。我们在两个子层的每一层后采用残差连接,接着进行layer normalization。也就是说,每个子层的输出是LayerNorm(x + Sublayer(x)),其中Sublayer(x) 是由子层本身实现的函数。为了方便这些残差连接,模型中的所有子层以及embedding层产生的输出维度都为d_{model} = 512.每一层的输出维度都是512。
这样设计的目的是为了保持特征维度的一致性,方便模型的连接和参数共享。

**LN和BN的区别**:LN和BN是指Layer Normalization(层归一化)和Batch Normalization(批归一化),
它们是深度学习中常用的归一化技术,用于加速模型的训练和改善模型的性能
LN(Layer Normalization):对每个样本的同一层的不同特征进行归一化。即在每个样本上,对该层的所有神经元的输出进行归一化处理。
BN(Batch Normalization):对每个特征的同一批次样本进行归一化。即对每个特征在一个批次(batch)的所有样本上进行归一化处理。
计算方式的差异:
LN(Layer Normalization):在每个样本上计算特征维度的均值和方差,然后对该样本的所有特征进行归一化
BN(Batch Normalization):在一个批次上计算每个特征维度的均值和方差,然后对该批次的所有样本的相同特征进行归一化

Decoder:decoder也由N(N=6)个完全相同的layer堆叠而成.除了每个编码器层中的两个子层之外,解码器还插入第三个子层该子层对编码器堆栈的输出执行multi-head attention操作,与encoder相似,我们在每个子层的后面使用了残差连接,之后采用了layer normalization。我们也修改了decoder stack中的 self-attention 子层,以防止当前位置信息中被添加进后续的位置信息。这种掩码与偏移一个位置的输出embedding相结合, 确保对第i个位置的预测 只能依赖小于i的已知输出

3.2 Attention(注意力机制)

在这里插入图片描述
Attention机制可以描述为将一个query和一组key-value对映射到一个输出,其中query,keys,values和输出均是向量。输出是values的加权求和,其中每个value的权重 通过query与相应key的兼容函数来计算

	Q、K和V的维度通常相同,且由模型的超参数决定。(通常来自embedding的线性变换)它们的含义如下:

	Q矩阵衡量查询序列中的每个元素对其他元素的关注程度。
	K矩阵表示被查询序列中的每个元素的重要性。
	V矩阵提供每个输入元素的信息,用于生成输出。

通过将Q、K和V矩阵输入到注意力机制中,Transformer能够根据输入序列的相关性和重要性,计算出每个位置的注意力权重,并使用这些权重对输入序列进行加权求和,得到最终的表示。这种机制使得Transformer能够捕捉输入序列中不同元素之间的关联关系,并在生成输出时更加准确和有针对性。
在这里插入图片描述
**例如:**这幅图不同的颜色代表不同的head,深浅代表相关性大小,计算完每一个head,将所有的拼接在一起,然后是符合d_model的输出维度。

Scaled Dot-Product Attention(缩放的点积注意力机制)

在这里插入图片描述在这里插入图片描述
**注意:**除以根号下 dk 是为了缩放点积的值,避免梯度爆炸问题,并平衡不同维度之间的影响,以提高模型的稳定性和泛化能力。

Multi-Head Attention(多头注意力机制)

在这里插入图片描述
分成八个分别计算,最后concat 在一起,跟单个的head的输出维度是一摸一样的。

具体来说,多头注意力机制通过将输入进行线性变换得到不同的查询、键和值,然后分别应用注意力机制并进行拼接,最后再经过一个线性变换得到最终的输出。每个注意力头都可以学习不同的注意力权重,从而关注输入的不同局部信息。这样的设计使得模型可以同时关注不同层次和不同角度的信息,提取更全面和多样化的特征表示。

Applications of Attention in our Model(注意力机制在我们模型中的应用)
  1. 在encoder-decoder attention层中,queries来自前面的decoder层,而keys和values来自encoder的输出。这使得decoder中的每个位置都能关注到输入序列中的所有位置。 这是模仿序列到序列模型中典型的编码器—解码器的attention机制,例如[38, 2, 9]。
  2. encoder包含self-attention层。 在self-attention层中,所有的key、value和query来自同一个地方,在这里是encoder中前一层的输出。 encoder中的每个位置都可以关注到encoder上一层的所有位置。
  3. 类似地,decoder中的self-attention层允许decoder中的每个位置都关注decoder层中当前位置之前的所有位置(包括当前位置)。 为了保持解码器的自回归特性,需要防止解码器中的信息向左流动。我们在scaled dot-product attention的内部 ,通过屏蔽softmax输入中所有的非法连接值(设置为 −∞)实现了这一点。

3.3 Positional Encoding(位置编码)

模型不包含循环或卷积,为了让模型利用序列的顺序信息,我们必须加入序列中关于字符相对或者绝对位置的一些信息。 为此,我们在encoder和decoder堆栈底部的输入嵌入中添加“位置编码”。 位置编码和嵌入的维度d_model 相同,所以它们两个可以相加。有多种位置编码可以选择,例如通过学习得到的位置编码和固定的位置编码.
在这里插入图片描述在这里插入图片描述

3.4 Why Self-Attention(为什么选择selt-attention)

我们考虑三个方面,最后促使我们使用self-attention。

  1. 一是每层的总计算复杂度.
  2. 另一个是可以并行化的计算量,以所需的最小序列操作数衡量。
  3. 第三个是网络中长距离依赖关系之间的路径长度。在许多序列转换任务中,学习长距离依赖性是一个关键的挑战。影响学习这种依赖关系能力的一个关键因素是网络中向前和向后信号必须经过的路径的长度。输入和输出序列中任意位置组合之间的这些路径越短,越容易学习长距离依赖。因此,我们还比较了在由different layer types组成的网络 中的任意两个输入和输出位置之间的最大的路径长度。

3.5 Training

模型采用的数据集和效果就不在此展示,主要展示使用的一些优化器和正则化处理方法

Optimizer(优化器)

在这里插入图片描述

Regularization(正则化)

主要采取三种正则化:

  1. Residual Dropout 我们在对每个子层的输出上执行dropout操作,这个操作在additive操作(子层的输出加上子层的输入)和 normalized操作之前。 此外,在编码器和解码器堆栈中,我们将丢弃应用到嵌入和位置编码的和。 对于基础模型,我们使用P drop = 0.1丢弃率。在这里插入图片描述3. Label Smoothing 在训练过程中,我们采用了值εls = 0.1的标签平滑。这会影响ppl,因为模型学习到了更多的不确定性,但提高了准确率和BLEU评分.

Conclusion

  1. 提出了Transformer,第一个完全基于attention的序列转换模型,用multi-headed self-attention取代了encoder-decoder架构中最常用的recurrent layers
  2. 对于翻译任务,Transformer比基于循环或卷积层的体系结构训练更快
  3. 计划将它们应用于其他任务。 我们计划将Transformer扩展到除文本之外的涉及输入和输出模式的问题,并研究局部的、受限的attention机制,以有效地处理图像、音频和视频等大型输入和输出。 让生成具有更少的顺序性是我们的另一个研究目标。

Transformer 框架

输出嵌入Embedding

词嵌入(Word Embedding):首先,输入的单词或字符会被映射到一个连续的向量空间,这就是词嵌入。词嵌入可以将离散的词或字符转化为连续的向量表示,捕捉到它们的语义信息和相似关系。常用的词嵌入方法有Word2Vec、GloVe和FastText等。

位置编码(Positional Encoding):为了引入输入序列中的位置信息,Transformer在词嵌入之后添加了位置编码。位置编码是一种用于表示单词或字符在序列中相对位置的向量。它使得Transformer能够区分不同位置的单词或字符,并且在自注意力机制中考虑到它们的位置关系。常用的位置编码方法有正弦和余弦函数编码。

类别嵌入(Segment Embedding):对于一些需要处理多个句子或段落的任务,Transformer还可以添加类别嵌入。类别嵌入用于区分不同句子或段落的信息,并将它们作为额外的输入特征引入模型中。类别嵌入可以用于任务如句子对分类和文档级情感分类等。

Bert 模型

Gpt 模型

代码实现完型填空(mask)

参考文献

1. attention is all you need
2, transformer架构

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

herry_drj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值