人工智能之核心技术 深度学习
第五章 Transformer模型
文章目录
- [人工智能之核心技术 深度学习](#人工智能之核心技术 深度学习)
- [前言:Transformer 模型 ------ 现代深度学习核心架构](#前言:Transformer 模型 —— 现代深度学习核心架构)
- [一、Transformer 核心机制](#一、Transformer 核心机制)
- [1.1 为什么需要 Transformer?](#1.1 为什么需要 Transformer?)
- [1.2 自注意力机制(Self-Attention)](#1.2 自注意力机制(Self-Attention))
- 核心思想:
- [数学实现(Scaled Dot-Product Attention):](#数学实现(Scaled Dot-Product Attention):)
- [1.3 多头注意力(Multi-Head Attention)](#1.3 多头注意力(Multi-Head Attention))
- [1.4 位置编码(Positional Encoding)](#1.4 位置编码(Positional Encoding))
- [1.5 编码器-解码器结构](#1.5 编码器-解码器结构)
- 二、预训练模型与范式
- [2.1 预训练-微调范式(Pretrain-Finetune)](#2.1 预训练-微调范式(Pretrain-Finetune))
- [2.2 BERT(Bidirectional Encoder Representations from Transformers)](#2.2 BERT(Bidirectional Encoder Representations from Transformers))
- [2.3 GPT(Generative Pre-trained Transformer)](#2.3 GPT(Generative Pre-trained Transformer))
- [2.4 优化模型](#2.4 优化模型)
- [三、Transformer 应用](#三、Transformer 应用)
- [3.1 自然语言处理(NLP)](#3.1 自然语言处理(NLP))
- [3.2 计算机视觉:Vision Transformer (ViT)](#3.2 计算机视觉:Vision Transformer (ViT))
- [四、配套代码实现(从零构建简化 Transformer)](#四、配套代码实现(从零构建简化 Transformer))
- 五、总结与演进路线
- 资料关注
前言:Transformer 模型 ------ 现代深度学习核心架构
自 2017 年 Google 提出 Transformer 以来,它彻底重塑了自然语言处理(NLP)乃至整个深度学习领域。凭借其强大的并行化能力 和长距离依赖建模能力,Transformer 不仅取代了 RNN/CNN 成为 NLP 主流架构,还成功跨界到计算机视觉、语音、生物信息学等领域。
本章将带你深入理解 Transformer 的核心机制、代表性预训练模型及其广泛应用。
一、Transformer 核心机制
1.1 为什么需要 Transformer?
RNN/LSTM 虽能建模序列,但存在致命缺陷:
- 无法并行计算:必须按时间步顺序处理 → 训练慢
- 长距离依赖衰减:即使有门控,超长序列仍难捕捉
CNN 虽可并行,但感受野有限,需堆叠多层才能覆盖全局。
✅ Transformer 的突破 :
完全基于注意力机制 ,抛弃循环和卷积,实现全局依赖建模 + 完全并行化
1.2 自注意力机制(Self-Attention)
核心思想:
"每个词都应该关注句子中所有其他词,以确定自己的含义。"
例如:
"他 把书 送给了她。"
- "他" 需关注 "送" 和 "她" 才知是施事者
- "她" 需关注 "送" 和 "他" 才知是受事者
数学实现(Scaled Dot-Product Attention):
对输入序列 X ∈ R n × d X \in \mathbb{R}^{n \times d} X∈Rn×d(n 个词,d 维向量):
-
线性变换生成 Q, K, V:
Q = X W Q , K = X W K , V = X W V Q = XW_Q,\quad K = XW_K,\quad V = XW_V Q=XWQ,K=XWK,V=XWV
- Q Q Q(Query):当前词的"查询向量"
- K K K(Key):其他词的"键向量"
- V V V(Value):其他词的"值向量"
-
计算注意力权重:
Attention ( Q , K , V ) = softmax ( Q K T d k ) V \text{Attention}(Q, K, V) = \text{softmax}\left( \frac{QK^T}{\sqrt{d_k}} \right) V Attention(Q,K,V)=softmax(dk QKT)V
- Q K T QK^T QKT:衡量词与词的相关性
- d k \sqrt{d_k} dk :缩放因子,防止 softmax 梯度消失
-
输出:加权和的上下文表示
Input Sequence
Linear W_Q
Linear W_K
Linear W_V
Q
K
V
Q·K^T / √d
Softmax
Weighted Sum
Output
💡 优势:
- 任意两词直接交互(路径长度=1)
- 完全并行(矩阵运算)
- 可解释性强(可视化注意力权重)
1.3 多头注意力(Multi-Head Attention)
单头注意力可能只关注一种关系(如语法主谓)。多头机制让模型同时学习多种子空间表示。
- 将 Q , K , V Q, K, V Q,K,V 投影到 h h h 个子空间(如 h=8)
- 每个头独立计算注意力
- 拼接结果并线性变换:
MultiHead ( Q , K , V ) = Concat ( head 1 , . . . , head h ) W O \text{MultiHead}(Q,K,V) = \text{Concat}(\text{head}_1, ..., \text{head}_h) W^O MultiHead(Q,K,V)=Concat(head1,...,headh)WO
✅ 效果:相当于集成多个注意力专家,提升模型表达能力。
1.4 位置编码(Positional Encoding)
RNN 天然有序,但 Transformer 并行处理 → 丢失时序信息!
解决方案:显式添加位置编码到词向量中。
常用 正弦位置编码(无需学习):
P E ( p o s , 2 i ) = sin ( p o s 10000 2 i / d ) , P E ( p o s , 2 i + 1 ) = cos ( p o s 10000 2 i / d ) PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{2i/d}}\right), \quad PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{2i/d}}\right) PE(pos,2i)=sin(100002i/dpos),PE(pos,2i+1)=cos(100002i/dpos)
- p o s pos pos:词在序列中的位置
- i i i:维度索引
🔁 特点:可泛化到比训练时更长的序列!
1.5 编码器-解码器结构
原始 Transformer 用于机器翻译,包含:
(1)编码器(Encoder)
- 6 个相同层堆叠
- 每层含:
- 多头自注意力
- 前馈神经网络(FFN)
- 残差连接 + LayerNorm
(2)解码器(Decoder)
- 6 个相同层堆叠
- 每层含:
- 掩码多头自注意力(防止看到未来词)
- 编码器-解码器注意力(关注源句)
- FFN + 残差 + LayerNorm
Decoder
Encoder
Input Embed + PE
Multi-Head Self-Attn
Add & Norm
FFN
Add & Norm
... ×6
Target Embed + PE
Masked Multi-Head Self-Attn
Add & Norm
Multi-Head Attn (with Encoder Output)
Add & Norm
FFN
Add & Norm
... ×6
Linear + Softmax
⚠️ 注意:BERT 只用编码器,GPT 只用解码器!
二、预训练模型与范式
2.1 预训练-微调范式(Pretrain-Finetune)
-
预训练(Pretraining):
- 在大规模无标签语料上训练(如 Wikipedia + BookCorpus)
- 学习通用语言表示
-
微调(Finetuning):
- 在特定下游任务(如情感分析)的小数据集上继续训练
- 通常只需加一个简单分类头
✅ 优势:小数据也能取得 SOTA 效果!
2.2 BERT(Bidirectional Encoder Representations from Transformers)
-
架构:12/24 层 Transformer 编码器
-
预训练任务:
- Masked Language Model (MLM) :随机遮盖 15% 词,预测原词 → 双向上下文
- Next Sentence Prediction (NSP):判断两句话是否连续
-
适用任务:理解类(问答、分类、NER)
python
# Hugging Face 使用示例
from transformers import BertTokenizer, BertModel
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')
inputs = tokenizer("Hello, how are you?", return_tensors="pt")
outputs = model(**inputs)
last_hidden_states = outputs.last_hidden_state # [1, seq_len, 768]
2.3 GPT(Generative Pre-trained Transformer)
- 架构:多层 Transformer 解码器(无编码器-解码器注意力)
- 预训练任务 :自回归语言建模
P(w_t \| w_1, ..., w_{t-1}) - 特点 :只能看到左侧上下文 → 天然适合文本生成
📈 GPT-3(175B 参数)、GPT-4 推动大模型时代
2.4 优化模型
| 模型 | 改进点 | 目标 |
|---|---|---|
| RoBERTa | 移除 NSP,更大 batch,动态 masking | 提升 BERT 性能 |
| DistilBERT | 知识蒸馏,保留 97% 性能,速度×2 | 模型压缩 |
| ALBERT | 参数共享 + 因式分解 embedding | 减少参数量 |
| T5 | 统一所有 NLP 任务为"文本到文本" | 通用框架 |
三、Transformer 应用
3.1 自然语言处理(NLP)
| 任务 | 模型选择 | 说明 |
|---|---|---|
| 文本分类 | BERT / DistilBERT | 加分类头微调 |
| 问答系统 | BERT / RoBERTa | 预测答案起止位置 |
| 机器翻译 | Transformer (原始) / mBART | 编码器-解码器架构 |
| 命名实体识别(NER) | BERT + CRF | 序列标注 |
| 文本生成 | GPT-2/3/4, LLaMA | 自回归生成 |
3.2 计算机视觉:Vision Transformer (ViT)
Dosovitskiy et al. (2020) 提出:图像也能用 Transformer!
核心思想:
- 将图像切分为固定大小 patch(如 16×16)
- 每个 patch 展平 + 线性嵌入 → 视为"词"
- 添加位置编码 → 输入标准 Transformer 编码器
224x224 Image
Split into 14x14 patches\n(16x16 each)
Flatten each patch → 768-dim
Add Positional Encoding
Transformer Encoder
Class Token Output
MLP Head → Prediction
✅ 效果:在大数据集(如 ImageNet-21k)上超越 CNN!
四、配套代码实现(从零构建简化 Transformer)
python
import torch
import torch.nn as nn
import math
class PositionalEncoding(nn.Module):
def __init__(self, d_model, max_len=5000):
super().__init__()
pe = torch.zeros(max_len, d_model)
position = torch.arange(0, max_len, dtype=torch.float).unsqueeze(1)
div_term = torch.exp(torch.arange(0, d_model, 2).float() * (-math.log(10000.0) / d_model))
pe[:, 0::2] = torch.sin(position * div_term)
pe[:, 1::2] = torch.cos(position * div_term)
self.register_buffer('pe', pe)
def forward(self, x):
# x: [batch, seq_len, d_model]
x = x + self.pe[:x.size(1), :]
return x
class MultiHeadAttention(nn.Module):
def __init__(self, d_model, num_heads):
super().__init__()
assert d_model % num_heads == 0
self.d_k = d_model // num_heads
self.num_heads = num_heads
self.q_linear = nn.Linear(d_model, d_model)
self.k_linear = nn.Linear(d_model, d_model)
self.v_linear = nn.Linear(d_model, d_model)
self.out = nn.Linear(d_model, d_model)
def forward(self, q, k, v, mask=None):
bs = q.size(0)
# Linear projections
q = self.q_linear(q).view(bs, -1, self.num_heads, self.d_k).transpose(1, 2)
k = self.k_linear(k).view(bs, -1, self.num_heads, self.d_k).transpose(1, 2)
v = self.v_linear(v).view(bs, -1, self.num_heads, self.d_k).transpose(1, 2)
# Scaled dot-product attention
scores = torch.matmul(q, k.transpose(-2, -1)) / math.sqrt(self.d_k)
if mask is not None:
scores = scores.masked_fill(mask == 0, -1e9)
attn = torch.softmax(scores, dim=-1)
out = torch.matmul(attn, v)
out = out.transpose(1, 2).contiguous().view(bs, -1, self.num_heads * self.d_k)
return self.out(out)
class TransformerEncoderLayer(nn.Module):
def __init__(self, d_model, num_heads, d_ff=2048, dropout=0.1):
super().__init__()
self.self_attn = MultiHeadAttention(d_model, num_heads)
self.norm1 = nn.LayerNorm(d_model)
self.norm2 = nn.LayerNorm(d_model)
self.ff = nn.Sequential(
nn.Linear(d_model, d_ff),
nn.ReLU(),
nn.Dropout(dropout),
nn.Linear(d_ff, d_model)
)
self.dropout = nn.Dropout(dropout)
def forward(self, x, mask=None):
# Self-attention + residual
attn_out = self.self_attn(x, x, x, mask)
x = self.norm1(x + self.dropout(attn_out))
# Feed-forward + residual
ff_out = self.ff(x)
x = self.norm2(x + self.dropout(ff_out))
return x
# 使用示例
encoder_layer = TransformerEncoderLayer(d_model=512, num_heads=8)
x = torch.randn(32, 20, 512) # batch=32, seq_len=20, d_model=512
pos_enc = PositionalEncoding(512)
x = pos_enc(x)
output = encoder_layer(x)
print(output.shape) # torch.Size([32, 20, 512])
五、总结与演进路线
并行差、长程弱
RNN/LSTM
Transformer 2017
BERT 2018
(理解)
GPT 2018
(生成)
RoBERTa/DistilBERT
GPT-2/3/4
ViT 2020
(视觉)
DETR
(目标检测)
SpeechFormer
(语音)
✅ 现代实践建议:
- NLP 理解任务 → BERT / RoBERTa
- NLP 生成任务 → GPT / LLaMA
- 视觉任务 → ViT / Swin Transformer
- 快速部署 → DistilBERT / TinyBERT
资料关注
公众号:咚咚王
gitee:https://gitee.com/wy18585051844/ai_learning
《Python编程:从入门到实践》
《利用Python进行数据分析》
《算法导论中文第三版》
《概率论与数理统计(第四版) (盛骤) 》
《程序员的数学》
《线性代数应该这样学第3版》
《微积分和数学分析引论》
《(西瓜书)周志华-机器学习》
《TensorFlow机器学习实战指南》
《Sklearn与TensorFlow机器学习实用指南》
《模式识别(第四版)》
《深度学习 deep learning》伊恩·古德费洛著 花书
《Python深度学习第二版(中文版)【纯文本】 (登封大数据 (Francois Choliet)) (Z-Library)》
《深入浅出神经网络与深度学习+(迈克尔·尼尔森(Michael+Nielsen)》
《自然语言处理综论 第2版》
《Natural-Language-Processing-with-PyTorch》
《计算机视觉-算法与应用(中文版)》
《Learning OpenCV 4》
《AIGC:智能创作时代》杜雨+&+张孜铭
《AIGC原理与实践:零基础学大语言模型、扩散模型和多模态模型》
《从零构建大语言模型(中文版)》
《实战AI大模型》
《AI 3.0》