查看全课大纲(第 1 / 40 节)
  1. 1.从规则到学习:深度学习解决什么问题
  2. 2.表示学习与端到端训练
  3. 3.张量、计算图与自动微分
  4. 4.训练三要素:数据、模型、目标函数
  5. 5.从感知机到多层感知机
  6. 6.反向传播:手推一个两层网络
  7. 7.激活函数与初始化
  8. 8.优化器:SGD → Momentum → Adam
  9. 9.正则化:权重衰减、Dropout、BN/LN
  10. 10.卷积的直觉与参数共享
  11. 11.池化、感受野与下采样
  12. 12.经典网络演进:LeNet → AlexNet → VGG → ResNet
  13. 13.残差连接与归一化为什么有效
  14. 14.迁移学习与特征可视化
  15. 15.RNN 与 BPTT
  16. 16.LSTM/GRU:门控如何缓解梯度问题
  17. 17.Seq2Seq 与编码器-解码器
  18. 18.注意力前史:Bahdanau 加性注意力
  19. 19.Self-Attention:QKV 与缩放点积
  20. 20.多头注意力:并行的多种关系
  21. 21.位置编码:正弦与可学习
  22. 22.残差、LayerNorm 与前馈层
  23. 23.从零实现一个最小 Transformer block
  24. 24.训练稳定性、复杂度与常见误区
  25. 25.自监督与语言建模目标
  26. 26.BERT:掩码语言模型与双向编码
  27. 27.GPT:自回归生成与缩放定律
  28. 28.指令微调与对齐:SFT → RLHF/DPO
  29. 29.参数高效微调:LoRA 与适配器
  30. 30.自编码器与 VAE
  31. 31.GAN:对抗训练与模式崩塌
  32. 32.扩散模型:前向加噪与反向去噪
  33. 33.扩散模型的应用与采样加速
  34. 34.对比学习与 CLIP
  35. 35.ViT:把图像当序列
  36. 36.多模态架构:对齐、融合与生成
  37. 37.能力边界、幻觉与评测
  38. 38.PyTorch 2.x 训练循环与混合精度
  39. 39.实验管理、评测与复现
  40. 40.推理部署与成本:量化/蒸馏概览

从规则到学习:深度学习解决什么问题

为什么手工写规则走不通?

小象实战讲义 · 深度学习基础:从神经网络到 Transformer

在编程与数学基础之上,我们即将踏入深度学习的世界。第一课,我们不急于跳入公式和代码,而要回答一个根本问题:深度学习究竟解决了什么传统方法难以应对的挑战?学完本节,你将能清晰地解释:为什么从“人工设计规则”转向“数据驱动学习”是必然趋势,以及深度学习如何通过“端到端”学习范式实现这一转变。本节是后续所有章节(神经网络、卷积、Transformer)的认知基石。

💡 核心导读

  • 范式转变:从“特征工程 + 浅层分类器”的两阶段流水线,转向“特征学习 + 任务目标”联合优化的端到端学习。
  • 核心优势:深度学习模型能够从原始数据中自动学习多层次、抽象的特征表示,尤其在大数据量下性能提升潜力巨大。
  • 问题驱动:深度学习并非万能,它擅长解决那些模式复杂、数据丰富、且传统特征工程成本高昂的问题。
  • 边界:数据极少、要求严格可解释、或规则本身明确的任务,传统方法往往更合适。

🧭 前置知识

  • 矩阵乘法:理解 (m, n) 矩阵与 (n, p) 矩阵相乘得到 (m, p) 矩阵的规则。
  • 函数复合:知道函数 f(g(x)) 的含义,即一个函数的输出是另一个函数的输入。
  • 监督学习基本概念:知道训练数据包含输入 x 和标签 y,目标是学习一个从 x 预测 y 的映射。

人工智能的演进:从规则到学习

早期的人工智能系统严重依赖专家规则。例如,一个早期的国际象棋程序,其“智能”完全由程序员编写的“如果-那么”规则构成。这种方法在定义明确、边界清晰的领域(如下棋)可能有效,但面对现实世界中图像、语音、自然语言等高维度、高噪声、模式复杂的数据时,手工编写规则几乎不可能。

统计机器学习提供了一条新路径:从数据中学习规则。给定输入 x 和期望输出 y(标签),算法自动寻找一个函数 f,使得 f(x) 尽可能接近 y。这避免了手工编码规则,但传统机器学习流程存在一个关键瓶颈:特征工程。

