Transformer原理拆解:从零基础到精通的详细指南
Transformer原理拆解:从零基础到精通的详细指南
Transformer是自然语言处理领域的重要模型,其独特的自注意力机制和编码器-解码器结构使其在各种任务中表现出色。本文将从Transformer的组成、编码器、解码器、注意力机制以及输入表示等方面,深入浅出地介绍这一模型的核心原理。
Transformer组成
Transformer可以分为两个主要部分:自注意力机制和编码器-解码器结构。
自注意力机制(Self-Attention)是Transformer的核心组件,它允许模型在处理序列数据时关注到不同位置的信息。自注意力机制通过计算序列中每个位置与其他位置之间的相关性,得到一个注意力权重分布,从而实现对不同位置信息的关注。具体来说,它包括三个矩阵:Query(查询)、Key(键)和Value(值)。这三个矩阵是通过将输入向量或隐藏层乘以不同的权重矩阵得到的。自注意力机制通过计算Query与Key的点积,得到每个位置的注意力权重,然后将这些权重应用于Value向量进行加权求和,从而生成输出向量。
编码器-解码器结构是Transformer的另一个关键组成部分。编码器由多个编码器层组成,每个编码器层包含两个子层:多头自注意力和前馈全连接网络。解码器同样由多个解码器层组成,每个解码器层包含三个子层:带掩码的多头自注意力、多头注意力(编码器到解码器)和前馈全连接网络。在每个子层后面都接有一个规范化层和一个残差连接,这有助于解决深度网络中的梯度消失和梯度爆炸问题。编码器的主要任务是将输入序列转换为一系列向量表示,而解码器则根据这些向量表示生成输出序列。
编码(Encoder)
文本如何表示
在 Transformer 模型中,首先会对输入文本进行处理来得到合适的表示。因为模型没有办法直接理解自然语言,所以它会把每个词或每个字符编码成一个特定的向量形式。
- 词嵌入(Word Embedding): 文本中的每个单词都被转换为一个高维向量。
- 位置嵌入(Positional Embedding): 标准的 Transformer 模型没有内置的序列顺序感知能力,因此需要添加位置信息。这是通过位置嵌入完成的,它与词嵌入具有相同的维度。
- 相加(Addition):词嵌入和位置嵌入相加,得到一个包含了文本信息和位置信息的新的嵌入表示。这样,模型就能知道每个单词不仅是什么,还能知道它在序列中的位置
如何理解编码器部分
Transformer 中的编码器部分,作用是学习输入序列的表示。
处理流程如下:
- 输入的数据会被送入注意力机制进行处理,注意力机制会给数据里的每一个元素分配不一样的权重,以决定哪些数据更重要,在"注意力机制"(Attention)这个步骤之后,会有一些新的数据生成。
- 执行 Add(残差连接) 操作,把注意力机制中产生的新数据会和最开始输入的原始数据合在一起。
- 随后,数据会经过“层归一化”(Norm)处理,主要是为了让数据更稳定,便于后续处理。
- 之后,数据将进入一个双层的前馈神经网络。这里的目标是将经过注意力处理的数据映射回其原始的维度,以便于后续处理。这是因为编码器会被多次堆叠,所以需要确保数据的维度在进入下一个编码器前是一致的。简单来说:就是把经过前面所有处理的数据变回原来的形状和大小。
- 最后,如果有下一个编码器,数据会再次经过 Add 和 Norm 操作,输出一个经过精细计算和重构的词向量表示。
Tips:为什么要经过两个神经网络?
经过两个前馈神经网络的处理,是为了引入非线性变换,增强模型的表示能力,并对每个位置的特征进行独立的变换,从而提高模型在生成目标序列任务中的性能。
通过引入非线性变换,模型可以对输入数据进行更复杂的变换和建模。非线性变换可以通过激活函数(如 ReLU、sigmoid、tanh等)来实现,这些激活函数通过引入非线性操作,使得模型可以对输入数据进行非线性映射。通过多个非线性变换的组合,模型可以逐渐构建出更复杂的特征表示,从而更好地捕捉数据中的非线性关系和模式。
在神经网络中,非线性变换通常被嵌入到网络的各个层中,使得模型可以通过堆叠多个非线性变换层来构建深层模型。这种深层结构可以提供更高级别的特征表示和抽象,从而增强了模型的表示能力。
解码(Decoder)
如何理解 decoder 的输入部分
在Transformer模型中,编码器(Encoder)和解码器(Decoder)各自有独立的输入。这是因为通常在有监督学习的场景下,编码器负责处理输入样本,而解码器处理与之对应的标签。这些标签在进入解码器之前同样需要经过适当的预处理。这样的设置目的是允许模型在特定任务上进行有针对性的训练。
举个一个简单的机器翻译例子。假设有以下的英语到法语的翻译对:
- 英语(输入样本): “Hello, world”
- 法语(标签): “Bonjour, monde”
在这个示例中,编码器(Encoder)会接收 “Hello, world” 这个句子作为输入。这个句子首先会被转换成一组词向量或者字符向量,然后进入编码器进行处理。
与此同时,解码器(Decoder)会接收与 “Bonjour, monde” 对应的标签作为输入。同样地,这些标签首先会被转换成一种机器可理解的表示(比如词向量或字符向量),然后进入解码器。
编码器处理完输入样本后,它的输出会与解码器的输入进行某种形式的结合,以生成最终的翻译输出。通过这个机制,模型可以在有监督的学习环境中进行训练,以完成特定的任务,如机器翻译
如何理解解码器部分
Transformer中的解码器部分,作用是用于生成输出序列。
数据处理流程如下:
- 数据首先进入一个 masked Attention 机制,这个遮罩的作用是确保解码器只能关注到它之前已经生成的词,而不能看到未来的词。
- 经过masked Attention机制输出的信息会与 Encoder 部分的输出进行融合。然后经历一个注意力机制的处理,从而综合考虑编码与解码的内容。
- 这个过程之后,解码器的操作与编码器部分大致相同。数据会经过层归一化、前馈神经网络,再次进行层归一化,最终输出一个词向量表示。
- 输出的词向量首先会通过一个线性层(Linear)。这一步的目的是将向量映射到预先定义的词典大小,从而准备进行词预测。
- 最后,使用 softmax 函数计算每个词的生成概率。最终,选取概率最高的词作为该时刻的输出。
注意力机制(Attention)
这两张图通常用来展示如何通过注意力机制确定代词 “it” 指代的是哪个名词,原始句子:"The Animal didn’t cross the street because it was too tired"译为:因为动物太累了所以没有过马路。“it” 指代的是 “The Animal”,然而,如果改变句子中的一个词,将 “tired” 替换为 “narrow” ,得到的新句子是 “The Animal didn’t cross the street because it was too narrow”,译为:由于街道太窄,动物没有过马路。在这个新的句子中,“it” 指 “the street”。
因此,模型需要能够理解当输入的句子改变时,句子中的词义也可能会随之改变。
Attention机制的工作原理
Attention 机制的工作原理可以这样形象化地描述:
模型把每个词编码成一个向量,然后把这些向量送入模型中。在这里,每个词都会像发送一条“询问”:“咱们之间的关系紧密吗?我们亲近吗?”如果关系紧密,模型就会采取一种行动,反之则会采取另一种行动。不仅每个词都会发出这样的“询问”,而且也会回应其他词的“询问”。通过这样的一问一答互动,模型能够识别出每两个词之间的紧密关系。一旦这种关系被确定,模型就会把与该词关系更紧密的词的信息“吸收”进来,与之进行更多的信息融合。这样,比如在翻译任务中,模型就能准确地识别 “it” 应该翻译为 “animal”,因为它的向量已经融合了与 “animal” 这个词紧密相关的信息。
注意力机制的核心就是要做重构词向量这样一件事。
Q、K、V的计算过程
- Q:即 Query,可以理解为某个单词像其它单词发出询问
- K:即 Key,可以理解为某个单词回答其它单词的询问
- V:即 Value,可以理解为某个单词的实际值,表示根据两个词之间的亲密关系,决定提取出多少信息出来融入到自身
- X, Q, K, V 的每一行都表示一个单词。
- Wq、Wk、Wv 是权重矩阵,可以把它当作模型的一个固有模块,理解为一个已经制定好的的计算规则。
因此以第一行为例: - 在 Q 矩阵中的第一行表示的是它包含了第一个词(与输入 X 的第一行对应)在查询其他词时所需的关键信息。
- 在 K 矩阵的第一行里,存储的是第一个词在回应其他词的查询时所需的信息。
- 在 V 矩阵的第一行,所包含的是第一个词自身携带的信息。
- 在通过 Q 和 K 确定了与其他词的关系后,这些存储在 V 中的信息被用来重构该词的词向量。
当得到了Q,K,V之后,Attention 做了如下操作:
这个公式就涉及到了一问一答的这个过程,它表现出来的计算过程是这样的:
最后得到的 QK^T 矩阵就表达了词与词之间关系的紧密程度。
Transformer 的输入
Transformer 中单词的输入表示 x由单词 Embedding 和位置 Embedding (Positional Encoding)相加得到。
Transformer 的输入表示
5.1 单词 Embedding
单词的 Embedding 有很多种方式可以获取,例如可以采用 Word2Vec、Glove 等算法预训练得到,也可以在 Transformer 中训练得到。
5.2 位置 Embedding
Transformer 中除了单词的 Embedding,还需要使用位置 Embedding 表示单词出现在句子中的位置。因为 Transformer 不采用 RNN 的结构,而是使用全局信息,不能利用单词的顺序信息,而这部分信息对于 NLP 来说非常重要。所以 Transformer 中使用位置 Embedding 保存单词在序列中的相对或绝对位置。
位置 Embedding 用 PE表示,PE 的维度与单词 Embedding 是一样的。PE 可以通过训练得到,也可以使用某种公式计算得到。在 Transformer 中采用了后者,计算公式如下:
其中,pos 表示单词在句子中的位置,d 表示 PE的维度 (与词 Embedding 一样),2i 表示偶数的维度,2i+1 表示奇数维度 (即 2i≤d, 2i+1≤d)。使用这种公式计算 PE 有以下的好处:
使 PE 能够适应比训练集里面所有句子更长的句子,假设训练集里面最长的句子是有 20 个单词,突然来了一个长度为 21 的句子,则使用公式计算的方法可以计算出第 21 位的 Embedding。
可以让模型容易地计算出相对位置,对于固定长度的间距 k,PE(pos+k) 可以用 PE(pos) 计算得到。因为 Sin(A+B) = Sin(A)Cos(B) + Cos(A)Sin(B), Cos(A+B) = Cos(A)Cos(B) - Sin(A)Sin(B)。
将单词的词 Embedding 和位置 Embedding 相加,就可以得到单词的表示向量 x,x 就是 Transformer 的输入。