来呀,快活呀~

论文 - Visualizing and Understanding ConvNet

Visualizing & Understanding ConvNet这篇文章是比较早期关于CNN调试的文章,作者利用可视化方法,设计了一个超过AlexNet性能的网络结构。

可视化结果

引言

继AlexNet之后,CNN在ImageNet竞赛中得到了广泛应用。AlextNet成功的原因包括以下三点:

  • Large data。
  • 硬件GPU性能。
  • 一些技巧提升了模型的泛化能力,如Dropout技术。

不过CNN仍然像一只黑盒子,缺少可解释性。这使得对CNN的调试变得比较困难。我们提出了一种思路,可以找出究竟input中的什么东西对应了激活后的Feature map。

(对于神经网络的可解释性,可以从基础理论入手,也可以从实践中的经验入手。本文作者实际上就是在探索如何能够更好得使用经验对CNN进行调试。这种方法仍然没有触及到CNN本质的可解释性的东西,不过仍然在工程实践中有很大的意义,相当于将黑盒子变成了灰盒子。从人工取火到炼金术到现代化学,也不是这么一个过程吗?)

在AlexNet中,每个卷积单元常常由以下几个部分组成:

  • 卷积层,使用一组学习到的$3D$滤波器与输入(上一层的输出或网络输入的数据)做卷积操作。
  • 非线性激活层,通常使用ReLU(x) = max(0, x)
  • 可选的,池化层,缩小Feature map的尺寸。
  • 可选的,LRN层(现在已经基本不使用)。

DeconvNet

我们使用DeconvNet这项技术,寻找与输出的激活对应的输入模式。这样,我们可以看到,输入中的哪个部分被神经元捕获,产生了较强的激活。

如图所示,展示了DeconvNet是如何构造的。
DeconvNet的构造

首先,图像被送入卷积网络中,得到输出的feature map。对于输出的某个激活,我们可以将其他激活值置成全$0$,然后顺着deconvNet计算,得到与之对应的输入。具体来说,我们需要对三种不同的layer进行反向操作。

Uppooling

在CNN中,max pooling操作是不可逆的(信息丢掉了)。我们可以使用近似操作:记录最大值的位置;在deconvNet中,保留该标记位置处的激活值。如下图所示。右侧为CNN中的max pooling操作。中间switches显示的是最大值的位置(用灰色标出)。在左侧的deconvNet中,激活值对应给到相应的灰色位置。这个操作被称为Uppooing。
Uppooling示意图

Rectification

在CNN中,一般使用relu作为非线性激活。deconvNet中也做同样的处理。

Filtering

在CNN中,一组待学习的filter用来与输入的feature map做卷积。得到输出。在deconvNet中,使用deconv操作,输入是整流之后的feature map。

对于最终输出的activation中的每个值,经过deconv的作用,最终会对应到输入pixel space上的一小块区域,显示了它们对最终输出的贡献。

CNN的可视化

要想可视化,先要有训练好的CNN模型。这里用作可视化的模型基于AlexNet,但是去掉了group。另外,为了可视化效果,将layer $1$的filter size从$11\times 11$变成$7\times 7$,步长变成$2$。具体训练过程不再详述。

训练完之后,我们将ImageNet的validation数据集送入到网络中进行前向计算,

如下所示,是layer $1$的可视化结果。可以看到,右下方的可视化结果被分成了$9\times 9$的方格,每个方格内又细分成了$9\times 9$的小格子。其中,大格子对应的是$9$个filter,小格子对应的是top 9的激活利用deconvNet反算回去对应的image patch、因为layer 1的filter个数正好也是$9$,所以可能稍显迷惑。
layer 1的可视化

附录

这里是关于CNN可视化的一些额外资料: