神经网络与深度学习笔记③|Transformer模型

引言

2017年,Google团队发表《Attention Is All You Need》一文,彻底抛弃RNN/LSTM/CNN结构,仅基于注意力机制提出Transformer模型,成为NLP领域里程碑式成果。如今Transformer不仅主导翻译、文本生成等NLP任务,更延伸至CV、语音、多模态大模型等领域,是深度学习的核心模型。


一、Transformer概述

1.1 Transformer的诞生

  • 发表时间:2017年
  • 核心论文:《Attention Is All You Need》
  • 核心团队:Google Brain & Google Research
  • 核心突破完全摒弃循环结构(RNN/LSTM)和卷积结构(CNN),仅通过自注意力机制实现序列建模,解决传统序列模型的痛点。

1.2 Transformer的核心优势

对比LSTM/GRU,Transformer两大核心优势:

  1. 超强并行计算能力:RNN需逐时间步串行计算,无法并行;Transformer通过矩阵运算,可对整个序列并行处理,大幅提升GPU利用率,训练速度显著加快。
  2. 长距离依赖建模能力:RNN长序列中易梯度消失,难以捕捉长距离语义关联;自注意力直接计算序列任意两个token的关联,无距离限制,长文本建模效果更优。

1.3 Transformer整体架构

Transformer为编码器-解码器(Encoder-Decoder)架构,整体分为6大核心部分:

  • 输入部分:词嵌入 + 位置编码
  • 编码器(Encoder):N层堆叠,每层含多头自注意力、前馈网络、残差连接+层归一化
  • 解码器(Decoder):N层堆叠,每层含掩码多头自注意力、交叉注意力、前馈网络、残差连接+层归一化
  • 输出部分:线性层 + Softmax层
  • 核心机制:自注意力、多头注意力、残差连接、层归一化、掩码机制、交叉注意力

二、Transformer输入部分

Transformer无循环结构,无法天然感知token顺序,输入需通过「词嵌入」编码语义、「位置编码」编码顺序,最终两者相加得到输入向量。

2.1 词嵌入(Word Embedding)

核心作用:将离散的文本token映射为低维稠密向量,编码单词语义信息。

(1)文本预处理
  • 分词:将句子切分为单词/子词token(如中文分词、英文按空格切分)
  • 序列对齐:不同长度句子通过填充(补null)或剪切统一长度,满足批量训练需求
  • 独热编码:将token映射为高维稀疏独热向量(维度=词汇表大小)
(2)低维映射

通过可训练的嵌入矩阵,将高维独热向量映射为低维稠密向量(d维,d<<词汇表维度):
Xemb=Xone−hot⋅WembX_{emb} = X_{one-hot} \cdot W_{emb}Xemb=XonehotWemb

  • WembW_{emb}Wemb:d×V维嵌入矩阵(V=词汇表大小),训练中自动学习
  • 常用工具:Word2Vec(CBOW/Skip-gram)、GloVe,或模型端到端训练学习
(3)代码示例(PyTorch)
import torch
import torch.nn as nn
# 词汇表大小=5,嵌入维度=24
emb = nn.Embedding(num_embeddings=5, embedding_dim=24)
# 输入token序列:[1,2,3,4]
token_ids = torch.LongTensor([1,2,3,4])
# 输出:4个token,每个对应24维向量
emb_vec = emb(token_ids)
print(emb_vec.shape)  # torch.Size([4, 24])

2.2 位置编码(Positional Encoding)

核心作用:为token注入位置信息,解决Transformer无循环、无法感知顺序的问题。

(1)无效编码方式
  • 整数编码:直接用0/1/2…表示位置,数值过大,信噪比低,难以区分语义和位置
  • 二进制编码:位置向量不连续,语义跳跃,不符合语言逻辑
(2)最终方案:正弦位置编码

