共计 1569 个字符,预计需要花费 4 分钟才能阅读完成。
核心概念对比:架构设计的本质差异
BERT 和 GPT 系列模型虽然都基于 Transformer,但核心架构存在根本性区别。这种差异直接影响了它们的能力边界和适用场景。
- BERT 的双向编码器结构
- 采用 Transformer 的纯编码器堆叠(论文中基础版 12 层)
- 通过完全双向的注意力机制捕获上下文信息
-
典型特征:每个 token 的表示都融合了全局上下文
-
GPT 的自回归解码器结构
- 使用带掩码的单向解码器(GPT- 3 多达 96 层)
- 仅允许关注左侧上下文,符合文本生成特性
- 关键限制:无法像 BERT 那样获得 ” 未来 ”token 信息

预训练目标:截然不同的学习范式
模型性能差异的根源在于预训练目标的设计,这决定了模型如何理解语言。
BERT 的 MLM 目标
数学表达:
L_MLM = -∑ log P(x_i | x_{masked})
– 随机掩盖 15% 的输入 token
– 必须同时利用左右上下文预测被掩盖词
– 适合学习深度上下文表征
GPT 的 Next Token Prediction
数学表达:
L_NTP = -∑ log P(x_{t+1} | x_{≤t})
– 标准语言模型目标
– 逐步预测序列下一个 token
– 天然适配生成任务
代码实战:注意力可视化
通过 PyTorch 实现注意力头可视化,关键要包含层规范化和残差连接:
import torch
from torch import nn
import matplotlib.pyplot as plt
class AttentionVisualizer(nn.Module):
def __init__(self, d_model=768, n_heads=12):
super().__init__()
self.qkv = nn.Linear(d_model, d_model*3) # [batch, seq, d_model*3]
self.proj = nn.Linear(d_model, d_model)
self.n_heads = n_heads
def forward(self, x):
# LayerNorm 和残差连接
residual = x
x = nn.LayerNorm(x.shape[-1])(x)
# 拆分 QKV [batch, seq, head, d_k]
qkv = self.qkv(x)
q, k, v = torch.chunk(qkv, 3, dim=-1)
q = q.view(*q.shape[:2], self.n_heads, -1)
# 计算注意力权重
attn = torch.einsum('bqhd,bkhd->bhqk', q, k) / (q.shape[-1]**0.5)
return attn.softmax(dim=-1)
# 可视化示例
visualizer = AttentionVisualizer()
attn_map = visualizer(torch.randn(1, 64, 768))
plt.imshow(attn_map[0,0].detach().numpy())
生产环境关键考量
显存占用对比(V100 32GB)
| 模型 | batch_size=32 | 序列长度 512 |
|---|---|---|
| BERT-base | 18.7GB | |
| GPT2-medium | 22.4GB |
微调学习率建议
- BERT:2e- 5 到 5e-5
- GPT:比预训练时小 1 - 2 个数量级
避坑指南
- 长文本位置编码
- BERT 的绝对位置编码在 512token 后失效
-
解决方案:使用 Longformer 或 Reformer 等改进架构
-
混合精度训练
- 梯度裁剪阈值建议在 1.0-2.0 之间
- AMP 模式下适当增大 10-20%
开放问题
在多模态场景下,如何设计跨模态的注意力机制?当前主流方案有:
– 共享注意力头的跨模态交互
– 模态特定子网络 + 交叉注意力
– 但如何平衡计算效率和表征能力仍是开放问题
通过这次对比分析,我们可以看到 BERT 更适合需要深度理解的任务(如分类、QA),而 GPT 系列在生成任务上表现卓越。实际选择时,还需要考虑计算资源、延迟要求等工程因素。
正文完
发表至: 人工智能
近一天内
