当前位置: 首页 > 科技观察

看得见的机器学习:零基础理解神经网络

时间:2023-03-23 11:39:02 科技观察

有一个关于机器学习的老笑话:机器学习就像高中性爱。每个人都说他们这样做,但没有人真的这样做,也没有人知道它到底是什么。[1]翻译过来的意思大概是:机器学习对高中生来说就像做爱。每个人都说他们做到了,但没有人真正做到,也没有人真正知道它是什么。总之,某种程度上,机器学习确实有很多黑暗的部分。虽然机器学习模型和神经网络通常可以在TensorFlow和sklearn等工具的帮助下快速运行,但仍然不容易理解幕后发生的事情。在本文中,我将尝试以直观的方式解释神经网络。俗话说,“耳闻为实,眼见为实”。这篇文章的目标是用“可视化”的方法让你“看到”神经网络在运行时在干什么。本文不会给出公式,希望非技术人员看得懂。希望如此^-^最简单的神经网络今天在图像识别或NLP中使用的深度神经网络已经发展出非常复杂的网络结构,有几十层和几十万个模型参数。百万。这样的神经网络极难理解,需要大量的计算能力。那么,让我们从简单到复杂,从最简单的案例开始。首先,我们考虑一个简单的“二元分类”问题。下图是一个随机生成的数据集:上图一共显示了160个点(包括红色和蓝色),每个点代表一个数据样本。显然,每个样本包含2个特征,这样每个样本都可以用二维坐标系中的一个点来表示。红点表示样本属于第一类,蓝点表示样本属于第二类。二分类问题可以理解为:训练一个分类模型,将上图中160个样本组成的训练集按照其分类分为两部分。注意:这个说法不是很严格。上图中的样本只是用来训练的,训练出来的模型应该可以对其他“不属于”这个训练集的样本进行分类(不过我们现在不关注这个,可以忽略现在这个表达式的详细信息)。为了完成这个二元分类任务,我们有多种机器学习模型可供选择。但是现在我们的目的是研究神经网络,所以我们可以设计最简单的神经网络来解决这个分类问题。如下图所示:这个神经网络再简单不过了。只有1个输入层和1个输出层,总共只有3个神经元。经过简单的数学分析,不难看出这个只有2层的神经网络模型其实等价于传统机器学习的LR模型(逻辑回归)。也就是说,这是一个线性分类器,它的训练相当于在之前的二维坐标平面中找到一条直线,将红点和蓝点分开。根据红点和蓝点的位置分布,我们很容易看出,这样的直线很容易找到(或学习)。事实上,上图这个简单的神经网络经过训练可以轻松达到100%的分类准确率。现在,假设我们的数据集看起来像下面这样(红点分成两个簇,围绕蓝点排列):如果我们仍然使用之前的2层神经网络,尝试画一条直线连接红点而且蓝点是分开的,显然是做不到的。我们说分成三个簇的数据集不再“线性可分”。事实上,对于最新的数据集,之前只有2层的神经网络无论怎么训练也只能达到60%到70%左右的分类准确率。为了提高分类的准确率,更直观的想法可能是画一条曲线,让红点和蓝点完全分开。这相当于对原始输入数据进行非线性变换。在神经网络中,我们可以通过添加一个隐藏层来完成这种非线性变换。修改后的神经网络如下图所示:我们可以看到修改后的神经网络增加了一个包含2个sigmoid神经??元的隐藏层;输入层和隐藏层是全连接的。事实上,当我们重新训练这个带有隐藏层的神经网络时,我们会发现分类准确率已经提高到100%(或者非常接近100%)。为什么是这样?我们可以这样看神经网络的计算:网络的每一层都相当于对样本空间(当然包括其中的每一个样本数据)进行变换。也就是说,输入的样本数据在经过中间隐藏层时发生了一次变换。而且,由于隐藏层的激活函数使用了sigmoid,所以这个变换是非线性变换。那么,一个很自然的问题是,经过隐藏层的这种非线性变换后,输入样本会发生什么变化?接下来,我们绘制下图中隐藏层两个神经元的输出:蓝点。两组红点各挤在一个角落里,而蓝点挤在另一个角落里。很容易看出图形现在是“线性可分的”。隐藏层的输出数据,经过神经网络的最后一个输出层处理后,就相当于经过了一个线性分类器,很容易用直线将红点和蓝点分开。从隐藏层的输出图像中,我们也可以发现一些细节:所有数据坐标(无论是X轴还是Y轴)都落在(0,1)区间内。因为sigmoid激活函数的特点,就是将实数域映射到(0,1)。我们发现所有的数据都落在了某处的角落里。这不是偶然的,而是因为sigmoid激活函数的特性。当完全训练到“饱和”一个sigmoid神经元时,它通常会输出接近0或1的值,很少会输出接近中间(0,1)的值。总结一下:从前面的分析中,我们大概可以看到这样一个变换过程,即输入样本在原始空间中不是“线性可分”的,而是经过隐藏层的变换处理后,变成了“线性可分””。”;最后对输出层进行一次线性分类后,就成功完成了二分类任务。当然,这个例子很简单,只是最简单的神经网络结构。但是即使对于更复杂的神经网络,原理也是类似的.输入样本每经过一层网络变换,就变得比之前更“可分离”了,接下来我们看一个稍微复杂一点的例子手写数字识别MNIST现在我们来考虑“手写数字识别”的问题。在机器学习学术界,有一个公开的数据集叫MNIST[2],利用神经网络识别MNIST数据,堪称神经网络和深度学习领域的“HelloWorld”。在MNIST数据集中,手写数字有70000张图片,类似如下:每张图片都是28像素×28像素的黑白图片,其中每个像素由一个灰度值表示[0,255]。MNIST数字识别问题就是给你这么一张28像素×28像素的图片,用程序区分0到9是哪个数字。对于这道题,历史最好成绩是识别率99.79%,并且该方案使用了卷积神经网络(CNN)。这里我们不想把问题复杂化,所以还是用普通的全连接神经网络来解决。我们使用的网络结构如下:这个神经网络的输入和输出定义如下:输入:一次输入一张图片。将图像每个像素点的灰度值除以255,得到[0,1]之间的归一化灰度值,然后输入到输入层的每个神经元。也就是说,输入层有784个神经元,正好对应一张图片的28×28=784个像素点。输出:输出层一共有10个神经元,每个神经元的输出对应0到9的数字,哪个神经元输出的值最大,我们可以认为预测的结果就是对应的数字。另外,这10个输出值经过softmax处理后,得到当前输入图片是每个数字的概率。训练这个神经网络后,很容易得到98%左右的正确识别率。对于这个更宽的神经网络,我们是否还能用之前的方法来可视化呢?降维在上一节中,我们简单的神经网络输入层和隐藏层只有2个神经元元素,所以它们的图像可以绘制在二维坐标平面上。对于MNIST的神经网络,当我们要绘制它的输入层的图像时,发现它有784维!如何绘制784维的特征向量?这涉及到高维数据的可视化。一般来说,人脑只能理解最高的3维空间,对于3维以上的空间,只能靠抽象思维。我们想象一个简单的例子来感受一下直观理解高维空间有多么困难:首先,在一个平面(也就是2维空间)中,我们可以找到3个成对等距的点,用它们的顶点即可构成一个等边三角形。在三维空间中,我们可以找到4个成对等距的点,以它们为顶点,组成一个正四面体,这个正四面体的每个面都是一个等边三角形。现在,我们上升到4维空间。理论上,我们可以找到5个成对等距的点,以它们为顶点,组成一个我们称之为“正五面体”的东西。继续打个比方,这个所谓的“正五面体”,它的每一个“面”,即5个点中任意4个点组成的“面”,严格来说不能称为“面”,因为它是正四面体。另外需要注意的是,当我们在这里用“正五面体”这样的用词不当来命名时,也是非常容易误导的,因为它听起来像是3维空间中的“正多面体”。但是如果你对数学史有所了解的话,应该知道,早在2000多年前,欧几里德就在他的《几何原本》中提出了3维空间中不存在正五面体(实际上只有5种正五面体)上3维空间中的多面体)。好吧,如果你还能跟上上一段关于4维空间的描述,那你一定是看得很仔细了,边看边思考^-^不过不管怎么说,4维空间的情况已经已经改变了。已经够烦人了(它们合乎逻辑却难以想象),更别提让我们想象784维空间中的几何结构了!因此,我们需要降维(dimensionalityreduction)技术,将高维空间的数据降维到3维或2维空间,然后才能直观地绘制出来,达到某种“直观理解”的目的。那么降维是一种什么样的操作呢?我们仔细想想。其实在现实世界中,我们遇到过很多降维的情况。比如下图:这是100多年前的一幅名画,名字是《大碗岛的星期天下午》。在这幅画中,我们可以感受到沙滩之外的强烈纵深感。但是任何绘画都是在二维平面上绘制的。因此,画家需要将三体场景投影到二维上,这是一种“降维”处理。与此类似,我们平时用相机拍摄的照片,也会将三维空间“降维”到二维平面上。这种降维处理无处不在,可以称为“投影变换”,是线性变换的一种。再看一个例子:图中右侧是平面世界地图。本来地球表面在三维空间是一个球体,但是上面的世界地图把整个球体画在了二维平面上。为了做到这一点,很明显,映射器需要将球体弄平,并且需要拉伸和扭曲某些区域。我们把这个绘制过程看作是一个映射:地球表面的一个点映射到平面世界地图上的一个点。但是所有点的映射不满足相同的线性关系,所以这是一个非线性变换。无论是一幅画的例子,一张照片,还是上面这个世界的平面地图的例子,都把三维维度降为二维。但是在机器学习中,我们经常需要将维度从更高的维度降维到3D或者2D。人们发明了各种降维方法,如PCA(PrincipalComponentAnalysis),它是一种线性降维方法;MDS(Multi-dimensionScaling),t-SNE(t-DistributedStochasticNeighborEmbedding),都是非线性降维方法。基于k近邻图和力学模型的降维可视化方法上述各种降维方法各有侧重。任何一种解释都会占用大量篇幅,本文不一一详述。考虑到我们接下来的目标是直观展示上一节介绍的MNIST神经网络,我们这里采用更直接(也更容易理解)的方法——k-NNG(k-NearestNeighborhoodGraph,k近邻图)和力学模型(Force-Directed)降维可视化方法[3][4]。该方法的过程可以描述为:计算高维空间中两个节点之间的距离,为每个节点找到k个最近的节点,并将它们连接起来建立一条边。这将创建一个由节点和边组成的图形数据结构。这个新创建的图有以下特点:由边直接连接的节点,它们在原始高维空间中的位置比较接近;而没有边直接相连的节点,它们在原始高维空间中的位置就比较远。这个图称为“k最近邻图”,即k-NNG(k-NearestNeighborhoodGraph)。还有一个问题:如何计算高维空间中两个节点之间的距离?计算方法其实有很多,比较常见的有“欧氏距离”、“闵可夫斯基距离”等。在二维平面上画出上一步得到的k近邻图。这成为一个常见的图纸布局问题,有点类似于电路板上的元件布局。为了使绘制的图像清晰易观察,绘制过程需要尽可能满足一定的条件,例如边缘的交集应尽可能少;由边连接的节点应尽可能靠近;节点不应该太靠近(在一起),它应该在整个坐标系平面上尽可能均匀地分布。为了满足这样的要求,我们使用了Fruchterman和Reingold发明的Force-DirectedGraphDrawing算法。它模拟了物理世界的力学原理,如下图所示:想象一下左上角的图形,用弹簧代替边,用带电的球代替节点;springs会倾向于将相邻节点(即边连接的节点)固定在自然长度(对应原始高维空间中的距离),既不太远也不太近;所有“带电球”保持相互排斥,使非相邻节点相互远离,促使所有节点传播全图;松开手,让各个节点在弹簧和斥力的作用下自由移动,最终达到整体能量最小的状态,即得到左下角较好的节点布局。对于这种方法,我们需要关注的是:从高维到低维,保持了原来高维空间中的哪些几何特征?从前面绘制过程的描述中不难看出:在原来的高维空间中,距离比较近的节点在最终绘制的二维图像中,在弹簧张力的作用下也会比较靠近.只有弄清楚这一点,我们才能通过查看低维图像来理解高维结构。现在,我们终于准备好可视化MNIST神经网络了。上面MNIST的可视化是MINST神经网络输入层数据的可视化图像(784维)。图中每个节点代表一张图片,用784维向量表示;图中每种颜色代表0到9中的一个数字,相当于总共10类节点。我们可以看到:在原始的MNIST数据集中,自我发展表现出一定的结构。代表相同数字的节点在原来的784维空间中会比较靠近,自然会聚集成簇。比如左边的蓝色节点组代表数字0;右下角的靛蓝节点组代表数字1;左下角的紫色节点组代表数字6。中间右侧有许多不同类型的节点混合在一起。例如,代表数字9的红色节点、代表数字7的深棕色节点和代表数字4的黄绿色节点相互交织。这意味着它们不容易彼此区分。上图是MINST神经网络中间隐藏层输出数据的可视化图像(128维)。图中每个节点仍然对应一张图片(即经过隐层变换后的原始图片数据对应的数据),变成128维的向量表示;图中每种颜色仍然代表0到9中的一个数,或者一共10个类别。我们可以看到:与之前的MINST原始输入数据相比,节点的混乱程度降低了(也可以说是熵值降低了)。这还包括在上一张图片中混杂在一起的数字7、4和9,现在它们聚集在自己的右侧:左侧突出的深棕色节点簇,即数字7;左上角的黄绿色节点簇,是数字4;红色节点组,是数字9。这意味着更容易将它们彼此分开。上图是MINST神经网络最终输出层输出数据(经过softmax处理后)的可视化图像(10维)。图中每个节点仍然对应一张图片(即整个神经网络变换后的原始图片数据对应的数据),变成一个只有10维的向量;图中每种颜色仍然代表0到9中的一个数,或者一共10个类别。可以看到:节点的混乱度大大降低,每一类数都聚集在一起。考虑到这张图的节点数和前两张图的节点数完全一样,但是分布空间要小很多,说明按分类聚类的程度已经达到了很高的水平。其实这时候你只需要对最后的10维向量做一个简单的argmax判断,就可以准确率很高的识别出具体的数字。这意味着最终的输出具有高度的“可分离性”。总结本文通过对神经网络的可视化研究,我们发现从原始特征输入出发,神经网络的每一层变换处理在抽象上更接近问题的目标。以MNIST的手写数字识别问题为例,目标是多分类问题,即把图片分类到0到9的10个类别中的其中一个。初始输入是原始图像像素数据。经过每一个网络层变换过程,数据变得比原来更“可分离”一点,即更接近分类目标。这是一个典型的信息整合过程。就像现实世界中的很多情况一样,只有将复杂的细节有效整合,我们才能获得真正的“感知”或“认知”。对于图像识别这样简单的感知行为,人类甚至意识不到这种信息整合过程的存在。从人眼看物体的过程来看,物理世界中的光子进入人眼的感光细胞后,会产生大量详细的数据。而这些数据必须经过人脑中类似于神经网络(肯定比神经网络更高级)的结构进行处理。整合这些详细数据后,我们就可以在宏观层面上识别我们眼前看到的是什么物体。对于人脑来说,这个过程是瞬时、快速、准确和低能量的。如果我们要设计一个可以识别物体的模型,最好的方式可能就是完全复制人脑的处理机制。但是这些机制是未知的,或者至少我们对它们知之甚少。因此,我们只能近似、参考、模仿人脑的机制。最后,我们今天讨论的可视化技术只是机器学习的可解释性技术中非常初级的部分。它可能为如何修改现有模型或如何更好地训练模型提供参考价值,但它可能无法帮助我们从头发明一种颠覆性的学习机制。正如我们在上一篇文章《程序员眼中的「技术-艺术」光谱》中所讨论的那样,新模型的设计,或新颖学习机制的发明,仍然是一门需要灵感的“艺术”。