赞
踩
Transformer是一种基于**注意力机制**(attention mechanism)的深度学习模型架构,最初由Vaswani等人在2017年提出。Transformer主要用于自然语言处理(NLP)任务,特别是用于机器翻译。
传统的序列模型(比如循环神经网络和长短期记忆网络)在处理长序列时存在一些问题,比如梯度消失和梯度爆炸等。而Transformer模型通过引入注意力机制,可以更好地处理长距离依赖关系,而且能够并行计算,提高了训练效率。
Transformer模型的核心组件包括**自注意力机制(self-attention mechanism)和全连接前馈网络(feed-forward neural networks)。**自注意力机制使得模型能够在输入序列中各个位置之间进行直接交互,从而更好地捕捉序列中的依赖关系。
Transformer模型的一个重要应用是Google提出的BERT(Bidirectional Encoder Representations from Transformers),它是一种预训练语言模型,可以用于各种NLP任务的微调,包括文本分类、命名实体识别、语义理解等。
原论文地址(感兴趣的可以看一看):https://link.zhihu.com/?target=https%3A//arxiv.org/abs/1706.03762
先让我们看看Transformer 的整体结构,下图是 Transformer 用于中英文翻译的整体结构
可以发现Transformer的结构和Attention模型一样,Transformer模型中也采用了 encoer-decoder 架构。但其结构相比于Attention更加复杂,论文中encoder层由6个encoder堆叠在一起,decoder层也一样。
Encoder-decoder是之前机器翻译任务中最常用的架构,即将整个翻译过程拆分为encoder和decoder两部分。其中encoder将输入序列(其中每一个元素的表示为 ()转换成一个向量
,之后decoder再以此向量为输入生成输出序列
(每个时刻生成其中的一个元素)。在每一步模型都是自回归的(auto-regressive),即在生成下一个结果时将之前已经生成的元素也作为额外的输入考虑进来。
每一个encoder和decoder的内部结构如下图:
下面让我们来看看transformer的工作流程:
(1)获取输入句子的每一个单词的表示向量 X,X由单词的 Embedding(Embedding就是从原始数据提取出来的Feature) 和单词位置的 Embedding 相加得到。
(2)将得到的单词表示向量矩阵 (如上图所示,每一行是一个单词的表示 x) 传入 Encoder 中,经过 6 个 Encoder block 后可以得到句子所有单词的编码信息矩阵 C,如下图。单词向量矩阵用
表示, n 是句子中单词个数,d 是表示向量的维度 (论文中 d=512)。每一个 Encoder block 输出的矩阵维度与输入完全一致。
(3)将 Encoder 输出的编码信息矩阵 C传递到 Decoder 中,Decoder 依次会根据当前翻译过的单词 1~ i 翻译下一个单词 i+1,如下图所示。在使用的过程中,翻译到单词 i+1 的时候需要通过 Mask (掩盖) 操作遮盖住 i+1 之后的单词。
下图 Decoder 接收了 Encoder 的编码矩阵 C,然后首先输入一个翻译开始符 “”,预测第一个单词 “I”;然后输入翻译开始符 “” 和单词 “I”,预测单词 “have”,以此类推。这是 Transformer 使用时候的大致流程,接下来是里面各个部分的细节。
单词 Embedding 是自然语言处理(NLP)中的一个重要概念。它指的是将单词或短语映射到连续向量空间中的过程。在这个连续向量空间中,单词的语义信息可以被更好地捕捉和表示。单词 Embedding 在许多 NLP 任务中都是至关重要的,例如情感分析、命名实体识别、语义相似度计算等。
单词 Embedding 的获得通常通过以下几种方法:
Transformer 中除了单词的 Embedding,还需要使用位置 Embedding 表示单词出现在句子中的位置。**因为 Transformer 不采用 RNN 的结构,而是使用全局信息,不能利用单词的顺序信息,而这部分信息对于 NLP 来说非常重要。**所以 Transformer 中使用位置 Embedding 保存单词在序列中的相对或绝对位置。
位置 Embedding 用 PE表示,PE 的维度与单词 Embedding 是一样的。PE 可以通过训练得到,也可以使用某种公式计算得到。在 Transformer 中采用了后者,计算公式如下:
P
E
(
p
o
s
,
2
i
)
=
sin
(
p
o
s
/
1000
0
2
i
/
d
)
P
E
(
p
o
s
,
2
i
+
1
)
=
cos
(
p
o
s
/
1000
0
2
i
/
d
)
其中,**pos 表示单词在句子中的位置,d 表示 PE的维度 (与词 Embedding 一样),2i 表示偶数的维度,2i+1 表示奇数维度 (即 2i≤d, 2i+1≤d)。**使用这种公式计算 PE 有以下的好处:
将单词的词 Embedding 和位置 Embedding 相加,就可以得到单词的表示向量 x,x 就是 Transformer 的输入。
可参考我的上一篇文章https://yuzai666.top/2024/02/20/%E8%87%AA%E6%B3%A8%E6%84%8F%E5%8A%9B%E6%9C%BA%E5%88%B6%EF%BC%88Self-Attention%20Mechanism%EF%BC%89/,这里不做过多解释,简单介绍
上图是论文中 Transformer 的内部结构图,左侧为 Encoder block,右侧为 Decoder block。红色圈中的部分为 Multi-Head Attention,是由多个 Self-Attention组成的,可以看到 Encoder block 包含一个 Multi-Head Attention,而 Decoder block 包含两个 Multi-Head Attention (其中有一个用到 Masked)。Multi-Head Attention 上方还包括一个 Add & Norm 层,Add 表示残差连接 (Residual Connection) 用于防止网络退化,Norm 表示 Layer Normalization,用于对每一层的激活值进行归一化。
因为 Self-Attention是 Transformer 的重点,所以我们重点关注 Multi-Head Attention 以及 Self-Attention
具体的流程大致如下图所示
假设输入序列是Dx*N的矩阵(Dx表示输入向量维度,N表示样本数),那么分别经过Wq、Wk和Wv三个线性变换后,可以得到Q、K、V矩阵(注意这里Q和K的维度要相同,但是并不一定要和V相同)。Q和K可以进一步通过缩放点积来进行打分,并经过Softmax归一化得到V矩阵的权重,从而计算得到最终的输出向量序列H:
介绍自注意力时我们提到可以通过三个不同的线性变换,得到Q、K、V矩阵。假设我们将这三个线性变换看做是一组,那么我们其实可以多训练几组来增强自注意力模型的学习能力(多组不同的线性变换即所谓的多头),Multi-Head Attention 是由多个 Self-Attention 组合形成的。多头注意力的结构如下所示:
假设我们一共应用h组线性变换,那就可以得到h个结果矩阵,将它们拼接起来再做一次线性变换,即可得到最后的结果:
在原论文中作者设置为h=8,如下图所示
得到 8 个输出矩阵 Z1 到 Z8 之后,Multi-Head Attention 将它们拼接在一起 (Concat),然后传入一个Linear层,得到 Multi-Head Attention 最终的输出Z。
逐位置的前馈神经网络(Feedforward Neural Network,FFN)是深度学习中常见的一种神经网络结构,特别在自然语言处理(NLP)中被广泛使用。在NLP中,FFN通常作为注意力机制(Attention Mechanism)中的一个组成部分。
FFN由两个或多个全连接层组成,每个全连接层都在其输入之间执行线性变换,然后应用非线性激活函数。这些全连接层是逐位置(position-wise)的,这意味着每个序列位置(例如单词或词向量序列中的位置)都会经过相同的变换。
在注意力机制中,逐位置的前馈神经网络通常用来对注意力权重进行非线性转换或对特征进行映射。在自注意力机制(Self-Attention)中,FFN通常被放置在每个注意力子层之后。这样的设计有助于捕获序列中每个位置的局部信息,并在不同的位置上执行不同的转换。
通常,FFN的结构如下:
FFN的目的是通过对序列中每个位置的信息进行非线性转换,从而增强模型的表征能力。在Transformer模型中,FFN层被放置在每个注意力层的后面,以便对注意力层的输出进行进一步的转换和特征提取。
其实说白了FFN其实就是一个简单的二层网络,其中第一层的激活函数为ReLU。对于输入序列中每个位置上的向量x:
需要注意的是:在同一层上(这里指的是Encoder或Decoder内的层),每个位置上的向量x所对应的参数W1、W2、b1、b2都是相同的,但是层与层之间的参数时不同的。FFN的作用应该就是提供更多的非线性和学习能力。
Add & Norm 层由 Add 和 Norm 两部分组成,其计算公式如下
其中 X表示 Multi-Head Attention 或者 Feed Forward 的输入,MultiHeadAttention(X) 和 FeedForward(X) 表示输出 (输出与输入 X 维度是一样的,所以可以相加)。
Add指 X+MultiHeadAttention(X),是一种残差连接,通常用于解决多层网络训练的问题,可以让网络只关注当前差异的部分,在 ResNet 中经常用到;
Norm指 Layer Normalization,通常用于 RNN 结构,Layer Normalization 会将每一层神经元的输入都转成均值方差都一样的,这样可以加快收敛。
通过上面描述的 Multi-Head Attention, Feed Forward, Add & Norm 就可以构造出一个 Encoder block,Encoder block 接收输入矩阵 ,并输出一个矩阵。通过多个 Encoder block 叠加就可以组成 Encoder。
第一个 Encoder block 的输入为句子单词的表示向量矩阵,后续 Encoder block 的输入是前一个 Encoder block 的输出,最后一个 Encoder block 输出的矩阵就是编码信息矩阵 C,这一矩阵后续会用到 Decoder 中。
上图红色部分为 Transformer 的 Decoder block 结构,与 Encoder block 相似,但是存在一些区别:
即翻译完第 i 个单词,才可以翻译第 i+1 个单词。通过 Masked 操作可以防止第 i 个单词知道 i+1 个单词之后的信息。下面以 “我有一只猫” 翻译成 “I have a cat” 为例,了解一下 Masked 操作。如下图所示。首先根据输入 “” 预测出第一个单词为 “I”,然后根据输入 “ I” 预测下一个单词 “have”。
Decoder 可以在训练的过程中使用 Teacher Forcing 并且并行化训练,即将正确的单词序列 ( I have a cat) 和对应输出 (I have a cat ) 传递到 Decoder。那么在预测第 i 个输出时,就要将第 i+1 之后的单词掩盖住,注意 Mask 操作是在 Self-Attention 的 Softmax 之前使用的,下面用 0 1 2 3 4 5 分别表示 “ I have a cat ”。
Mask 操作第一步:是 Decoder 的输入矩阵和 Mask 矩阵,输入矩阵包含 “ I have a cat” (0, 1, 2, 3, 4) 五个单词的表示向量,Mask 是一个 5×5 的矩阵。在 Mask 可以发现单词 0 只能使用单词 0 的信息,而单词 1 可以使用单词 0, 1 的信息,即只能使用之前的信息。
第二步:接下来的操作和之前的 Self-Attention 一样,通过输入矩阵X计算得到Q,K,V矩阵。然后计算Q和KT的乘积 QKT。
第三步:在得到 QKT 之后需要进行 Softmax,计算 attention score,我们在 Softmax 之前需要使用Mask矩阵遮挡住每一个单词之后的信息,遮挡操作如下:
得到 Mask QKT之后在 Mask QKT上进行 Softmax,每一行的和都为 1。但是单词 0 在单词 1, 2, 3, 4 上的 attention score 都为 0。
第四步:使用 Mask QKT与矩阵 V相乘,得到输出 Z,则单词 1 的输出向量 Z1 是只包含单词 1 信息的。
第五步:通过上述步骤就可以得到一个 Mask Self-Attention 的输出矩阵 �� ,然后和 Encoder 类似,通过 Multi-Head Attention 拼接多个输出�� 然后计算得到第一个 Multi-Head Attention 的输出Z,Z与输入X维度一样。
Decoder block 第二个 Multi-Head Attention 变化不大, 主要的区别在于其中 Self-Attention 的 K, V矩阵不是使用 上一个 Decoder block 的输出计算的,而是使用 Encoder 的编码信息矩阵 C 计算的。
根据 Encoder 的输出 C计算得到 K, V,根据上一个 Decoder block 的输出 Z 计算 Q (如果是第一个 Decoder block 则使用输入矩阵 X 进行计算),后续的计算方法与之前描述的一致。
这样做的好处是在 Decoder 的时候,每一位单词都可以利用到 Encoder 所有单词的信息 (这些信息无需 Mask)。
Decoder block 最后的部分是利用 Softmax 预测下一个单词,在之前的网络层我们可以得到一个最终的输出 Z,因为 Mask 的存在,使得单词 0 的输出 Z0 只包含单词 0 的信息,如下:
Softmax 根据输出矩阵的每一行预测下一个单词:
编码器通过处理输入序列开启工作。顶端编码器的输出之后会变转化为一个包含向量K(键向量)和V(值向量)的注意力向量集 ,这是并行化操作。这些向量将被每个解码器用于自身的“编码-解码注意力层”,而这些层可以帮助解码器关注输入序列哪些位置合适:
在完成编码阶段后,则开始解码阶段。解码阶段的每个步骤都会输出一个输出序列(在这个例子里,是英语翻译的句子)的元素。
接下来的步骤重复了这个过程,直到到达一个特殊的终止符号,它表示transformer的解码器已经完成了它的输出。每个步骤的输出在下一个时间步被提供给底端解码器,并且就像编码器之前做的那样,这些解码器会输出它们的解码结果 。
完成之后如图所示
RNN系列的模型,并行计算能力很差。RNN并行计算的问题就出在这里,因为 T 时刻的计算依赖 T-1 时刻的隐层计算结果,而 T-1 时刻的计算依赖 T-2 时刻的隐层计算结果,如此下去就形成了所谓的序列依赖关系。
Transformer的特征抽取能力比RNN系列的模型要好。
具体实验对比可以参考:放弃幻想,全面拥抱Transformer:自然语言处理三大特征抽取器(CNN/RNN/TF)比较
但是值得注意的是,并不是说Transformer就能够完全替代RNN系列的模型了,任何模型都有其适用范围,同样的,RNN系列模型在很多任务上还是首选,熟悉各种模型的内部原理,知其然且知其所以然,才能遇到新任务时,快速分析这时候该用什么样的模型,该怎么做好。
1、 seq2seq缺点:这里用代替这个词略显不妥当,seq2seq虽已老,但始终还是有其用武之地,seq2seq最大的问题在于将Encoder端的所有信息压缩到一个固定长度的向量中,并将其作为Decoder端首个隐藏状态的输入,来预测Decoder端第一个单词(token)的隐藏状态。在输入序列比较长的时候,这样做显然会损失Encoder端的很多信息,而且这样一股脑的把该固定向量送入Decoder端,Decoder端不能够关注到其想要关注的信息。
这里用代替这个词略显不妥当,seq2seq虽已老,但始终还是有其用武之地,seq2seq最大的问题在于将Encoder端的所有信息压缩到一个固定长度的向量中,并将其作为Decoder端首个隐藏状态的输入,来预测Decoder端第一个单词(token)的隐藏状态。在输入序列比较长的时候,这样做显然会损失Encoder端的很多信息,而且这样一股脑的把该固定向量送入Decoder端,Decoder端不能够关注到其想要关注的信息。
** 2、Transformer优点**:transformer不但对seq2seq模型这两点缺点有了实质性的改进(多头交互式attention模块),而且还引入了self-attention模块,让源序列和目标序列首先“自关联”起来,这样的话,源序列和目标序列自身的embedding表示所蕴含的信息更加丰富,而且后续的FFN层也增强了模型的表达能力,并且Transformer并行计算的能力是远远超过seq2seq系列的模型,因此我认为这是transformer优于seq2seq模型的地方。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。