目录
0.概要
在人工智能领域,序列数据(如文本、语音、时间序列)的处理一直是核心挑战。传统循环神经网络(RNN)及其变体(如 LSTM、GRU)通过逐元素处理序列信息,曾长期占据主导地位。然而,其串行计算特性导致难以高效利用并行硬件,且对长距离依赖的建模能力有限。2017 年,Google 团队提出的Transformer 模型彻底颠覆了这一格局,通过自注意力机制和并行化架构,在机器翻译任务中达到了 SOTA(state-of-the-art)性能,并为后续大语言模型(如 BERT、GPT)奠定了基础。本文将深入解析 Transformer 的核心结构,揭示其设计思想与创新点。
1.Transformer整体结构及数据处理顺序
Input Embedding+Positional Encoding-->Encoder-->Decoder-->Output
Transformer 整体结构中①Positional Encoding 和② Input Embedding 是编码器处理输入的前置步骤,是输入预处理的一部分。编码器的主体部分只包含 Multi-Head Attention、Add & Norm、Feed Forward 和最后的 Add & Norm,由N个③编码器层(Encoder Layer)堆叠构成Transformer的解码部分。每个④解码器层与编码器层类似,但多了一个编码器-解码器注意力层,N个解码器层(Decoder Layer)堆叠构成Transformer解码器。最终通过⑤输出预测结果。各个层的具体原理如下:
1.
输入表示(Input Embedding)
输入文本首先需要转换为向量形式。通常,我们使用词嵌入(Word Embeddings)来表示每个单词。假设输入句子长度为n,词嵌入的维度为 ,则输入可以表示为一个
的矩阵
。
2.位置编码(Positional Encoding)
由于Transformer没有使用传统的RNN或CNN架构,因此需要添加位置编码来让模型获取序列信息。位置编码可以通过正弦和余弦函数生成:
对于输入位置和维度
:
将位置编码添加到输入嵌入向量中:
3.编码器层(Encoder Layer)
每个编码器层包括以下几个步骤:
1)多头注意力机制:
2) 残差连接和层归一化:
3) 前馈神经网络:
4) 残差连接和层归一化:
4.解码器层(Decoder Layer)
每个解码器层与编码器层类似,但多了一个编码器-解码器注意力层:
1) 掩码多头注意力机制(Masked MultiHead Attention):
2) 残差连接和层归一化:
3) 编码器-解码器注意力机制:,这里
是解码器的输出,
和
是编码器的输出。
4) 残差连接和层归一化:
5) 前馈神经网络:
6) 残差连接和层归一化:
5.Output:
在 Transformer 模型里,输出层运用线性层和 Softmax 函数来算出每个 token 的输出概率。
1)线性层(也叫全连接层):其作用是把模型最后一个隐藏层的特征表示变换到词汇表大小的维度。因为 Transformer 的编码器 - 解码器结构输出的特征向量维度是固定的,而最终要预测的是词汇表中的某个 token,所以需要把特征向量映射到和词汇表大小相同的维度,每个维度对应词汇表中的一个 token。假设模型最后一个隐藏层的输出维度是,词汇表大小是
,那么线性层的权重矩阵维度就是
。通过矩阵乘法,就可以把
维度的特征向量转换为
维度的向量,这个向量中的每个元素代表了对应 token 的得分。
2) Softmax 函数 经过线性层得到的V维度向量中的元素是没有经过归一化的得分,这些得分不能直接当作概率。Softmax 函数的作用就是把这些得分转换为概率分布,使得所有元素之和为 1。Softmax 函数的数学公式如下:
这里的 代表线性层输出向量的第
个元素,
是词汇表的大小。经过 Softmax 函数处理后,每个元素都在 0 到 1 之间,且所有元素之和为 1,这样就得到了每个 token 的输出概率。
2.Self-Attention
上图是 Self-Attention 的结构,在计算的时候需要用到矩阵Q(查询),K(键值),V(值)。在 Self Attention 和 Multi - Head Attention 机制里,Q、K、V是关键概念,它们各自发挥着不同的作用。在讲解其具体计算方式之前,按照我个人的习惯先描述三者的作用和关联,这样才能从粗到细对其由比较全面透彻的理解。
2.1Q、K、V关系
1)查询(Query)
Query 主要用于在序列里查找和它相关的信息。在计算注意力分数时,每个位置的 Query 向量会和序列中其他位置的 Key 向量进行点积运算,以此来衡量该位置与其他位置的相关性。简单来说,Query 可以被看作是一个 “问题”,模型通过这个 “问题” 去序列里寻找与之匹配的信息。
2)键(Key)
Key 用于表示序列中每个位置的特征信息,它和 Query 进行点积运算,为每个位置生成一个注意力分数。这个分数反映了该位置的信息对于当前 Query 的重要程度。可以把 Key 理解为一个 “索引”,用于帮助模型快速定位和 Query 相关的信息。
3)值(Value)
Value 是序列中每个位置的实际信息表示,在计算出注意力权重后,模型会根据这些权重对 Value 向量进行加权求和,从而得到当前位置的输出。可以把 Value 看作是 “答案”,模型根据 Query 和 Key 的匹配结果,从 Value 中提取有用的信息。
Query、Key 和 Value 在 Self Attention 机制中相互协作,共同完成信息的选择和整合。Query 提出 “问题”,Key 提供 “索引” 来匹配相关信息,Value 则提供实际的 “答案”。通过这种方式,模型能够动态地关注序列中不同位置的信息,从而更好地捕捉序列内的长距离依赖关系。
2.2 Q, K, V 计算
Self-Attention 的输入用矩阵X进行表示,则可以使用线性变阵矩阵WQ,WK,WV计算得到Q,K,V(WQ,WK,WV的参数初始化为服从高斯分布(正态分布)的随机值)。计算如下图所示,注意 X, Q, K, V 的每一行都表示一个单词。
得到矩阵 Q, K, V之后计算 Self-Attention 的输出,计算的公式如下:
其中是Q,K矩阵的列数,即向量维度。公式中计算矩阵Q和K每一行向量的内积,为防止内积过大除以
的平方根。Q乘以K的转置后,得到的矩阵行列数都为 n,n 为句子单词数,这个矩阵可以表示单词之间的 attention 强度。
3.Multi-Head Attention
在上一步,我们已经知道怎么通过 Self-Attention 计算得到输出矩阵 Z,而 Multi-Head Attention 是由多个 Self-Attention 组合形成的,下图是论文中 Multi-Head Attention 的结构图。
从上图可以看到 Multi-Head Attention 包含多个 Self-Attention 层,首先将输入X分别传递到 h 个不同的 Self-Attention 中,计算得到 h 个输出矩阵Z。下图是 h=8 时候的情况,此时会得到 8 个输出矩阵Z。得到 8 个输出矩阵到
之后,Multi-Head Attention 将它们拼接在一起 (Concat),然后传入一个Linear层,得到 Multi-Head Attention 最终的输出Z,矩阵Z与其输入的矩阵X的维度相同。具体如下图所示: