跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
编程语言AI算法

Transformer 框架详解:原理与架构解析

深入解析了 Transformer 框架的核心原理与架构设计。文章从序列到序列模型的定义出发,对比了传统 RNN/LSTM 的局限性,阐述了 Transformer 如何通过自注意力机制解决长距离依赖问题。详细拆解了 Encoder-Decoder 结构,包括输入嵌入、位置编码、多头注意力、残差连接及层归一化等关键组件。同时解释了 Masked Attention 在解码器中的作用及 Softmax 预测机制,为理解 BERT、GPT 等衍生模型奠定基础。

漫步发布于 2025/2/6更新于 2026/6/1529 浏览
Transformer 框架详解:原理与架构解析

Transformer 是由谷歌大脑在 2017 年论文《Attention is All You Need》中提出的一种序列到序列(Seq2Seq)模型。自提出伊始,该模型便在 NLP 和 CV 领域取得显著效果,多次达到 SOTA 水平。NLP 领域中,BERT 和 GPT 等预训练语言模型均衍生自 Transformer。

1. 什么是 Transformer?

在 Transformer 出现之前,NLP 领域主要应用 RNN 或 LSTM 循环处理序列数据,一个 token 一个 token 输入到模型中。这种顺序结构包含 token 在序列中的位置信息,但也存在以下问题:

  • 会出现梯度消失现象,无法支持长时间序列。
  • 句子越靠后的 token 对结果的影响越大。
  • 只能利用上文信息,无法获取下文信息。
  • 循环网络逐个 token 输入,计算效率低。

Transformer 的出现解决了上述一系列问题。

2. Transformer 架构

2.1. 宏观层面

Transformer 可以看作是一个黑箱操作的序列到序列模型,输入是单词/字母/图像特征序列,输出是另一个序列。在机器翻译任务中,即输入一种语言(一连串单词),经 Transformer 输出另一种语言(一连串单词)。

拆开这个黑箱,可以看到模型本质是一个 Encoder-Decoder 结构,由编码组件、解码组件和它们之间的连接组成。

每个 Encoder 中分别由 6 层 Encoder 组成,而每个 Decoder 中同样也是由 6 层 Decoder 组成。每一层 Encoder 的结构都是相同的,但是它们的权重参数不同。

每个 Encoder 里面又分为两层:

  • Self-Attention Layer(自注意力层)
  • Feed Forward Neural Network(前馈神经网络)

输入 Encoder 的文本数据,首先会经过一个 self-attention 层,这个层处理一个词的时候,不仅会使用这个词本身的信息,还会关注上下文其它词的信息。self-attention 的输出会被传入一个全连接的前馈神经网络,每个 Encoder 的前馈神经网络参数个数都是相同的,但是他们的作用是独立的。

每个 Decoder 也同样具有这样的层级结构,但是在这之间有一个 Attention 层,这个层能帮助 Decoder 聚焦于输入句子的相关部分。

2.2. 微观层面

Transformer 内部结构由 Encoder 和 Decoder 两大部分组成。其中,Encoder 负责将输入的自然语言序列映射成为隐藏层,然后 Decoder 将隐藏层映射为自然语言序列。

以机器翻译为例,说明模型具体运行过程:

  1. 输入自然语言序列到 Encoder:Why do we work? (我们为什么工作)
  2. Encoder 输出的隐藏层,再输入到解码器
  3. 输入 <start> (起始) 符号到解码器
  4. 得到第一个字 "为"
  5. 将得到的第一个字 "为" 落下来再输入到解码器
  6. 得到第二个字 "什"
  7. 将得到的第二字再落下来,直到解码器输出 <end> (终止符),即序列生成完成。
2.2.1. Encoder

首先是 Encoder,即把自然语言序列映射为隐藏层的数学表达的过程。

2.2.1.1. 输入嵌入 (Input Embedding)

输入数据 X 维度为:[batch_size, sequence_length]。例如输入'你好啊。最近正在忙什么呢?明天有空出来喝茶。几个朋友都来。',batch size 指的是句子数,sequence length 指的是输入的句子中最长的句子的字数。这里共四句话,所以 batch_size 为 4。最长的句子是 8 个,所以 sequence_length 为 8。输入数据维度为 [4, 8]。

