self-attention自注意力学习

self-attention自注意力

自我注意已经成功地用于各种任务,包括阅读理解、抽象总结、文本蕴涵和学习任务独立的句子表征。

原文地址:https://semanticscholar.org/paper/204e3073870fae3d05bcbc2f6a8e263d9b72e776

代码地址:
https://github.com/tensorflow/tensor2tensor

本文贡献:
1)不同于以往主流机器翻译使用基于RNN的seq2seq模型框架,该论文用attention机制代替了RNN搭建了整个模型框架。
2)提出了多头注意力(Multi-headed attention)机制方法,在编码器和解码器中大量的使用了多头自注意力机制(Multi-headed self-attention)。
3)Transformer,它完全基于注意机制,完全免除了重复和卷积。

自我注意(Self-attention),有时也称为内部注意(intra-attention),是一种将单个序列的不同位置联系起来,以计算该序列的表示的注意机制。Transformer是第一个完全依靠自我注意来计算其输入和输出表示的转导模型,而不使用序列对齐的rnn或卷积。

模型框架:

1.编码器将符号表示的输入序列(x1,…,xn)映射为连续表示的序列z = (z1,…,zn)。给定z,解码器然后生成一个输出序列(y1,…(, ym)每次一个元素的符号。在每个步骤中,模型都是自动回归的,在生成下一个步骤时,将之前生成的符号作为额外的输入使用。Transformer遵循这种总体架构,编码器和解码器都使用了堆叠的自注意层和点式的、完全连接的层。

编码器:编码器由N = 6个相同的层组成。每一层有两个子层。

(1)第一层是多头自注意机构,通过self-attention层帮助Endcoder在编码单词的过程中查看输入序列中的其他单词。

(2)第二层是简单的位置全连接前馈网络。我们在两个子层周围使用残差连接,然后是层归一化。也就是说,每个子层的输出是LayerNorm(x +子层(x)),其中子层(x)是子层本身实现的函数。为了方便这些剩余连接,模型中的所有子层以及嵌入层都会产生dimension dmodel = 512的输出。
编码器结构

解码器:解码器也由N = 6个相同的层组成。除每个编码器层中的两个子层外,解码器还插入第三个子层,该子层对编码器堆栈的输出执行多头注意。与编码器类似,我们在每个子层周围使用残差连接,然后进行层归一化。我们还修改了解码器堆栈中的自注意子层,以防止位置注意到后续位置。这种掩蔽,加上输出嵌入被一个位置偏移的事实,确保了位置i的预测只能依赖于位置小于i的已知输出。
编码器和解码器结构类似

2注意
注意函数可以描述为将查询和一组键-值对映射到输出,其中查询、键、值和输出都是向量。输出是作为值的加权和计算的,其中分配给每个值的权重是通过查询与相应键的兼容性函数计算的。
缩放点积注意
加性注意和点积注意。

3.Multi-Head Attention
不同于使用dmodel维度的键、值和查询来执行单一的注意功能,我们发现将查询、键和值分别以不同的线性投影h次线性投影到dk、dk和dv维度是有益的。对于这些查询、键和值的每个投影版本,我们然后并行地执行注意功能,产生dv维输出值。将它们连接起来并再次进行投影,得到最终的值。

多头注意使得模型能够在不同位置共同关注来自不同表示子空间的信息。用一个注意力集中的头,平均就能抑制这种情况。

在这项工作中,我们使用h = 8个平行的注意层,或头部。对于每一个,我们用dk = dv = dmodel/h = 64。由于每个头的尺寸减小,总计算成本类似于单头注意全维。

4注意在我们模型中的应用
Transformer以三种不同的方式使用多头注意力:
在encoder-decoder关注;层,查询来自前面的解码器层,而内存键和值来自编码器的输出。这使得译码器中的每个位置都可以参加输入序列中的所有位置。
编码器包含自我注意层。在自我注意层中,所有的键、值和查询都来自同一个地方,在本例中,是编码器中前一层的输出。编码器中的每个位置都可以对应上一层的所有位置。
类似地,解码器中的自我注意层允许解码器中的每个位置关注解码器中直到并包括该位置的所有位置。我们需要防止解码器中的信息流向左,以保持自回归特性。我们通过屏蔽(设置为)softmax输入中对应非法连接的所有值来实现缩放点积注意。参见图2。

3.3位置前馈网络
除了注意子层,编码器和解码器中的每一层都包含一个完全连接的前馈网络,它分别和相同地应用于每个位置。这包括两个线性变换,中间有一个ReLU激活。
FFN(x) = max(0, xW1 + b1)W2+b2
虽然在不同位置上的线性转换是相同的,但它们在不同层之间使用不同的参数。另一种描述方法是两个卷积,内核大小为1。输入输出维数为dmodel = 512,内层维数为dff =2048。

3.4Embeddings和Softmax
类似于其他序列转换模型,我们使用学习嵌入将输入标记和输出标记转换为维数dmodel的向量。我们还使用通常学到的线性变换和softmax函数将解码器输出转换为预测的下一个令牌概率。在我们的模型中,我们在两个嵌入层之间共享相同的权矩阵和前softmax线性变换,类似于[30]。在嵌入层中,我们将这些权重乘以√dmodel。

3.5位置编码

由于我们的模型不包含递归和卷积,为了使模型利用序列的顺序,我们必须注入一些关于标记在序列中的相对或绝对位置的信息。为此,我们在编码器和解码器堆栈底部的输入嵌入中添加了“位置编码”。位置编码具有与嵌入相同的维数dmodel,因此两者可以相加。有许多位置编码的选择,学习和固定。

Transformer发轫于NLP(自然语言处理),并跨界应用到CV(计算机视觉)领域。目前已成为深度学习的新范式,影响力和应用前景巨大。 本课程对Transformer的原理和TensorFlow 2代码进行精讲,来帮助大家掌握其详细原理和具体实现。 原理精讲部分包括:注意力机制和自注意力机制、Transformer的架构概述、Encoder的多头注意力(Multi-Head Attention)、Encoder的位置编码(Positional Encoding)、残差链接(Residual Connection)、层规范化(Layer Normalization)、FFN(Feed Forward Network)、Transformer的训练及性能、Transformer的机器翻译工作流程。  代码精讲部分使用Jupyter Notebook对Transformer的TensorFlow 2实现代码进行逐行解读,包括:安装TensorFlow、Transformer的数据集加载与预处理代码解读、Transformer的位置编码与多头注意力代码解读、Transformer的Transformer类代码解读、Transformer的优化器与损失函数代码解读、Transformer的训练代码解读、Transformer的推理与权重保存代码解读。相关课程: 《Transformer原理与代码精讲(PyTorch)》https://edu.csdn.net/course/detail/36697《Transformer原理与代码精讲(TensorFlow)》https://edu.csdn.net/course/detail/36699《ViT(Vision Transformer)原理与代码精讲》https://edu.csdn.net/course/detail/36719《DETR原理与代码精讲》https://edu.csdn.net/course/detail/36768《Swin Transformer实战目标检测:训练自己的数据集》https://edu.csdn.net/course/detail/36585《Swin Transformer实战实例分割:训练自己的数据集》https://edu.csdn.net/course/detail/36586《Swin Transformer原理与代码精讲》 https://download.csdn.net/course/detail/37045
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值