一、Transformer概述

1.1 诞生背景

2017年,Google团队发表论文《Attention Is All You Need》,提出了Transformer模型,完全摒弃了传统序列模型中的循环和卷积结构,仅基于注意力机制构建

1.2 核心优势

相比之前主流的LSTM和GRU模型,Transformer具有两个显著优势:

  • 高度并行化:可以同时处理序列中的所有token,充分利用GPU的并行计算能力,大幅提升训练速度
  • 性能更优:在机器翻译等任务上取得了当时最好的效果

1.3 总体架构

Transformer采用经典的编码器-解码器(Encoder-Decoder)架构,整体分为四个部分:

  1. 输入部分:词嵌入 + 位置编码
  2. 编码器部分:N个相同的编码器块堆叠(原始论文中N=6)
  3. 解码器部分:N个相同的解码器块堆叠(原始论文中N=6)
  4. 输出部分:线性层 + Softmax层

二、输入部分

输入部分的核心是将文本序列转换为模型能够处理的向量表示,由词嵌入位置编码两部分相加得到。

2.1 词嵌入(Word Embedding)

词嵌入的目标是将离散的单词转换为连续的低维向量表示,步骤如下:

  1. 分词:将输入文本以单词为单位切分,形成token序列
  2. 长度对齐:对不同长度的序列进行剪切或填充(padding),使所有样本长度一致
  3. 独热编码:将每个token转换为词汇表大小的独热向量
  4. 低维映射:通过可学习的映射矩阵,将高维独热向量映射为低维稠密向量(d << v,v为词汇表大小)

实现方式:可通过Word2Vec等预训练方法,或直接使用PyTorch中的nn.Embedding层。

2.2 位置编码(Positional Encoding)

由于Transformer没有循环结构,无法天然捕捉序列的位置信息,因此需要显式地为每个token添加位置编码。

正弦位置编码(原始论文采用):

  • 偶数维度使用正弦函数,奇数维度使用余弦函数
  • 公式:
    PE(pos,2i)=sin⁡(pos100002i/d)PE(pos, 2i) = \sin\left(\frac{pos}{10000^{2i/d}}\right)PE(pos,2i)=sin(100002i/dpos)
    PE(pos,2i+1)=cos⁡(pos100002i/d)PE(pos, 2i+1) = \cos\left(\frac{pos}{10000^{2i/d}}\right)PE(pos,2i+1)=cos(100002i/dpos)
    其中,pos是token在序列中的位置,i是维度索引,d是模型维度

三、编码器部分

编码器的作用是将输入序列编码为上下文相关的特征表示。每个编码器块包含两个子层:多头自注意力层前馈神经网络层,每个子层都采用"残差连接 + 层归一化"的结构。

3.1 自注意力机制(Self-Attention)

自注意力机制的核心是让每个token都能关注到序列中所有其他token的信息,从而生成上下文相关的表示

计算步骤

  1. 生成Q/K/V向量:将输入向量分别与三个可学习的权重矩阵相乘,得到查询向量Q、键向量K和值向量V
  2. 计算注意力得分:将查询向量Q与所有键向量K做点积
  3. 缩放:将得分除以dk\sqrt{d_k}dk dkd_kdk是K向量的维度),防止点积结果过大导致softmax梯度消失
  4. Softmax归一化:将得分转换为0-1之间的权重,且权重和为1
  5. 加权求和:将值向量V与对应的权重相乘后求和,得到自注意力层的输出

公式
Attention(Q,K,V)=softmax(QKTdk)VAttention(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)VAttention(Q,K,V)=softmax(dk QKT)V

3.2 多头自注意力机制(Multi-Head Attention)

多头自注意力机制是对自注意力机制的扩展,使用多组独立的Q/K/V矩阵并行计算多个注意力头,然后将结果拼接起来

优势:扩展了模型专注于不同位置的能力,能够捕捉到更丰富的上下文信息。

计算步骤

  1. 将输入向量分别输入到h个不同的注意力头中
  2. 每个注意力头独立计算自注意力输出
  3. 将所有注意力头的输出拼接起来
  4. 乘以一个可学习的权重矩阵WOW_OWO,得到最终的多头注意力输出

3.3 Add & Norm层

每个子层(自注意力层和前馈层)之后都有一个Add & Norm层,由两部分组成:

  • Add(残差连接):将子层的输入与输出相加,解决深度网络中的梯度消失问题
  • Norm(层归一化):对每一层的输入进行归一化处理,使均值为0、方差为1,加快模型收敛速度

公式
LayerNorm(X+Sublayer(X))\text{LayerNorm}(X + \text{Sublayer}(X))LayerNorm(X+Sublayer(X))

3.4 前馈神经网络(Feed Forward)

前馈神经网络是一个简单的两层全连接网络:

  • 第一层:线性变换 + ReLU激活函数
  • 第二层:线性变换(无激活函数)

公式
FFN(X)=max⁡(0,XW1+b1)W2+b2\text{FFN}(X) = \max(0, XW_1 + b_1)W_2 + b_2FFN(X)=max(0,XW1+b1)W2+b2

四、解码器部分

解码器的作用是根据编码器的输出和已生成的序列,预测下一个token。每个解码器块包含三个子层:

  1. 掩码多头自注意力层
  2. 交叉注意力层
  3. 前馈神经网络层

4.1 掩码多头自注意力层

与编码器中的自注意力层类似,但增加了掩码(Mask)操作,目的是防止模型在预测时看到未来的token

掩码原理:在计算注意力得分时,将当前位置之后的所有位置的得分设为-∞,经过Softmax后这些位置的权重变为0,从而不会对当前token的表示产生影响。

4.2 交叉注意力层(Cross-Attention)

交叉注意力层连接编码器和解码器:

  • 查询向量Q来自解码器上一层的输出
  • 键向量K和值向量V来自编码器的最终输出

通过交叉注意力,解码器能够关注到输入序列中与当前预测相关的信息。

五、输出部分

输出部分由线性层Softmax层串联而成:

  1. 线性层:将解码器输出的d维向量转换为词汇表大小的向量
  2. Softmax层:将线性层的输出转换为概率分布,每个元素表示对应token的预测概率

最终选择概率最大的token作为当前位置的预测结果。

六、网络训练

6.1 训练过程(以机器翻译为例)

  1. 将源语言句子输入编码器,得到编码后的特征表示
  2. 在解码器输入端输入开始符<sos>
  3. 解码器根据编码器输出和已生成的序列,预测下一个token
  4. 将预测结果与真实标签比较,计算交叉熵损失
  5. 误差反向传播,更新模型参数
  6. 重复步骤2-5,直到生成结束符<eos>或达到最大长度

6.2 训练数据与条件

  • 数据集:WMT2014英语-德语(450万句对)、英语-法语(3600万句对)
  • 硬件:8个NVIDIA P100 GPU
  • 训练时长:基础模型训练10万步(约12小时),大模型训练30万步(约3.5天)

6.3 训练结果

在WMT2014翻译任务上,Transformer取得了当时最好的BLEU分数:

  • 英语→德语:28.4
  • 英语→法语:41.8
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