写在前面:
好久没有学习深度学习相关知识了,这几天觉得虽然现在工作跟深度学习无关,可是还是要继续下去,所以还是把最近学习的一些内容总结一下,不一定严谨,只是希望自己可以借此好好整理整理思路。
我们在训练神经网络的时候,需要调节大量的参数,神经网络的可视化对于调整参数有着很好的指导作用。
什么是可视化呢,先举一个简单的例子。
我们可以直接看第一层的feature map来观察神经网络是否取得了较好的效果:
(以下图片来自cs231)
左边的图片中的feature有很多噪声,这表示网络可能还没有收敛,或者学习速度不太对,或者是正则化没有做好;而右边的feature较为平滑,干净,并且特征也呈现出了多样化,这表示了训练较好。
1.实际上,最直观的可视化手段,就是去看前向传播中神经网络各层的激活(即经过激活函数后的状态)。对于ReLU激活函数而言,在刚开始训练的时候,激活看上去都是呈滴状的,且较为密集,之后会逐渐变得稀疏,呈局部化。如果一些激活值一直是0,那么很有可能说明学习速率太高了。
(图片来源:cs231)
上面这幅图是第一层网络,下面这幅图则是第二层网络。
2.滤波器的可视化
第二种常见的方法是对权重进行可视化。通常是第一层权重的可读性较好。
训练得较好的网络的权重较为平滑,噪声较少。
(图片来源:CS231)
上图为AlexNet第一层权重的可视化
下图为AlexNet第二层权重的可视化
可以看出,第一层的权重非常平滑,而且从第一层的各个权重中我们也可以看出,各个滤波器在做什么。
3.提取能够最大激活神经元的图片
还有一种手段,是保持整个网络不变,给网络输入大量的图片,针对某些神经元,观察哪些图片可以使他们激活最大(输出的值最大)
下图为针对AlexNet第五层Pool层的神经元做的可视化,即用下面的图片,可以使他们激活值最高。白色框代表的是感受野(感受野中的像素都会对第五层的一个神经元产生作用,算出来是163*163个像素)
下面分别介绍几篇相关的论文
1.这篇文章首先介绍一种通过输入图片进行可视化的技术,也就是神经网络是事先训练好的,固定的,对于指定的一个分类,想办法找出一个一张图片,使得网络在这个分类上得到的分数最高。
对于类别c, 输入图片I, Sc(I) 是相应的得分,我们在此基础上增加一个L2正则项,也就是要找到图片I,可以满足以下式子:
argmaxSc(I)−λ||I||22
需要注意的是,我们在这里用到的是得分,而不是Softmax层得到的后验概率 Pc=expSc∑cexpSc ,如果使用的是后者的话,优化器会想办法使得其他类别的分数减小。事实上,实验也证明了使用后验概率的效果更差一些。
我们可以通过back-propagation计算出来一个局部最优的I。
论文中提供了一个例子。可以仔细观察下图片,会发现一张图片中会出现多个物体,从而使得该类别的分数尽可能高。
2.显著性的可视化(原文是saliency visualization,我之前没有接触过机器视觉太多的知识,这里仅凭我自己查了一点资料感觉是应该这样翻译,表示图片中各部分对用户的重要程度,不知道理解是否有误)
给定一个图片 I0 ,类别c,和一个分类用的卷积神经网络,网络的得分公式是 Sc(I) ,我们可以得到各个像素对得分的影响。
假设网络是线性的,我们可以很容易得到
Sc(I)=wTcI+b
这时候, wc 的各个元素能够表示相应的像素对类别c的影响。
对于卷积神经网络而言,我们可以通过一阶泰勒展开得到一个近似方程
Sc(I)≈wTI+b
其中, w=∂Sc∂I|I0 ,可以通过back-propagation计算出来。
其实可以把这个公式解读为,优化器试图来寻找得分 Sc 和像素之间的关系,看哪些需要更改的多,哪些需要更改的少。
根据上述公式,我们不难得到saliency map M∈Rm∗n ,对于灰度图而言, Mi,j=|wh(i,j)| ,其中h(i ,j)是指i行j列对应的w的索引号(前文将I作为一个一维数组了,现在M是二维的),对于多通道的图像,如RGB图,通道c中像素点(i, j)对应w中的h(i, j, c), Mi,j=maxc|wh(i,j,c)|
这种计算显著图的方法,不需要额外的工具,如bounding box或者segmentation mask,计算起来非常快。
由于像素的位置其实给出了图片中的一些位置信息,因此,我们也可以做物体的定位。