Transformer

https://zhuanlan.zhihu.com/p/54356280

transformer 在NLP领域,目前最流行的特征抽取器。
有encoder 和decoder两部分,其中encoder部分有 自注意力和前馈神经网络部分,而decoder部分主要是 自注意力、编码解码注意力层和前馈神经网络。
在transformer 中 一般encoder和decoder 数量一般一样,可能都为6个或者多个。
在使用过程中还是先把文字转换为词向量。
encoder计算过程如下图所示 1首先进行位置编码 2 然后进行自注意力的计算,可以得到 Z值,然后进行归一化处理,3 然后再进行FNN计算,并且同时进行求和与归一化处理。
decoder计算过程类似只是中间多了一个编码-解码注意力层的计算,计算完后 然后进行线性变化和softmax 计算。

Transformer

transformer 的结构

可以认为是下图所示。
Transformer

其中编码组件由多个编码器构成。解码器由和编码器同样数量的解码器构成。
所有的编码器都是一样的,没有共享参数,并且每个编码器都可以分解成两个子层。

Transformer
两个子层分别为前馈神经网络和自注意力层。
从编码器输入的句子首先会经过一个自注意力(self-attention)层,这层帮助编码器在对每个单词编码时关注输入句子的其他单词。自注意力层的输出会传递到前馈(feed-forward)神经网络中。每个位置的单词对应的前馈神经网络都完全一样(译注:另一种解读就是一层窗口为一个单词的一维卷积神经网络)。
Transformer
解码器中也有编码器的自注意力(self-attention)层和前馈(feed-forward)层。除此之外,这两个层之间还有一个注意力层,用来关注输入句子的相关部分(和seq2seq模型的注意力作用相似)。

将张量引入图景
我们已经了解了模型的主要部分,接下来我们看一下各种向量或张量(译注:张量概念是矢量概念的推广,可以简单理解矢量是一阶张量、矩阵是二阶张量。)是怎样在模型的不同部分中,将输入转化为输出的。
像大部分NLP应用一样,我们首先将每个输入单词通过词嵌入算法转换为词向量。

Transformer
每个单词都被嵌入为512维的向量,我们用这些简单的方框来表示这些向量。

词嵌入过程只发生在最底层的编码器中。所有的编码器都有一个相同的特点,即它们接收一个向量列表,列表中的每个向量大小为512维。在底层(最开始)编码器中它就是词向量,但是在其他编码器中,它就是下一层编码器的输出(也是一个向量列表)。向量列表大小是我们可以设置的超参数——一般是我们训练集中最长句子的长度。

将输入序列进行词嵌入之后,每个单词都会流经编码器中的两个子层。
Transformer
接下来我们看看Transformer的一个核心特性,在这里输入序列中每个位置的单词都有自己独特的路径流入编码器。在自注意力层中,这些路径之间存在依赖关系。而前馈(feed-forward)层没有这些依赖关系。因此在前馈(feed-forward)层时可以并行执行各种路径。

现在我们开始“编码”
如上述已经提到的,一个编码器接收向量列表作为输入,接着将向量列表中的向量传递到自注意力层进行处理,然后传递到前馈神经网络层中,将输出结果传递到下一个编码器中。
Transformer
输入序列的每个单词都经过自编码过程。然后,他们各自通过前向传播神经网络——完全相同的网络,而每个向量都分别通过它。

attention 计算
可以用下面公式简单代替
Transformer

多头计算
https://blog.****.net/weixin_43758551/article/details/98220358

残差模块
在继续进行下去之前,我们需要提到一个编码器架构中的细节:在每个编码器中的每个子层(自注意力、前馈网络)的周围都有一个残差连接,并且都跟随着一个“层-归一化”步骤。

则可以得到其中的编码器为
Transformer
如果我们去可视化这些向量以及这个和自注意力相关联的层-归一化操作,那么看起来就像下面这张图描述一样:Transformer解码器的子层也是这样样的。如果我们想象一个2 层编码-解码结构的transformer,它看起来会像下面这张图一样:Transformer

最终的线性变换和Softmax层

解码组件最后会输出一个实数向量。我们如何把浮点数变成一个单词?这便是线性变换层要做的工作,它之后就是Softmax层。
线性变换层是一个简单的全连接神经网络,它可以把解码组件产生的向量投射到一个比它大多的、被称作对数几率(logits)的向量里。
不妨假设我们的模型从训练集中学习一万个不同的英语单词(我们模型的“输出词表”)。因此对数几率向量为一万个单元格长度的向量——每个单元格对应某一个单词的分数。
接下来的Softmax 层便会把那些分数变成概率(都为正数、上限1.0)。概率最高的单元格被选中,并且它对应的单词被作为这个时间步的输出。
Transformer
这张图片从底部以解码器组件产生的输出向量开始。之后它会转化出一个输出单词。