机器学习(四)——神经网络的表层结构

动机

神经网络实际上是一个相对古老的算法,并且后来沉寂了一段时间,不过到了现在,它又成为许多机器学习问题的首选技术,既然我们已经有线性回归和逻辑回归算法了,为什么还要研究神经网络?有时我们要解决的问题可能依赖于研究复杂的非线性分类器,在此之前,我们只是简单的增加二次项或者三次项之类的逻辑回归算法,但这并不是一个解决复杂非线性问题的好办法,因为当n很大时,将会产生非常多的特征项,最后的结果很有可能是过拟合的,此外,在处理这么多项时,也存在运算量过大的问题。然而对于许多实际的机器学习问题,特征个数n是很大的,比如计算机视觉,神经网络在解决复杂的非线性分类问题上,被证明是一种好得多的算法,即使你输入特征空间或输入的特征维数n很大也能轻松搞定。

神经网络产生的原因,是人们想尝试设计出模仿大脑的算法,从某种意义上说,如果我们想要建立学习系统,那为什么不去模仿我们所认识的最神奇的学习机器——人类的大脑呢?神经网络逐渐兴起于二十世纪八九十年代,应用得非常广泛,但由于各种原因,在90年代的后期应用减少了,但是最近神经网络又东山再起了,其中一个原因是,神经网络是计算量有些偏大的算法,然而大概由于近些年,计算机的运行速度变快,才足以真正运行起大规模的神经网络。正是由于这个原因,和其他一些我们后面会讨论到的技术因素,如今的神经网络,对于许多应用来说是最先进的技术。当你想模拟大脑时,是指想制造出与人类大脑作用效果相同的机器,大脑可以学会去以看而不是听的方式处理图像,学会处理我们的触觉,我们能学习数学,学着做微积分,而且大脑能处理各种不同的令人惊奇的事情,似乎如果你想要模仿它,你得写很多不同的软件,来模拟所有大脑告诉我们的这些五花八门的奇妙的事情,不过能不能假设,大脑做所有这些不同事情的方法,不需要用上千个不同的程序去实现,相反的,大脑处理的方法只需要一个单一的学习算法就可以了?幸运的是,这一假设已经得到了多方面的证据。例如神经重接实验,它指出如果人体有同一块脑组织可以处理光、声或触觉信号,那么也许存在一种学习算法,可以同时处理视觉、听觉和触觉,而不是需要运行上千个不同的程序来做这些。也许我们需要做的就是,找出一些近似的或实际的大脑学习算法,然后实现它,大脑通过自学掌握如何处理这些不同类型的数据。在很大的程度上,可以猜想如果我们把几乎任何一种传感器接入到大脑的几乎任何一个部位的话,大脑就会学会处理它。同样的,也有许多这方面的证据,例如,BrainPort系统。从某种意义上来说,如果我们能找出大脑的学习算法,然后在计算机上执行大脑学习算法或与之相似的算法,也许这将是我们向人工智能迈进,做出的最好的尝试。人工智能的梦想就是,有一天能制造出真正的智能机器。

神经网络

我想开始向你介绍,我们该如何表示神经网络,换句话说,当我们在运用神经网络时,我们该如何表示我们的假设或模型。神经网络是在模仿大脑中的神经元或者神经网络时发明的,因此要解释如何表示模型假设,我们先来看单个神经元在大脑中是什么样的? 我们的大脑中充满了这样的神经元(nucleus),神经元是大脑中的细胞,其中有两点值得我们注意,一是神经元有像这样的细胞主体,二是神经元有一定数量的输入神经,这些输入神经叫做树突(dendrite),可以把它们想象成输入电线,它们接收来自其他神经元的信息;神经元的输出神经叫做轴突(axon),这些输出神经是用来给其他神经元传递信号或者传送信息的。简而言之,神经元是一个计算单元,它从输入神经接受一定数目的信息,并做一些计算,然后将结果通过它的轴突传送到其他节点或者大脑中的其他神经元。神经元利用微弱的电流进行沟通,这些弱电流也称作动作电位。

捕获

