0. 本章核心目标:从线性分类器走向视觉神经网络

本章要解决的问题是:

线性分类器只能学习线性决策边界,无法处理 XOR 等非线性模式;MLP 通过隐藏层和非线性激活函数提升表达能力,但对图像直接全连接会导致参数量巨大;CNN 进一步利用图像的局部性、平移共享和空间结构,大幅减少参数并学习局部视觉特征。

整体进化树如下:

KNN
→ 记忆训练集,预测慢,没有真正学习参数

Linear Classifier
→ 学习 W,b,预测快
→ 但只能表达线性边界

MLP
→ 引入 hidden layer
→ 通过 nonlinear activation 组合多个线性特征
→ 可表达 XOR / 非线性边界

Deep MLP
→ 多层特征抽象
→ 但训练会遇到梯度消失、激活函数选择问题

CNN
→ 针对图像结构设计
→ 局部连接 + 参数共享 + 多 filter
→ 参数更少,保留空间结构

Pooling
→ 降低空间尺寸
→ 提高表示紧凑性和一定平移鲁棒性

重要程度标注: ★★★ 必考核心;★★ 常考概念; 理解即可。

1. 上周回顾:从 KNN 到线性分类器 ★★★

1.1 KNN 的框架

KNN 的训练阶段本质上是:

train(images, labels):
memorize all data and labels

预测阶段:

predict(test_image):
find most similar training image
return its label

它的核心问题是:训练很便宜,但预测很慢;模型没有学到显式参数,也没有抽象出数据规律。

1.2 线性分类器的标准机器学习框架

线性分类器不再直接记忆样本,而是学习一个带参数的函数:

其中:

表示输入样本,例如图像展平后的向量;

表示模型参数;

输出每个类别的 score。

训练目标是定义损失函数:

然后求最优参数:

预测时使用:

核心逻辑是:

定义模型 f_W(x)
→ 定义损失 L(f_W(x), y)
→ 优化参数 W*
→ 用 f_{W*}(x) 预测标签

2. 正则化:控制模型复杂度 ★★★

课件中给出两类正则化:

符号解释:

是全部模型权重;

是第 (k) 个权重参数;

是正则化项,用于惩罚复杂模型。

完整训练目标通常写成:

其中:

是分类损失,例如 cross entropy;

是正则化强度。

直觉:

L2 会惩罚大权重,使模型更平滑;如果某个权重很大,那么输入特征的微小变化都会导致输出巨大变化,因此容易过拟合噪声。

在 SVM 中,最小化:

等价于最大化 margin。margin 越大,分类边界对测试样本扰动越鲁棒。

3. Softmax 与 Cross Entropy ★★★

线性模型输出的是 raw scores,不是概率。假设模型对第 (i) 个样本输出:

其中:

是第 (j) 个类别的 score。

Softmax 把 score 转换为概率:

其中:

所以它可以被解释为类别概率。

若真实标签是 one-hot 分布:

其中正确类别 (y_i) 对应:

其他类别为 0。

Cross Entropy loss 为:

由于 是 one-hot,只有正确类别保留,所以:

符号解释:

是训练样本数;

是类别数;

是类别 (j) 的 score;

是第 (i) 个样本真实类别的 score。

直觉: 正确类别 score 越大,softmax 概率越接近 1,loss 越小;错误类别 score 越大,分母越大,loss 越大。

4. Gradient Descent ★★★

梯度下降更新规则:

符号解释:

是参数;

是损失函数;

是损失对参数的梯度;

是 learning rate,也叫 step size。

直觉: 梯度方向是损失上升最快的方向,因此减去梯度就是沿损失下降最快方向更新。

5. 为什么需要非线性模型:XOR 问题 ★★★

XOR 的四个点可以理解为:

| 点 | 横向线性特征 | 纵向线性特征 | 标签 | | - | —— | —— | ——— | | 1 | + | + | green / + | | 2 | - | + | red / - | | 3 | + | - | red / - | | 4 | - | - | green / + |

单条直线无法把绿色点和红色点分开,因此线性分类器失败。

解决方式是:先用两个线性特征分别判断点在两条线的哪一侧,然后组合它们:

再做非线性组合:

当两个符号相同时,输出正;符号不同时,输出负。这正好实现 XOR 结构。

关键结论:

多个线性函数本身不够;必须加入非线性操作,例如 threshold、activation、product 或逻辑组合。

6. Single Hidden Layer MLP ★★★

单隐藏层网络结构:

符号解释:

是输入向量;

是输入维度;

是 hidden layer size,是超参数;

是输入层到隐藏层的权重矩阵;

是隐藏层偏置;

是隐藏层输出;

是逐元素激活函数;

是隐藏层到输出层的权重;

是输出层偏置;

是最终输出 score。

为什么必须有非线性激活?

如果没有激活函数:

代入得到:

令:

则:

这仍然是线性模型。

