大家好,我是小寒
今天给大家分享一个强大的算法模型,Transformer
Transformer 是近年来在自然语言处理(NLP)领域取得显著成果的一种深度学习模型,最初由 Vaswani et al. 在 2017 年提出。
与传统的序列模型(如 RNN 和 LSTM)相比,Transformer 的主要优势在于其能够更好地处理长距离依赖关系,同时显著提高了计算效率。
Transformer 架构
Transformer 模型的核心由编码器(Encoder)和解码器(Decoder)两部分组成,每部分由多个相同的层(Layer)堆叠而成。
图片
编码器
编码器部分由六个相同的层(来自原始论文)堆叠而成,每层分为 2 个子层。
- 多头自注意力机制
通过计算输入序列中每个位置与其他位置之间的注意力权重,来捕捉序列中的长距离依赖关系。 - 前馈神经网络
对每个位置的表示进行进一步的非线性变换。
每个子层后面都紧跟着一个残差连接(Residual Connection)和层归一化(Layer Normalization)。
图片
下面,我们来对编码器的组件进行详细的描述。
- 词向量
原始形式的单词对机器来说毫无意义。
词向量是将离散的词表示成连续的向量,以捕捉词与词之间的语义关系。
词向量通过嵌入层(Embedding Layer)实现,将每个词映射到一个高维的向量空间中。
这使得模型可以处理输入序列中的词,并在训练过程中学习词与词之间的语义关系。
图片
- 位置编码
由于 Transformer 不像 RNN 那样具有顺序信息,因此需要显式地将位置信息加入到输入中。
位置编码通过将每个位置映射到一个向量,提供了词在序列中的位置信息。
常见的方法是使用正弦和余弦函数来生成位置编码。
其中,pos 是位置,i 是维度索引,d 是嵌入维度。位置编码将被添加到词向量中,使得每个词的表示包含了位置信息。
图片
- 自注意力
自注意力机制是 Transformer 的核心组件,它通过计算输入序列中每个位置与其他位置之间的注意力权重,来捕捉序列中的长距离依赖关系。
具体步骤如下:
- 查询(Query)、键(Key)、值(Value)向量通过线性变换得到查询、键和值向量。
图片
- 注意力权重
通过查询和键向量的点积计算注意力权重,然后应用 softmax 函数。 - 加权和
利用注意力权重对值向量进行加权求和。
- 残差连接和层归一化
残差连接和层归一化用于稳定训练过程,并加速模型的收敛。
残差连接将子层的输入直接添加到输出中,使得每一层都可以直接访问输入信号。
层归一化则对每一层的输出进行标准化,减少内部协变量偏移。 - 前馈层
前馈层是一个简单的两层全连接神经网络,用于对每个位置的表示进行进一步的非线性变换。
它在每个位置上独立操作,不共享参数。 - 输出
编码器的输出是一个大小为 (N, T, d) 的张量,其中每个位置的向量表示是经过多层编码器后的最终表示。
这些表示将被传递到解码器或用于下游任务(如分类、翻译等)。
解码器
解码器层除了包含与编码器层相同的两个子层外,还额外包含一个用于处理编码器输出与解码器输入之间关系的多头注意力机制。
具体来说,解码器层包括以下三个子层:
- Masked 多头自注意力子层(Masked Multi-Head Self-Attention Sub-layer)
- 编码器-解码器注意力子层(Encoder-Decoder Multi-Head Attention Sub-layer)
- 前馈神经网络
同样,每个子层后面都有残差连接和层归一化。
图片
- Masked 多头自注意力子层
在标准的多头注意力机制中,每个位置的查询(Query)会与所有位置的键(Key)进行点积计算,得到注意力分数,然后与值(Value)加权求和,生成最终的输出。
然而,在解码器中,生成序列时不能访问未来的信息。因此需要使用掩码(Mask)机制来屏蔽掉未来位置的信息,防止信息泄露。
具体来说,在计算注意力得分时,对未来的位置进行屏蔽,将这些位置的得分设为负无穷大,使得 Softmax 归一化后的权重为零。
图片
- 编码器-解码器注意力子层
编码器-解码器多头注意力子层在 Transformer 解码器中起到了关键作用,它使解码器能够有效地关注输入序列(编码器的输出),从而在生成序列时参考原始输入信息。
具体来说,编码器-解码器多头注意力的基本思想是通过对编码器输出(Key 和 Value)和解码器当前输入(Query)来生成新的表示。
这种机制使得解码器能够在生成序列时动态地选择性关注输入序列的不同部分。
图片
- 前馈神经网络子层
这是一个完全连接的前馈神经网络,通常由两个线性变换和一个ReLU激活函数组成。
它在每个位置上独立地应用相同的网络,处理每个位置的表示。