我们将神经元模拟成一个逻辑单元,当我画一个这样的黄色圆圈时,你应该把它想象成作用类似于神经元的东西,然后我们通过它的树突或者说它的输入神经传递给它一些信息,然后神经元做一些计算,并通过它的输出神经,即它的轴突,输出计算结果。当我画一个像这样的图表时,就表示对h(x)的计算。h(x)等于1除以1加e的负θ转置乘以x,通常x和θ是我们的参数向量。这是一个简单的模型,甚至说是一个过于简单的模拟神经元的模型,它被输入x1 x2和x3,然后输出一些这样的结果。当我绘制一个神经网络时,通常我只绘制输入节点x1 x2 x3,但有时也可以增加一个额外的节点x0,这个x0节点有时也被称作偏置单位(bias unit)或偏置神经元,但因为x0总是等于1,所以有时候我会画出它,有时我不会画出,这取决于它是否对例子有利。有时我们会说:这是一个有s型函数或者逻辑函数作为激励函数的人工神经元。在神经网络术语中,激励函数只是对类似非线性函数g(z)的另一个术语称呼,g(z)等于1除以1加e的-z次方。到目前为止,我一直称θ为模型的参数,在关于神经网络的文献里,有时你可能会看到人们谈论一个模型的权重,权重其实和模型的参数是一样的东西,我会继续使用“参数”这个术语,但有时你可能听到别人用“权重”这个术语。最后,这个黄色小圈代表一个单一的神经元。

捕获2

神经网络其实就是这些不同的神经元组合在一起的集合,具体来说,这里是我们的输入单元x1 x2和x3,再说一次,有时也可以画上额外的节点x0,这里有3个神经元,我在里面写了a(2)1 a(2)2和a(2)3,然后再次说明,我们可以在这里添加一个a(2)0,即一个额外的偏度单元,它的值永远是1,我们在最后一层有第三个节点,正是这第三个节点输出假设函数h(x)计算的结果。再多说一点关于神经网络的术语,网络中的第一层也被称为输入层(input layer),因为我们在这一层输入我们的特征项x1 x2 x3,最后一层也称为输出层(output layer),因为这一层的神经元输出假设的最终计算结果,中间的两层也被称作隐藏层(hidden layer),隐藏层不是一个很合适的术语,但是直觉上我们知道,在监督学习中,你能看到输入,也能看到正确的输出,而隐藏层的值,你在训练集里是看不到的,它的值不是x也不是y,所以我们叫它隐藏层。神经网络可以有不止一个的隐藏层,但在这个例子中,我们有一个输入层,即第1层,一个隐藏层,即第2层,和一个输出层,即第3层,但实际上,任何非输入层或非输出层的层就被称为隐藏层。接下来,我希望你们明白神经网络究竟在做什么,让我们逐步分析这个图表所呈现的计算步骤,为了解释这个神经网络具体的计算步骤,这里还有些记号要解释,我要使用a上标(j)下标i表示第j层的第i个神经元或单元,具体来说,这里a上标(2)下标1表示第2层的第一个激励,即隐藏层的第一个激励,所谓激励(activation)是指由一个具体神经元读入计算并输出的值,此外,我们的神经网络被矩阵θ上标(j)参数化,它将成为一个波矩阵,控制着从第j层到第j+1层的作用,比如说从第一层到第二层,或者第二层到第三层的作用。所以,这就是这张图所表示的计算:

图片19

这里的第一个隐藏单元是这样计算它的值的:a(2)1等于s函数(或者说s激励函数,也叫做逻辑激励函数)作用在这种输入的线性组合上的结果,第二个隐藏单元等于s函数作用在这个线性组合上的值,同样对于第三个隐藏的单元,它是通过这个公式计算的。在这里,我们有三个输入单元和三个隐藏单元,这样一来,参数矩阵控制了我们来自三个输入单元到三个隐藏单元的映射,因此θ1将变成一个3乘4维的矩阵。更一般的,如果一个网络在第j层有sj个单元,在j+1层有sj+1个单元,那么矩阵θ(j),即控制第j层到第j+1层映射的矩阵的维度为sj+1 * sj+1,这里要搞清楚,这个是s下标j+1,而这个是s下标j,然后整体加上1。最后,在输出层我们还有一个单元,它计算h(x),这个也可以写成a(3)1,就等于后面这块,注意到我这里写了个上标2,因为θ上标2是参数矩阵或着说是权重矩阵,该矩阵控制从第二层(即隐藏层的3个单位)到第三层的一个单元(即输出单元)的映射。

