杂谈CNN:如何通过优化求解输入图像互联网+
训练模型其实就是下面的参数优化问题,训练模型其实就是下面的参数优化问题,特征(R 机器学习和优化问题很多机器学习方法可以归结为优化问题。
机器学习和优化问题很多机器学习方法可以归结为优化问题,对于一个参数模型,比如神经网络,用 y=f(x;θ) 来表示的话,训练模型其实就是下面的参数优化问题: 其中 L 是loss function,比如神经网络中分类常用的 cross-entropy。 CNN学到了什么?特征(R
机器学习和优化问题很多机器学习方法可以归结为优化问题,对于一个参数模型,比如神经网络,用 y=f(x;θ) 来表示的话,训练模型其实就是下面的参数优化问题:
其中 L 是loss function,比如神经网络中分类常用的 cross-entropy。
CNN学到了什么?特征(Representation)。把原始图像看做一个维度是像素×通道的向量,经过各种复杂的CNN结构,其实只不过成了另一个向量。这个向量所在的空间也许有更好的线性可分性,也许是相似样本的“距离”更近,原始的数据经过变换到了这里之后,就是特征。
可视化CNN那么有个问题来了,如何可视化一个CNN结构学到的特征呢?答案有很多,其中一种就是本文的主题:不再通过优化求解网络的参数,而是求解输入图像。
优化网络的输入,是相对于“正统”的机器学习优化参数而言的。当一个CNN训练完全后,我们可以固定好参数,把输入作为可训练的量,根据目的给定一个新的目标函数。
把这种方法最早用在深度学习里大概是Bengio组在2009年的一个Tech report:《Visualizing Higher-Layer Features of a Deep Network》。文章里提出了下面的优化问题
其中 hij代表第j层中的第i个神经元的响应。很直观的,这是要寻找什么样的图像可以最大程度地激活这个神经元,这种方法就叫做activation maximization。利用这种办法,原文中得到了类似下面的可视化,从左至右依次是一个DBN中从低到高的三层:
也许很多人一提起特征可视化首先想到的是可视化特征图或是直接把卷积核画出来,就像 CAffe 的 Tutorial(ImaGE ClassifiCATion and Filter Visualization,地址:)中一样。这样的可视化其实是很不直观的,尤其是卷积核的可视化,第一层之后的卷积核到底学到了什么内容只能靠脑补。基于这个思路,Cornell的Jason Yosinski把公式改了改
其实就是Regularization项R(x)放到了目标函数里。然后他把这种可视化作为功能之一,基于Caffe制作了一个年久失修的用于CNN可视化的工具包:yosinski/deep-visualization-toolbox(地址:)。用在AlexNet上的效果是下面样子:
注意到这个可视化结果还考虑到了感受野,也就是实际优化的目标是响应图中心的点,所以越高层的可视化图像越大。
直接把某一类别的分数作为优化值可以得到关于该类别更直观的可视化结果,比如下图是这个工具包对几个类别的可视化:
每个类别学到的视觉上的特征一目了然。另外注意到这种方法因为是基于优化,所以每次优化的结果会有不同。
借助这种可视化,我们能够分析出网络是不是真的学习到了我们希望其所学的特征,比如GOOGle的Research Blog中提到过哑铃的例子:
可视化的类别是哑铃,可是结果里包含了一些我们不希望出现的元素:胳膊。这是因为用于训练的哑铃图片中,大都有握着哑铃的胳膊。
可视化网络的方法有很多,以简单粗暴为最大特点的大概只是activation maximization。
对抗样本(Adversarial Examples)对抗样本也是机器学习中的一种常用概念,通常指人为制造的,让一个机器学习模型发生错误的样本。Anh Nguyen的论文《Deep Neural Networks are Easily FoOLED: High Confidence Predictions for Unrecognizable Images》中有个比较形象的示意:
要理解这个图,还要提一句机器学习的一个基本问题:学习数据的分布。具体到方法就是从训练数据中进行学习,如果学习成功,则可以泛化到所有数据,包含没见过的测试数据。回到这个图,数据的分布就是最上边那三坨。一种造对抗样本的方法就是从一个类别的样本出发,做一些小修改,让模型将修改后的样本判断为另一个类别,而实际上(或是人的,显然的判断)该样本仍为原来类别,这就是图中从蓝色原点到白色小方块的方法。
当然更容易的方法是利用分类边界的不可确定性。比如上图中除了最上面部分的空间可以认为是数据存在概率极低的区域,从实际应用的角度甚至可以认为是我们完全不关心的区域。因为算法学习的样本只有实心的小圆点,所以远离小圆点的部分,分类边界是难以控制的。在这里面很容易轻松取到算法高概率认为是一个类别的样本,而实际上却难以辨认的对抗性样本。
所以大体来说,对抗性样本的存在是因为数据维度通常过高,即使考虑所在的子区域,往往还是过高,对整个(数据分布的)空间的搜索是不可行的。在训练样本没有覆盖的区域,无论该区域是否属于数据分布所在的区域,无论模型的capacity够不够,都有出现对抗性样本的可能。尽管深度学习中一直主张DIStributed representation已大幅优于局部泛化,维度的诅咒仍是一个无法摆脱的难题。
具体到CNN,下边这个例子可能不少人见过:
熊猫的图片上加上一个人眼难以察觉的噪音,对于人眼而言看上去还是熊猫,可是对于一个CNN而言,右边的图片以99%高概率被判断为了长臂猿。上句话其实已经很清楚地指出了得到右边图片的方法,还是一个优化输入图像的问题:加上一个尽量小的噪音,并通过优化这个噪音,让优化后的图像具有另一个类别的高概率:
其中n是要求的噪音,α 是相应的系数,L是x+n属于某个类别的loss,c是某个错误类别的标签。这大概是基于深度学习的计算机视觉中第一个讨论造对抗样本的方法,见于Christian Szegedy的论文《Intriguing properties of neural networks》。同样是在这篇论文中,Christian描述了一个比较令人担忧的发现:就是这种样本居然可以泛化,同一个对抗样本,对于不同的CNN结构,在不同数据子集下训练的模型,是可以达到一定程度的“通用”性的。也就是说对于一些涉及到安全的应用,攻击者即使不知道部署的模型是什么,通过某种手段猜测数据的分布,也是可以得到有效的攻击样本的。
语义信息和高层神经元对于CNN,有个很基础的认识:低层的部分学习纹理等简单信息,高层部分学习语义信息。在《Intriguing properties of neural networks》中的另一个发现是,CNN中表示高层学习到的语义信息的,并不是某一个神经元,而是高层神经元构成的空间。这个看上去有些显然的结论的一种佐证方式又是对输入图像进行优化:
其中 Φ(x) 是神经元激活值对应的向量,v是一个随机向量。另外这和前边的优化有些许不同,x的取值范围限定在已有的图片集里。其实就是在某个高层响应的空间里,沿着某个方向挑选了一些该方向上值最大的图片。最后的结论是,无论是沿着某个随机方向找到的图片,还是以某一个神经元响应最大找到的图片,都能看出一些语义上的共性,比如下图:
黑线以上是最大化某个神经元响应的样本,共性挺明显,黑线以下是最大化某层特征空间中某个方向响应的样本,共性也挺明显。
1.TMT观察网遵循行业规范,任何转载的稿件都会明确标注作者和来源;
2.TMT观察网的原创文章,请转载时务必注明文章作者和"来源:TMT观察网",不尊重原创的行为TMT观察网或将追究责任;
3.作者投稿可能会经TMT观察网编辑修改或补充。