我们不能直接将这些语句输入到 Encoder 中,因为 Transformer 不认识,所以需要先进行 Embedding,找到每个字的数学表达,即得到图中的 input Embedding,通过查表得到字向量,它的维度就变为 [batch_size, sequence_length, embedding_dimension]。

简单来说,就是字->词向量的转换,这种转换是将字转换为计算机能够辨识的数学表示,用到的方法是 Word2Vec。得到的维度是 [batch_size, sequence_length, embedding_dimension]。其中,embedding_dimension 的大小由算法决定,例如 Transformer 采用 512 长度的词向量。因此,维度是 。

[4, 8, 512]
2.2.1.2. 位置编码 (Positional Encoding)

Transformer 以 token 作为输入,将 token 进行 input Embedding 之后,再和 Positional Encoding 相加。注意这里不是拼接,而是对应位置上的数值进行加和。

input Embedding 的维度是 512,由于是相加关系,自然而然地,这里 Positional Encoding 的维度也是 512。

为什么要使用 Positional Encoding 呢?我们知道,NLP 领域中,模型的输入是一串文本,也就是序列 Sequence。

而在以前的模型 (RNN 或 LSTM) 中,NLP 的每个序列都是一个字一个字的输入到模型当中。比如有一句话是'我喜欢吃洋葱',那么输入模型的顺序就是'我','喜','欢','吃','洋','葱',一个字一个字的。

这样的输入方式其实就引入了一个问题。一个模型每次只吃了一个字,那么模型只能学习到前后两个字的信息,无法知道整句话讲了什么。为了解决这个问题,Transformer 模型引用了 Self-attention 来解决这个问题。Self-attention 的输入方式如下:

它可以一次性输入所有的字。但是 NLP 的输入文本要按照一定的顺序才可以,因为不同的语序,语义很有可能是不同的。比如下面两句话:

句子 1:我喜欢吃洋葱 句子 2:洋葱喜欢吃我

所以,对于 Transformer 结构而言,为了更好的发挥并行输入的特点,首先要解决的问题就是要让模型输入具有一定的位置信息。因此,Transformer 加入了 Positional Encoding 机制。

2.2.1.2.1. 构造位置编码

用整型值标记位置

说起标记位置,大概首先能想到的方法就是给第一个字标记 1,第二个字标记 2…,以此类推。但是,在处理不同长度的句子时,模型可能碰到比训练的序列更长的句子,这将不利于模型泛化。随着序列长度增加,位置标记值越来越大,模型将很难学习到这些位置信息。

用 [0,1] 范围标记位置

这时候可以将模型位置值限制在 [0,1] 范围内,来解决上述问题。其中,第一个字标记 0,最后一个字标记 1,中间的均分,比如共 3 个字,位置信息就是 [0, 0.5, 1];4 个字位置信息就是 [0, 0.33, 0.69, 1]。

但是这样,序列长度不同时,字与字的相对距离是不同的。

所以,理想情况下,Positional Encoding 的设计应该满足以下条件:

  • 为每个字输出唯一的编码可以表示每个字在序列中的绝对位置;
  • 不同长度的序列之间,任意两个字的距离/相对位置应该保持一致;
  • 可以表示模型在训练中未遇到过的句子长度。

用二进制向量标记位置

位置信息是作用在 input Embedding 上的,因此可以用一个和 input Embedding 维度一致的向量表示位置。这里以 d_model=3 为例,位置向量可以表示为下图所示。

这样满足所有值都是有界的 (位于 0、1 之间),且 Transformer 中 d_model=512,足够将每个位置都编码出来了。

但是,这样编码的位置向量,处在一个离线空间,不同位置间的变化是不连续的。

用周期函数(sin)标记位置

到这里,我们更明确了,需要的是有界且连续的函数,最先想到的,正弦函数 sin 可以满足吧。

我们可以将位置向量中的每个元素都用一个 sin 函数表示,第 t 个字的位置可以表示为: $$PE_{(pos, 2i)} = \sin(pos / 10000^{2i/d_{model}})$$ $$PE_{(pos, 2i+1)} = \cos(pos / 10000^{2i/d_{model}})$$

如下图所示,每一行表示一个 pos,每一列表示 PE 中的第 i 个元素。旋钮用于调整精度,越往右边的旋钮,需要调整的精度越大,因此指针移动的步伐越小。

