← 返回AI教程
速查手册
速查手册
张量操作
| API | 说明 | 示例 |
|---|---|---|
torch.tensor(data) | 从列表/数组创建张量 | torch.tensor([[1,2],[3,4]]) |
torch.zeros / ones | 创建全零 / 全一张量 | torch.zeros(3, 4) |
torch.randn | 标准正态分布随机张量 | torch.randn(2, 3) |
.to(device) | 移动到 GPU / CPU | x.to('cuda') |
.view() / .reshape() | 改变形状(view 要求连续) | x.view(-1, 28*28) |
.squeeze() / .unsqueeze() | 去除 / 添加长度为 1 的维度 | x.unsqueeze(0) |
.detach() | 脱离计算图(不追踪梯度) | loss.detach().item() |
torch.cat | 沿指定维度拼接张量 | torch.cat([a, b], dim=0) |
nn.Module 自定义模型
python
import torch
import torch.nn as nn
class MyModel(nn.Module):
def __init__(self, in_dim, hidden_dim, out_dim):
super().__init__()
self.fc1 = nn.Linear(in_dim, hidden_dim)
self.relu = nn.ReLU()
self.dropout = nn.Dropout(0.5)
self.fc2 = nn.Linear(hidden_dim, out_dim)
def forward(self, x):
x = self.fc1(x)
x = self.relu(x)
x = self.dropout(x)
x = self.fc2(x)
return x
model = MyModel(784, 256, 10)
print(sum(p.numel() for p in model.parameters())) # 参数量标准训练循环
python
model = MyModel(784, 256, 10).to(device)
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)
for epoch in range(num_epochs):
model.train() # 训练模式(启用 Dropout/BN)
for x, y in train_loader:
x, y = x.to(device), y.to(device)
optimizer.zero_grad() # 清空梯度
pred = model(x) # 前向传播
loss = criterion(pred, y) # 计算损失
loss.backward() # 反向传播
optimizer.step() # 更新参数
# 验证
model.eval() # 推理模式
with torch.no_grad(): # 不计算梯度
correct = 0
for x, y in val_loader:
pred = model(x.to(device))
correct += (pred.argmax(1) == y.to(device)).sum().item()
print(f"Epoch {epoch}: val_acc={correct/val_total:.4f}")数据处理 Dataset & DataLoader
python
from torch.utils.data import Dataset, DataLoader
from torchvision import transforms
# 自定义 Dataset
class MyDataset(Dataset):
def __init__(self, data, labels, transform=None):
self.data = data
self.labels = labels
self.transform = transform
def __len__(self):
return len(self.data)
def __getitem__(self, idx):
x, y = self.data[idx], self.labels[idx]
if self.transform:
x = self.transform(x)
return x, y
# 常用 transforms
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize(mean=[0.5], std=[0.5]),
transforms.RandomHorizontalFlip(), # 数据增强
])
# DataLoader
loader = DataLoader(
MyDataset(data, labels, transform),
batch_size=64, shuffle=True, num_workers=4
)
# 模型保存与加载
torch.save(model.state_dict(), 'model.pth')
model.load_state_dict(torch.load('model.pth'))| 损失函数 | 公式 | 适用场景 | 优缺点 |
|---|---|---|---|
| MSE 均方误差 | L = mean((y - ŷ)²) | 回归任务;对大误差敏感 | + 凸函数、易优化 - 对离群点敏感 |
| MAE 平均绝对误差 | L = mean(|y - ŷ|) | 回归;数据含离群点 | + 鲁棒抗离群 - 零点不可导、收敛慢 |
| CrossEntropy 交叉熵 | L = -Σ yᵢ log(ŷᵢ) | 分类任务(配合 Softmax) | + 梯度不饱和、收敛快 - 需注意数值稳定 |
| BCE 二分类交叉熵 | L = -[y log ŷ + (1-y)log(1-ŷ)] | 二分类、多标签分类 | + 概率输出直观 - 标签需在 [0,1] |
| Hinge 合页损失 | L = max(0, 1 - y·ŷ) | SVM、最大间隔分类 | + 追求最大间隔 - 非光滑、对噪声敏感 |
| Focal Loss | FL = -α(1-ŷ)^γ · y log ŷ | 类别极不平衡(检测) | + 抑制易样本、聚焦难样本 - 需调 α、γ 超参 |
| KL 散度 | L = Σ p log(p/q) | 分布逼近、知识蒸馏 | + 衡量分布差异 - 非对称、非度量 |
| Triplet Loss | L = max(0, d(a,p) - d(a,n) + m) | 度量学习、人脸识别 | + 学到嵌入空间 - 样本采样困难 |
速记口诀:回归用 MSE(精度优先)或 MAE(鲁棒优先);多分类用 CrossEntropy + Softmax;二分类/多标签用 BCE;类别不平衡用 Focal Loss;分布对齐用 KL 散度。
| 优化器 | 核心公式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| SGD | θ ← θ - η·g | 简单;泛化好 | 收敛慢;易震荡;需调 lr | 凸优化;CV 精调 |
| Momentum | v ← βv + g<br/>θ ← θ - η·v | 加速收敛;抑制震荡 | 多一个超参 β | 稀疏梯度;陡峭曲面 |
| AdaGrad | θ ← θ - η·g / √(Σg²) | 自适应 lr;适合稀疏特征 | lr 单调递减,后期停滞 | NLP 词嵌入;稀疏数据 |
| RMSProp | E ← βE + (1-β)g²<br/>θ ← θ - η·g/√E | 指数衰减解决 AdaGrad 停滞 | 仍需手调 lr | 非平稳目标;RNN |
| Adam | m,v ← βm+g, βv+g²<br/>θ ← θ - η·m̂/√v̂ | 动量+自适应+偏差修正;开箱即用 | 泛化有时不如 SGD | 默认首选;Transformer/LLM |
| AdamW | Adam + 解耦权重衰减 | 权重衰减更合理;泛化更好 | 需调 weight_decay | 大模型训练标配 |
选型建议:快速实验 / 原型 → Adam(默认参数);追求极致精度 / 论文复现 → SGD + Momentum + 学习率调度;Transformer / LLM → AdamW + Warmup + Cosine Decay。
| 激活函数 | 公式 | 导数 | 优点 | 缺点 |
|---|---|---|---|---|
| Sigmoid | σ(x) = 1/(1+e⁻ˣ) | σ(1-σ) | 输出 (0,1),适合概率 | 梯度消失;非零中心 |
| Tanh | tanh(x) = (eˣ-e⁻ˣ)/(eˣ+e⁻ˣ) | 1 - tanh²(x) | 零中心;比 Sigmoid 梯度大 | 仍有梯度消失 |
| ReLU | max(0, x) | 1 if x>0 else 0 | 计算快;缓解梯度消失;稀疏 | 神经元死亡(负区梯度为 0) |
| LeakyReLU | max(αx, x), α=0.01 | 1 if x>0 else α | 解决死亡 ReLU | α 需调参;效果提升有限 |
| GELU | x · Φ(x) | Φ(x) + xφ(x) | 平滑可导;Transformer 标配 | 计算稍贵(需 erf) |
| SwiGLU | Swish(xW₁) ⊗ (xW₂) | 门控复合 | LLM FFN 标配;性能更强 | 参数翻倍;计算量大 |
| ELU | x if x>0 else α(eˣ-1) | 1 if x>0 else αeˣ | 负区有梯度且零中心 | 指数计算开销 |
选型建议:隐藏层默认 ReLU(快且稳);Transformer / GPT / BERT 用 GELU;现代 LLM(LLaMA 等)的 FFN 用 SwiGLU;输出层二分类用 Sigmoid,多分类用 Softmax。
| 方法 | 机制 | 施加位置 | 适用场景 | 注意点 |
|---|---|---|---|---|
| L1 正则 | 损失加 λΣ|w|,产生稀疏权重 | 损失函数(权重上) | 特征选择;模型压缩 | 不可导处需次梯度 |
| L2 正则 | 损失加 λΣw²,权重衰减 | 损失函数(权重上) | 通用防过拟合;权重衰减 | 不产生真正稀疏 |
| Dropout | 训练时随机置零 p 比例神经元 | 全连接层之间 | CNN/MLP 防过拟合 | 推理时关闭;需缩放 |
| BatchNorm | 按 batch 维度归一化 + 可学习缩放 | 卷积/全连接后、激活前 | CV 图像;大 batch 训练 | 依赖 batch size;推理需运行均值 |
| LayerNorm | 按特征维度归一化(单样本) | 每个样本特征维归一化 | Transformer / RNN / LLM | 不依赖 batch;序列首选 |
| RMSNorm | 只用均方根归一化,去均值 | 同 LayerNorm 位置 | LLaMA 等现代 LLM | 比 LN 快约 7-10% |
| 权重衰减 | 每步参数 ×(1-ηλ),等价 L2(SGD) | 优化器参数 | AdamW 用解耦版本 | Adam 上 L2 ≠ 权重衰减 |
速记:BN 看批次(图像/CV),LN 看特征(序列/NLP/LLM);Dropout 用于全连接;L1 选特征,L2 通用防过拟合;AdamW 用解耦权重衰减替代 L2。
| 注意力类型 | 机制说明 | Q / K / V 来源 | 复杂度 | 适用场景 |
|---|---|---|---|---|
| Self-Attention 自注意力 | 序列内每个位置关注所有位置 | Q=K=V 来自同一序列 | O(n²·d) | Transformer 编码器;BERT |
| Masked Self-Attention | 因果掩码,只看过去位置 | Q=K=V 同序列(上三角掩码) | O(n²·d) | GPT 解码器;自回归生成 |
| Multi-Head 多头注意力 | 并行 h 个头,各关注不同子空间 | 每头独立投影 Q/K/V | O(n²·d) | 所有 Transformer 标配 |
| Cross-Attention 交叉注意力 | 一个序列关注另一个序列 | Q 来自解码器,K/V 来自编码器 | O(n·m·d) | Seq2Seq 解码器;多模态对齐 |
| TriAttention 三重注意力 | 跨维度(通道+空间)三路注意力 | Q/K/V 跨通道与空间维度 | O(n²·d) | 视觉任务;细粒度特征建模 |
| Sparse Attention 稀疏注意力 | 只关注局部窗口或固定模式 | 同 Self-Attention,但掩码稀疏 | O(n·log n) | 长序列;Longformer/BigBird |
| Grouped-Query GQA | 多 Query 共享一组 K/V 头 | Q 有 h 头,K/V 有 g 组 | O(n²·d) 计算不变 | LLM 推理降 KV 缓存;LLaMA-2 |
| Flash Attention | 分块计算,减少 HBM 读写 | 同标准注意力 | O(n²) 计算,IO 大减 | 加速训练;显存友好 |
核心公式:Attention(Q,K,V) = softmax(QKᵀ/√dₖ)·V。自注意力 Q=K=V 同源;交叉注意力 Q 与 K/V 不同源;多头把 d 维拆成 h 个 d/h 子空间并行计算后拼接。
| 超参数 | 符号 | 典型值 | 含义 | 调整建议 |
|---|---|---|---|---|
| 模型维度 | d_model | 512 / 1024 / 4096 | 每个 token 的表示维度 | 越大容量越大,参数按 d² 增长 |
| 注意力头数 | num_heads (h) | 8 / 16 / 32 | 并行注意力模式数 | 须满足 d_model = h × d_k;d_k 常 64 |
| 编码/解码层数 | num_layers (N) | 6 / 12 / 24 / 32 | 处理遍数 / 网络深度 | 越深理解越深,但训练更难 |
| FFN 维度 | d_ff | 4 × d_model | 前馈网络内部升维宽度 | 通常 4 倍 d_model;SwiGLU 用 ⅔ 缩放 |
| Dropout | p_drop | 0.1 / 0.3 | 随机置零比例 | 模型越大可适当调大(0.1→0.3) |
| 每头维度 | d_k | 64 / 128 | 单头注意力宽度 | 经验值 64 最稳;先定 d_k 再推 d_model |
| 学习率 | lr | 1e-4 ~ 5e-4 | AdamW 初始学习率 | 配 Warmup + Cosine Decay |
| Batch Size | batch | 32 ~ 4M tokens | 每次更新 token 数 | 大 batch 配大 lr;用梯度累积 |
| 模型 | d_model | heads | layers | d_ff | 参数量 |
|---|---|---|---|---|---|
| Transformer-Base | 512 | 8 | 6 | 2048 | ~65M |
| BERT-Base | 768 | 12 | 12 | 3072 | ~110M |
| GPT-2 (小) | 768 | 12 | 12 | 3072 | ~124M |
| LLaMA-2 7B | 4096 | 32 | 32 | 11008 | ~7B |
| 技术 | 原理 | 加速效果 | 内存影响 | 适用场景 |
|---|---|---|---|---|
| KV Cache | 缓存已计算的 K/V,避免重复计算 | 解码步计算从 O(n²) 降到 O(n) | 显存随序列长度线性增长 | 所有自回归推理标配 |
| PagedAttention | 分页管理 KV Cache,类似虚拟内存 | 吞吐提升 2-4 倍 | 碎片减少,利用率近 100% | vLLM;高并发服务 |
| 量化 (Quant) | FP16→INT8/INT4 降低精度 | 显存减半/四分之一;速度提升 | 显存大幅降低 | 边缘部署;显存受限 |
| GPTQ / AWQ | 训练后量化(权重量化) | INT4 几乎无损,2-3 倍加速 | 权重显存降 75% | 离线量化部署 |
| 投机解码 Speculative | 小模型草拟,大模型并行验证 | 2-3 倍加速(接受率高时) | 额外小模型显存 | 低延迟对话;接受率高的场景 |
| Flash Attention | 分块计算减少 HBM 读写 | 训练 2-4 倍加速 | 显存 O(n) 而非 O(n²) | 训练与长序列推理 |
| Continuous Batching | 动态拼接不同请求的 token | GPU 利用率大幅提升 | 需管理变长序列 | 在线服务;多用户并发 |
| KV Cache 量化 | 缓存 K/V 量化到 INT8/FP8 | 支持更长上下文 | 缓存显存减 50%+ | 长上下文场景 |
部署组合建议:服务端高并发 → vLLM(PagedAttention + Continuous Batching + Flash Attention);显存受限 → AWQ/GPTQ INT4 量化;极致低延迟 → 投机解码;长上下文 → KV Cache 量化 + 稀疏注意力。
使用提示
- 点击各卡片标题可展开 / 收起,便于聚焦关注内容
- 表格支持横向滚动,移动端可左右滑动查看完整对比
- 想深入了解某个主题,可返回 AI 教程查看对应章节的完整讲解