我想告诉你如何高效地进行计算,并展示一个向量化的实现方法,更重要的是,我想让你们明白为什么这样表示神经网络是一个好的方法,并且明白它们怎样帮助我们学习复杂的非线性假设。还是以之前那个神经网络为例,以前我们说计算出假设输出的步骤是:通过上面那些方程,我们计算出三个隐藏单元的激励值,然后利用这些值来计算假设h(x)的最终输出。接下来,我要定义一些额外的项,上面第一个方程括号里的项,我把它定义为z上标(2)下标1,这样一来,就有了a(2)1这个项等于g(z(2)1),另外顺便提一下,这些上标2的意思是,这些值与第二层相关,即与神经网络中的隐藏层有关,接下来,上面第二个方程括号里的项,我将同样定义为z(2)2,最后,上面第三个方程括号里的项,我把它定义为z(2)3,这样,我们有a(2)3等于g(z(2)3),所以这些z值都是输入值x0 x1 x2 x3的加权线性组合,它将会进入一个特定的神经元。现在,注意上面前三个方程括号里的项,你可能会注意到这块对应了矩阵向量运算,类似于矩阵向量乘法θ(1)乘以向量x,观察到这一点,我们就能将神经网络的计算向量化了。具体而言,我们定义特征向量x为x0 x1 x2 x3组成的向量,其中x0仍然等于1,并定义z(2)为这些z值组成的向量,即z(2)1 z(2)2 z(2)3,注意,在这里z(2)是一个三维向量。下面,我们可以这样向量化a(2)1 a(2)2 a(2)3的计算:我们只用两个步骤,z(2)等于θ(1)乘以x,这样就有了向量z(2),然后a(2)等于g(z(2))。需要明白,这里的z(2)是三维向量,并且a(2)也是一个三维向量,因此这里的激励g,将s函数逐元素作用于z(2)中的每个元素。顺便说一下,为了让我们的符号和接下来的工作相一致,在输入层,虽然我们有输入x,但我们还可以把这些想成是第一层的激励,所以我可以定义a(1)等于x,因此a(1)就是一个向量了,我就可以把上面两个步骤中第一步的x替换成a(1),那么z(2)就等于θ(1)乘以a(1)了,这都是通过在输入层定义a(1)做到的。现在,就我目前所写的,我得到了a(2)1 a(2)2 a(2)3的值,但我还需要一个值,我同样需要这个a(2)0,它对应于隐藏层的偏置单元,当然,输入层也有一个偏置单元,我只是没有画出来,为了注意这额外的偏置单元,接下来我们要额外加上一个a(2)0,它等于1,这样一来,现在a(2)就是一个四维的特征向量。最后,为了计算假设的实际输出值,我们只需要计算z(3)(即上面最后一个方程括号里的项),z(3)等于θ(2)乘以a(2),则假设输出为h(x)等于a(3),a(3)是输出层唯一的单元,它是一个实数,你可以写成a(3)或a(3)1,等于g(z(3)),这个计算h(x)的过程,也称为前向传播(forward propagation),这样命名是因为,我们从输入层的激励开始,然后进行前向传播给隐藏层并计算隐藏层的激励,然后我们继续前向传播并计算输出层的激励,这个从输入层到隐藏层再到输出层依次计算激励的过程叫前向传播。我们刚刚得到了这一过程的向量化实现方法,如果你使用下边这些公式实现它,就会得到一个有效的计算h(x)的方法。

图片20

