-
Transformer相较于RNN的最大优势在于其速度上的优势,相较于CNN,其能直接获取全局信息。
-
encoder
-
编码器由n = 6个相同层的堆栈组成。每一层有两个子层。第一种是multi-head self-attention mechanism,第二种是简单的位置全连接前馈网络。
-
两个子层周围使用残差连接,然后是层归一化
-
Decoder
- 解码器也由n = 6个相同层的堆栈组成。
- 除每个编码器层中的两个子层外,解码器还插入第三个子层,该子层对编码器堆栈的输出执行多头注意
- 每个子层周围使用残差连接,然后进行层归一化。
- 还修改了解码器堆栈中的自注意子层,以防止位置注意到后续位置。这种掩蔽,加上输出嵌入被一个位置偏移的事实,确保了positionican的预测只依赖于小于i位置的已知输出。
-
attention
-
Attention机制最早的提出是针对与序列模型的
-
注意函数可以描述为将查询和一组键-值对映射到输出,其中查询、键、值和输出都是向量。
-
输出是作为值的加权和计算的,其中分配给每个值的权重是通过查询与相应键的兼容性函数计算的。
-
attention机制其实是借鉴了生物在观察和学习行为中的过程,也就是说我们人来通常在观察和学习的时候,都是通过快速的获取全局的信息,建立起对于事物的需要重点观察或者学习的区域,这些需要重点关注的目标区域,就是我们注意力的焦点。然而,就和我们日常生活中处理事情一样,我们没有办法同时处理所有的事情,我们会给他们分出优先级。同样的,注意力也会有一个权重值,从而更专注的聚焦在某些关键的信息上。
-
-
Scaled Dot-Product Attention
-
最常用的两个注意函数
- 加性注意
- 加性注意使用带有单一隐藏层的前馈网络计算兼容性函数。
- 点积注意(乘性)。
- 虽然这两种方法在理论上的复杂性上是相似的,但在实践中,点积注意力要快得多,而且更节省空间,因为它可以使用高度优化的矩阵乘法代码来实现。
- 加性注意
-
Multi-Head Attention
-
与其使用模型维度的键、值和查询来执行单一的注意功能,不如分别用不同的、学习过的线性投影来线性投影查询、键和值时间。
-
在这些查询、键和值的每个投影版本上,我们然后并行地执行注意功能,生成dv维的输出值。
-
将它们连接起来并再次进行投影,得到最终的值
-
多头注意使得模型能够在不同位置共同关注来自不同表示子空间的信息。用一个注意力集中的头,平均就能抑制这种情况。
-
每个Transformer结构会有多层结构完全一样的,但权重矩阵不同的Attention组成,也就是我们上面提到的Attention结构。这么做的目的是为了防止模型只关注到模型的一部分特征,却忽略了其他特征,所以增加模型的厚度,让模型拥有多层结构相同,但是权重不同的Attention,每一个head都关注到了不同的特征,那么模型整体就会关注到更多的特征。
-
中间省略了两部分结构,一个是传播用的全连接层,一个是用于mask的mask层。
-
Q来自于query,而,K,V是来自与同一个矩阵的
-
Attention层的目的是,先计算Q与K的相关度,然后根据计算Q与K的相关度矩阵后,再使用这个相关度矩阵与V相乘,得出最终结果。
-
其中,K和V来自于同一个矩阵(但是是通过不同的全连接层计算得来的),那么Q,K计算的目的就是为了计算出Q应该关注V中的哪些值,关注度达到多少。
-
-
性能最好的模型通过注意机制连接编码器和解码器。
-
Transformer,它完全基于注意机制,完全免除了卷积。
- 这是一种避免重复的模型体系结构,而是完全依赖于关注机制来绘制输入和输出之间的全局依赖关系。
- 允许更多的并行化
- 对于转换任务,Transformer的训练速度要比基于循环层或卷积层的架构快得多。
- 编码器和解码器都使用了堆叠的自注意层和点式的、完全连接的层
-
递归模型通常沿着输入和输出序列的符号位置进行因子计算。生成一个隐藏状态序列,这种固有的顺序性质排除了训练示例中的并行化,这在较长的序列长度时变得至关重要,因为记忆约束限制了跨示例的批处理。
- 分解技巧
- 条件计算:还提高了模型性能
-
减少顺序计算的目标
-
Extended Neural GPU
-
ByteNet
-
ConvS2S
-
- 都使用卷积神经网络作为基本构建块,并行计算所有输入和输出位置的隐藏表示。
- 这些模型中,将两个任意输入或输出位置的信号关联起来所需的操作数量随着位置之间的距离增长
- ConvS2S呈线性增长,ByteNet呈对数增长
-
Transformer中,这被减少到一个固定的操作数量,尽管这是以由于平均注意力加权位置而降低的有效分辨率为代价的,这是我们在本节中描述的Multi-Head Attention抵消的影响
-
自我注意(Self-attention),有时也称为内部注意(intra-attention),是一种将单个序列的不同位置联系起来,以计算该序列的表示的注意机制。
-
端到端记忆网络基于重复注意机制,而不是顺序排列的重复注意机制
-
Transformer是第一个完全依靠自我注意来计算其输入和输出的表示而不使用序列对齐的rnn或卷积的转导模型
-
-
Transformer以三种不同的方式使用多头注意力:
- 在“编码器-解码器注意”层中,查询来自前面的解码器层,而内存键和值来自编码器的输出。这使得译码器中的每个位置都可以参加输入序列中的所有位置。
- 编码器包含自我注意层。在自我注意层中,所有的键、值和查询都来自同一个地方,在本例中,是编码器中前一层的输出。编码器中的每个位置都可以对应上一层的所有位置。
- 解码器中的自我注意层允许解码器中的每个位置关注解码器中直到并包括该位置的所有位置。我们需要防止解码器中的信息流向左,以保持自回归特性。我们通过屏蔽(设置为−∞)softmax输入中对应非法连接的所有值来实现缩放点积注意。
-
Position-wise Feed-Forward Networks
- 编码器和解码器中的每一层都包含一个完全连接的前馈网络,它分别和相同地应用于每个位置。这包括两个线性变换,中间有一个ReLU激活。
- 虽然在不同位置上的线性转换是相同的,但它们在不同层之间使用不同的参数。
-
Embeddings and Softmax
- 使用学习嵌入将输入标记和输出标记转换为维数模型向量。
- 还使用通常学到的线性变换和softmax函数将解码器输出转换为预测的下一个令牌概率。
- 在两个嵌入层之间共享相同的权矩阵和前softmax线性变换
-
Positional Encoding
- 在编码器和解码器堆栈底部的输入嵌入中添加了“位置编码”。
- 位置编码与嵌入编码具有相同的维数模型,两者可以相加。位置编码有许多选择,学习和固定的
-
Why Self-Attention
- 一个是每层的总计算复杂度
- 另一个是可以并行化的计算量,由所需的最小顺序操作数来衡量。
- 第三是网络中远程依赖关系之间的路径长度。
- 在输入和输出序列中任何位置组合之间的这些路径越短,就越容易学习长期依赖关系
- 自我关注可以产生更多可解释的模型。
- 自注意力是 Transformer 用来将其他相关词的“理解”融入我们当前正在处理的词中的方法。
-
Regularization
-
我们观察到减少注意键大小会影响模型质量。这表明确定兼容性并不容易,一个比点积更复杂的兼容性函数可能是有益的。
-
Transformer是谷歌在2017年发布的一个用来替代RNN和CNN的新的网络结构,Transformer本质上就是一个Attention结构,它能够直接获取全局的信息,而不像RNN需要逐步递归才能获得全局信息,也不像CNN只能获取局部信息,并且其能够进行并行运算,要比RNN快上很多倍。
-
https://blog.csdn.net/qq_28634403/article/details/88117277
-
注意力模型(Attention Model,AM)
- 解决多任务最先进的模型
- 被广泛用于提高神经网络的可解释性,而神经网络之前常常被视为黑盒模型。主要是因为人们对影响人类生活的应用程序中的机器学习模型公平性、问责制和透明度越来越感兴趣
- 有助于克服递归神经网络RNN中的一些挑战,如随着输入长度的增加性能下降,以及输入顺序不合理导致的计算效率低下。
-
sequence-to-sequence模型由编码器-解码器体系结构组成
-
传统编码器-解码器的挑战
- 编码器必须将所有输入信息压缩成一个固定长度的向量ht,然后将其传递给解码器。使用一个固定长度的向量压缩长而详细的输入序列可能会导致信息丢失
- 它无法对输入和输出序列之间的对齐进行建模,这是结构化输出任务(如翻译或汇总)的一个重要方面
-
如何使用向量计算自注意力
- 第一步骤中计算自关注的是从每个编码器的输入向量的创建三个矢量(在这种情况下,每个字的嵌入)
- 对于每个单词,我们创建一个 Query 向量、一个 Key 向量和一个 Value 向量。
- 这些向量是通过将嵌入乘以我们在训练过程中训练的三个矩阵来创建的。
- 第二个步骤中计算自注意的是,计算得分。
- 需要根据这个词对输入句子的每个词进行评分。当我们在某个位置对单词进行编码时,分数决定了将多少注意力放在输入句子的其他部分上。
- 得分是通过将查询向量与我们正在评分的各个单词的关键向量进行点积来计算的。
- 第三和第四步骤是除以8(使用的密钥向量的维数的平方根来划分的分数- 64。这导致具有更稳定的梯度有可能是这里其他可能的值,但是这是。默认),
-
通过 softmax 操作传递结果。Softmax 对分数进行归一化,因此它们都是正数,加起来为 1。
-
这个 softmax 分数决定了每个单词在这个位置的表达量。
-
- 第五步骤是由SOFTMAX得分乘以每个值向量
- 第六步骤是要总结的加权值向量。这会在这个位置(对于第一个词)产生自注意力层的输出。
- 第一步骤中计算自关注的是从每个编码器的输入向量的创建三个矢量(在这种情况下,每个字的嵌入)
-
Self-Attention 的矩阵计算
-
通过将我们的嵌入打包到一个矩阵X 中,并将其乘以我们训练过的权重矩阵(WQ、WK、WV)来做到这一点。
-
-
“多头”注意力的机制进一步细化了自注意力层。
- 扩展了模型专注于不同位置的能力。
- 为注意力层提供了多个“表示子空间”。
-
残差
- 每个编码器中的每个子层(self-attention,ffnn)周围都有一个残差连接,然后是层归一化步骤。
-
解码器端
-
编码器首先处理输入序列。然后将顶级编码器的输出转换为一组注意力向量 K 和 V。 这些将由每个解码器在其“编码器-解码器注意力”层中使用,帮助解码器专注于输入序列中的适当位置:
-
重复这个过程,直到一个特殊的符号到达表示转换器解码器已完成其输出。每一步的输出在下一个时间步被馈送到底部解码器,解码器就像编码器一样冒泡他们的解码结果。
-
就像我们对编码器输入所做的一样,我们将位置编码嵌入并添加到这些解码器输入中,以指示每个单词的位置。
-
最终的线性和 Softmax 层
- 线性层是一个简单的全连接神经网络,它将解码器堆栈产生的向量投影到一个更大的向量中,称为 logits 向量。
- softmax 层然后将这些分数转换为概率(全部为正,加起来为 1.0)。选择概率最高的单元格,并生成与之关联的单词作为该时间步的输出。
-
-
RNN结构本身比较简单,也很适合序列建模,但RNN的明显缺点之一就是无法并行,因此速度较慢,这是递归的天然缺陷。另外我个人觉得RNN无法很好地学习到全局的结构信息,因为它本质是一个马尔科夫决策过程。
-
CNN方便并行,而且容易捕捉到一些全局的结构信息
-
RNN要逐步递归才能获得全局信息,因此一般要双向RNN才比较好;CNN事实上只能获取局部信息,是通过层叠来增大感受野;Attention的思路最为粗暴,它一步到位获取了全局信息!
-
yt=f(xt,A,B),其中A,B。A,B是另外一个序列(矩阵)。如果都取A=B=X,那么就称为Self Attention,它的意思是直接将xtxt与原来的每个词进行比较,最后算出ytyt!
-
长期依赖是指当前系统的状态,可能受很长时间之前系统状态的影响,是RNN中无法解决的一个问题。
受野;Attention的思路最为粗暴,它一步到位获取了全局信息!
- yt=f(xt,A,B),其中A,B。A,B是另外一个序列(矩阵)。如果都取A=B=X,那么就称为Self Attention,它的意思是直接将xtxt与原来的每个词进行比较,最后算出ytyt!
- 长期依赖是指当前系统的状态,可能受很长时间之前系统状态的影响,是RNN中无法解决的一个问题。