1 Transformer 介绍
Transformer的本质上是一个Encoder-Decoder的结构。
1.1 编码器
在Transformer模型中,编码器(Encoder) 的主要作用是将输入序列(例如文本、语音等)转换为隐藏表示(或者称为特征表示)。这些隐藏表示可以被Transformer模型的解码器使用,以生成目标序列(如翻译文本或生成文本)。
具体来说,编码器在Transformer中执行以下几个关键步骤和功能:
- 嵌入输入表示(Input Embedding):
首先,输入的单词或符号会经过嵌入层(embedding layer),将其转换为高维度的词嵌入(word embeddings)。这些嵌入向量不仅仅是简单的词向量,而是包含了位置编码(Positional Encoding),用于表示单词在序列中的位置信息。 - 多层自注意力机制(Multi-Head Self-Attention):
编码器由多层堆叠的自注意力层组成。自注意力机制能够帮助模型在处理每个输入位置时,同时关注到序列中的其他位置,从而更好地捕捉上下文信息。每个自注意力层都会对输入序列进行线性变换,然后计算注意力权重并应用到序列上,以获取加权的表示。 - 前馈神经网络(Feedforward Neural Networks):
在每个自注意力层之后,还有一个前馈神经网络。该网络由两个全连接层组成,之间通过ReLU激活函数连接。这一层的作用是对每个位置的特征进行非线性变换和映射。 - 残差连接和层归一化(Residual Connections and Layer Normalization):
在每个子层(自注意力层和前馈神经网络层)之间,都有残差连接和层归一化操作。残差连接允许信息直接在不同层之间流通,有助于避免梯度消失和加速训练。层归一化则有助于稳定训练过程,使得每层的输入分布保持在较小的范围内。 - 输出隐藏表示(Output Representation):
最终,编码器将经过多层处理的输入序列转换为一系列高维度的隐藏表示。这些表示不仅包含了输入序列的语义信息,还包括了序列中每个位置的上下文信息。
总体而言,Transformer编码器的作用是将输入序列转换为上下文感知的隐藏表示,这些表示能够包含输入序列的语义和语境信息,为解码器生成输出序列提供必要的信息基础。
在Transformer的encoder中,数据首先会经过一个叫做self-attention
的模块得到一个加权之后的特征向量 Attention(Q,K,V)。
得到特征向量之后,它会被送到encoder的下一个模块,即Feed Forward Neural Network。
1.2 解码器
在Transformer模型中,解码器(Decoder) 负责生成目标序列(如翻译文本或生成文本),它通过编码器生成的隐藏表示来理解输入序列,并逐步生成输出序列。
以下是Transformer解码器的主要作用和功能:
- 嵌入目标表示(Target Embedding):
与编码器类似,解码器也会经过一个嵌入层,将目标序列(如翻译任务中的目标语言单词序列)转换为高维度的词嵌入。这些嵌入向量同样包含位置编码,以保留目标序列中单词的位置信息。 - 多层自注意力机制和编码器-解码器注意力机制:
解码器中的每一层都包含自注意力机制和编码器-解码器注意力机制(Encoder-Decoder Attention)。自注意力机制帮助解码器关注到目标序列内部的不同位置,而编码器-解码器注意力机制则帮助解码器在生成每个单词时,将注意力集中在编码器输出的不同位置上,以获取输入序列的相关信息。 - 前馈神经网络:
与编码器类似,解码器中也包含前馈神经网络层,用于对每个位置的特征进行非线性变换和映射。 - 残差连接和层归一化:
解码器中的每个子层之间也存在残差连接和层归一化操作,以促进信息流动和训练稳定性。 - 生成输出序列:
在每个解码器层中,经过多次自注意力机制和编码器-解码器注意力机制的处理后,最终将得到一系列的隐藏表示。解码器通过这些隐藏表示,结合一个额外的线性变换和softmax操作,以概率分布的形式生成每个位置上可能的输出单词。 - 输出序列的生成和调整:
解码器通过逐步生成输出序列的每个单词,并在每个时间步骤上更新其内部状态,直到生成整个目标序列或者达到终止条件(如生成特定的结束标记)为止。
总体来说,Transformer解码器的主要作用是利用编码器生成的输入序列的隐藏表示,结合自注意力机制和编码器-解码器注意力机制,生成目标序列的概率分布,从而实现机器翻译、文本生成等任务。
2 输入编码
输入数据后,我们首先通过Word2Vec等词嵌入方法将输入语料转化成特征向量。
然后直接将X作为输入,输入到transformer中,得到具有上下文关系的向量。
3 Self-Attention
Self-attention(自注意力)是Transformer模型中的关键组成部分,用于处理输入序列内部的依赖关系和长距离依赖。它是一种机制,允许模型在处理序列中的每个位置时,能够同时关注序列中其他不同位置的信息,而无需通过逐步处理序列来实现。
具体来说,self-attention的作用是将序列中的每个元素(如词语或时间步中的特征)与序列中所有其他元素进行关联,以便在表征时捕捉全局的语义信息和依赖关系。这种关联是通过计算注意力权重来实现的,注意力权重决定了一个位置上的输出应该受到其他位置信息的多大影响。
自注意力机制通常包括以下几个步骤:
计算注意力分数:
对于输入序列中的每个位置 ( i ),通过线性变换(通常是矩阵乘法)将输入向量转换为三种不同的向量:查询向量(Query),键向量(Key),和数值向量(Value)。这些向量通过学习得到,并且在每个位置上都是独立计算的。
查询向量(Query)用于查询序列中其他所有位置的信息。
键向量(Key)和数值向量(Value)用于提供序列中其他位置的信息。
query向量类比于询问。 某个token问:“其余的token都和我有多大程度的相关呀?”
key向量类比于索引。 某个token说:“我把每个询问内容的回答都压缩了下装在我的key里”
value向量类比于回答。 某个token说:“我把我自身涵盖的信息又抽取了一层装在我的value里
- 如上文,将输入单词转化成嵌入向量
- 根据嵌入向量得到 Q,K,V三个向量
- 为每个向量计算一个score:score=q*k
- 为了梯度的稳定,Transformer使用了score归一化,即除以 Dk^0.5
- 对score施以softmax激活函数
- softmax点乘Value值 v,得到加权的每个输入向量的评分
- 相加之后得到最终的输出结果
Self-attention v.s. RNN
1. 并行性
Self-attention: Self-attention 允许模型在处理输入序列时并行计算每个位置的注意力权重。这意味着,不同位置之间的计算可以同时进行,使得模型在处理长序列时能够更高效地进行学习和推理。每个位置的输出只依赖于所有位置的加权平均,而不需要像RNN那样按照顺序逐步计算。
RNN: 循环神经网络需要按照时间步顺序依次处理输入序列。每个时间步的隐藏状态依赖于前一个时间步的隐藏状态,因此无法并行计算所有时间步的隐藏状态。这种串行处理限制了RNN在长序列上的效率,尤其是对于长期依赖关系的建模会有挑战。
2. 距离依赖性
Self-attention: Self-attention 在计算注意力权重时,可以同时关注序列中任意两个位置之间的关系,而不受距离的限制。这使得模型能够捕捉长距离依赖关系.
RNN: RNN 的隐藏状态通过循环连接,每一步的隐藏状态主要依赖于前一步的隐藏状态。
总结
Self-attention 和 RNN 在处理序列数据时有显著的区别。Self-attention 通过并行计算和全局关注机制提高了处理长序列的效率和能力,并且能够有效地捕捉长距离依赖关系。相比之下,RNN 需要按时间顺序逐步计算,其处理效率和能力受到长期依赖和梯度问题的限制。
4 Multi-head Self-attention
Multi-head self-attention 是 Transformer 模型中自注意力机制的一种扩展形式,它允许模型同时考虑来自不同表示空间的多组注意力表示,以增强模型对输入序列的表示能力和表征能力。
主要组成部分:
线性变换:
在每个注意力头中,输入序列的每个位置都会经过三种线性变换来形成 Query、Key 和 Value 向量。这些变换是通过学习的权重矩阵实现的,分别是 ( W_Q )、( W_K ) 和 ( W_V )。
注意力计算:
每个注意力头都会独立计算注意力权重。对于每个位置 ( i ),首先计算 Query 向量 ( Q_i ),然后与所有位置的 Key 向量 ( K_j ) 计算点积,得到注意力分数。这些分数经过 softmax 函数归一化,得到每个位置对于当前位置的注意力权重。使用这些注意力权重对所有位置的 Value 向量 ( V_j ) 进行加权求和,得到该头的自注意力输出。
多头机制:
Transformer 模型通常会使用多个注意力头(通常是8或16个),每个头都是独立计算的。每个头产生的注意力输出会被拼接在一起,然后经过一个线性变换 ( W_O ),以产生最终的多头注意力输出。
总体而言,Multi-head Self-attention 是 Transformer 模型成功的关键因素之一,它使得模型能够有效地捕捉长距离依赖和复杂语义信息,适用于各种自然语言处理任务,如机器翻译、文本生成和语言理解。
5 位置编码
位置编码(Positional Encoding)是在Transformer模型中使用的一种技术,在Transformer模型中,由于自注意力机制并不包含序列顺序信息,因此需要通过其他方式将位置信息引入模型。位置编码的目的是为了确保模型在处理输入序列时能够考虑到每个词语的位置顺序,而不仅仅是它们的内容。
为了解决这个问题,论文中在编码词向量时引入了位置编码(Position Embedding)的特征。具体地说,位置编码会在词向量中加入了单词的位置信息,这样Transformer就能区分不同位置的单词了。
6 输出编码
6.1 自注意力与交叉注意力
自注意力(Self-Attention):
自注意力机制是Transformer中的核心组件之一,用于在单个序列内部建立长距离依赖关系。 它的基本思想是:
**输入和输出: ** 自注意力接收一个输入序列,通常是由词嵌入向量组成的。对于每个输入位置,自注意力会计算该位置与序列中其他所有位置的相关性。
**计算过程: ** 相关性的计算通常是通过将输入序列经过线性变换(乘以权重矩阵)得到查询(Query)、键(Key)、值(Value)来完成的。然后通过计算Query和Key之间的点积,再经过Softmax归一化得到注意力权重,最后将权重与对应的值向量相乘并求和,得到输出表示。
**作用: ** 自注意力使得每个位置能够同时关注到序列中所有其他位置的信息,从而更好地捕捉全局依赖关系,有利于各种任务中的上下文理解和长距离依赖建模。
交叉注意力(Cross-Attention):
交叉注意力是Transformer中用于处理两个不同输入序列之间关系的注意力机制,一般用于编码器-解码器结构中的解码器部分。其主要思想是:
输入和输出: 交叉注意力接收两个不同的输入序列,通常分别用作查询序列(Q)和键序列(K),并使用值序列(V)来生成输出序列。
计算过程: 对于解码器中的每个位置,交叉注意力会计算该位置与编码器输出序列中所有位置的相关性。然后使用编码器输出序列的值向量和注意力权重来计算加权和,作为解码器当前位置的输出表示。
Self-attention(Mask)
自注意力中的mask机制是Transformer模型中的一个重要组成部分,特别是在处理序列任务时,用于控制模型在预测未来位置时的行为。
在推理时,解码器的输入是依次进行的,需要控制模型不能使用未来位置
**作用: ** 交叉注意力允许解码器在生成序列时通过查询序列与编码器的输出序列建立联系,以便更好地集成编码器的信息并生成符合上下文的输出序列。这对于机器翻译等任务中的解码过程至关重要。
总结:
自注意力用于建模单个序列内部的依赖关系,允许每个位置同时关注到整个序列的信息,适合于捕捉局部和全局的依赖关系。
交叉注意力用于处理两个不同输入序列之间的关系,例如编码器-解码器结构中,允许解码器根据编码器的输出来生成上下文相关的输出序列。
6.2 解码器推理模式
编码器输入"好久不见",转换为含有相关关系的向量,解码器最初传入"开始",经过自注意力模块也转换为相应向量,在解码器的交叉注意力模块计算并经过一系列操作输出概率最大的字,并把该向量当作下一次预测解码器的输入,以此类推,直至解码器输出BOS 结束符。
6.3 解码器训练模式
“好久不见”输入到解码器与“Long time no see” 输入到解码器,按照各自的transformer计算运行,然后编码器结果传入交叉注意力层进行计算(过程见6.1 交叉注意力部分),得到向量互相匹配,得到一个损失函数,通过损失函数得到损失值进行反向传播修改模型参数,最终达到编码器与解码器的词向量对应成功。