Transformer

26
0
0
2023-03-08

Transformer

Transformer架构是一种深度学习模型,它在2017年由Google的研究者提出,并在自然语言处理(NLP)领域取得了重大突破。下面我会尽量用简单的话来解释Transformer的构架。

上图所示的整体框架乍一眼一看非常复杂,由于 Transformer 起初是作为翻译模型,因此我们以翻译举例,简化一下上述的整体框架:

从上图可以看出 Transformer 相当于一个黑箱,左边输入 “Je suis etudiant”,右边会得到一个翻译结果 “I am a student”。

再往细里讲,Transformer 也是一个 Seq2Seq 模型(Encoder-Decoder 框架的模型),左边一个 Encoders 把输入读进去,右边一个 Decoders 得到输出,如下所示:

在这里,我们穿插描述下 Encoder-Decoder 框架的模型是如何进行文本翻译的:

  1. 将序列 (x1,x2,⋯,xn)(x1,x2,⋯,xn) 作为 Encoders 的输入,得到输出序列 (z1,z2,⋯,zn)(z1,z2,⋯,zn)

  2. 把 Encoders 的输出序列 (z1,z2,⋯,zn)(z1,z2,⋯,zn) 作为 Decoders 的输入,生成一个输出序列 (y1,y2,⋯,ym)(y1,y2,⋯,ym)。注:Decoders 每个时刻输出一个结果

第一眼看到上述的 Encodes-Decoders 框架图,随之产生问题就是 Transformer 中 左边 Encoders 的输出是怎么和右边 Decoders 结合的。因为decoders 里面是有N层的,再画张图直观的看就是这样:

也就是说,Encoders 的输出,会和每一层的 Decoder 进行结合

现在我们取其中一层进行详细的展示:

通过上述分析,发现我们想要详细了解 Transformer,只要了解 Transformer 中的 Encoder 和 Decoder 单元即可,接下来我们将详细阐述这两个单元。

