目录
1.2.2 非自回归(Non-Autoregressive,NAT)
1.5.4 优化评估指标(Optimizing Evalution Metrics)
摘要
本周学习了李宏毅深度学习关于Transformer的部分。了解了Transformer架构分为编码器和解码器,然后详细学习了编码器和解码器的结构,包括位置编码、多头注意力机制、残差连接和归一化等重要组成部分,还了解了训练Transformer的一些方法和Transformer应用建议。最后使用Pytorch实现Transformer架构,进一步加深了对Transformer架构的理解。
Abstract
This week, I learned about the part of Li Hongyi's deep learning about Transformer. After understanding the Transformer architecture divided into encoder and decoder, and then the structure of encoder and decoder was learned in detail, including important components such as position encoding, multi-head attention mechanism, residual connection and normalization, and also learned some methods for training Transformer and suggestions for Transformer application. Finally, the Transformer architecture is implemented by Pytorch, which further deepens the understanding of the Transformer architecture.
1 Transformer
1.1 Encoder
首先从编码器(Encoder)部分开始,其大致结构如下图左边部分,输入输出均为一个向量组。这类任务可以使用Self-attention、RNN或CNN完成,而Transformer选用的是Self-attention。
上图右半边给出了Transformer编码器的框架,以下针对这一部分进行更细的解释。
Transformer的Encoder分成很多很多的块(block),每一个块的输入和输出同样都是一个向量组,第一个块的输出作为第二个块的输入,以此类推,然后会输出最终的向量序列。
而单个的块也由很多层构成,输入输出也是向量组,大致结构如下:
Transformer会将经过Self-attention处理的数据 与未经处理的数据
相加,即残差(residual),之后进行层归一化(Layer Normalization)。而在全连接层部分同样的对结果作残差后归一化。
残差的基本思路:经过网络处理的数据的表达效果并不一定是提高的,因此将该部分数据与未经处理的数据相加后标准化,该操作可以一定程度上回滚神经网络,从而避免效果变得过差
层归一化:首先计算向量中各元素组成的正态分布的均值m与标准差(各元素并不一定来自同一正态分布),然后进行标准化操作
Transformer的Encoder部分主要包括:
- 输入嵌入(Input Embedding):将输入序列中的每个词或标记映射为其对应的词嵌入向量。这些词嵌入向量包含了词语的语义信息,并且可以在模型中进行学习;
- 位置编码(Positional Encoding):因为Transformer模型不包含任何关于序列顺序的信息,为了将位置信息引入模型,需要添加位置编码。位置编码是一种特殊的向量,用于表示输入序列中每个词的位置信息,以便模型能够区分不同位置的词;
- 多头注意力机制(Multi-Head Attention):注意力机制允许模型在处理每个词时,同时考虑到输入序列中所有其他词之间的关系。多头注意力机制通过将输入进行多次线性变换并计算多组注意力分数,从而允许模型在不同的表示子空间中学习到不同的语义信息;
- 残差连接和层归一化(Add&Norm):为了减轻梯度消失和加速训练,Transformer Encoder 层使用了残差连接。残差连接允许模型直接学习到输入序列的增量变换,而不是完全替代原始输入。在残差连接后应用层归一化,有助于提高模型的训练稳定性,加快训练速度;
- 前馈网络(Feed Forward):前馈网络能够通过线性变换,先将数据映射到高纬度空间,在映射到低纬度空间从而提取更深层次的特征;
- 残差连接和层归一化(Add&Norm):再重复一次残差连接和层归一化。
以上操作为一个块的输出,然后重复N次。
BERT 其实就是Transformer Encoder。
除此之外,也有很多优秀的模型在该部分做了其他的操作。下图中左侧为Transformer的结构,而右侧为针对其进行的改进。首先,进行层归一化、使用多头注意力机制,然后进行残差连接,再层归一化、前馈网络,最后再残差连接得到输出:
1.2 Decoder
1.2.1 自回归(Autoregressive,AT)
数据在经过编码器处理后输入到解码器(decoder),而自回归(Autogressive,AT)编码器则是一种较为常见的解码器。
解码器需要做的工作是解析编码器生成的向量序列,从而生成输出。
除了向量组输入解码器以外,在起始时刻还需要输入BEGIN of sentence(可以看作代表起始的标识符),这是一个特殊的token。而解码器在读取标识符后,会生成一个经过softmax处理的独热编码(one-hot vetor),即可以看作每个可能输出的概率分布,其中最高的就是输出。
每一次的输出结果会作为下一次的token,然后由解码器进行处理,重复上述过程。就像在RNN中做的那样,可以将上次的输出看作本次的记忆单元。
但相应的由于上述过程是迭代进行的,解码器应该对于错误的输出具有一定的纠错能力,从而提高模型的稳定性,尽量避免一步错步步错,即误差传递(error propagation)的问题。
解码器的结构如下:
下面简单的介绍解码器内部的结构,相较于编码器,解码器主要区别在于多了N层的多头注意力机制与Add&Norm。而其首个多头注意力机制层是带有掩码(Mask)的,而该层的差异在于其在处理时仅考虑在其前面(即已经阅读部分)数据及其本身。
以下简单解释掩码自注意力机制(Masked Self-attention):
自注意力机制如下图,每一个输出都与所有的输入有关:
而掩码自注意力机制,从数据处理过程来理解上述过程,如下图,在生成时,仅使用第二个位置的query矩阵,与第一个、第二个位置的key矩阵计算其注意力,而不处理后续第三第四位置的数据。