深度学习使用数据、目标函数、优化器和评测协议训练参数化函数。架构很重要,但数据切分、预处理、计算预算、复现记录和失败分析同样重要。不存在适用于所有任务的“最佳架构”。

一个实用的心智模型

给定输入 (x)、参数 (\theta) 和目标 (y),一次训练步骤通常会:

  1. 计算预测值 (\hat y = f_\theta(x));
  2. 计算损失 (L(\hat y, y));
  3. 通过自动微分得到 (\nabla_\theta L);
  4. 使用优化器更新参数;
  5. 在不更新参数的情况下评估留出样本。

模型不会自动“理解”数据,而是在数据和系统提供的归纳偏置下,最小化指定目标。

神经网络基础

全连接层可以表示为仿射变换加非线性函数:

python
def layer(x, weight, bias, activation):
    return activation(x @ weight.T + bias)

没有非线性激活时,多层仿射变换仍可合并成一个仿射变换。激活函数、归一化、架构和损失共同决定哪些函数容易学习。

反向传播与优化

反向传播使用微积分链式法则,在计算图中复用中间导数。自动微分负责计算导数,但不会替你选择合理目标,也不会阻止数据泄漏。

对参数 (\theta) 的基本更新为:

[ \theta_{t+1} = \theta_t - \eta \nabla_\theta L(\theta_t) ]

其中 (\eta) 是学习率。小批量在梯度噪声和吞吐之间折中。SGD、Momentum、Adam 和 AdamW 的正则化与收敛行为不同,“自适应”不等于“总是更好”。

最小可复现的 PyTorch 步骤

python
import torch

model = torch.nn.Linear(4, 2)
optimizer = torch.optim.AdamW(model.parameters(), lr=1e-3, weight_decay=1e-4)
loss_fn = torch.nn.CrossEntropyLoss()

features = torch.randn(8, 4)
labels = torch.randint(0, 2, (8,))

optimizer.zero_grad(set_to_none=True)
logits = model(features)
loss = loss_fn(logits, labels)
loss.backward()
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
optimizer.step()

这是训练步骤示意,不是完整生产配方。真实实验应记录框架和 GPU 版本、随机种子策略、数据修订、批次构造、学习率计划、检查点和评测代码。

架构家族

卷积网络

卷积共享局部滤波器,适合具有局部性和位移结构的图像、音频及空间信号任务。池化并非必需,它以空间分辨率换取计算量和不变性。现代视觉系统也会使用注意力与混合设计,因此“所有图像任务都用 CNN”不是规则。

循环网络

RNN 按序列更新隐藏状态。LSTM 和 GRU 的门控有助于优化长依赖,但串行执行可能限制吞吐。它们仍适合部分流式和资源受限任务;选择应依据延迟、内存、序列长度和数据条件。

Transformer

Transformer 使用注意力、前馈层和位置信息。并行训练与灵活的上下文混合使其常见于语言、视觉、音频和多模态系统,但注意力成本、上下文限制、分词、内存和数据质量仍是硬边界。

潜变量与生成模型

  • 自编码器:为重建目标学习编码器/解码器;
  • VAE:约束概率潜变量分布,通常在重建项和 KL 项之间权衡;
  • GAN:优化生成器与判别器的对抗博弈,可能不稳定或偏向部分模式;
  • 扩散模型:围绕噪声计划学习去噪或 Score 相关目标,采样成本与引导策略会影响质量和多样性。

模型名称不能证明“最先进”。任何比较都应注明带日期的模型版本、数据集、Prompt 或预处理、计算预算、指标定义,以及可行时的方差或不确定性。

数据与评测

数据集本身就是模型的一部分。需要定义:

  • 分析单位和标签政策;
  • 训练/验证/测试或按时间切分;
  • 去重和近重复处理;
  • 缺失值、增强和归一化;
  • 许可证、同意、隐私和保留期限;
  • 类别不平衡与子群覆盖。

不要在测试集上调参。对于时间或用户数据,如果随机切分会泄漏,应按时间或实体切分。报告基线、可行时的置信区间或重复运行,并分析失败切片,而不是只给一个总体分数。

数据增强必须保持标签语义。会改变类别的旋转、裁剪或亮度变化,不能被当作通用增强。

泛化与优化失败

过拟合与欠拟合

训练损失不能证明泛化。应比较训练/验证曲线,使用固定评测协议,并检查预处理或超参搜索是否泄漏验证信息。正则化、早停、增强或更多数据可能有帮助,但都会改变偏差—方差权衡。

梯度消失、爆炸与不稳定

可能的缓解手段包括初始化、归一化、残差路径、门控单元、降低学习率、混合精度损失缩放和梯度裁剪。先检查梯度范数与激活统计,再针对失败模式选择方法。

分布偏移

模型可能在历史测试集上得分良好,却在用户、传感器、政策、语言或标签定义变化后失效。应监控输入与结果漂移,定义重训练触发条件,并保留可回滚模型和数据快照。

可复现性与生产边界

记录代码版本、锁文件、数据快照、特征预处理、模型配置、随机种子、硬件、训练时长、检查点和评测输出。种子只能减少一种变化来源,不能保证不同硬件和算子上逐位确定性。

生产质量还包括:

  • 输入/输出 Schema 校验;
  • 访问控制和租户隔离;
  • 速率、内存和超时预算;
  • 模型与数据血缘;
  • 隐私安全日志;
  • 灰度或 Shadow 评测;
  • 回滚与事故响应。

训练模型不等于获得数据使用许可,高指标也不能证明模型对未测试人群安全或公平。

常见问题

需要多少训练数据?

没有通用样本数。它取决于任务熵、标签噪声、模型容量、迁移学习、部署场景覆盖和评测不确定性。应通过学习曲线和有记录的数据采集计划估计,而不是套用固定数字。

为什么需要激活函数?

没有非线性时,多层仿射层会退化为一个仿射映射。激活函数扩大可表示的函数族,但其数值行为也会影响优化和硬件效率。

模型越大越好吗?

不一定。数据和计算足够时大模型可能改善测量任务,也可能过拟合、增加延迟与成本,或放大伪相关。应在固定协议下比较,并纳入运维约束。

CNN、RNN 和 Transformer 哪个最好?

没有普遍答案。根据局部性、序列长度、流式需求、上下文、内存、延迟、数据量和工具链选择,并记录实际测试版本与权衡。

延伸阅读

总结

深度学习是一套由目标函数、数据管线、可微程序、优化器和评测契约组成的实验学科。理解机制只是起点;可信结果还需要防泄漏切分、可复现记录、失败切片、运维限制和回滚方案。