跳到主要内容 Transformer 框架详解:原理与架构解析 | 极客日志
编程语言 AI 算法
Transformer 框架详解:原理与架构解析 本文深入解析了 Transformer 框架的核心原理与架构设计。文章从序列到序列模型的定义出发,对比了传统 RNN/LSTM 的局限性,阐述了 Transformer 如何通过自注意力机制解决长距离依赖问题。详细拆解了 Encoder-Decoder 结构,包括输入嵌入、位置编码、多头注意力、残差连接及层归一化等关键组件。同时解释了 Masked Attention 在解码器中的作用及 Softmax 预测机制,为理解 BERT、GPT 等衍生模型奠定基础。
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 的结构都是相同的,但是它们的权重参数不同。
Self-Attention Layer(自注意力层)
Feed Forward Neural Network(前馈神经网络)
输入 Encoder 的文本数据,首先会经过一个 self-attention 层,这个层处理一个词的时候,不仅会使用这个词本身的信息,还会关注上下文其它词的信息。self-attention 的输出会被传入一个全连接的前馈神经网络,每个 Encoder 的前馈神经网络参数个数都是相同的,但是他们的作用是独立的。
每个 Decoder 也同样具有这样的层级结构,但是在这之间有一个 Attention 层,这个层能帮助 Decoder 聚焦于输入句子的相关部分。
2.2. 微观层面 Transformer 内部结构由 Encoder 和 Decoder 两大部分组成。其中,Encoder 负责将输入的自然语言序列映射成为隐藏层,然后 Decoder 将隐藏层映射为自然语言序列。
输入自然语言序列到 Encoder:Why do we work? (我们为什么工作)
Encoder 输出的隐藏层,再输入到解码器
输入 <start> (起始) 符号到解码器
得到第一个字 "为"
将得到的第一个字 "为" 落下来再输入到解码器
得到第二个字 "什"
将得到的第二字再落下来,直到解码器输出 <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 的输入文本要按照一定的顺序才可以,因为不同的语序,语义很有可能是不同的。比如下面两句话:
所以,对于 Transformer 结构而言,为了更好的发挥并行输入的特点,首先要解决的问题就是要让模型输入具有一定的位置信息。因此,Transformer 加入了 Positional Encoding 机制。
2.2.1.2.1. 构造位置编码 说起标记位置,大概首先能想到的方法就是给第一个字标记 1,第二个字标记 2…,以此类推。但是,在处理不同长度的句子时,模型可能碰到比训练的序列更长的句子,这将不利于模型泛化。随着序列长度增加,位置标记值越来越大,模型将很难学习到这些位置信息。
这时候可以将模型位置值限制在 [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 函数表示,第 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 函数频率足够小,波长足够长,不会重合)。
位置向量的值有界,且连续。模型在处理位置向量时泛化性强,即更好处理长度和训练数据分布不一致的序列。
但是,我们还希望不同的位置向量是可以通过线性变换得到的。这样,不仅能表示一个字的绝对位置,还可以表示一个字的相对位置。
在这样的表示下,我们可以很容易用一个线性变换,把 $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$$
模型在对当前位置的信息进行编码时,会过度的将注意力集中于自身的位置,有效信息抓取能力就差一些。
它一次性输入所有的字,而没有考虑位置信息。但是 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 的作用是把神经网络中隐藏层归一为标准正态分布,也就是独立同分布,以起到加快训练速度,加速收敛的作用。
均值 $\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 的内部运作机制,对于掌握深度学习与自然语言处理的前沿技术至关重要。
相关免费在线工具 加密/解密文本 使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
RSA密钥对生成器 生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
Mermaid 预览与可视化编辑 基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
Markdown转HTML 将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online