10.6 自注意力和位置编码
在深度学习中,我们经常使用卷积神经网络(CNN)或循环神经网络(RNN)对序列进行编码。
想象一下,有了注意力机制之后,我们将词元序列输入注意力池化中, 以便同一组词元同时充当查询、键和值。
具体来说,每个查询都会关注所有的键-值对并生成一个注意力输出。 由于查询、键和值来自同一组输入,因此被称为 自注意力(self-attention) [Lin et al., 2017b][Vaswani et al., 2017], 也被称为内部注意力(intra-attention) [Cheng et al., 2016][Parikh et al., 2016][Paulus et al., 2017]。
在本节中,我们将使用自注意力进行序列编码,以及如何使用序列的顺序作为补充信息。
1. 自注意力
给定一个由词元组成的输入序列x1,…,xn\mathbf{x}_1, \ldots, \mathbf{x}_nx1,…,xn, 其中任意xi∈Rd\mathbf{x}_i \in \mathbb{R}^dxi∈Rd(1≤i≤n1 \leq i \leq n1≤i≤n)。
该序列的自注意力输出为一个长度相同的序列 ,其中:
yi=f(xi,(x1,x1),…,(xn,xn))∈Rd\mathbf{y}_i = f(\mathbf{x}_i, (\mathbf{x}_1, \mathbf{x}_1), \ldots, (\mathbf{x}_n, \mathbf{x}_n)) \in \mathbb{R}^dyi=f(xi,(x1,x1),…,(xn,xn))∈Rd
根据前文介绍定义的注意力函数。
2. 比较卷积神经网络、循环神经网络和自注意力
让我们比较下面几个架构,目标都是将由个词元组成的序列映射到另一个长度相等的序列,其中的每个输入词元或输出词元都由维向量表示。
具体来说,我们将比较的是卷积神经网络、循环神经网络和自注意力这几个架构的计算复杂性、顺序操作和最大路径长度。
请注意,顺序操作会妨碍并行计算,而任意的序列位置组合之间的路径越短,则能更轻松地学习序列中的远距离依赖关系 [Hochreiter et al., 2001]。
图10.6.1 比较卷积神经网络(填充词元被忽略)、循环神经网络和自注意力三种架构
2.1 CNN
考虑一个卷积核大小为的卷积层。 我们将在后面的章节中提供关于使用卷积神经网络处理序列的更多详细信息。 目前,我们只需要知道,由于序列长度是,输入和输出的通道数量都是, 所以卷积层的计算复杂度为。 如 图10.6.1所示, 卷积神经网络是分层的,因此为有个顺序操作, 最大路径长度为。 例如,和处于 图10.6.1中卷积核大小为3的双层卷积神经网络的感受野内。
2.2 RNN
当更新循环神经网络的隐状态时, 权重矩阵和维隐状态的乘法计算复杂度为。 由于序列长度为,因此循环神经网络层的计算复杂度为。 根据 图10.6.1, 有个顺序操作无法并行化,最大路径长度也是。
2.3 self attention
在自注意力中,查询、键和值都是矩阵。 考虑 前文 缩放的”点-积“注意力, 其中矩阵乘以矩阵。 之后输出的矩阵乘以矩阵。 因此,自注意力具有计算复杂性。 正如我们在 图10.6.1中看到的那样, 每个词元都通过自注意力直接连接到任何其他词元。 因此,有个顺序操作可以并行计算, 最大路径长度也是。
总而言之,卷积神经网络和自注意力都拥有并行计算的优势, 而且自注意力的最大路径长度最短。 但是因为其计算复杂度是关于序列长度的二次方,所以在很长的序列中计算会非常慢。
3. 位置编码
在处理词元序列时,循环神经网络是逐个的重复地处理词元的, 而自注意力则因为并行计算而放弃了顺序操作。
为了使用序列的顺序信息,我们通过在输入表示中添加 位置编码(positional encoding)来注入绝对的或相对的位置信息。
位置编码可以通过学习得到也可以直接固定得到。 接下来,我们描述的是基于正弦函数和余弦函数的固定位置编码 [Vaswani et al., 2017]。
假设输入表示 X∈Rn×d\mathbf{X} \in \mathbb{R}^{n \times d}X∈Rn×d包含一个序列中个词元的维嵌入表示。
位置编码使用相同形状的位置嵌入矩阵P∈Rn×d\mathbf{P} \in \mathbb{R}^{n \times d}P∈Rn×d 输出X+P\mathbf{X} + \mathbf{P}X+P, 矩阵第iii行、第2j2j2j列和2j+12j+12j+1列上的元素为:
pi,2j=sin(i100002j/d),p_{i, 2j} = \sin (\frac{i}{10000^{2j/d}} ), pi,2j=sin(100002j/di),
pi,2j+1=cos(i100002j/d),p_{i, 2j+1} = \cos(\frac{i}{10000^{2j/d}}), pi,2j+1=cos(100002j/di),
乍一看,这种基于三角函数的设计看起来很奇怪。 在解释这个设计之前,让我们先在下面的PositionalEncoding类中实现它。
#@save
class PositionalEncoding(tf.keras.layers.Layer):"""位置编码"""def __init__(self, num_hiddens, dropout, max_len=1000):super().__init__()self.dropout = tf.keras.layers.Dropout(dropout)# 创建一个足够长的Pself.P = np.zeros((1, max_len, num_hiddens))X = np.arange(max_len, dtype=np.float32).reshape(-1,1)/np.power(10000, np.arange(0, num_hiddens, 2, dtype=np.float32) / num_hiddens)self.P[:, :, 0::2] = np.sin(X)self.P[:, :, 1::2] = np.cos(X)def call(self, X, **kwargs):X = X + self.P[:, :X.shape[1], :]return self.dropout(X, **kwargs)
在位置嵌入矩阵P\mathbf{P}P中, 行代表词元在序列中的位置,列代表位置编码的不同维度。
在下面的例子中,我们可以看到位置嵌入矩阵的第6列和第7列的频率高于第8列和第9列。
第6列和第7列之间的偏移量(第8列和第9列相同)是由于正弦函数和余弦函数的交替。
encoding_dim, num_steps = 32, 60
pos_encoding = PositionalEncoding(encoding_dim, 0)
X = pos_encoding(tf.zeros((1, num_steps, encoding_dim)), training=False)
P = pos_encoding.P[:, :X.shape[1], :]
d2l.plot(np.arange(num_steps), P[0, :, 6:10].T, xlabel='Row (position)',figsize=(6, 2.5), legend=["Col %d" % d for d in np.arange(6, 10)])
3.1. 绝对位置信息
为了明白沿着编码维度单调降低的频率与绝对位置信息的关系, 让我们打印出的二进制表示形式。 正如我们所看到的,每个数字、每两个数字和每四个数字上的比特值 在第一个最低位、第二个最低位和第三个最低位上分别交替。
for i in range(8):print(f'{i}的二进制是:{i:>03b}')0的二进制是:000
1的二进制是:001
2的二进制是:010
3的二进制是:011
4的二进制是:100
5的二进制是:101
6的二进制是:110
7的二进制是:111
在二进制表示中,较高比特位的交替频率低于较低比特位, 与下面的热图所示相似,只是位置编码通过使用三角函数在编码维度上降低频率。 由于输出是浮点数,因此此类连续表示比二进制表示法更节省空间。
P = np.expand_dims(np.expand_dims(P[0, :, :], 0), 0)
d2l.show_heatmaps(P, xlabel='Column (encoding dimension)',ylabel='Row (position)', figsize=(3.5, 4), cmap='Blues')
3.2. 相对位置信息
除了捕获绝对位置信息之外,上述的位置编码还允许模型学习得到输入序列中相对位置信息。 这是因为对于任何确定的位置偏移,位置处 的位置编码可以线性投影位置处的位置编码来表示。
这种投影的数学解释是,令ωj=1/100002j/d\omega_j = 1/10000^{2j/d}ωj=1/100002j/d, 对于任何确定的位置偏移δ\deltaδ, (10.6.2)中的任何一对 (pi,2j,pi,2j+1)(p_{i, 2j}, p_{i, 2j+1})(pi,2j,pi,2j+1)都可以线性投影到(pi+δ,2j,pi+δ,2j+1)(p_{i+\delta, 2j}, p_{i+\delta, 2j+1})(pi+δ,2j,pi+δ,2j+1) :
[cos(δωj)sin(δωj)−sin(δωj)cos(δωj)][pi,2jpi,2j+1]=[cos(δωj)sin(iωj)+sin(δωj)cos(iωj)−sin(δωj)sin(iωj)+cos(δωj)cos(iωj)]=[sin((i+δ)ωj)cos((i+δ)ωj)]=[pi+δ,2jpi+δ,2j+1],\begin{aligned} &\begin{bmatrix} \cos(\delta \omega_j) & \sin(\delta \omega_j) \\ -\sin(\delta \omega_j) & \cos(\delta \omega_j) \\ \end{bmatrix} \begin{bmatrix} p_{i, 2j} \\ p_{i, 2j+1} \\ \end{bmatrix}\\ =&\begin{bmatrix} \cos(\delta \omega_j) \sin(i \omega_j) + \sin(\delta \omega_j) \cos(i \omega_j) \\ -\sin(\delta \omega_j) \sin(i \omega_j) + \cos(\delta \omega_j) \cos(i \omega_j) \\ \end{bmatrix}\\ =&\begin{bmatrix} \sin\left((i+\delta) \omega_j\right) \\ \cos\left((i+\delta) \omega_j\right) \\ \end{bmatrix}\\ =& \begin{bmatrix} p_{i+\delta, 2j} \\ p_{i+\delta, 2j+1} \\ \end{bmatrix}, \end{aligned} ===[cos(δωj)−sin(δωj)sin(δωj)cos(δωj)][pi,2jpi,2j+1][cos(δωj)sin(iωj)+sin(δωj)cos(iωj)−sin(δωj)sin(iωj)+cos(δωj)cos(iωj)][sin((i+δ)ωj)cos((i+δ)ωj)][pi+δ,2jpi+δ,2j+1],
2×22\times 22×2投影矩阵不依赖于任何位置的索引。
4. 小结
在自注意力中,查询、键和值都来自同一组输入。
卷积神经网络和自注意力都拥有并行计算的优势,而且自注意力的最大路径长度最短。但是因为其计算复杂度是关于序列长度的二次方,所以在很长的序列中计算会非常慢。
为了使用序列的顺序信息,我们可以通过在输入表示中添加位置编码,来注入绝对的或相对的位置信息。
10.6 自注意力和位置编码相关推荐
- 【动手深度学习-笔记】注意力机制(四)自注意力、交叉注意力和位置编码
文章目录 自注意力(Self-Attention) 例子 Self-Attention vs Convolution Self-Attention vs RNN 交叉注意力(Cross Attenti ...
- 基于Transformer的文本情感分析编程实践(Encoder编码器-Decoder解码器框架 + Attention注意力机制 + Positional Encoding位置编码)
日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) Encoder编码器-Decoder解码器框架 + Atten ...
- 【Transformer 相关理论深入理解】注意力机制、自注意力机制、多头注意力机制、位置编码
目录 前言 一.注意力机制:Attention 二.自注意力机制:Self-Attention 三.多头注意力机制:Multi-Head Self-Attention 四.位置编码:Positiona ...
- NLP-生成模型-2019:TransformerXL【对Vanilla Transformer的改进:片段级递归机制、相对位置编码】【超出固定长度上下文的注意力语言模型】
<原始论文:Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context> 一.概述 一句话简介:Tran ...
- Attention注意力机制和位置编码的机制
文章目录 前言 一. 文本张量的表示方法 1 One-hot Encoding 2 word2vec 二.注意力机制 1 Self-Attention 2 Self-Attention运算机制 2.1 ...
- [深度学习] 自然语言处理---Transformer 位置编码介绍
2017年来自谷歌的Vaswani等人提出了Transformer模型,一种新颖的纯粹采用注意力机制实现的Seq2Seq架构,它具备并行化训练的能力,拥有非凡的性能表现,这些特点使它深受NLP研究人员 ...
- ICCV2021 | Vision Transformer中相对位置编码的反思与改进
前言 在计算机视觉中,相对位置编码的有效性还没有得到很好的研究,甚至仍然存在争议,本文分析了相对位置编码中的几个关键因素,提出了一种新的针对2D图像的相对位置编码方法,称为图像RPE(IRPE). ...
- 文本生成(二)【NLP论文复现】Relative position representations 相对位置编码突破Bert的文本长度限制!
Relative position representations 相对位置编码突破Bert文本512长度的限制 前言 Self-Attention with Relative Position Re ...
- Transformer正余弦位置编码理解
在学习Transformer模型过程中不可避免的一个过程便是要对序列进行位置编码,在Transformer中分为固定位置编码与可学习的位置编码,其一般采用固定位置编码中的正余弦位置编码方式. 今天便以 ...
最新文章
- 160个Crackme017
- Kittle工具抽取文件出现乱码的情况解决方法
- Nginx启动后无法访问页面
- facebook快捷登录 pc_华为发布首款商用台式机,商用PC布局更进一步
- HTML5基础教程(14)Web SQL 数据库
- MapGuide Windows编译
- [渝粤教育] 中山大学 健康评估 参考 资料
- com.esotericsoftware.kryo.KryoException: Encountered unregistered class ID
- MATLAB泰勒级数展开
- stm32f103 延时20ns,在STM32上生成C中的纳秒延迟
- 思科交换机-常用命令及配置
- 顶峰Android手机视频转换器,凡人Android手机视频转换器
- 冲量在线荣获2021中关村国际前沿科技创新大赛TOP10
- IE浏览器打不开网页,其他浏览器却可以打开
- 第三章第三节、他是一个箍桶匠
- JAVA 连接 Hbase1.2.3查询
- 蓝松AE模板SDK使用介绍.
- H3C基础配置学习笔记1-端口配置
- 培训班学java学到什么程度可以出去工作了?
- 兴趣探测的模型化探索
热门文章
- 循环视图——RecycleView
- 实现Fegin远程调用
- 计算机无法以管理员模式运行,电脑为什么没法以管理员身份运行软件
- linux(centos7)内核升级
- 法硕有专硕学硕之分吗?
- java x_java - “x = x ++”后的x是什么?
- 重复测量数据多重填补 SAS code
- Rust学习记录 -> 线程之间的通道通信
- Android关机充电打开log,Android关机log
- MyBatis入门配置(2022.7.16)