每一排的旋钮都在上一排的基础上进行调整(函数中 pos 的作用)。通过频率控制 sin 函数的波长,频率不断减小,则波长不断变大,此时 sin 函数对 pos 的变动越不敏感,以此来达到越向右的旋钮,指针移动步伐越小的目的。

此外,由于 sin 是周期性函数,纵向看,如果函数频率偏大,引起波长偏短,则不同 pos 对应的位置向量可能会存在重合。为了避免这种情况,则要尽量把波长拉长。最简单的方法就是把所有的频率尽可能设小。因为,在 Transformer 论文中,频率设为 $10000^{-2i/d_{model}}$。

所以,到这里,位置向量可以表示为: $$PE_{(pos, i)} = \begin{cases} \sin(pos / 10000^{2i/d_{model}}) & \text{if } i \text{ is even} \ \cos(pos / 10000^{2(i-1)/d_{model}}) & \text{if } i \text{ is odd} \end{cases}$$

用 sin 和 cos 交替标记位置

目前为止,位置向量已经满足:

  • 每个字的向量唯一(每个 sin 函数频率足够小,波长足够长,不会重合)。
  • 位置向量的值有界,且连续。模型在处理位置向量时泛化性强,即更好处理长度和训练数据分布不一致的序列。

但是,我们还希望不同的位置向量是可以通过线性变换得到的。这样,不仅能表示一个字的绝对位置,还可以表示一个字的相对位置。

在这样的表示下,我们可以很容易用一个线性变换,把 $PE_{(pos, i)}$ 转变为 $PE_{(pos+k, i)}$。

2.2.1.3. Transformer 位置编码

Positional Encoding 定义如下: $$PE_{(pos, i)} = \begin{cases} \sin(pos / 10000^{2i/d_{model}}) & \text{if } i \text{ is even} \ \cos(pos / 10000^{2(i-1)/d_{model}}) & \text{if } i \text{ is odd} \end{cases}$$

其中,

  • pos 表示序列中某个字的实际位置,例如第一个字为 1,第 2 个字为 2。
  • $PE_{(pos, i)}$ 表示 pos 位置处的字的 Positional Encoding 向量,该向量可以用来给句子中每个字提供位置信息。
  • i 表示向量中每个元素的 index。
  • $d_{model}$ 表示向量的维度,即 512。

其实这里的公式和上面提到的是一样的。

把 512 维的向量两两一组,每组都是一个 cos 和一个 sin,这两个函数共享一个频率,共 256 组,由于从 0 开始编号,所以最后编号是 255。

回到定义中,i 越来越大,$10000^{-2i/d_{model}}$ 越来越小,$ rac{2\pi}{10000^{-2i/d_{model}}}$ 也越来越小,所以,频率随着 i 的递增而递减,周期递增。当 $i=0$ 时,周期最小是 $2\pi$;当 $i=255$ 时,周期也就是波长最大是 $10000*2\pi$。

为什么要将 Transformer 的每个维度设计成周期形式呢?如下图所示是 0-15 的二进制形式。可以看出,不同位置的数字都会出现 0、1 的交替变化。

2.2.1.4. 可视化

如下图所示是一串序列长度为 50、位置编码维度是为 128 位置编码可视化效果。

由此可以发现位置向量的每一个值都位于 [-1, 1] 之间。同时,纵向来看,图的右半边几乎都是蓝色的,这是因为越往后的位置,频率越小,波长越长,所以不同的 pos 对最终的结果影响不大。而越往左边走,颜色交替的频率越频繁。

2.2.2. 自注意力机制 (Self Attention Mechanism)

注意力机制,顾名思义,就是我们对某件事或某个人或物的关注重点。举个生活中的例子,当我们阅读一篇文章时,并非每个词都会被同等重视,我们会更关注那些关键的、与上下文紧密相关的词语,而非每个停顿或者辅助词。

对于没有感情的机器来说其实就是赋予多少权重 (比如 0-1 之间的小数),越重要的地方或者越相关的地方赋予的权重越高。

在技术实现层面,注意力机制通常涉及三个核心概念:Query、Key 和 Value。其中,

  • 查询(Query, Q):指的是查询的范围,自主提示,即主观意识的特征向量。
  • 键(Key, K):指的是被比对的项,非自主提示,即物体的突出特征信息向量。
  • 值(Value, V):则是代表物体本身的特征向量,通常和 Key 成对出现。

