深度学习模型是个黑箱
同样的任务训练两次,模型内部的分工可能完全不同。

关键术语
重 点三张图怎么看
四个角是四个样本,圆圈和叉号是两类。三个网络都把两个圆圈划进灰色、叉号留在外面,任务都完成了。左图的参数是人定的,每一步都说得清。右边两张从不同的随机起点训练出来,灰色的划法各不相同,事先猜不到。
知道更多为什么要打开黑箱
看病、贷款、判案这些场合,只给结论不够,还要说清理由。这一节和下一节讲三种查看模型内部的办法。
同样的任务训练两次,模型内部的分工可能完全不同。

四个角是四个样本,圆圈和叉号是两类。三个网络都把两个圆圈划进灰色、叉号留在外面,任务都完成了。左图的参数是人定的,每一步都说得清。右边两张从不同的随机起点训练出来,灰色的划法各不相同,事先猜不到。
看病、贷款、判案这些场合,只给结论不够,还要说清理由。这一节和下一节讲三种查看模型内部的办法。
参数固定不动,改图片,找出最能让某个神经元兴奋的输入。
训练数据固定,改模型的参数,让损失越来越小。沿着梯度往下走,叫梯度下降。
参数固定,改图片的像素,让某个神经元的激活越来越大。沿着梯度往上走,叫梯度上升。
想知道朋友最爱什么口味,他自己又说不清。那就做道菜让他尝,一点点调咸淡酸甜,直到他吃得最开心。最后那道菜的味道,就是他最爱的口味。
做激活最大化时,每一步改动的是什么?
不加约束地往上改,像素会跑出正常范围,图也看不懂了。
| 改了几步 | 像素甲 | 像素乙 | 像素丙 | 激活 |
|---|---|---|---|---|
| 0 | 0.5 | 0.5 | 0.5 | 2.0 |
| 1 | 0.7 | 0.4 | 0.8 | 3.4 |
| 2 | 0.9 | 0.3 | 1.1 | 4.8 |
| 5 | 1.5 | 0.0 | 2.0 | 9.0 |
| 10 | 2.5 | −0.5 | 3.5 | 16.0 |
真实的图片有成千上万个像素,只顾让激活变大,得到的往往是一片细碎的雪花点。神经元确实极度兴奋,人却什么也看不出来。
面板里的神经元,要让激活尽量大,同时像素只能在 0 到 1 之间,像素乙应该取多少?
三种约束都在把结果往“像一张正常的图”上拉。
| 约束 | 怎么做 | 管什么 |
|---|---|---|
| 高频抑制 | 每一步把图稍微模糊一下,或惩罚相邻像素差得太多 | 去掉细碎的格子和雪花点 |
| 像素约束 | 像素值只能在 0 到 1 之间 | 别让数值跑出范围 |
| 自然图像先验 | 不直接改像素,让一个会画图的生成模型来出图 | 让结果像一张真实的照片 |
两张图都从同一团噪声出发,改了 40 步。不做模糊的那张激活更高,可满眼是细碎的格子。每步模糊一下的那张,激活低一些,却清楚地显出了这个神经元喜欢的斜条纹。
约束越强,得到的图越好看,但也可能把神经元在意的细节修饰掉。约束太弱,又只剩一片雪花点。
浅层喜欢简单的条纹,越往深层,喜欢的花纹越复杂。

左边的式子把前两页合在一起:找一张图,让神经元的响应减去正则化项尽量大。右边每个小方块就是这样找出来的图,从上到下对应网络从浅到深,花纹越来越大、越来越复杂。
人认字也是这样,先认笔画,再认偏旁,最后认出整个字。没有人教网络这个顺序,它是在训练中自己长成这样的。
本章实验一会动手做一遍:把一个训练好的小网络固定住,找出让某个通道最兴奋的图。通道是卷积网络里负责在图上各处找同一种花纹的一组神经元。