这种前向传播的角度也可以帮助我们了解,神经网络的原理和它为什么能够帮助我们学习非线性假设。再次回顾上面的神经网络图,倘若我们只观察隐藏层和输出层,这看起来很像逻辑回归。在逻辑回归中,我们用输出层的节点(即这个逻辑回归单元)来预测h(x)的值,具体来说,假设输出的h(x)将等于s型激励函数g(θ(2)10 * a(2)0 + θ(2)11 * a(2)1 + θ(2)12 * a(2)2 + θ(2)13 * a(2)3),其中a1 a2 a3由隐藏层的三个单元给出。这样做完,我们只得到了逻辑回归,但是逻辑回归的输入特征值是通过隐藏层计算的,再说一遍,神经网络所做的就像逻辑回归,但是它不是使用x1 x2 x3作为输入特征,而是用a(2)1 a(2)2 a(2)3作为新的输入特征。有趣的是,特征项a(2)1 a(2)2 a(2)3,它们是作为输入的函数来学习的。具体来说,就是从第一层映射到第二层的函数,这个函数由其他一组参数θ(1)决定,所以,在神经网络中,它没有用输入特征x1 x2 x3 来训练逻辑回归,而是自己训练逻辑回归的输入a1 a2 a3。可以想象,如果在θ1中选择不同的参数,有时可以学习到一些很有趣和复杂的特征,就可以得到一个更好的假设,比使用原始输入x1 x2或x3时得到的假设更好,你也可以选择多项式项x1 x2 x3等作为输入项,但这个算法可以灵活地快速学习任意的特征项。神经网络中神经元相连接的方式称为神经网络的架构,所以说,架构是指不同的神经元是如何相互连接的。任何一个不是输入层或输出层的,都被称为隐藏层。

应用

在接下来,我要通过讲解一个具体的例子,来解释神经网络是如何计算关于输入的复杂的非线性函数。考虑下面的问题:我们有二进制的输入特征x1 x2,要么取0,要么取1,只能有两种取值,在这个例子中,我只画出了两个正样本和两个负样本,但你可以认为这是一个更复杂的学习问题的简化版本,在这个复杂问题中,我们可能在右上角有一堆正样本,在右下方有一堆用圆圈表示的负样本,我们想要学习一种非线性的决策边界来区分正负样本。

捕获5

那么神经网络是如何做到的呢?为了描述方便我不用右边这个例子,我用左边这个例子更容易说明。具体来讲,这里需要计算的是,目标函数y等于x1异或x2,或者y也可以等于x1异或非x2,其中异或非表示x1异或x2后取反,X1异或X2为真当且仅当这两个值X1或者X2中有且仅有一个为1,我们想要知道是否能找到一个神经网络模型来拟合这种训练集,为了建立能拟合XNOR运算的神经网络,我们先讲解一个稍微简单的神经网络,它拟合了“且运算”,假设我们有输入x1和x2,并且都是二进制,即要么为0要么为1,我们的目标函数y正如你所知道的等于x1且x2,这是一个逻辑与,那么我们怎样得到一个具有单个神经元的神经网络来计算这个逻辑与呢?为了做到这一点,我也需要画出偏置单元,即这个里面有个+1的单元,现在让我给这个网络分配一些权重或参数,我在图上写出这些参数,所以我的假设h(x)等于g(-30 + 20×1 + 20×2)。在图上画出这些参数和权重是很方便很直观的。

捕获4

其实在这幅神经网络图中,第一个-30其实是θ(1)10,第二个+20是θ(1)11,第三个+20是θ(1)12,但把它们想成这些边的权重会更容易理解。回忆一下s型激励函数g(z)看起来是这样的:它从0开始光滑上升,穿过0.5渐进到1,如果横轴值z等于4.6,则S形函数等于0.99,这是非常接近1的,并且由于对称性,如果z为-4.6,S形函数等于0.01,非常接近0。让我们来看看x1和x2的四种可能输入,看看我们的假设在各种情况下的输出:如果X1和X2均为0,则假设会输出g(-30),g(-30)在图的很左边的地方,非常接近于0,如果x1等于0且x2等于1,那么此公式等于g(-10),也在很左边的位置,所以也是非常接近0;如果x1等于1并且x2等于0,这就是-30加20等于-10,这也是g(-10),也是非常接近0;最后,如​​果x1等于1且x2也等于1,那么这等于-30 +20 +20,所以这是取+10时,非常接近1。这显然就是逻辑“与”的计算结果,所以,这里得到的h(x),近似等于x1和x2的与运算的值。换句话说,假设输出1当且仅当x1 x2都等于1。同理,下面的神经网络实现了或函数的功能:

