机器学习(三)

一、神经网络模型

对于非线性的数据分布,例如

                  

若用感知器或者逻辑回归的非线性模型,则算特征多项式和权重参数的分数时需要把特征多项式的情况都列举出来,当特征少的时候(例如只有x1,x2)有可能列举出特征组合的所有的特征多项式,但若是特征数很多的情况

  

只算上二次特征多项式的情况,就大约有5000特征项,若算上有三次特征多项式的情况有17000项特征项,这些大量的特征项所对应的权重参数想要进行计算优化出最优解无疑需要大量的样本,并且很容易过拟合,例如对于图像的识别分类,一副很小的50*50像素的图像,若把灰度图像作为输入也有2500个特征,这样组合出来的特征项是非常大的

单个的线性分类的感知器模型为 

,每个感知器可以做一个线性分类,那么多个线性分类组合在一起就会组合成一个非线性的分类模型,要有足够多的感知器模型就可以模拟出平滑的非线性分类界面,如下图所示

为了做梯度下降时求导的方便,把感知器的阶梯形sign假设函数变为S型的假设函数,每个感知器看做一个神经元,多个神经元(感知器)链接在一起就构成了神经网络模型,可以模拟非线性的分类界面

对于一个多层的神经网络,前几层可以看做是特征的层层转换,最后一层输出则可以看做一个线性的模型,所以最后一层所学的线性模型都可以用,根据想要实现不同的功能可以搭建相应的模型,例如,想做回归最后一层可以搭建线性回归的模型,想做分类最后一层可以搭建逻辑回归模型

若想做分类最后一层接一个逻辑回归的神经元,则可以做二分类的问题,但多分类的情况怎么办?最后一层多搭建几个神经元

例如对图片进行多分类

最后一层可以搭建如下的神经元

最后的标签信息为某一位为1其余为0的列向量,不同位置设为1代表不同的种类(不使用y=1,2,3,4这样的标签),经过训练最后的输出要近似于样本标签信息(例如,四分类标签信息为四维)

               

二、BP算法

神经网络的的每个神经元用S型的假设函数,则它的代价函数形式类似于逻辑回归,不同的是逻辑回归是二分类,只有一个输出,而神经网络的最后一层输出可能有多个神经元(做多分类的情况),所以神经网络的代价函数为

所以输出层有K个神经元,则每个神经元就对应一个,而对应该神经元相应样本标签的维度(0或者1),最后的正则化项则是所用的权重参数的平方和

给出了代价函数,就需要对代价函数进行最小化来得到最优的权重参数解,用梯度下降的思想就需要求解代价函数对于每个权重参数的梯度,即

给出一个训练数据,进过层层运算最终得到的前向传播的结果可表示为

向前传播的过程,我们得到了各层的假设函数输出值,怎么使用梯度下降来更新权重呢?利用反向传播(BP)算法

以上是一个训练样本对其中一层神经元的代价函数权重求导的反向传播算法的公式 推导,所谓“偏差”应该这么理解:对于后一层某一个结点上出现的偏差,前一层的每一个结点都要承担一部分责任,所以我们可以把后一层结点的偏差量按照系数比例分配给前一层的结点。同时,前一层的某一个结点,对后一层的每一个节点都承担着责任,那么它的“总责任”就是这些所有的小责任之和。如果你仔细想想这个矩阵乘法的计算过程,会发现正好就是上面说的这个责任分配与求和的过程。所以加上所有训练样本以及正则化项,反向传播的算法可表示为

再加深理解前向传播和反向传播的算法

这里给出了第三次的其中一个神经元的激励值(分数)的算法,激励值输入S型函数得到输出值,其他的神经元计算方法类似

在神经元过多的时候,前向传播和反向传播会比较复杂,在进行训练的时候,我们怎么算法是正常工作的?若代价函数对于权重参数的导数(反向传播)很近似于所计算数值检验的权重梯度,则证明算法正常工作,如下图所示

推广的所有权重参数,可得

则计算过程为

值得注意的是,数值检验会比反向传播的速度慢的多,再确定算法正常工作之后要关闭数值检验的步骤

三、初始化权重

在对神经元各层之间的权重进行初始化的时候,不能把初始权重设定为0,这样训练会造成各层之间的权重相同,等同于一个神经元的功能,失去了神经网络结构的意义,应该对各层之间的权重进行随机初始化,即随机取接近于0的数

对于神经网络的模型选择,我们有很多种

通常,输入层的神经元个数等于特征的维数,输出层的神经元个数等于分类的类别数,而隐藏层的神经元个数则可以略大于或小于特征的个数,理论上神经网络的层数越多,若训练的足够好则能够拟合的曲线越复杂,可以做到更精准的分类,但一旦层数增多就变为了深度学习的问题,模型的复杂度会增大,神经元个数的增多会很容易造成过拟合,需要大量的数据进行训练,或者与应用问题相结合(例如对于图片的处理应用卷积神经网络的模型架构,每一个神经元不是和整张图片的每一个像素连接,而是把有相关性的像素和神经元进行连接,这样就变为局部连接)来减少神经元的个数,再者利用正则化的方法,例如dropout、denoising方法,并且若神经元层与层之间的权重再用随机数进行初始化,训练的结果就会很容易陷入局部最优解或者到某一层神经元就不能再反向传递回来值,这就需要对神经元层与层之间进行pre-training,即预训练

 怎么做预训练pre-training得到好的权重起始点?对于神经网络,层与层之间的权重代表的是意义是特征之间的转换过程,转换之后的特征要能表现原有特征表达的信息,所以转换过后的特征再反转换之后,能够还原出原来的特征,这样的转换才是合适的转换,以此可以用自动编码器来确定两层神经元之间的初始连接权重,输入经过编码之后得到输出,输出经解码得到的输出和之前的输入要很相近,这样得到的编码权重可作为两层神经元之间的pre-training权重,以此类推其他层与层之间的初始权重

所以基本的自动编码器可表示为

由于数据的噪声过多时,很容易造成过拟合,通常现实中数据大都含有噪声,如果能够减少噪声,可以降低过拟合的可能,怎么降低噪声的影响?直接的思想是清除或减少数据的噪声,使数据变得纯净,但对于噪声不容易去除或者找不到噪声污染数据的情况下,怎么降低噪声的影响?在数据中加入一些噪声

 我们希望自动编码器具有更强的鲁棒性,当输入加入一些噪声的影响时,输出仍然有干净的结果,即希望得到的g(x)具有一定的抗干扰噪声的能力

 

posted on 2017-06-12 19:31  水涵空  阅读(144)  评论(0编辑  收藏  举报