1.介绍在本文中,我们将回顾目前用于可视化和理解深度神经网络的一些方法。我不会深入研究材料的细节,而是提供一些个人观点和我在研究材料时的个人经验。所有原创材料均来自AndrejKarpathy在伯克利的客座演讲,CS294。2.ConvexOptimizationvs.Non-ConvexNeuralNetworksConvexOptimization在数学上是一个非常严谨的问题,人们一直在做大量的研究。它的美妙之处在于能够推导出易于实现的全局最优下降算法。它不是凸优化问题,但很难证明其绝对性。因此,我们担心针对这些问题提出的优化算法会停滞在局部极小值。然而,这并不是说我们不能证明非凸问题的解决方案。我遇到过使用区间分析的技术,只要该函数在某些奇数处是Lipschitz连续的,并且它的解(局部最小值)不会组合爆炸。神经网络本质上是一个非凸问题。因此,其专利形式被证明是安全的。过去,担心局部极小值不佳是真的,尤其是在神经网络刚刚开始发展的时候(80年代)。该主题的论文之一:TheLossSurfacesofMultilayerNetworks(TheLossSurfacesofMultilayerNetworksbyChoromanskaetal.2015),经验表明随着问题维度的增加(可以看作是更多的隐藏层),最终解决方案的损失方差将下降。所以基本上,最佳解决方案和最差解决方案之间的差距不断缩小,所有局部最小值都变得相同。所以非凸优化解决方案就消失了,人们并没有真正解决问题,它只是变得不重要了。3.层图表达和t-SNE可视化(编者注:t-SNE是t-distributedstochasticneighborembedding的缩写,即t-distributedstochasticneighborembedding算法)卷积神经网络,简单来说,就是一个多层巨型Mac三明治。可视化这些网络的一种方法是从网络中取出一个神经元,看看是什么激发了该神经元。本质上,我们根据经验使用这些激活反应来可视化神经元响应的对象。图例:可视化激活神经网??络的事物另一种技术是可视化网络权重。这需要训练它自己的神经网络并显示它学到的Gabor过滤器。但是,这种方法只对卷积神经网络的第一层有效,因为输入图像得到的权重会在第一层之后进行卷积。当你深入网络时,我们无法解释这些过滤器的结果,因为每一层的权重都在前一层的输出上进行卷积。图注:Visualizingnetworkweights在这里,Andrej给出了一个关于使用ConvNetJS实现可视化技术的链接(https://cs.stanford.edu/people/karpathy/convnetjs/),它可以逐层分解,你可以使用这个在输出最终的分类结果之前观察网络每一层的梯度、激活函数、权重等。另外,Andrej还推荐了TensorFlowPlayground:http://playground.tensorflow.org/,以及JasonYosinski的博客:http://yosinski.com/deepvis4.有一个观察量,不仅是对单个神经元的可视化卷积神经网络的方法是看它的全局表达,即卷积神经网络顶层对任意一张图片的输出。我们将图像传递到卷积神经网络进行处理。这个网络的每一层都会重新表达图像,对于每一层,我们都可以了解原始图像是如何整合到这一层的。因此,为了可视化这个过程,我们希望将这些表示整合到二维空间中。这时候,你需要使用一种很酷的技术,叫做t-SNE可视化技术(VanderMaaten,Hinton**)。**这种技术将高维点嵌入到低维空间中,同时保留了局部成对距离(在低维空间中相邻的点在高维空间中仍然相邻)。图例:t-SNE可视化图例:使用强化学习玩Atari游戏的可视化5.覆盖实验这种可视化网络所学内容的技术是将网络视为黑盒,修改其输入并观察输出。假设我们有一张图片可以被这个网络准确分类为博美犬。现在,我们要做的就是把这张图片的某一块“挡住”(把这个地方的像素值设置为0或者255,或者颜色可以设置为黑色或者白色)。因此,该网络的输出是该蒙版图像的输出。我们可以发现,我们屏蔽的部分越重要,比如面部,网络做出正确分类的可能性就越小。一个有趣的发现是,例如,我们有一张照片,中间有一只阿富汗猎犬,旁边是一个男人,网络可以正确地将它标记为阿富汗猎犬。然而,如果这个人的脸被0像素的方块覆盖,网络认为它是阿富汗猎犬的概率会急剧增加。造成这种现象的原因是每张图片都只分配了一个正确的标签。当我们覆盖了一些可能导致网络做出其他决定的部分时,那么得到正确标签的概率就会大大提高。向上。这也是一种完整性检查,让网络通过调整图片可能属于的类别标签的概率来做出合理的判断。六、反卷积法(DeconvolutionApproaches)通常我们会尝试计算损失函数关于网络权值的梯度,这样我们每次做update操作的时候都可以优化权值。现在,让我们思考一个问题:给定一张图片,我们如何得到网络中任意一个随机神经元的梯度?有一个可行的解决方案:1)将图片输入到网络中,对于网络单元深处的某个神经元,我们将其命名为神经元a。2)将其梯度设置为1,并将同一层中的所有其他神经元设置为0。3)将梯度一路反向传播回图像,从而产生略微怪异、嘈杂的图像。虽然这张梯度图很难解释,但至少可以告诉你,如果你把这张图和原图叠加起来,会增加神经元a的激活函数值。反向传播过程只改变整流线性单元ReLU层。这里的直觉是:将梯度(反向)传递到ReLU层中的某个神经元,然后神经元被激活。否则,交货停止。另一种选择是不使用简单的反向传播,而是使用所谓的引导式反向传播。该技术不仅可以识别修正线性单元ReLU是否被激活,还可以识别所有负梯度。本质上,除了关闭所有不活跃的整流线性单元ReLU外,反向传播过程中遇到的所有负信号也可以设置为0的阈值。最终,我们只需要传回梯度为正的值。这样,反向传播***得到的图会更清晰,因为我们去掉了所有负梯度对我们选择的神经元的影响,只保留了正影响(参见:StrivingforSimplicity:TheallConvolutionalNet,Springenberg、Dosovitskiy等人,2015年了解更多信息)。图例:使用引导反向传播后噪声显着降低7.最大化图像1.类别可视化教授的下一个技术涉及最大化图像。考虑以下问题:我们能否找到使某个类别的分数最大化的图像?为此,我们希望保持神经网络架构不变,但使用不同的损失函数对图像进行优化。改变。该方法包括以下步骤:(1)将随机图像传入神经网络;(2)设置梯度得分向量为[0,0,…,1,0,…0](感兴趣的设置那个类为1,不感兴趣的设置为0),然后反向传播对象;(3)进行小规模的“图像更新”;(4)前向传播更新后的图像;(5)重复(2)设置其他梯度得分向量。我们从一张随机噪声的图像开始,将梯度上升应用到目标类(即使用上述梯度得分向量反向传播的那个),我们将生成一个图像,为目标类改进神经网络激活状态。在数学上,让I代表一个图像,y代表一个目标类别,Sy(I)是神经网络在类别y上分配给图像I的分数。我们希望解决以下优化问题:也就是说,我们希望找到一个图像I*,它可以最大化神经网络分配给类别y的分数。在上式中,R是正则化项。正则化项改进了输出图像的可视化(参见Simonyan等人,DeepInsideConvolutionalNetworks:VisualizingImageClassificationModelsandSaliencyMaps,ICLRWorkshop2014)。这个内容是去年完成的,它涉及类分数。然而,这个技巧可以应用于神经网络中的所有节点。我们从一些随机图像开始并向前传播,直到我们到达我们想要研究和可视化的层。对于层中的任何神经节点,重复此步骤(即将其他梯度分数设置为0,目标对象梯度值设置为1,在图像上反向传播)以检查哪个图像激活了神经网络中最多的神经节点。请注意,这些技术中有正则化项以避免对抗性图像。不同的正则化方案侧重于图像的不同方面来判断我们认为什么是“正常”图像。因此,它们会对这些试验的结果产生重大影响。2.FeatureInversion另一个可以探讨的问题是:给定一个卷积神经网络的“编码”(特征表示,可以理解为神经网络中某一层的输出值),是否可以基于它重建原始图像?下面的技术试图实现这个功能。它分为三个步骤:(1)将一些输入图像传递到网络中;(2)忽略输入图像;(3)在一些层中反向传播输入,直到在网络中找到这样一个层,该层可以生成与输入图像具有相同“encode”(在该层学习的特征表示)的图像。在数学上,让I表示输入图像,φl(I)是卷积神经网络φ中的激活层l。我们希望解决以下优化问题:即我们希望在神经网络φ的第l层中找到与图像I具有相似特征表示的图像I*。其中||.||2表示L2范数,R是正则项(可能是隐式的)。简而言之,我这里的想法是,要存储一张图片,只需要存储图片的“编码”即可。我们可以使用这些“编码”根据上述方法重建图像(尽管有损失)(参见Yosinski等人,“UnderstandingNeuralNetworksThroughDeepVisualization”,ICML2015DeepLearningWorkshop)。总的来说,这项技术使我们能够看到图像是如何通过一组特定的“代码”(特征表示)在神经网络上恢复的。八、卷积网络中的对抗图像对抗图像是对原始图像加入微小扰动后形成的图像;这些扰动由数据集中的数据组成,并被故意设置为最坏的情况。结果,神经网络将错误地为这个新形成的图像分配高概率。在实践中,我们可以将任何正确标记的图像传入神经网络,并根据其他对抗性图像对其进行扰动。我们不打算深入探讨数学细节,但发生这种情况的原因是因为神经网络通常具有非常高的维度,因此具有内在的线性特性。直观地,我们考虑下面的线性例子:设x为输入图像,w为模型的权重值,那么得到输出的运算就是x和w的内积,即wTx。如果我们用η稍微扰动输入,我们会得到xˉ=x+η。然后,输出变为xˉ=wTx+wTη。这种反扰动导致激活值wTη增加。此外,我们可以根据对η的某些约束(通常是正则化约束)来最大化该项,从而导致模型出现问题。然而,随着问题维度的增加,我们可以在满足正则化条件的同时对η向量应用许多小的扰动。加起来,这些小的变化最终会对输出产生很大的影响。查看不同模型之间的对抗性图像的另一种方法是将它们视为对抗性扰动在模型权重向量下高度对齐的结果。这是因为上面解释中所说的:这些微小的变化迫使线性模型关注与模型具有最接近权重值的信号;即使其他信号(来自正确的图像)具有更大的振幅也是如此。9.DeepDreamExperiment注:DeepDreamGitHub:https://github.com/google/deepdreamDeepDream实验背后的机制其实很简单。基本上我们只是修改图像以增强网络中选定层的激活。具体来说,我们需要:(1)从神经网络中选择某一层;(2)将一些输入图像传入其中,以确定给定层的特征;(3)设置该层的梯度值为激活值本身;(4)反向传播图像。10.神经风格实验考虑以下场景:我们有两张图片,一张是内容图片Ic,另一张是风格图片Is,我们要生成第三张图片,这样它可以有内容图片Ic和Is的风格也就是说,我们要做的就是从Ic中解析出内容,从Is中解析出样式。为了解析出内容,我们将Ic输入我们的神经网络并存储每一层的激活值。但是解析样式的过程是不同的。我们将Is传入神经网络,计算出每一层激活值的加米安矩阵(G=VTV)。从代数的角度来看,Garmian矩阵G就是V的内积。例如,CONV1层由244×244×64个激活组成,我们计算一个64×64Gram矩阵,它是每个区域中成对激活的协方差之和。从图像的角度,我们将一层由三维(244×244×64)矩阵组成的激活值转化为二维矩阵((244×244)×64),取它的外积得到64x64矩阵。对于矩阵中的每个条目gi,j,我们将该层输出通道i和j的激活值相乘。如果通道i和j的神经元交织在一起,那么它们会加起来,我们也会得到更大的gi,j。因此,Gram矩阵G包含在对整个空间位置进行平均后哪些神经元连接在一起的数据。我们为神经网络中的每一层计算一个Gram矩阵。最后,一旦我们有了这些信息,我们就可以优化整个图像以获得:Ic的内容和Is的风格(详见LeonA.Gatys等人,《A Neural Algorithm of Artistic Style》,2015)。***,Andrej还推荐了一个fastneuralstyletransfer项目,可以通过网络摄像头实时实现风格迁移:https://github.com/jcjohnson/fast-neural-style,见文章《开源 | 怎么让你的照片带上艺术大师风格?李飞飞团队开源快速神经网络风格迁移代码》机器的心脏。11.结论在这篇评论中,我们回顾了一些可用于理解和可视化神经网络的技术。这些技术是从各种来源收集的,并以无关紧要的顺序呈现。我们探索如何可视化最大化神经元激活的块,检查它们的权重值及其对激活值的影响(第三部分);我们还讨论了使用t-SNE等技术来可视化全局表示(第4节);在讨论的掩蔽实验中,我们修改输入并观察输出如何变化(第5节);然后,我们讨论几种反卷积方法(第6节),然后是图像优化(第7节)以最大化类、神经元之间的放电率,或匹配特定编码。此外,我们基于简化的线性解释讨论了卷积网络中的对抗性输入。***,我们谈到了优化图像的一些应用(在DeepDream,NeuralStyle的最后两节中)。这些技术表明,神经网络中的“层”或特征不仅仅是随机模式,而是具有可以直观理解的属性。我们能够使用这些可视化技巧来发现模型中的问题以获得更好的结果。最后,我们想提一个可能更有价值的观点:随着神经网络的增长,今天神经网络给出的解决方案被证明是经验最优的——也就是所谓的“好”和“坏”答案之间的鸿沟消失了。因此,被困在本地热点可能不再是问题。【本文为栏目组织机器之心原创文章微信公众号“机器之心(id:almosthuman2014)”】点此查看作者更多好文