注意力机制是通过 Query 与 Key 的注意力汇聚(给定一个 Query,计算 Query 与 Key 的相关性,然后根据 Query 与 Key 的相关性去找到最合适的 Value)实现对 Value 的注意力权重分配,生成最终的输出结果。

举个例子, 我们淘宝购物时,会输入一句关键词(比如:高腰),这个就是 Query。 搜索系统会根据关键词查找一系列相关的 key(商品名称 + 图片)。 最后系统会将相应的 Value(具体的衣服) 输出。

Q、K 和 V 虽然在不同的空间,其实它们是有一定潜在联系的,也就是说通过某种变换,可以使得三者的属性在一个相近的空间中。

自注意力机制是注意力机制的变体,其减少了对外部信息的依赖,更擅长捕捉数据或特征的内部相关性。

注意力机制和自注意力机制的区别:

  • 注意力机制的 Q 和 K 是不同来源的,例如,在 Encoder-Decoder 模型中,K 是 Encoder 中的元素,而 Q 是 Decoder 中的元素。在中译英模型中,Q 是中文单词特征,而 K 则是英文单词特征。
  • 自注意力机制的 Q 和 K 则都是来自于同一组的元素,例如,在 Encoder-Decoder 模型中,Q 和 K 都是 Encoder 中的元素,即 Q 和 K 都是中文特征,相互之间做注意力汇聚。也可以理解为同一句话中的词元或者同一张图像中不同的 batch,这都是一组元素内部相互做注意力机制,因此,自注意力机制也被称为内部注意力机制。
2.2.2.1. 运行步骤

步骤 1. 对输入 Encoder 的每个词向量,都创建 3 个向量,分别是:Q 向量,K 向量,V 向量。

上文中提到, input = input Embedding + Positional Embedding

词嵌入与位置向量相加可以得到句中每个单词的词向量表示,第 t 个词的词向量记作 $x_t$。

对于每个词向量,分别乘以权重矩阵 $W^Q$、$W^K$、$W^V$,即可得到新的向量 $q_t$、$k_t$、$v_t$。而权重矩阵 $W^Q$、$W^K$、$W^V$ 即为我们要学习的参数。

步骤 2. 计算一个注意力分数 Attention Score。假设我们正在计算本例中第一个词'Thinking'的注意力分数。这个分数就决定着'Thinking'这个词在某句话中与其他词的关联程度,所以'Thinking'这个词要与其他所有词都计算一个分数。

这个分数是通过 Q 向量与其它位置的每个词的 K 向量进行点积求得。例如我们要计算句子中第一个位置单词的 score,那么第一个分数就是 $q_1$ 和 $k_1$ 的内积,第二个分数就是 $q_1$ 和 $k_2$ 的点积。

其意义就是比较两个向量的相关程度,越相关值越大。

步骤 3. 每个 score 除以 $ ext{scale} = \sqrt{d_k}$($d_k$ 是 key 向量的长度)。也可以除以其他数,这里除以一个数是为了在反向传播时,求取梯度更加稳定。论文中除以 Q 向量维度的平方根 8,即 $ rac{1}{\sqrt{8}}$。

然后通过 softmax 操作映射出最后的结果。Softmax 对分数进行归一化处理,使它们都为正且加起来为 1。

softmax 结果决定了每个词在句子中每个位置的重要性。很明显,这个词与其本身的 softmax 结果最高,因为它的 Q、K、V 向量都是源于其本身。

步骤 4. 得到每个位置的分数后,将每个分数分别与每个 Value 向量相乘,使得每个单词重要程度进行重新分配。对于分数高的位置,相乘后的值就越大,我们把更多的注意力放到了它们身上;对于分数低的位置,相乘后的值就越小,这些位置的词可能是相关性不大的,这样我们就忽略了这些位置的词。

最后再加权值求和,产生 Self-Attention 输出。

自注意力计算到此结束。

在实际中,我们通常会将输入词向量打包成矩阵,然后分别和 3 个权重矩阵 $W^Q$、$W^K$、$W^V$ 相乘,得到 Q,K,V 矩阵。

矩阵 X 中的每一行,表示句子中的每一个词的词向量,长度是 512。Q,K,V 矩阵中的每一行表示 Query 向量,Key 向量,Value 向量,向量长度是 64。

接着进行矩阵运算,直接得到 Self Attention 的输出。

整体矩阵运算过程如下: $$\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V$$

