池化在窗口里挑一个代表,把特征图缩小。它没有参数,不学任何东西。 实测 4×4 的图做 2×2、步幅 2 的最大池化,得到 2×2:左上角窗口是 1、3、5、0,取最大得 5.0, 取平均得 2.25。 反向传播时梯度只回给被选中的那个位置,其余三个拿 0。这叫 argmax 路由。
5.7 的 ReLU 和这一节的池化都不带参数,经常成对出现。 5.6 的步幅卷积也能降采样,两者常被拿来比较。 5.9 节会看到,全连接层的参数爆炸很大程度上是被池化压下来的。
一、池化在做什么
把特征图切成不重叠的窗口,每个窗口输出一个数。2×2 配步幅 2,尺寸正好减半。 它没有参数,所以不增加模型容量,只减少后面要处理的位置数。 这带来两个好处:计算量降下来,以及「位置稍微动一动,结果不变」的容忍度。
二、两种池化问的是两个问题
最大池化问「这个特征在不在这个窗口里」。取最大值,只要有一个点响应强,整个窗口就有输出。 平均池化问「这个特征在这个窗口里平均有多强」。取平均,响应分散时会把它稀释掉。 分类任务更常用最大池化,因为「在不在」比「平均多少」更贴近「这张图里有没有这个物体」。 平均池化更多出现在网络末端(全局平均池化)。
三、反向传播怎么走
前向时记住最大值的位置。反向时梯度只送给那个位置,其余三个拿 0。这叫 argmax 路由。 所以池化的「梯度」其实是一张路由表,不是一个导数值。 它不可微,但几乎处处可导——只有窗口里出现并列最大值时才有歧义。 平均池化则把梯度平均分给四个位置,各拿四分之一。 一个送全部、一个四等分,这就是两种池化在反向时的全部区别。
四、池化给的是什么不变性
只要最大值还在同一个 2×2 窗口里,输入挪一格,池化后的输出不变。 注意范围:只在窗口内有效。挪两格就跨窗口了,输出就变了。 想要更大的容忍度就要更大的窗口。 5.10 节那个 Demo 里,把窗口放大到整张图,准确率又往上跳了一截。
五、池化正在被替代
池化丢的是位置信息。分类不在乎位置,但检测和分割在乎。 所以现代网络常用「步幅 2 的卷积」代替池化: 同样缩小尺寸,但缩小方式是学出来的,而且保留了位置信息。 池化在分类网络里还常见,在检测分割里越来越少。这是「结构跟着任务走」的一个典型例子。
六、动手 Demo:2×2 的窗口里只留最大的那个
一张 4×4 的图,分别做 2×2 最大池化和平均池化,看两种结果差在哪,再验证输出尺寸的算法。
import numpy as np
x = np.array([1.0, 3.0, 2.0, 4.0,
5.0, 0.0, 7.0, 1.0,
2.0, 8.0, 3.0, 0.0,
9.0, 1.0, 4.0, 6.0]).reshape(4, 4)
mx = np.zeros((2, 2))
av = np.zeros((2, 2))
for i in range(2):
for j in range(2):
w = x[i * 2:i * 2 + 2, j * 2:j * 2 + 2]
mx[i, j] = w.max()
av[i, j] = w.mean()
print("最大池化"); print(mx)
print("平均池化"); print(av)
print("输出边长", (4 - 2) // 2 + 1)
实跑输出:
--------------------------------------------------------------------
池化层:2×2 的窗口里只留最大的那个
--------------------------------------------------------------------
输入(1 通道 4×4):
1.0 3.0 2.0 4.0
5.0 0.0 7.0 1.0
2.0 8.0 3.0 0.0
9.0 1.0 4.0 6.0
max 池化 2×2、步幅 2:
5.0 7.0
9.0 6.0
average 池化,同样窗口:
2.25 3.50
5.00 3.25
左上角那个窗口是 1、3、5、0,取最大得 5.0、取平均得 2.25。
**尺寸是 (4 − 2) / 2 + 1 = 2,两个方向都缩一半。**
池化没有参数。**它不学任何东西,只做「在这个窗口里挑一个代表」。**
所以它不增加模型容量,只减少后面要处理的位置数。
反向传播的时候,梯度只回给那个被选中的位置,其余三个位置拿 0。
**这叫 argmax 路由——每个窗口记住最大值在哪,反向时原路送回。**
为什么要池化?一是省计算,二是给一点平移容忍度:
**只要最大值还在同一个 2×2 窗口里,整体挪一格像素,池化后的输出不变。**
最大池化得 5.0、7.0、9.0、6.0;平均池化得 2.25、3.50、5.00、3.25。 每一格都能看出「在不在」和「平均多强」的差别。 左上角那个窗口是 1、3、5、0,最大 5.0、平均 2.25。 差一倍多——因为最大值只挑了一个,平均值被那个 0 拖了下来。 尺寸 (4 − 2) / 2 + 1 = 2,两个方向都缩一半。注意池化的步幅一般就等于窗口大小,所以窗口不重叠。 池化没有参数,这一层在参数表里是空的。 但它在计算图里是一个节点,反向时要按 argmax 路由把梯度送回去。 「挪一格不变」的范围只在窗口内。 这是它和「真正的平移不变」的差距, 也是后来全局平均池化流行起来的原因——它把这个范围放大到了整张图。
30 秒实验
- 把窗口改成 3×3、步幅 3,4×4 的图会输出多大?(提示:向下取整)
- 如果窗口里有两个并列的最大值(比如两个 5.0),梯度该给谁?
- 换成全局平均池化(整个特征图取平均),这张 4×4 会输出几个数?
常见误区
- 以为池化能学东西。它没有参数。说「这个池化层训得好不好」是不成立的。
- 以为池化给的是完全的平移不变。只在窗口内。跨窗口输出就变了。
- 以为池化一定提升准确率。它主要省计算。在需要位置信息的任务上,它会实实在在地伤害性能。
自测三问(点开对答案)
1. 最大池化和平均池化分别在问什么? —— 前者问「这个特征在不在」,后者问「平均有多强」。分类任务更常用前者,网络末端更常用后者。 2. 池化的反向传播怎么走? —— 按前向记住的最大值位置(argmax)把梯度送回去,其余位置拿 0。平均池化则把梯度四等分。 3. 为什么现在很多网络用步幅卷积代替池化? —— 同样降采样,但降采样方式是学出来的,而且保留了位置信息。 池化只是取一个代表,丢掉的细节找不回来。卷积、ReLU、池化三轮下来,特征图已经又小又深。 最后要把它变成「十个类别的概率」,这一步交给全连接层。
- ☐ (本节完,下一节 5.9 全连结层)