捕获3

现在我们怎样进行逻辑非运算,也就是计算"非x1",我先写出这个神经网络中相连接的各权值:

捕获6

这里我们只有一个输入量x1,在这里我们也加上了表示偏差的单位元+1,如果我将输入单元和两个权数相连,也就是+10和-20,则可用以上假设方程来计算h(x)=g(10-20×1),其中g是一个S型函数。当x1等于0时,计算出假设函数g(10-20*0),也就是g(10),这个值近似的等于1;而当x等于1时,计算出的假设函数则变成g(-10),也就是约等于0。所以要计算逻辑非运算的总体思路是:在你希望取非运算的变量前面放上一个绝对值大的负数作为权值。另外,我再给出一个例子,计算这样一个函数:(非x1)与(非x2),你大概应该知道,至少应该在x1和x2前面放一个绝对值比较大的负数作为权值。因此,这个看起来很长的逻辑函数“(非x1)与(非x2)”的值将等于1,当且仅当x1等于x2等于0。

捕获7

"x1与x2"与运算的网络,以及计算"(非x1)与(非x2)"的网络,还有最后一个是"x1或x2"的或运算网络,把这三个网络放在一起,我们就应该能计算"x1 XNOR x2",也就是同或门运算。这里我们用以下这个网络来解决:

捕获8

取输入单元+1 x1和x2,建立第一个隐藏层单元,我们称其为a(2)1,接下来我要从"x1与x2"这个网络复制出权值,也就是-30 20 20,接下来我再建立第二个隐藏单元,我们称之为a(2)2,它是第二层的第二个隐藏单元,然后再从“(非x1)与(非x2)”这个网络复制出权值,这样我们就有了10 -20 -20这样三个权值,最后,建立输出节点,也就是输出单元a(3)1,这也是等于输出值h(x),然后复制一个或运算网络的所有权值,同时我需要一个+1作为偏差单元将其添加进来,也就是-10 20 20。

我想和大家谈谈,如何用神经网络做多类别分类。在多类别分类中,通常有不止一个类别需要我们去区分。我们处理多类别分类的方法,实际上是基于一对多神经网络算法而延伸出来的。让我们来看这样一个例子,还是有关计算机视觉的例子,我们希望处理的是四个类别的分类问题,给出一幅图片,我们需要确定图上是什么,是一个行人?一辆汽车?还是一辆摩托车?亦或是一辆卡车。对于这样一个问题,我们的做法是建立一个具有四个输出单元的神经网络,也就是说,此时神经网络的输出是一个四维向量。

捕获9

当图片上是一个行人时,我们希望这个神经网络输出1 0 0 0;当图片是一辆轿车时,我们希望输出是0 1 0 0;当图片是一辆摩托车时,我们希望结果是0 0 1 0,以此类推。所以,这和我们介绍逻辑回归时讨论过的一对多方法其实是一样的,只不过现在我们有四个逻辑回归的分类器,而我们需要对四个分类器中每一个都分别进行识别分类。此时我们需要用如上的方法来表示训练集,之前,我们把标签写作一个整数,用y来表示1 2 3 4,现在我们不这样表示y,而是用别的方法来代表y,那就是y(i)表示1 0 0 0或者0 1 0 0或者0 0 1 0或者0 0 0 1,根据相对于的图片x(i)来决定,这样我们的训练样本将成为x(i) y(i)这一对数,其中x(i)表示我们已知的四种物体图像中的一个,而y(i)是这四个向量中的某一个,我们希望能够找到某种方法,让我们的神经网络输出某个值,因此h(x)近似约等于y,在我们的例子中h(x)和y(i),它们都应该是四维向量,因为我们有四个类别。



发表评论

电子邮件地址不会被公开。 必填项已用*标注