传统机器学习的瓶颈:特征工程

在深度学习兴起之前,一个典型的图像分类流程是这样的:

输入:原始图像像素
    ↓
[特征提取器] (人工设计:SIFT, HOG, LBP...)
    ↓
手工特征向量 (例如,一个 1000 维的向量)
    ↓
[分类器] (机器学习模型:SVM, 随机森林...)
    ↓
输出:类别标签

这个流程是割裂的。特征提取器的设计依赖领域专家经验,目标是提取出“对分类可能有用”的图案(如边缘、纹理)。分类器则在固定特征上学习,无法反馈信息来优化特征提取过程。特征工程成为性能天花板,且迁移到新任务时,整个流程需要重新设计。

深度学习的范式:端到端学习

深度学习颠覆了上述两阶段范式。它用一个多层神经网络统一了特征提取和分类决策:

输入:原始图像像素
    ↓
[神经网络层 1] (学习基础特征,如边缘)
    ↓
[神经网络层 2] (学习组合特征,如纹理、部件)
    ↓
[神经网络层 3] (学习高级特征,如物体轮廓)
    ↓
[输出层] (直接输出类别概率)
    ↓
输出:类别标签

这个过程被称为 端到端(End-to-End)学习。模型接收原始数据,直接输出最终任务结果。中间的“特征”由模型在训练过程中,根据任务目标(如分类损失)自动学习而来。这些学习到的特征是数据自适应和任务驱动的。

用一个简单的代码对比来感受两种范式的差异。我们模拟一个简化场景:用784维向量(类似小图像)输入,做2分类。

import torch
import torch.nn as nn

torch.manual_seed(0)  # 固定随机种子,确保结果可复现

# 模拟数据:batch_size=4, 特征维度=784 (例如28x28图像展平)
batch_size, feat_dim = 4, 64
x = torch.randn(batch_size, feat_dim)
y = torch.randint(0, 2, (batch_size,))  # 随机生成0或1的标签

print("=== 传统机器学习流程模拟 ===")
# 1. 手工特征提取器 (这里用随机投影模拟一个固定的特征变换)
handcrafted_feat_dim = 10
handcrafted_extractor = nn.Linear(feat_dim, handcrafted_feat_dim, bias=False)
# 假设这个提取器的权重是预先设定好的,不随任务改变
with torch.no_grad():
    handcrafted_features = handcrafted_extractor(x)
print(f"传统方法:特征提取器参数 shape: {handcrafted_extractor.weight.shape}")
print(f"手工特征向量 shape: {handcrafted_features.shape}")

# 2. 独立的分类器 (可训练)
classifier = nn.Linear(handcrafted_feat_dim, 2)
print(f"传统方法:分类器参数 shape: {classifier.weight.shape}")
print(f"总参数量(仅分类器): {sum(p.numel() for p in classifier.parameters())}\n")

print("=== 深度学习流程模拟 ===")
# 端到端的深度网络 (特征提取+分类一体)
deep_net = nn.Sequential(
    nn.Linear(feat_dim, 32),   # 第一层:学习初级特征
    nn.ReLU(),
    nn.Linear(32, 2)           # 输出层:直接分类
)
print(f"深度网络结构:{deep_net}")
total_params = sum(p.numel() for p in deep_net.parameters())
print(f"深度网络:总参数量 = {total_params}")
=== 传统机器学习流程模拟 ===
传统方法:特征提取器参数 shape: torch.Size([10, 64])
手工特征向量 shape: torch.Size([4, 10])
传统方法:分类器参数 shape: torch.Size([2, 10])
总参数量(仅分类器): 22

=== 深度学习流程模拟 ===
深度网络结构:Sequential(
  (0): Linear(in_features=64, out_features=32, bias=True)
  (1): ReLU()
  (2): Linear(in_features=32, out_features=2, bias=True)
)
深度网络:总参数量 = 2146

对比一目了然:

  1. 参数归属:传统方法中,特征提取器(10×64=640 参数)是“冻结”的先验知识,只有分类器的22个参数从数据中学习。深度网络中,全部 2 千多参数共同参与学习特征和分类。
  2. 信息流:深度网络的信息流是双向的。分类误差可以通过反向传播一直传递到第一层,指导每一层应该学习什么样的特征对最终任务最有利。这就是任务驱动的特征学习。

为什么是“深度”?为什么现在成功?

