论文链接:Attention Is All You Need
这篇论文提出了 Transformer 模子架构,这是一个序列到序列的模子,在论文中被应用于英德和英法两个呆板翻译使命。
由于 Transformer 被用于翻译使命,整个模子的输入维度是 (batch_size, seq_len),输出维度是 (batch_size, seq_out_len)。模子接纳 Encoder-Decoder 架构,下面是模子的团体布局图:
这里的维度指的是 Tokenization(分词)后的数据,详见反面形貌
Encoder 端的数据运动
让我们从输入端开始,渐渐追踪数据在 Encoder 中的运动过程。
起首是 Tokenization(分词) 阶段。固然模子表现图中没有明确标出这一步,但实际应用中它是必不可少的。Tokenization 的作用是将无穷大概的文本流转化为一个有限的词表。输入是一个 (batch_size,) 的数组,每个元素是一个输入句子的字符串,经太过词后输出就是我们所说的 inputs,维度变为 (batch_size, seq_len),此中第二维表现每个字词在词表中的索引。
接下来是 Input Embedding(词嵌入) 层。这一层的作用是将离散的索引映射为稠密的向量表现。颠末这一步,数据维度从 (batch_size, seq_len) 扩展为 (batch_size, seq_len, d_model),此中 d_model 是模子的隐蔽维度,第三维就是每个字词的向量表现。
然后是 Positional Encoding(位置编码) 。这篇论文接纳的是绝对位置编码,利用正弦和余弦函数来天生位置信息。为什么必要位置编码呢?由于注意力机制会一次性并行处置处罚句子中的全部字词,这个过程本身是没有序次概念的,也就是说它是置换稳定的(permutation invariant)。假如不添加位置信息,模子就无法区分"我爱你"和"你爱我"如许的句子。位置编码会直接加到词嵌入上,因此不改变数据的维度,依然保持 (batch_size, seq_len, d_model)。
末了,数据会颠末 6 层堆叠的 Encoder 层。每一层 Encoder 都包罗多头自注意力机制和前馈神经网络,但无论颠末多少层,数据的维度始终保持为 (batch_size, seq_len, d_model)。Encoder 的终极输出会被共享给全部 6 个 Decoder 层,作为它们各自交错注意力(Cross-Attention)的输入源。
这里有个值得注意的点:固然全部 Decoder 层都利用同一个 Encoder 输出作为原始输入,但每个 Decoder 层会用本身独立的权重矩阵将这个输出投影成 K 和 V。因此,固然输入源雷同,但颠末各自的线性变更后,每层实际利用的 K 和 V 是差异的。而 Q 则来自 Decoder 自身的隐蔽状态,每一层的 Q 也都差异。这种筹划让每个 Decoder 层能从差异角度关注输入序列的信息。
Decoder 端的数据运动
如今让我们看看 Decoder 端的数据运动。这里有个紧张的概念必要明白:outputs 在训练和推理时饰演着差异的脚色。
在训练阶段,outputs 有双重身份。一方面,它作为模子的输入,这种方式叫做 Teacher Forcing,即把准确答案喂给模子;另一方面,它也作为标签用于盘算丧失。而在推理阶段,模子接纳自回归的方式逐个天生 token,每次猜测一个词,然后把猜测结果作为下一步的输入。
和 inputs 雷同,outputs 最初也是一个 (batch_size,) 的字符串数组,每个元素是目的语言的句子。颠末 Tokenization 后变为 (batch_size, seq_len)。这里必要特别注意:由于输入是英语,输出是法语或德语,因此输入和输出利用的是完全差异的词表和分词器。
接下来的流程和 Encoder 端雷同。颠末 Output Embedding 和 Positional Encoding 后,数据维度变为 (batch_size, seq_len, d_model)。
然后数据进入 6 层堆叠的 Decoder 层。每一层 Decoder 包罗三个子模块:起首是 Masked Self-Attention,它会掩藏未来的信息,防止模子在猜测当前词时"偷看"反面的词;然后是 Cross-Attention,这里 Decoder 会与 Encoder 的输出举行交互;末了是 Feed-Forward Network。颠末这 6 层后,数据维度依然是 (batch_size, seq_len, d_model),但此时的表现还没有对应到详细的词表。
为了得到终极的猜测结果,必要颠末 Linear 层。这一层将隐蔽状态映射到词表空间,输出维度变为 (batch_size, seq_len, vocab_size),表现每个位置对应词表中每个词的得分(logits)。但这些得分还不是概率,因此必要通过 Softmax 层 举行归一化,将 logits 转换为概率分布。终极输出依然是 (batch_size, seq_len, vocab_size),但此时每个值表现的是某个批次中某个位置猜测为某个词的概率。
Encoder 内部的数据维度厘革
如今让我们深入到单个Encoder层内部,看看数据是怎样运动和厘革的。每个Encoder层重要包罗两个子模块:多头自注意力(Multi-Head Self-Attention)和前馈神经网络(Feed-Forward Network),每个子模块反面都有残差毗连和层归一化。
假设输入到某一层Encoder的数据维度是 (batch_size, seq_len, d_model),我们来追踪它的厘革过程。
起首进入 多头自注意力模块。这个模块会将输入分别通过三个线性变更天生Q、K、V,每个的维度都是 (batch_size, seq_len, d_model)。然后这些向量会被切分成多个头,假设有h个头,那么每个头的维度就变成 (batch_size, seq_len, d_model/h)。每个头独立盘算注意力,盘算完后再拼接返来,维度重新变为 (batch_size, seq_len, d_model)。末了颠末一个输出投影矩阵,维度保持稳定。
接下来是 残差毗连和层归一化。残差毗连就是把注意力模块的输入和输出相加,这要求它们维度必须雷同,都是 (batch_size, seq_len, d_model)。然后举行层归一化,维度依然稳定。
然后数据进入 前馈神经网络(FFN) 。这是一个两层的全毗连网络,第一层会将维度扩展到 (batch_size, seq_len, d_ff),此中 d_ff 通常是 d_model 的4倍(论文中是2048,而d_model是512)。颠末ReLU激活函数后,第二层再将维度压缩回 (batch_size, seq_len, d_model)。
末了又是一次 残差毗连和层归一化,将FFN的输入和输出相加后归一化,终极输出维度依然是 (batch_size, seq_len, d_model)。
可以看到,固然Encoder内部履历了多次维度厘革(特别是在多头注意力的头切分和FFN的维度扩展),但由于残差毗连的存在,每一层的输入和输出维度必须保持同等,都是 (batch_size, seq_len, d_model)。这也是为什么6层Encoder堆叠后,数据维度始终稳定的缘故原由。
Decoder 内部的数据维度厘革
Decoder层的布局比Encoder更复杂一些,它包罗三个子模块:掩码多头自注意力(Masked Multi-Head Self-Attention)、交错注意力(Cross-Attention)和前馈神经网络(Feed-Forward Network)。
假设输入到某一层Decoder的数据维度是 (batch_size, seq_len, d_model),同时从Encoder吸取的输出也是 (batch_size, seq_len_enc, d_model)(注意这里的seq_len_enc是输入序列的长度,大概与输出序列长度差异)。
起首是 掩码多头自注意力模块。这个模块的处置处罚方式和Encoder中的自注意力根本雷同,也是天生Q、K、V,切分成多个头,盘算注意力,再拼接返来。唯一的区别是这里利用了掩码(mask),防止当前位置看到未来的信息。整个过程中,输入和输出的维度都是 (batch_size, seq_len, d_model)。然后颠末残差毗连和层归一化,维度保持稳定。
接下来是 交错注意力模块。这里的Q来自上一步的输出,维度是 (batch_size, seq_len, d_model);而K和V来自Encoder的输出,维度是 (batch_size, seq_len_enc, d_model)。注意这里的关键点:Q的序列长度是输出序列长度,K和V的序列长度是输入序列长度,它们可以差异。
在交错注意力的盘算中,Q会与K做点积得到注意力权重,维度是 (batch_size, seq_len, seq_len_enc),表现输出序列的每个位置对输入序列每个位置的关注水平。然后用这个权重对V举行加权求和,终极输出的维度是 (batch_size, seq_len, d_model),序列长度跟随Q,也就是输出序列的长度。颠末输出投影、残差毗连和层归一化后,维度依然是 (batch_size, seq_len, d_model)。
末了是 前馈神经网络,这部门和Encoder完全一样。先扩展到 (batch_size, seq_len, d_ff),再压缩回 (batch_size, seq_len, d_model),然后颠末残差毗连和层归一化。
总结一下,Decoder层的输入和输出维度都是 (batch_size, seq_len, d_model),但在交错注意力中会与Encoder输出 (batch_size, seq_len_enc, d_model) 举行交互。这种筹划让Decoder既能关注本身已经天生的内容(通过掩码自注意力),又能关注输入序列的信息(通过交错注意力)。
关键明白要点
整个数据运动的维度厘革链路可以总结为:索引 (B, L) → 嵌入 (B, L, D) → 编码 (B, L, D) → 词表 (B, L, V) → 概率 (B, L, V)。
位置编码之以是须要,是由于注意力机制本身不包罗任何位置信息。假如没有位置编码,模子就无法区分词序,"猫吃鱼"和"鱼吃猫"对模子来说是一样的。
Encoder 和 Decoder 的交互方式是:Encoder 的输出作为 Decoder 每一层交错注意力的 K 和 V,而 Q 则来自 Decoder 自身的隐蔽状态。这种筹划让 Decoder 可以或许关注到输入序列的相干信息。
末了,训练和推理的方式有本质区别。训练时利用 Teacher Forcing,可以并行处置处罚整个目的序列,服从很高;而推理时必须自回归地逐个天生 token,每次只能猜测一个词,因此速率较慢。
|