自注意力机制的问题

  1. 模型在对当前位置的信息进行编码时,会过度的将注意力集中于自身的位置,有效信息抓取能力就差一些。
  2. 它一次性输入所有的字,而没有考虑位置信息。但是 NLP 的输入文本要按照一定的顺序才可以,因为不同的语序,语义很有可能是不同的。
2.2.2.2. 多头注意力(Multi-Head Attention)

多头注意力即为:用独立学习得到的 h 组(一般 h=8)不同的线性投影(linear projections)来变换查询 Q、键 K 和值 V。然后,这 h 组变换后的查询、键和值将并行地送到注意力汇聚中。最后,将这 h 个注意力汇聚的输出拼接在一起,并且通过另一个可以学习的线性投影进行变换,以产生最终输出。

步骤 1. 定义多组 W,生成多组 Q、K、V。刚才我们已经理解了,Q、K、V 是输入向量分别乘上三个系数 $W_i^Q$、$W_i^K$、$W_i^V$ 得到,$W_i^Q$、$W_i^K$、$W_i^V$ 是可训练的参数矩阵。

现在,对于同样的 X,我们定义多组不同的 $W_i^Q$、$W_i^K$、$W_i^V$,比如 $W_1^Q$、$W_1^K$、$W_1^V$...$W_h^Q$、$W_h^K$、$W_h^V$,每组分别计算生成不同的 Q、K、V,最后学习到不同的参数。

步骤 2. 定义 8 组参数。对应 8 组参数矩阵 $W_i^Q$、$W_i^K$、$W_i^V$,再分别进行 self-attention,即可得到 $head_i$。每一组 $W_i^Q$、$W_i^K$、$W_i^V$ 都可以得到一个输出矩阵。

步骤 3. 将多组输出拼接后乘以矩阵以降低维度。首先在输出到下一层前,需要将 concat(heads),再乘以矩阵 $W^O$ 做一次线性变换降维,得到 Z。

完整流程图如下: $$\text{MultiHead}(Q, K, V) = \text{Concat}(head_1, ..., head_h)W^O$$

2.2.2.3. 残差连接(Residual Connections)和层归一化(Layer Normalization)

残差连接

在上一步得到了经过注意力矩阵加权之后的 V,也就是 $Attention(Q, K, V)$。

现在进行转置,使其和维度一致,也就是 [batch-size, sequence_length, embedding_dimension],再把他们对应元素加起来做残差连接。

在之后的运算里,每经过一个模块的运算,都要把运算之前的值和运算之后的值相加,从而得到残差连接,训练的时候可以使梯度直接走捷径反传到最初始层: $$\text{Output} = \text{LayerNorm}(x + \text{Sublayer}(x))$$

Layer Normalization

Layer Normalization 的作用是把神经网络中隐藏层归一为标准正态分布,也就是独立同分布,以起到加快训练速度,加速收敛的作用。

均值 $\mu$: $$\mu = \frac{1}{N} \sum_{i=1}^{N} x_i$$

方差 $\sigma^2$: $$\sigma^2 = \frac{1}{N} \sum_{i=1}^{N} (x_i - \mu)^2$$

然后用每一行的每一个元素减去这行的均值,再除以这行的标准差,从而得到归一化后的数值,是为了防止除 0。之后引入两个可训练参数 $\alpha, \beta$ 来弥补归一化的过程中损失掉的信息,注意 $\odot$ 表示元素相乘而不是点积,我们一般初始化 $\alpha$ 为全 1,而 $\beta$ 为全 0。

2.2.2.4. Add&Norm

Add & Norm 层 Add 和 Norm 两部分组成,其计算公式如下: $$\text{AddNorm}(x) = \text{LayerNorm}(x + \text{Sublayer}(x))$$

其中,X 表示输入向量,MultiheadAttention(X) 表示多头注意力输出,FeedForward(X) 表示前馈网络输出,输出与输入 X 维度是一样的,所以可以相加。

Add 指 X + MultiHeadAttention(X),是一种残差连接,通常用于解决多层网络训练的问题,可以让网络只关注当前差异的部分,在 ResNet 中经常用到。

Norm 指 Layer Normalization,通常用于 RNN 结构,Layer Normalization 会将每一层神经元的输入都转成均值方差都一样的,这样可以加快收敛。

2.2.2.5. Feed Forward

