共计 3303 个字符,预计需要花费 9 分钟才能阅读完成。
【认知框架】AI 核心概念与技术图谱
- 监督学习 vs 无监督学习
- 监督学习(Supervised Learning):需要带标签的数据,如分类(Classification)和回归(Regression)
- 典型算法:线性回归(Linear Regression)、支持向量机(SVM)
-
无监督学习(Unsupervised Learning):无标签数据,如聚类(Clustering)和降维(Dimensionality Reduction)

- 典型算法:K-Means、PCA(Principal Component Analysis)
-
特征工程(Feature Engineering)
- 作用:将原始数据转化为模型可理解的特征
-
常见操作:归一化(Normalization)、独热编码(One-Hot Encoding)、文本向量化(TF-IDF/Word2Vec)
-
损失函数(Loss Function)与优化
- 交叉熵损失(Cross-Entropy Loss):$L = -\sum y_i\log(p_i)$,用于分类任务
- 均方误差(MSE):$L = \frac{1}{n}\sum (y_i – \hat{y}_i)^2$,用于回归任务
-
反向传播(Backpropagation):通过链式法则计算梯度
-
符号主义 vs 连接主义
- 符号主义(Symbolism):基于规则和逻辑推理(如专家系统)
- 连接主义(Connectionism):基于神经网络的数据驱动学习(如深度学习)
【模型选型】主流模型对比与工业应用
| 模型类型 | 适用领域 | 计算复杂度 | 数据需求 | 硬件适配性 | 典型案例 |
|---|---|---|---|---|---|
| CNN | 图像处理(CV) | 中等(O(n^2)) | 需要大量标注 | GPU 加速显著 | ResNet(图像分类) |
| RNN/LSTM | 时序数据(NLP) | 较高(O(T)) | 中等规模 | 并行化困难 | 股票预测 |
| Transformer | NLP/CV | 高(O(n^2)) | 海量数据 | TPU/GPU 集群 | BERT(文本理解) |
工业案例
– BERT:谷歌搜索的语义理解
– ResNet:医学影像分析(如 X 光片分类)
【实战演示】PyTorch 实现 MNIST 分类
1. 数据预处理
import torch
from torchvision import transforms, datasets
# 数据标准化(均值为 0.5,标准差为 0.5)transform = transforms.Compose([transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,)) # MNIST 是单通道
])
# 加载数据集并构建 DataLoader
train_set = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
train_loader = torch.utils.data.DataLoader(train_set, batch_size=64, shuffle=True)
2. CNN 模型定义(带 Dropout 和 BN)
import torch.nn as nn
import torch.nn.functional as F
class CNN(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(1, 32, kernel_size=3) # 输入 1 通道,输出 32 通道
self.bn1 = nn.BatchNorm2d(32)
self.conv2 = nn.Conv2d(32, 64, kernel_size=3)
self.dropout = nn.Dropout(0.25) # 随机丢弃 25% 神经元
self.fc = nn.Linear(1600, 10) # 最终输出 10 类(MNIST 有 0 - 9 数字)def forward(self, x):
x = F.relu(self.bn1(self.conv1(x))) # [B,1,28,28] -> [B,32,26,26]
x = F.max_pool2d(x, 2) # -> [B,32,13,13]
x = F.relu(self.conv2(x)) # -> [B,64,11,11]
x = F.max_pool2d(x, 2) # -> [B,64,5,5]
x = self.dropout(x)
x = torch.flatten(x, 1) # -> [B,1600]
return self.fc(x)
3. 训练循环(含学习率衰减与早停)
from torch.optim.lr_scheduler import ReduceLROnPlateau
model = CNN()
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
scheduler = ReduceLROnPlateau(optimizer, 'min', patience=2) # 验证损失不降时降低学习率
best_loss = float('inf')
for epoch in range(10):
model.train()
for images, labels in train_loader:
optimizer.zero_grad()
outputs = model(images)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
# 验证阶段(代码略)val_loss = ...
scheduler.step(val_loss)
if val_loss < best_loss: # 早停法判断
best_loss = val_loss
else:
break
【生产考量】性能优化技巧
- FP16 混合精度训练
- 节省显存约 50%,加速计算 20%+
-
代码示例:
from torch.cuda.amp import autocast, GradScaler scaler = GradScaler() for inputs, labels in dataloader: optimizer.zero_grad() with autocast(): # 自动混合精度 outputs = model(inputs) loss = criterion(outputs, labels) scaler.scale(loss).backward() # 缩放梯度 scaler.step(optimizer) scaler.update() -
显存不足时的梯度累积
accum_steps = 4 # 累积 4 个 batch 的梯度 for i, (inputs, labels) in enumerate(dataloader): outputs = model(inputs) loss = criterion(outputs, labels) / accum_steps # 损失按累积步数缩放 loss.backward() if (i+1) % accum_steps == 0: # 每 4 个 batch 更新一次参数 optimizer.step() optimizer.zero_grad()
【避坑指南】常见问题解决方案
- 验证集泄露检测
- 检查训练数据中是否包含验证集样本(通过 MD5 哈希比对)
-
使用
sklearn.model_selection.train_test_split时确保随机种子固定 -
类别不平衡时的评估指标
- Accuracy(准确率)不可靠:若 90% 样本为 A 类,全预测 A 也有 90% 准确率
-
使用 F1-score(精确率与召回率的调和平均):$F1 = \frac{2 \times precision \times recall}{precision + recall}$
-
模型部署陷阱
- ONNX 转换时注意动态轴问题(如 batch_size 需明确指定)
- TorchScript 不支持部分 Python 原生控制流(需改用
torch.jit.script_if_tracing)
开放性问题
在小样本场景下,如何评估预训练模型微调的效果可靠性?可以考虑:
– 使用 K 折交叉验证(K-Fold Cross Validation)
– 对比微调前后在测试集上的 F1-score 差异
– 检查模型预测结果的置信度分布(Calibration Curve)
正文完

