以下是 PyTorch 框架的核心代码结构、主要类与函数介绍,以及包含 Transformer 的架构图说明:
1. PyTorch 核心代码结构
PyTorch 的代码结构可分为 核心计算层、自动微分层、神经网络层 和 工具层,具体分层如下:
PyTorch 框架架构
├── **核心计算层 (Torch)**
│ ├── Tensor 操作 (CPU/GPU 张量)
│ ├── 数学运算 (加减乘除、矩阵操作)
│ └── 内存管理
│
├── **自动微分层 (Autograd)**
│ ├── Function 类(定义反向传播)
│ └── Engine(计算梯度)
│
├── **神经网络层 (nn.Module)**
│ ├── Layer 类(卷积、全连接、RNN 等)
│ ├── 损失函数(CrossEntropyLoss, MSELoss)
│ ├── 优化器(SGD, Adam)
│ └── **Transformer 模块**(nn.Transformer, MultiheadAttention)
│
├── **工具层**
│ ├── 数据加载(Dataset, DataLoader)
│ ├── 模型保存(torch.save, torch.load)
│ └── 分布式训练(DistributedDataParallel)
│
└── **扩展库**
├── TorchVision(图像处理)
├── TorchText(NLP)
└── TorchAudio(音频处理)
2. 主要类与函数
(1) 核心计算层
torch.Tensor
: 多维数组,支持 GPU 加速和自动微分。
x = torch.tensor([1, 2, 3], dtype=torch.float32, device="cuda")
- 数学运算:
y = torch.matmul(x, w) # 矩阵乘法
z = torch.sum(x, dim=0) # 求和
(2) 自动微分层
torch.autograd.Function
: 自定义前向和反向传播。- 梯度计算:
x.requires_grad = True
y = x * 2
y.backward() # 计算梯度
print(x.grad) # 输出梯度值
(3) 神经网络层
nn.Module
: 所有神经网络模块的基类。
class MyModel(nn.Module):
def __init__(self):
super().__init__()
self.linear = nn.Linear(10, 5)
def forward(self, x):
return self.linear(x)
- 损失函数:
loss_fn = nn.CrossEntropyLoss()
loss = loss_fn(output, target)
- 优化器:
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
optimizer.step()
(4) Transformer 模块
PyTorch 内置了完整的 Transformer 实现(torch.nn.Transformer
):
- 核心类:
nn.Transformer
: 完整的 Transformer 模型。nn.TransformerEncoder
和nn.TransformerDecoder
: 编码器与解码器。nn.MultiheadAttention
: 多头注意力机制。
- 位置编码:
pe = torch.zeros(max_len, d_model)
position = torch.arange(0, max_len).unsqueeze(1)
div_term = torch.exp(torch.arange(0, d_model, 2) * (-math.log(10000.0) / d_model))
pe[:, 0::2] = torch.sin(position * div_term) # 正弦编码
pe[:, 1::2] = torch.cos(position * div_term)
3. Transformer 架构图
PyTorch 的 nn.Transformer
结构如下(以机器翻译为例):
Input Sequence
↓
Embedding + Positional Encoding
↓
→ [Transformer Encoder] →
(Multi-head Attention → Feed Forward)
↓
← [Transformer Decoder] ←
(Masked Multi-head Attention → Cross Attention → Feed Forward)
↓
Linear Projection
↓
Output Sequence
关键组件说明
(1)Encoder:
-
- 由多个
TransformerEncoderLayer
堆叠而成。 - 每个层包含多头自注意力和前馈网络。
- 由多个
(2)Decoder:
-
- 由多个
TransformerDecoderLayer
堆叠而成。 - 包含掩码多头自注意力(防止未来信息泄露)、交叉注意力(关注 Encoder 输出)和前馈网络。
- 由多个
4. 完整代码示例(Transformer 实现)
以下是一个简化的 Transformer 机器翻译模型代码:
import torch
import torch.nn as nn
class TransformerTranslator(nn.Module):
def __init__(self, src_vocab_size, tgt_vocab_size, d_model=512, nhead=8, num_layers=6):
super().__init__()
self.encoder_embed = nn.Embedding(src_vocab_size, d_model)
self.decoder_embed = nn.Embedding(tgt_vocab_size, d_model)
self.transformer = nn.Transformer(
d_model=d_model,
nhead=nhead,
num_encoder_layers=num_layers,
num_decoder_layers=num_layers
)
self.fc_out = nn.Linear(d_model, tgt_vocab_size)
def forward(self, src, tgt):
# 添加位置编码(示例,需自定义)
src_embed = self.encoder_embed(src)
tgt_embed = self.decoder_embed(tgt)
# 生成掩码(防止未来信息泄露)
tgt_mask = nn.Transformer.generate_square_subsequent_mask(tgt.size(0))
# Transformer 前向传播
output = self.transformer(
src_embed, tgt_embed,
tgt_mask=tgt_mask
)
return self.fc_out(output)
# 示例用法
model = TransformerTranslator(src_vocab_size=10000, tgt_vocab_size=8000)
src = torch.randint(0, 10000, (10, 32)) # (seq_len, batch_size)
tgt = torch.randint(0, 8000, (10, 32))
output = model(src, tgt)
print(output.shape) # (tgt_seq_len, batch_size, tgt_vocab_size)
5. 核心函数与参数
(1) nn.Transformer
参数
参数 | 说明 |
---|---|
d_model | 特征维度(如 512) |
nhead | 多头注意力的头数(如 8) |
num_encoder_layers | Encoder 层数(如 6) |
num_decoder_layers | Decoder 层数(如 6) |
(2) 训练流程
# 数据加载
dataset = MyDataset(...)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)
# 训练循环
for epoch in range(100):
for src, tgt in dataloader:
output = model(src, tgt[:-1]) # 输入 tgt 的前 n-1 个词
loss = loss_fn(output.view(-1, tgt_vocab_size), tgt[1:].view(-1))
optimizer.zero_grad()
loss.backward()
optimizer.step()
6. 总结
- PyTorch 架构:以张量计算为核心,通过
autograd
实现自动微分,nn.Module
管理神经网络层。 - Transformer 实现:使用
nn.Transformer
类快速搭建模型,需自定义位置编码和数据掩码。 - 关键点:理解多头注意力、位置编码和掩码机制在序列生成任务中的作用。