Feed Forward 层比较简单,是一个两层的全连接层,第一层的激活函数为 ReLU,第二层不使用激活函数,对应的公式如下。 $$\text{FFN}(x) = \max(0, xW_1 + b_1)W_2 + b_2$$

X 是输入,Feed Forward 最终得到的输出矩阵的维度与 X 一致。

至此,MultiHeadAttention、FeedForward、Add&Norm 就可以造出一个 Encoder Block,Encoder block 接收输入矩阵 $X$,并输出一个矩阵 $Y$。通过多个 Encoder block 叠加组成 Encoder。

第一个 Encoder block 的输入为句子单词的表示向量矩阵,后续 Encoder block 的输入是前一个 Encoder block 的输出,最后一个 Encoder block 输出的矩阵就是编码输出,这一矩阵后续会用到 Decoder 中。

2.2.3. Decoder

由下图可以看出,Decoder 结构从上到下依次是:

  • Masked Multi-Head Self-Attention
  • Multi-Head Encoder-Decoder Attention
  • FeedForward Network

和 Encoder 一样,上面三个部分的每一个部分,都有一个残差连接,后接一个 Layer Normalization。Decoder 的中间部件并不复杂,大部分在前面 Encoder 里我们已经介绍过了,但是 Decoder 由于其特殊的功能,因此在训练时会涉及到一些细节。

包含两个 Multi-Head Attention 模块。

  • 第一个 Multi-Head Attention 层采用了 Masked 操作。
  • 第二个 Multi-Head Attention 层的 K、V 矩阵使用 Encoder 输出进行计算,而 Q 使用上一个 Decoder block 的输出计算。
  • 最后有一个 Softmax 层计算下一个翻译单词的概率。
2.2.3.1. 第一个 Multi-Head Attention

Decoder block 的第一个 Multi-Head Attention 采用了 Masked 操作,因为在翻译的过程中是顺序翻译的,即翻译完第 i 个单词,才可以翻译第 i+1 个单词。通过 Masked 操作可以防止第 i 个单词知道 i+1 个单词之后的信息。下面以'我有一只猫'翻译成 "I have a cat" 为例,了解一下 Masked 操作。

下面的描述中使用了类似 Teacher Forcing 的概念。在 Decoder 的时候,是需要根据之前的翻译,求解当前最有可能的翻译,如下图所示。首先根据输入 'Begin' 预测出第一个单词为 'I',然后根据输入 'Begin I' 预测下一个单词 'have'。

Decoder 可以在训练的过程中使用 Teacher Forcing 并且并行化训练,即是指将正确的单词序列 (I have a cat) 和对应输出 (I have a cat) 传递到 Decoder。那么在预测第 i 个输出时,就要将第 i+1 之后的单词掩盖住,注意 Mask 操作是在 Self-Attention 的 Softmax 之前使用的,下面用 0 1 2 3 4 分别表示 "I have a cat "。

步骤 1. Decoder 的输入矩阵和 Mask 矩阵。输入矩阵包含 <start>I have a cat (0, 1, 2, 3, 4) 五个单词的表示向量,Mask 是一个 5×5 的矩阵。在 Mask 可以发现单词 0 只能使用单词 0 的信息,而单词 1 可以使用单词 0, 1 的信息,即只能使用之前的信息。

步骤 2. 通过输入矩阵 X 计算得到 Q、K、V 矩阵。然后计算 Q 和 $K^T$ 的乘积。

步骤 3. 在得到 $QK^T$ 之后需要进行 Softmax,计算 attention score。另外我们在 Softmax 之前需要使用 Mask 矩阵遮挡住每一个单词之后的信息,遮挡操作如下:

得到 Mask 之后在 Mask 上进行 Softmax,每一行的和都为 1。但是单词 0 在单词 1, 2, 3, 4 上的 attention score 都为 0。

步骤 4. 使用 Mask 与矩阵 V 相乘,得到输出 Z,则单词 I 的输出向量是只包含单词 1 信息的。

步骤 5. 通过上述步骤就可以得到一个 Mask Self-Attention 的输出矩阵,然后和 Encoder 类似,通过 Multi-Head Attention 拼接多个输出然后计算得到第一个 Multi-Head Attention 的输出 Z,Z 与输入 X 维度一样。

2.2.3.2. 第二个 Multi-Head Attention

