type
status
date
slug
summary
tags
category
icon
password
笔记
⭐ Abstract+Introduction
序列翻译模型中主导的方法是在编码器和解码器配置中使用复杂的循环或卷积神经网络,同时可以使用注意力机制将编码器和解码器连接起来。
Transformer模型仅基于注意力机制,完全摒弃了循环和卷积网络。
Transformer改进了RNN最被人诟病的训练慢的缺点,利用self-attention机制实现快速并行。并且Transformer可以增加到非常深的深度,充分发掘DNN模型的特性,提升模型准确率。
⭐ Model Architecture

主要分为两部分,编码器层和解码器层
🍀 编码器
由6个相同层堆叠成(但不共享参数),每层包括两个子层,第一个子层为多头自我注意机制(帮助编码器在对每个单词编码时关注输入句子的其他单词),第二个是简单的位置全连接前馈网络。在两个子层间采用残差连接,并进行层标准化,即每个子层的输出为:
sublayer(X)是由子层本身实现的功能。为了促进这些剩余连接,模型中的所有子层以及嵌入层产生维度dModel=512的输出。
🍀 解码器
同样由6个相同层堆叠而成。但是相比于编码器,解码器还插入了第三个子层,该子层对编码器堆栈的输出执行多头关注;对解码器中的自我注意机制子层进行了修改,以防止位置关注后续位置,这种掩蔽与输出嵌入偏移一个位置的事实相结合,确保了对位置i的预测只能依赖于小于i的位置处的已知输出。

⭐ 注意力机制
注意力机制就是关注事物最有辨识度的地方
注意力函数可以被描述为将一个查询和一组键-值对映射到输出,其中查询、键、值和输出都是向量。输出被计算为值的加权和,其中分配给每个值的权重是通过查询与相应键的兼容性函数来计算的。
输入:
- Q(query):查询向量
- K(key):键向量
- V(value):值向量
实现步骤:
第一步: 根据注意力计算规则,对Q, K, V进行相应的计算;
第二步: 根据第一步采用的计算方法,如果是拼接的方法,则需要将Q与第二步的计算结果再进行拼接;如果是转置点积,一般是自注意力,Q与V相同,则不需要进行再次拼接;
第三步: 为了使整个attention机制按照指定的尺寸输出,使用线性层作用在第二步的结果上进行一个线性变换,最终得到对Q的注意力表示。
常见的注意力计算规则
- 将Q,K进行纵轴拼接,做一次线性变化,再使用softmax处理获得结果最后与V做张量乘法。
- 将Q,K进行纵轴拼接,做一次线性变化后再使用tanh函数激活,然后再进行内部求和,最后使用softmax处理获得结果再与V做张量乘法。
- 将Q与K的转置做点积运算,然后除以一个缩放系数,再使用softmax处理获得结果,最后与V做张量乘法。
🍀 Scaled Dot-Product Attention

- 输入:维度dk的查询和键、维度dv
- 计算:计算查询的所有键的点积,每个键除以dk的开方,并应用softmax函数来获得值的权重。在实践中,同时计算一组查询上的注意力函数,权重打包成矩阵Q,键和值打包成矩阵K和V,输出计算公式如下:
最常用的两个注意函数为:加性注意和点积注意。
点积注意与上述算法相同(除了比例因子)加性注意算法采用带有单一隐藏层的前馈网络计算兼容性函数。
理论复杂性上两者类似,但点积注意在实践中更快、更节省空间;
当dk值较小时,两种机制表现相似,dk值较大时,加性注意在没有缩放的情况下优于点积注意,因此对点积注意引入了缩放值。
🍀 Multi-Head Attention

多头注意力机制通过将查询、键和值线性投影h次,分别投影到dk,dk和dv维度。在每个投影版本上,并行执行注意力函数,产生dv维输出值,将这些值连接起来并再次投影,得到最终值。
👉:模型能够同时关注来自不同位置的不同表示子空间的信息。
🍀 注意力机制在Transformer中的应用
- 解码器-编码器注意层。查询来自上一个解码器层,而键和值来自编码器的输出。使得解码器中的每个位置都可以覆盖输入序列中的所有位置(类似seq2seq中典型的编码器-解码器注意机制)
- 编码器中的自注意层。所有的键、值、查询都来自编码器中的前一层的输出。编码器中的每个位置都可以处理编码器上一层中的所有位置。
- 解码器中的自注意层。与2类似,允许解码器中的每个位置注意到解码器中的所有位置,直到包括该位置。需要注意的是,要防止解码器中的信息向左流动,以保持自回归性,通过设置屏蔽softmax输入中与非法连接对应的所有值,在Scaled Dot-Product Attention中实现这一点。
🍀 为什么使用自注意机制?
比较自注意层与循环层和卷积层
自注意层、循环层和卷积层通常用于映射一个可变长度的序列到另一个等长序列
动机:
- 计算复杂度
- 可并行化的计算量 可以通过所需的最小顺序操作数量来衡量
- 网络中长期依赖关系之间的路径长度 在许多序列转导任务中,学习长期依赖关系是一个关键的挑战。影响学习这种依赖关系能力的一个关键因素是向前和向后信号在网络中必须遍历的路径长度。输入和输出序列中任意位置组合之间的路径越短,就越容易学习长期依赖关系。
自注意层将所有位置与常数数量的顺序执行操作连接起来,而循环层需要O(n)个顺序操作。在计算复杂度方面,当序列长度n小于表示维数d时,自注意层比循环层更快
注意力机制的作用:
- 在解码器端的注意力机制:能够根据模型目标有效地聚焦编码器的输出结果,当其作为解码器的输入时提升效果。改善以往编码器输出是单一定长向量,无法存储过多信息的情况;
- 在编码器端的注意力机制:主要解决表征问题,相当于特征提取过程,得到输入的注意力表示,一般使用自注意力机制
⭐ 位置前馈神经网络Position-wise Feed-Forward Networks
除了注意力子层,编码器和解码器中的每一层都包含一个完全连接的前馈网络,该网络分别且相同地应用于每个位置。这包括两个线性转换,中间有一个ReLU激活。
虽然线性变换在不同位置上是相同的,但它们在不同层之间使用不同的参数。另一种描述方法是两个核大小为1的卷积。输入输出维数为dmodel = 512,内层维数为dimensionalitydf f = 2048。
⭐ Embeddings and Softmax
与其他序列转导模型类似使用学习嵌入将输入标记和输出标记转换为维度为dmodel的向量。我们还使用常用的学习线性变换和softmax函数将解码器输出转换为预测的下一个令牌概率。在我们的模型中,我们在两个嵌入层之间共享相同的权重矩阵和pre-softmax线性变换。在嵌入层中,我们将这些权重乘以√dmodel。
⭐ Positional Encoding
由于模型不使用循环和卷积,为了使模型能够考虑序列的顺序信息,必须注入一些序列中令牌的相对/绝对位置信息。
👉:将位置编码添加到编码器和解码器堆栈底部的输入嵌入中。
位置编码与嵌入具有相同的维数dmodel
- Author:NotionNext
- URL:https://tangly1024.com/article/attention
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts