Deep Learning 学习笔记1:神经元、神经网络与深度学习

    深度学习是机器学习的一个重要分支,而神经网络则是其理论基础。神经网络的设计来源于神经科学,很早之前科学家就研究了神经元的组成结构。而这种神经元结构也就是神经网络的原型。

    神经元模型是一个包括一个输入、输出以及计算功能的模型,如下图:

    在每一个连接上都会有一个参数,叫做权重。一个神经网络的算法就是让权重值调整到最佳,以使得整个网络的预测效果达到最好。在初端,传递的信号大小是a的话,经过端中间的加权参数w之后,信号大小就会变成a*w。下图为一个神经元的计算过程:

    z是在输入和权值的线性加权和叠加了一个函数g的值。在MP模型里,函数g是sgn函数,也就是取符号函数。这个函数当输入大于0时,输出1,否则输出0。

    单层神经网络

    单层神经网络是由两层神经网络组成的神经网络,又名感知器。在“感知器”中,有两个层次,分别是输入层和输出层。输入层里的“输入单元”只负责传输数据,不做计算。输出层里的“输出单元”则需要对前面一层的输入进行计算。我们把需要计算的层次称之为“计算层”,并把拥有一个计算层的网络称之为“单层神经网络”。假如我们要预测的目标不再是一个值,而是一个向量,那么可以在输出层再增加一个“输出单元”。

    一个神经元的输出可以向多个神经元传递,但是向不同的神经元传递的时候,所需的参数w都不相同。如下图:

    这两个公式就是线性代数方程组。因此可以用矩阵乘法来表达这两个公式。例如,输入的变量是[a1,a2,a3]^{_{T}},用向量a来表示。方程的左边是[z1,z2]^{_{T}},用向量z来表示。系数则是矩阵W(2行3列的矩阵,排列形式与公式中的一样)。

    于是,输出公式可以改写成:g=(W*a)=z。这个公式就是神经网络中从前一层计算后一层的矩阵运算

    两层神经网络:

    单层神经网络只适合线性问题的求解,但无法解决非线性问题,这时就需要引入两层神经网络了。两层神经网络除了包含一个输入层,一个输出层以外,还增加了一个中间层。此时,中间层和输出层都是计算层。我们扩展上节的单层神经网络,在右边新加一个层次(只含有一个节点)。下图是两层神经网络的中间层计算:

    最终输出的方式是将中间层的神经元通过第二个权值矩阵计算得到的。下图是输出层的计算:

    如果输出是一个向量,则在输出层增加节点,如下图:

    使用矩阵运算来表达整个计算公式的话如下:

                                                  g=(W^{(1)}*a^{(1)})=a^{(2)}

                                                  g=(W^{(2)}*a^{(2)})=z

    在神经网络中还存在一种偏置节点,它本质上是一个只含有存储功能,且存储值永远为1的单元。在神经网络的每个层次中,除了输出层以外,都会含有这样一个偏置单元。正如线性回归模型与逻辑回归模型中的一样。偏置单元与后一层的所有节点都有连接,我们设这些参数值为向量b,称之为偏置。如下图:

    在考虑了偏置以后的一个神经网络的矩阵运算如下:

                                                               g(W^{(1)}*a^{(1)}+b^{(1)})=a^{(2)}

                                                               g(W^{(2)}*a^{(2)}+b^{(1)})=z

    在两层神经网络中,我们不再使用sgn函数作为函数g,而是使用平滑函数sigmoid作为函数g。我们把函数g也称作激活函数。神经网络的本质就是通过参数与激活函数来拟合特征与目标之间的真实函数关系。

    相比单层神经网络,两层神经网络能够很好地解决非线性的复杂分类问题,因为两层神经网络能够无线逼近任意连续函数。两层神经网络中,隐藏层对原始数据进行了一个空间变换,使其可以被线性分类,然后输出层的决策分界划出了一个线性分类分界线,对其进行分类。这样就导出了两层神经网络可以做非线性分类的关键--隐藏层。联想到我们一开始推导出的矩阵公式,我们知道,矩阵和向量相乘,本质上就是对向量的坐标空间进行一个变换。因此,隐藏层的参数矩阵的作用就是使得数据的原始坐标空间从线性不可分,转换成了线性可分。两层神经网络通过两层的线性模型模拟了数据内真实的非线性函数。因此,多层的神经网络的本质就是复杂函数拟合。

    接下来需要进行的就是对神经网络进行训练了,常用的算法包括梯度下降算法与反向传播算法。

    多层神经网络(深度学习):

    延续两层神经网络的方式来设计一个多层神经网络。如下图:

    

    依照这样的方式不断添加,我们可以得到更多层的多层神经网络。公式推导的话其实跟两层神经网络类似,使用矩阵运算的话就仅仅是加一个公式而已。多层神经网络中,输出也是按照一层一层的方式来计算。从最外面的层开始,算出所有单元的值以后,再继续计算更深一层。只有当前层所有单元的值都计算完毕以后,才会算下一层。有点像计算向前不断推进的感觉。所以这个过程叫做“正向传播”。

    一个重要的思想是神经网络中参数的改变,我们可以将中间层的节点数做一下调整,如下图:

    经过调整,整个网络的参数变成了33个。虽然层数保持不变,但是第二个神经网络的参数数量却是第一个神经网络的接近两倍之多,从而带来了更好的表示能力。在参数一致的情况下,我们也可以获得一个“更深”的网络。如下图:

    上图的网络中,虽然参数数量仍然是33,但却有4个中间层,是原来层数的接近两倍。这意味着一样的参数数量,可以用更深的层次去表达。增加更多的层次的好处就是能有更深入的表示特征,以及更强的函数模拟能力。随着网络的层数增加,每一层对于前一层次的抽象表示更深入。在神经网络中,每一层神经元学习到的是前一层神经元值的更抽象的表示。例如第一个隐藏层学习到的是“边缘”的特征,第二个隐藏层学习到的是由“边缘”组成的“形状”的特征,第三个隐藏层学习到的是由“形状”组成的“图案”的特征,最后的隐藏层学习到的是由“图案”组成的“目标”的特征。通过抽取更抽象的特征来对事物进行区分,从而获得更好的区分与分类能力。

    在单层神经网络时,我们使用的激活函数是sgn函数。到了两层神经网络时,我们使用的最多的是sigmoid函数。而到了多层神经网络时,通过一系列的研究发现,ReLU函数在训练多层神经网络时,更容易收敛,并且预测性能更好。因此,目前在深度学习中,最流行的非线性函数是ReLU函数。ReLU函数不是传统的非线性函数,而是分段线性函数。其表达式非常简单,就是y=max(x,0)。简而言之,在x大于0,输出就是输入,而在x小于0时,输出就保持为0。这种函数的设计启发来自于生物神经元对于激励的线性响应,以及当低于某个阈值后就不再响应的模拟。

    本文简单阐述了神经元的设计原理,并介绍了单层神经网络、两层神经网络以及多层神经网络的基本模型。理解神经网络的结构,是学习Deep Learning的重要基础。

猜你喜欢

转载自blog.csdn.net/WPR1991/article/details/82812221