深度带来更强的表示能力

理论上,一个足够宽的单层神经网络可以近似任何函数(万能近似定理)。但“近似”可能需要极其庞大的神经元数量,导致参数爆炸、难以优化。深度结构通过多层非线性变换的复合,能够用更少的参数、更优雅的层次结构来建模复杂函数。高层特征由低层特征组合而成,形成从“边缘”到“纹理”再到“物体部件”的层次化抽象。

三大驱动力:数据、算力、算法

深度学习的理念(如神经网络)早在20世纪就已提出,但直到21世纪初才迎来爆发,这归功于三股合力:

  1. 数据爆炸:互联网与数字化产生了海量的图像、文本、语音数据,为数据饥渴的深度学习模型提供了充足的“燃料”。
  2. 算力飞跃:GPU并行计算的出现,使得训练大规模神经网络从数月缩短到数天甚至数小时。
  3. 算法突破:
    • 逐层预训练:Hinton等人在2006年的工作(Reducing the Dimensionality of Data with Neural Networks, Science 2006)展示了如何有效训练深度网络。
    • 激活函数:ReLU等激活函数缓解了梯度消失问题。
    • 结构创新:残差连接(ResNet)、注意力机制等让训练更深、更复杂的网络成为可能。
    • 开源框架:Caffe、TensorFlow、PyTorch等工具极大降低了研究和应用门槛。

工程上还有一条经验规律值得记住:模型容量要和数据量匹配。数据很少时,容量大的模型容易记住噪声(过拟合);数据充足时,容量大的模型才谈得上发挥表示能力。这条规律要靠真实数据集与完整训练才能验证,本节不做玩具实验——用几百个随机点跑几轮 SGD 得到的曲线,既不能证明它,也很容易读出错误结论。

深度学习的边界

深度学习并非银弹。它通常在以下情况表现突出:

  • 输入数据具有丰富的结构(图像、语音、文本序列)。
  • 拥有大量标注数据或可以通过自监督等方式获取监督信号。
  • 任务目标可以定义为一个可微分的损失函数。

对于数据量极少、需要严格可解释性、或决策逻辑必须基于明确规则的任务,传统方法或符号AI可能更合适。

📝 动手练一练

问题:对于一个极其简单的线性可分数据集(二维平面上的点,被一条直线分开),分别用一个线性模型(nn.Linear(2, 1))和一个深层模型(如两层ReLU网络)去拟合。你认为哪个模型会更快(更少的训练步数)达到100%训练准确率?为什么?请编写代码验证你的猜想。

👉 点击查看参考答案

思路:先猜「假设空间匹配就该更快」——线性可分数据的真实边界是一条直线,线性模型的假设空间恰好吃得下,理应高效。但真跑一遍会发现一个反直觉的现象,正好用来区分「表示能力」与「优化难度」这两件常被混为一谈的事。

代码验证:

import torch
import torch.nn as nn
import torch.optim as optim

torch.manual_seed(0)

# 1. 生成一个简单的线性可分数据集 (二维)
num_samples = 24
X = torch.randn(num_samples, 2)
# 标签由一条简单的直线决定: y = 1 if x1 > x2 else 0
y = (X[:, 0] > X[:, 1]).float().unsqueeze(1)

# 2. 定义模型
linear_model = nn.Sequential(nn.Linear(2, 1))
deep_model = nn.Sequential(
    nn.Linear(2, 10),
    nn.ReLU(),
    nn.Linear(10, 1)
)

# 3. 训练函数,记录达到100%准确率所需的步数
def train_until_perfect(model, X, y, max_steps=150, lr=0.1, batch_size=4):
    criterion = nn.BCEWithLogitsLoss()
    optimizer = optim.SGD(model.parameters(), lr=lr)
    model.train()
    n = X.shape[0]
    for step in range(max_steps):
        idx = torch.randint(0, n, (batch_size,))   # 每次取 4 个样本的小批量
        optimizer.zero_grad()
        loss = criterion(model(X[idx]), y[idx])
        loss.backward()
        optimizer.step()
        with torch.no_grad():                      # 在全部 24 个样本上评估
            pred = (torch.sigmoid(model(X)) > 0.5).float()
            acc = (pred == y).float().mean().item()
        if acc == 1.0:
            return step + 1, round(float(criterion(model(X), y)), 4)
    return None, round(float(criterion(model(X), y)), 4)