所以:

线性层叠加线性层,结果仍然是线性层。深度本身不产生非线性,激活函数才产生表达能力。

7. 多分类 MLP ★★★

对 (d) 类分类问题,输出层改为:

更标准的写法是:

其中:

表示 (d) 个类别的 score;

表示 softmax 后的类别概率。

8. Multiple Hidden Layers ★★★

多层 MLP:

超参数包括:

深层网络的意义是逐层构造特征:

raw input
→ low-level feature
→ mid-level feature
→ high-level feature
→ class score

但深层网络训练会带来梯度传播问题,这引出 activation function 的选择。

9. Backpropagation ★★★

课件用 step-by-step 图示展示了反向传播。核心不是记住每张图,而是理解链式法则。

假设:

反向传播从输出层开始:

因为:

所以:

因此:

对隐藏层:

对 pre-activation:

其中:

表示逐元素乘法。

再对 (W_1):

反向传播本质:

forward: compute activations and loss
backward: apply chain rule layer by layer
update: W ← W − λ∂L/∂W

10. 激活函数演进 ★★★

本章一个重要方法论演进是:

Step Function
→ Sigmoid
→ tanh
→ ReLU
→ Leaky ReLU / PReLU / ELU / Maxout

每一步都在解决前一种激活函数的缺陷。

10.1 Step Function ★★

硬阈值函数:

问题:不可导或几乎处处梯度为 0,不适合梯度下降训练。

10.2 Sigmoid ★★★

输出范围:

(0,1)

优点: 可以解释为神经元 firing rate,也可用于二分类概率输出。

缺点 1:饱和区杀死梯度。

Sigmoid 导数:

当:

时:

当:

时:

所以深层网络中梯度会逐层变小,导致前面层几乎无法更新。

缺点 2:输出不是 zero-centered。

Sigmoid 输出总是正数:

若一个神经元输入总为正,局部梯度也为正,那么所有权重梯度符号会受到 upstream gradient 的统一控制。结果是更新方向只能“全部增加”或“全部减少”,无法让某些权重增加、某些权重减少,从而造成 zig-zag optimization path。

10.3 tanh ★★★

输出范围:

(-1,1)

优点:zero-centered,比 sigmoid 更适合隐藏层训练。

缺点:仍然会饱和。即当:

时:

所以仍然存在梯度消失问题。

10.4 ReLU ★★★

分段写法:

导数:

优点:

正区间不饱和
计算非常便宜
实践中比 sigmoid/tanh 收敛更快

缺点:

输出不是 zero-centered
可能出现 dead neuron

Dead ReLU 指如果某个神经元长期落在负区间:

则输出为:

0

梯度也为:

0

于是该神经元不再更新,永远不激活。课件提到实践中常用稍微正的 bias 初始化,例如:

来降低 ReLU 死亡风险。

10.5 Leaky ReLU ★★

Leaky ReLU 解决 ReLU 负区间梯度为 0 的问题:

其中:

通常是小常数,例如 0.01。

优点:负区间也有梯度,因此不容易 die。

10.6 PReLU ★★

Parametric ReLU 把 作为可学习参数:

区别在于:

通过 backpropagation 学习,而不是人工固定。

10.7 ELU ★★

ELU,即 Exponential Linear Unit:

优点:

保留 ReLU 正区间不饱和的优点
负区间输出更接近 zero mean
负区间饱和可以增加对噪声的鲁棒性

缺点:

计算更贵。

10.8 Maxout

Maxout 不再是简单的:

而是:

它可以泛化 ReLU 和 Leaky ReLU。

优点:

linear regime
non-saturating
does not die

缺点:参数量增加,课件强调会 double number of parameters per neuron。

10.9 实践建议 ★★★

课件结论:

隐藏层中优先使用 ReLU
注意 learning rate
可以尝试 Leaky ReLU / Maxout / ELU 获得边际提升
不要在隐藏层使用 sigmoid 或 tanh
sigmoid/tanh 可以用于输出层控制输出范围

11. 从 MLP 到 CNN:为什么全连接不适合图像? ★★★

图像输入:

展平后:

线性分类器参数:

如果堆叠多层 MLP:

参数量巨大,而且破坏了图像的空间结构。

核心问题:

图像具有局部结构
相邻像素高度相关
同一个视觉模式可能出现在不同位置
MLP 把图像展平后丢失空间邻接关系
全连接层参数量过大

CNN 的改进:

局部连接:每个神经元只看局部 patch
参数共享:同一个 filter 在所有位置复用
多 filter:学习不同视觉模式
保留空间结构:输出仍是 feature map

12. Convolutional Layer ★★★

输入图像:

一个卷积核:

注意:课件强调:

Filters always extend the full depth of the input volume.

所以如果输入 depth 是 3,filter depth 也必须是 3。

参数量:

若包含 bias:

卷积操作是在空间位置上滑动 filter,对每个局部区域做 dot product:

符号解释:

是输入图像或输入 volume;

是卷积核;

是 filter spatial size;

是输入 depth/channel 数;

是 bias;

是输出 activation map 在位置 ((i,j)) 的值。

一个 filter 会产生一个 activation map。 如果有 6 个 filters,则产生 6 张 activation maps,并 stack 成:

对于:

输入,使用:

filter,stride 1,无 padding,输出空间尺寸为:

因为 filter 可以放置的位置数量是:

32-5+1=28

13. CNN 的层级结构 ★★★

ConvNet 是多个卷积层和激活函数交替组成:

Input: 32×32×3
→ CONV, ReLU: 6 filters of 5×5×3
→ 28×28×6
→ CONV, ReLU: 10 filters of 5×5×6
→ 24×24×10
→ ...

第二层 filter depth 必须等于上一层输出 depth:

如果有 10 个这样的 filters,输出 depth 是 10。

14. 卷积输出尺寸公式 ★★★

无 padding 时:

其中:

是输入空间尺寸;

是 filter size;

是 stride。

例如:

stride 1:

输出:

stride 2:

输出:

stride 3:

不是整数,因此 filter 放不下,不能合法卷积。

15. Zero Padding ★★★

为了防止空间尺寸快速缩小,CNN 常在边界补 0。

有 padding 时输出尺寸为:

其中:

是 padding size。

例子:

则:

输出仍为:

常见做法:当 stride 为 1,filter size 为 ,为了保持空间尺寸不变,取:

例如:

注意:这要求 (F) 通常为奇数。

为什么 padding 重要? 如果不 padding,连续使用 卷积会导致:

空间尺寸缩小太快,不利于深层特征学习。

16. 卷积层参数量计算 ★★★

例题:

输入:

使用 10 个:

filters,stride 1,pad 2。

输出空间尺寸:

输出 volume:

每个 filter 参数量:

其中 (+1) 是 bias。

10 个 filters 总参数量:

这体现 CNN 的参数共享优势:输出有 个神经元,但参数只有 760 个。

17. Receptive Field ★★★

课件定义:

一个 activation map 是一张 neuron output sheet。每个 neuron:

只连接输入中的一个小区域
所有空间位置共享同一个 filter 参数

如果 filter 是:

则每个输出 neuron 的 receptive field 是:

直觉: receptive field 表示某个输出单元“看见”的输入区域。CNN 越深,后层 neuron 的有效 receptive field 越大,可以从局部边缘逐渐组合成更高级视觉模式。

18. Pooling Layer ★★★

Pooling 的作用:

减小 representation size
让特征更 manageable
对每个 activation map 独立操作

Max Pooling

课件例子:

输入单个 depth slice:

使用:

filter,stride 2。

四个区域分别取最大值:

左上:

右上:

左下:

右下:

输出:

Pooling 不改变 depth,只缩小 height 和 width。

19. 算法/模型对比表 ★★★

| 方法 | 核心思想 | 优点 | 局限 | 为什么引出下一步 | | —————– | ——————- | ———– | ————————– | ——————– | | KNN | 记忆训练样本,找最近邻 | 简单,无训练成本 | 预测慢,不学习抽象规律 | 需要参数化模型 | | Linear Classifier | 学习 (W,b),输出类别 score | 预测快,可优化 | 只能线性分割 | XOR 等非线性问题失败 | | MLP | 隐藏层 + 非线性激活 | 可表达非线性边界 | 图像全连接参数巨大 | 需要利用图像结构 | | Deep MLP | 多层抽象特征 | 表达能力更强 | 梯度消失、训练困难 | 需要更好的激活函数 | | CNN | 局部连接 + 参数共享 | 参数少,保留空间结构 | 需要设计 filter/stride/padding | 成为视觉任务基础结构 | | Pooling | 下采样 feature map | 降低计算量,提高鲁棒性 | 丢失部分空间精度 | 与 CNN 组合形成经典 ConvNet |

20. 期末高频考点总结

最可能考计算题:

softmax + cross entropy
gradient descent update
MLP 前向传播维度
为什么没有 activation 时多层线性仍是线性
卷积输出尺寸
padding 后输出尺寸
卷积层参数量
max pooling 结果

最可能考概念题:

为什么线性分类器不能解决 XOR
为什么需要非线性激活函数
sigmoid 的两个问题:梯度消失、非 zero-centered
tanh 相比 sigmoid 的改进与不足
ReLU 的优点与 dead neuron 问题
Leaky ReLU / PReLU / ELU / Maxout 的动机
CNN 为什么比 MLP 更适合图像
filter 为什么必须覆盖 full depth
receptive field 的意义
pooling 的作用

最核心的一句话:

MLP 通过非线性激活突破线性分类器的表达瓶颈;CNN 通过局部连接和参数共享突破 MLP 在图像上的参数与结构瓶颈。