Decoder block 第二个 Multi-Head Attention 变化不大,主要的区别在于其中 Self-Attention 的 K、V 矩阵不是使用上一个 Decoder block 的输出计算的,而是使用 Encoder 的编码输出计算的。

根据 Encoder 的输出 C 计算得到 K、V,根据上一个 Decoder block 的输出 Z 计算 Q (如果是第一个 Decoder block 则使用输入矩阵 X 进行计算),后续的计算方法与之前描述的一致。

这样做的好处是在 Decoder 的时候,每一位单词都可以利用到 Encoder 所有单词的信息 (这些信息无需 Mask)。

2.2.3.3. Softmax 预测输出单词

Decoder block 最后的部分是利用 Softmax 预测下一个单词,在之前的网络层我们可以得到一个最终的输出 Z,因为 Mask 的存在,使得单词 0 的输出 Z0 只包含单词 0 的信息,如下:

Softmax 根据输出矩阵的每一行预测下一个单词: $$P(y_t | y_{<t}) = \text{softmax}(z_t W_E^T)$$

总结

Transformer 通过自注意力机制和位置编码,成功解决了传统 RNN 模型在长序列处理上的梯度消失和并行计算难题。其 Encoder-Decoder 架构配合多头注意力机制,使得模型能够高效捕捉全局依赖关系。尽管原始 Transformer 主要用于机器翻译,但其核心思想已被广泛应用于 BERT、GPT 等现代大语言模型中,成为当前人工智能领域的基石技术之一。理解 Transformer 的内部运作机制,对于掌握深度学习与自然语言处理的前沿技术至关重要。

目录

  1. 1. 什么是 Transformer?
  2. 2. Transformer 架构
  3. 2.1. 宏观层面
  4. 2.2. 微观层面
  5. 2.2.1. Encoder
  6. 2.2.1.1. 输入嵌入 (Input Embedding)
  7. 2.2.1.2. 位置编码 (Positional Encoding)
  8. 2.2.1.2.1. 构造位置编码
  9. 2.2.1.3. Transformer 位置编码
  10. 2.2.1.4. 可视化
  11. 2.2.2. 自注意力机制 (Self Attention Mechanism)
  12. 2.2.2.1. 运行步骤
  13. 2.2.2.2. 多头注意力(Multi-Head Attention)
  14. 2.2.2.3. 残差连接(Residual Connections)和层归一化(Layer Normalization)
  15. 2.2.2.4. Add&Norm
  16. 2.2.2.5. Feed Forward
  17. 2.2.3. Decoder
  18. 2.2.3.1. 第一个 Multi-Head Attention
  19. 2.2.3.2. 第二个 Multi-Head Attention
  20. 2.2.3.3. Softmax 预测输出单词
  21. 总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • AnythingLLM 文件定位错误分析与 Whisper 模型路径优化
  • Midjourney 进阶:色相详解与色彩控制
  • 旋转位置编码 RoPE:从 2D 到 nD 的扩展与原理
  • 旋转位置编码 RoPE:从 2D 到 nD 的完美扩展之旅
  • AI、AGI、AIGC、NLP、LLM 与 ChatGPT 核心概念解析
  • JDK 1.8 在 Windows 系统下的安装与配置教程
  • Mamba 模型环境配置:Windows/Linux 双平台部署 causal_conv1d 与 mamba_ssm
  • Claude Code Viewer: Web 端会话管理与日志分析工具
  • AIGC 检测工具选择标准与论文降重修改策略
  • Whisper 模型国内镜像源汇总与快速下载指南
  • 解决 Google Scholar 自动化查询限制问题
  • AIGC 结合 Photoshop 实现 Spine 2D 骨骼动画拆件工作流
  • 利用 AIGC 与 Photoshop 快速生成 Spine 2D 骨骼动画拆件 PSD
  • 基于 AIGC 与 Photoshop 的 Spine 2D 角色拆件工作流
  • Whisper 模型国内镜像源汇总与快速下载方法
  • 利用 AIGC 与 Photoshop 快速生成 Spine 2D 骨骼动画拆件 PSD
  • 数据结构入门:C 语言单链表实现
  • SDIO 控制器原理、架构及 FPGA 通信应用
  • 银行个人贷款违约风险预测:基于逻辑回归模型
  • 基于 AIGC 与 Photoshop 的 Spine 2D 角色拆件补图工作流

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online