# 4. 训练并比较
linear_steps, linear_loss = train_until_perfect(linear_model, X, y)
deep_steps, deep_loss = train_until_perfect(deep_model, X, y)

fmt = lambda s: "未在 150 步内达到 100%" if s is None else f"{s} 步达到 100%"
print("线性模型:", fmt(linear_steps), "|全量损失", linear_loss)
print("深层模型:", fmt(deep_steps), "|全量损失", deep_loss)
线性模型: 未在 150 步内达到 100% |全量损失 0.3102
深层模型: 136 步达到 100% |全量损失 0.2201

结果值得停留一下:线性模型 150 步都没达到 100%,两层网络 136 步就到了。原因不在「谁更聪明」,而在数据生成方式——标签是 y=1[x0>x1]y = \mathbf{1}[x_0 > x_1],必有一批样本贴在直线 x0=x1x_0 = x_1 附近(∣x0−x1∣|x_0 - x_1| 很小)。逻辑回归要把这条边界”推”到无穷陡才能把所有点分对,SGD 在有限步内做不到;而两层 ReLU 网络可以折出一条有厚度的分段线性边界,很快就能把贴边的点也分开。

所以这条练习的结论是:假设空间包含正确答案,不等于优化时更快找到它。表示能力解决”能不能表示”,优化难度解决”多久能找到”——后面讲初始化、优化器、归一化,处理的都是第二件事。

常见错误

错误理解或写法现象或报错原因正确做法
认为深度学习在所有任务上都比传统方法好在小数据集或简单问题上,深度学习模型性能差、训练慢、易过拟合。深度学习模型容量大,需要大量数据来约束,否则会记住噪声。根据问题复杂度、数据量、可解释性需求选择合适的模型。数据少时优先考虑简单模型(如线性模型、SVM)。
将“端到端”理解为只有一个层模型无法学习到层次化特征,性能瓶颈低。误解了“端到端”的含义,它指的是从原始输入到最终输出的完整可微分通路,而非模型结构的简单。“端到端”系统通常内部由多个层组成,共同在最终任务目标的驱动下进行优化。
忽视数据的重要性,只关注模型结构尝试最新的复杂网络架构但效果不佳。在深度学习实践中,高质量、大规模的数据往往比模型结构的小幅改进更重要。优先确保数据质量(标注准确、噪声少)和数量,再考虑模型架构的优化。

本章小结

  1. 深度学习实现了从人工特征工程到数据驱动特征学习的范式转变。
  2. 其核心是端到端学习:一个多层神经网络直接从原始数据映射到任务目标,中间所有层的特征表示均在训练中联合优化。
  3. “深度”结构通过多层非线性变换的组合,能够高效地学习数据的层次化抽象表示。
  4. 深度学习的成功得益于数据爆炸、算力飞跃和算法突破三股力量的共同驱动。
  5. 深度学习并非万能,它在数据丰富、模式复杂的感知类任务上优势明显,但在小数据、需严格解释的任务上需谨慎使用。

📋 行动清单

  • 运行本节第一个代码块,对比传统流程与深度学习流程的参数数量和结构差异,理解“参数共同学习”的含义。
  • 修改“动手练一练”中的数据集生成规则(例如,将 y = (X[:, 0] > X[:, 1]) 改为 y = (X[:, 0]**2 + X[:, 1]**2 > 1) 创建一个圆形可分数据集),再次运行比较线性模型和深层模型的性能,观察结果变化。
  • 思考一个你熟悉的领域(如文本分类、用户行为预测),尝试用“特征工程+分类器”和“端到端学习”两种范式来描述其解决方案,并分析各自的潜在挑战。

延伸阅读

  • Hinton, G. E. & Salakhutdinov, R. Reducing the Dimensionality of Data with Neural Networks(2006),Science 313: 504–507,DOI: 10.1126/science.1127647 —— 逐层预训练让深层网络可训的开创性工作。
  • Krizhevsky, A., Sutskever, I. & Hinton, G. E. ImageNet Classification with Deep Convolutional Neural Networks(2012),NIPS 25(2012);CACM 重印版 DOI: 10.1145/3065386 —— AlexNet,点燃这一轮深度学习浪潮。
  • LeCun, Y., Bengio, Y. & Hinton, G. Deep Learning(2015),Nature 521: 436–444,DOI: 10.1038/nature14539 —— 三位图灵奖得主对深度学习的综述,本文的「表示学习」视角即取自该文。

—— 小象教研组