AI基础概念与常用模型解析:从入门到实战避坑指南

1次阅读
没有评论

共计 3303 个字符,预计需要花费 9 分钟才能阅读完成。

image.webp

【认知框架】AI 核心概念与技术图谱

  1. 监督学习 vs 无监督学习
  2. 监督学习(Supervised Learning):需要带标签的数据,如分类(Classification)和回归(Regression)
    • 典型算法:线性回归(Linear Regression)、支持向量机(SVM)
  3. 无监督学习(Unsupervised Learning):无标签数据,如聚类(Clustering)和降维(Dimensionality Reduction)

    AI 基础概念与常用模型解析:从入门到实战避坑指南

    • 典型算法:K-Means、PCA(Principal Component Analysis)
  4. 特征工程(Feature Engineering)

  5. 作用:将原始数据转化为模型可理解的特征
  6. 常见操作:归一化(Normalization)、独热编码(One-Hot Encoding)、文本向量化(TF-IDF/Word2Vec)

  7. 损失函数(Loss Function)与优化

  8. 交叉熵损失(Cross-Entropy Loss):$L = -\sum y_i\log(p_i)$,用于分类任务
  9. 均方误差(MSE):$L = \frac{1}{n}\sum (y_i – \hat{y}_i)^2$,用于回归任务
  10. 反向传播(Backpropagation):通过链式法则计算梯度

  11. 符号主义 vs 连接主义

  12. 符号主义(Symbolism):基于规则和逻辑推理(如专家系统)
  13. 连接主义(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

【生产考量】性能优化技巧

  1. FP16 混合精度训练
  2. 节省显存约 50%,加速计算 20%+
  3. 代码示例:

    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()

  4. 显存不足时的梯度累积

    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()


【避坑指南】常见问题解决方案

  1. 验证集泄露检测
  2. 检查训练数据中是否包含验证集样本(通过 MD5 哈希比对)
  3. 使用 sklearn.model_selection.train_test_split 时确保随机种子固定

  4. 类别不平衡时的评估指标

  5. Accuracy(准确率)不可靠:若 90% 样本为 A 类,全预测 A 也有 90% 准确率
  6. 使用 F1-score(精确率与召回率的调和平均):$F1 = \frac{2 \times precision \times recall}{precision + recall}$

  7. 模型部署陷阱

  8. ONNX 转换时注意动态轴问题(如 batch_size 需明确指定)
  9. TorchScript 不支持部分 Python 原生控制流(需改用torch.jit.script_if_tracing

开放性问题

在小样本场景下,如何评估预训练模型微调的效果可靠性?可以考虑:
– 使用 K 折交叉验证(K-Fold Cross Validation)
– 对比微调前后在测试集上的 F1-score 差异
– 检查模型预测结果的置信度分布(Calibration Curve)

正文完
 0
评论(没有评论)