Transformer采用正弦/余弦函数生成位置向量,与词嵌入维度相同,公式如下:
{PE(pos,2i)=sin⁡(pos100002i/d)PE(pos,2i+1)=cos⁡(pos100002i/d) \begin{cases} PE(pos, 2i) = \sin\left(\frac{pos}{10000^{2i/d}}\right) \\ PE(pos, 2i+1) = \cos\left(\frac{pos}{10000^{2i/d}}\right) \end{cases} {PE(pos,2i)=sin(100002i/dpos)PE(pos,2i+1)=cos(100002i/dpos)

  • pospospos:token在序列中的位置(0,1,2…)
  • iii:向量维度索引(0,1,2…d/2-1)
  • ddd:模型维度(词嵌入维度)
  • 特点:可学习、无参数、能建模相对位置,位置相近的token,位置向量相似度高。

2.3 最终输入向量

词嵌入编码语义,位置编码编码顺序,两者直接相加得到Transformer输入向量:
X=Xemb+PEX = X_{emb} + PEX=Xemb+PE

2.4 输出嵌入

解码器输入为目标文本(右移一位),嵌入方式与输入一致:

  • 同样采用词嵌入+位置编码
  • 区别:使用目标语言词汇表,而非源语言

三、Transformer编码器详解

编码器负责对源文本进行语义编码,提取全局语义特征,共N层堆叠,每层结构完全相同,含2个子层:多头自注意力子层、前馈全连接子层,均搭配残差连接+层归一化(Add&Norm)

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

(1)核心作用

解决一词多义问题,让每个token关注序列中所有相关token,融合全局上下文语义。
例:「mole」在不同语境中含义不同(鼹鼠/摩尔/痣),自注意力通过上下文区分语义。

(2)核心要素:Q、K、V

每个输入token通过3个可训练权重矩阵,生成3个向量:

  • 查询向量Q(Query):当前token的特征,用于「查询」相关token
  • 键向量K(Key):所有token的特征,用于「被查询」
  • 值向量V(Value):所有token的语义特征,用于「输出结果」

矩阵形式:
Q=X⋅WQ,K=X⋅WK,V=X⋅WVQ = X \cdot W_Q, \quad K = X \cdot W_K, \quad V = X \cdot W_VQ=XWQ,K=XWK,V=XWV

  • WQ、WK、WVW_Q、W_K、W_VWQWKWV:d×d维可训练矩阵
(3)自注意力计算公式

Attention(Q,K,V)=softmax(QKTdk)VAttention(Q,K,V) = softmax\left(\frac{QK^T}{\sqrt{d_k}}\right)VAttention(Q,K,V)=softmax(dkQKT)V
计算步骤拆解

  1. 计算注意力分数:Q与K转置相乘,得到n×n分数矩阵(n=序列长度),表示token间关联度
  2. 缩放:除以dk\sqrt{d_k}dkdkd_kdk=Q/K维度),避免维度高时分数过大、Softmax后梯度消失
  3. Softmax归一化:分数映射为0-1概率,每行和为1,概率越高表示关联越强
  4. 加权求和:概率矩阵与V相乘,得到融合全局信息的输出向量

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

(1)核心作用

并行捕捉不同类型的语义关联(如语法、语义、指代),提升模型表达能力。

  • 单头注意力:仅能捕捉一种关联
  • 多头注意力:并行h个注意力头(论文h=8),每个头独立计算自注意力,捕捉不同维度关联
(2)计算流程
  1. 分头:将Q、K、V按维度拆分为h个头
  2. 单头注意力:每个头独立计算自注意力,得到h个输出
  3. 拼接:将h个输出向量拼接,恢复原维度
  4. 输出投影:通过权重矩阵WOW_OWO线性变换,得到最终多头注意力输出

公式:
headi=Attention(QWQi,KWKi,VWVi)MultiHead(Q,K,V)=Concat(head1,...,headh)⋅WO \begin{align*} head_i &= Attention(QW_{Q_i}, KW_{K_i}, VW_{V_i}) \\ MultiHead(Q,K,V) &= Concat(head_1,...,head_h) \cdot W_O \end{align*} headiMultiHead(Q,K,V)=Attention(QWQi,KWKi,VWVi)=Concat(head1,...,headh)WO

3.3 Add&Norm(残差连接+层归一化)

(1)残差连接(Add)

解决深层网络梯度消失问题,公式:
Xout=Xin+F(Xin)X_{out} = X_{in} + F(X_{in})Xout=Xin+F(Xin)

  • XinX_{in}Xin:子层输入
  • F(Xin)F(X_{in})F(Xin):子层输出(注意力/前馈网络)
  • 核心:原始输入直接跨层传递,梯度可直接回传,避免深层梯度消失
(2)层归一化(Norm)

加速模型收敛、提升稳定性,公式:
LayerNorm(X)=X−μσ2+ϵ⋅γ+βLayerNorm(X) = \frac{X - \mu}{\sqrt{\sigma^2 + \epsilon}} \cdot \gamma + \betaLayerNorm(X)=σ2+ϵXμγ+β

  • μ、σ2\mu、\sigma^2μσ2:特征均值、方差
  • γ、β\gamma、\betaγβ:可训练缩放、偏移参数
  • 作用:将每层输出归一化为均值0、方差1,避免梯度爆炸/消失
(3)完整子层结构

Output=LayerNorm(X+MultiHeadAttention(X))Output = LayerNorm(X + MultiHeadAttention(X))Output=LayerNorm(X+MultiHeadAttention(X))
Output=LayerNorm(X+FeedForward(X))Output = LayerNorm(X + FeedForward(X))Output=LayerNorm(X+FeedForward(X))

3.4 前馈全连接网络(Feed Forward)

每层编码器的第二个子层,对每个token特征进行非线性变换,增强表达能力,公式:
FeedForward(X)=max(0,XW1+b1)W2+b2FeedForward(X) = max(0, XW_1 + b_1)W_2 + b_2FeedForward(X)=max(0,XW1+b1)W2+b2

  • 两层全连接:第一层激活函数ReLU,第二层无激活
  • 维度变化:输入d维→中间4d维→输出d维

3.5 编码器堆叠

6层完全相同的编码器块堆叠,逐层提取更高级的语义特征

  • 底层:捕捉词法、语法特征
  • 中层:捕捉短语、句子特征
  • 顶层:捕捉全局语义、上下文特征

四、Transformer解码器详解

解码器负责生成目标文本(如翻译结果),同样N层堆叠,每层含3个子层:掩码多头自注意力、交叉注意力、前馈网络,均搭配Add&Norm。

4.1 掩码多头自注意力(Masked Multi-Head Attention)

(1)核心作用

防止生成时偷看未来token,保证生成顺序(逐词生成)。
例:生成第i个词时,只能依赖前i-1个词,不能看第i及之后的词。

(2)掩码机制

生成上三角掩码矩阵,未来token位置填充-∞:

  • 注意力分数计算时,掩码位置分数=-∞
  • Softmax后,掩码位置概率=0,彻底屏蔽未来token信息

代码核心逻辑:

scores = scores.masked_fill(mask == 0, -1e9)
p_attn = scores.softmax(dim=-1)

4.2 交叉注意力(Cross-Attention)

(1)核心作用

融合编码器的源文本语义,让解码器生成时关注源文本关键信息(翻译核心)。

(2)Q/K/V来源
  • Q:来自解码器上一层输出(当前生成token特征)
  • K、V:来自编码器最终输出(源文本全局语义)
(3)计算逻辑

与多头自注意力一致,仅K/V来自编码器,实现源文本→目标文本的语义对齐

4.3 解码器完整结构

每层解码器流程:

  1. 掩码多头自注意力(避免偷看未来)→ Add&Norm
  2. 交叉注意力(融合源文本语义)→ Add&Norm
  3. 前馈网络(非线性变换)→ Add&Norm

五、Transformer输出层

解码器输出经线性层+Softmax层,输出目标token概率分布。

  1. 线性层:将解码器输出(d维)映射为目标词汇表维度(V维)
  2. Softmax层:将V维向量归一化为概率分布(0-1,和为1)
  • 输出:每个位置对应目标词汇表中各token的生成概率
  • 取概率最大值对应的token,作为当前生成结果

六、Transformer网络训练

以机器翻译为例,讲解训练流程、数据集、硬件配置与结果。

6.1 训练流程

(1)数据准备
  • 源文本:输入编码器(如中文)
  • 目标文本:输入解码器(右移一位,如英文),作为标签
(2)逐词生成与损失计算
  1. 解码器初始输入:开始符()
  2. 逐步预测:每次预测下一个token,直到生成结束符()
  3. 损失函数:交叉熵损失(Cross-Entropy),计算预测概率与真实标签的误差
  4. 反向传播:误差逐层回传,更新所有可训练参数(嵌入矩阵、注意力权重、前馈权重)

6.2 训练数据集

  • WMT2014英德数据集:450万句子对,词汇表37000
  • WMT2014英法数据集:3600万句子对,词汇表32000
  • 编码方式:字节对编码(BPE),解决生僻词问题

6.3 硬件配置与训练结果

(1)硬件
  • 8张NVIDIA P100 GPU
  • 基础模型:训练10万步(12小时)
  • 大模型:训练30万步(3.5天)
(2)核心结果(BLEU分数,越高越好)
  • Transformer(base):英德27.3、英法38.1
  • Transformer(big):英德28.4、英法41.8
  • 超越同期所有RNN/CNN模型,成为NLP任务SOTA

七、核心总结

  1. Transformer核心注意力机制替代循环/卷积,实现并行+长距离依赖建模
  2. 输入:词嵌入(语义)+ 位置编码(顺序)
  3. 编码器:6层堆叠,多头自注意力+前馈网络,提取全局语义
  4. 解码器:6层堆叠,掩码自注意力(防偷看)+ 交叉注意力(融源信息)
  5. 训练:交叉熵损失,端到端训练,并行高效
  6. 影响:奠定大模型基础,从NLP延伸至CV、语音、多模态,是深度学习核心模型
Logo

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

更多推荐