Transformer的主要组件:

  1. 1. 自注意力机制(Self-Attention)

    自注意力是一种机制,它允许模型在处理一个序列(如一个句子)时,能够同时考虑序列中的每个元素如何相互关联。以下是自注意力的步骤:

    • 查询(Query)、键(Key)和值(Value):输入序列中的每个元素(如单词)都被映射为三个向量,分别称为查询(Q)、键(K)和值(V)。这些向量是通过训练得到的。

    • 计算注意力得分:对于序列中的每个元素,计算其查询向量与所有键向量的点积。这些得分表示了序列中每个元素对这个元素的“重要性”。

    • 应用softmax函数:将注意力得分通过softmax函数转换为概率分布,这样所有得分加起来等于1。

    • 生成加权值:将值向量乘以它们对应的softmax得分,得到加权值。

    • 汇总:将所有加权值相加,得到自注意力的输出。

    2. 多头注意力(Multi-Head Attention)

    多头注意力是将自注意力分成多个“头”,每个“头”都有自己的查询、键和值矩阵。这样做的目的是让模型在不同的表示子空间中学习信息。

    • 并行处理:每个“头”独立计算自注意力,这可以在并行计算中实现。

    • 头合并:所有“头”的输出被拼接起来,并通过一个线性层进行转换,以产生最终的输出。

    3. 位置编码(Positional Encoding)

    由于Transformer不使用递归结构,它无法捕捉序列中元素的顺序。位置编码被添加到输入嵌入中,以提供元素的位置信息。

    • 正弦和余弦函数:位置编码通常使用正弦和余弦函数来生成,这些函数的频率不同,以确保模型可以学习到相对位置信息。

    4. 编码器和解码器(Encoder and Decoder)

    Transformer由编码器和解码器组成,两者都是由多层构成的。

    • 编码器层

      • 自注意力层:处理输入序列,生成上下文表示。

      • 前馈神经网络:对自注意力层的输出进行进一步的非线性变换。

      • 残差连接和层归一化:在每个子层周围添加残差连接,然后进行层归一化。

      • 编码器的主要功能是处理输入序列(如一个文本句子),并输出一个与输入序列长度相同的序列,这个输出序列包含了输入序列的编码表示。

        编码器结构:

        1. 自注意力层(Self-Attention Layer)

          • 自注意力层允许模型在处理一个词时同时考虑序列中的所有其他词。

          • 它通过计算每个词与其他所有词的关联度(注意力权重),然后对这些词的表示进行加权求和,得到每个词的新的表示。

          • 这个过程可以用公式表示为:Attention(Q,K,V)=softmax(QKTdk)VAttention(Q,K,V)=softmax(dk​​QKT)V,其中Q、K、V分别是查询(Query)、键(Key)和值(Value)的矩阵。

        2. 位置编码(Positional Encoding)

          • 因为Transformer模型本身不具有处理序列位置信息的能力,所以位置编码被添加到输入向量的对应位置上,以提供词的位置信息。

          • 位置编码通常使用正弦和余弦函数来生成,这样能够捕捉到不同尺度的位置信息。

        3. 前馈神经网络(Feed-Forward Neural Network)

          • 每个自注意力层后面都跟着一个简单的前馈网络,这个网络对每个位置都是独立作用的,它的目的是在自注意力层之后进一步处理每个位置的表示。

          • 前馈网络通常包含两个线性变换和一个ReLU激活函数。

        4. 层归一化(Layer Normalization)

          • 在自注意力和前馈网络之后,都会使用层归一化来稳定训练过程。

        5. 残差连接(Residual Connection)

          • 每个自注意力层和前馈网络后面都有残差连接,即输出是层的输入和层输出的和,后面跟着层归一化。

        编码器由多个这样的层堆叠而成,通常在标准的Transformer模型中,编码器包含6个这样的层。

    • 解码器层

      • 自注意力层:处理解码器的输入序列。

      • 编码器-解码器注意力层:使得解码器的每个位置都能关注到输入序列的所有位置。

      • 前馈神经网络:与编码器相同。

      • 残差连接和层归一化:与编码器相同。

      • 掩码自注意力层(Masked Self-Attention Layer)

        • 与编码器的自注意力层类似,但是这里使用了掩码(masking),防止模型在解码当前词时看到未来的词。

        • 这是因为在生成序列时,模型应该只能使用之前生成的词的信息。

      • 编码器-解码器注意力层(Encoder-Decoder Attention Layer)

        • 这个层允许解码器的每个位置都去关注输入序列的所有位置。

        • 它的目的是将编码器的输出(包含了输入序列的完整表示)与解码器当前层的输出结合起来。

      • 前馈神经网络(Feed-Forward Neural Network)

        • 与编码器中的前馈网络相同,用于进一步处理每个位置的表示。

      • 层归一化(Layer Normalization)和残差连接(Residual Connection)

        • 与编码器相同,用于稳定训练过程。

      • 解码器同样由多个这样的层堆叠而成,标准的Transformer模型中,解码器也包含6个这样的层。

        通过这种结构,Transformer模型能够在处理序列数据时既考虑到全局的信息(通过自注意力),又能保持生成序列时的正确性(通过掩码自注意力)。这种架构在处理长距离依赖的问题上比传统的循环神经网络(RNN)和长短时记忆网络(LSTM)等模型更加有效。

    • 编码器(Encoder)

      • 编码器负责读取和理解输入信息(比如一个句子)。

      • 它由多个相同的层组成,每个层都可以理解为一个“处理单元”,这些单元能够同时处理整个句子,而不是一个接一个地处理单词。

    • 解码器(Decoder)

      • 解码器负责根据编码器提供的信息生成输出(比如翻译后的句子)。

      • 它也由多个相同的层组成,但这些层在处理信息时有一些特殊的规则,以确保在生成每个单词时只使用之前生成的单词。

    5. 前馈神经网络(Feed-Forward Neural Networks)

    前馈神经网络在每个编码器和解码器层之后,对自注意力层的输出进行进一步处理。

    • 两层全连接神经网络:第一层的激活函数通常是ReLU,第二层是线性激活。

    架构概述

    1. 输入编码器:

      • 接收原始输入序列(如句子中的单词或短语),并将它们转换为固定维度的向量表示,称为词嵌入。

    2. 位置编码器:

      • 由于Transformer不依赖RNN或CNN来维持序列顺序信息,因此需要额外的机制来帮助模型理解序列的位置关系。位置编码器为每个输入位置的词嵌入添加一个唯一的向量,以保留序列的相对或绝对位置信息。

    3. 编码层堆叠:

      • 多个相同的编码层堆叠在一起,每层都包括两个子层:多头自注意力机制(Multi-Head Attention)和前馈神经网络(Feed Forward Neural Network)。这些层通过残差连接(Residual Connections)和层归一化(Layer Normalization)来提高训练稳定性。

    4. 解码器:

      • 与编码器类似,但增加了几个关键组件:掩码多头自注意力机制(Masked Multi-Head Attention)、编码器-解码器注意力机制(Encoder-Decoder Attention)以及最终的线性变换和softmax函数用于输出预测的概率分布。

    工作流程

    1. 输入阶段:

      • 输入数据首先经过词嵌入层转换成高维向量,然后与位置编码相加得到增强的输入特征。首先,每个单词都被转换成一个数字向量,这个向量包含了单词的信息。

      • 然后,这些向量通过编码器的一个个层进行处理,每层都会更新这些向量的信息,使得它们更好地表达句子的含义。

    2. 编码过程:

      • 每一层编码器依次执行以下操作:

        1. 多头自注意力机制: 计算输入特征的加权平均,权重由查询(Query)、键(Key)和值(Value)三组矩阵决定。多头设计允许模型同时关注不同方面的信息。

        2. 残差连接和层归一化: 将自注意力的结果与原输入相加并通过层归一化稳定梯度传播。

        3. 前馈网络: 对归一化的数据进行非线性变换,通常采用两层感知机结构。

        4. 再次进行残差连接和层归一化。

    3. 解码过程:

      • 解码器的每一层也包含类似的步骤,但在自注意力部分增加了一个掩码操作以确保模型只能看到前面的词,防止未来信息的泄露。

      • 编码器和解码器之间的交互通过编码器-解码器注意力机制实现,使得解码器能够利用整个源句子的信息来进行目标句子的生成。

    4. 输出阶段:

      • 最后,解码器的输出经过线性变换映射到词汇表大小,再通过softmax函数得到各个可能输出的概率分布。

    这种架构的设计使得Transformer在处理长距离依赖时具有优势,因为它可以直接建模输入序列中任意两元素之间的关系,而不受限于固定的窗口大小。此外,由于没有循环或卷积操作,Transformer可以并行计算,大大加快了训练速度。