前面的文章已经介绍过了2种经典的机器学习算法:线性回归和logistic回归,并且在后面的练习中也能够感觉到这2种方法在一些问题的求解中能够取得很好的效果。现在开始来看看另一种机器学习算法——神经网络。线性回归或者logistic回归问题理论上不是可以解决所有的回归和分类问题么,那么为什么还有其它各种各样的机器学习算法呢?比如这里马上要讲的神经网络算法。其实原因很简单,在前面的一系列博文练习中可以发现,那些样本点的输入特征维数都非常小(比如说2到3维),在使用logistic回归求解时,需要把原始样本特征重新映射到高维空间中,如果特征是3维,且指数最高为3时,得到的系数最高维数应该是20维。但是一般现实生活中的数据特征非常大,比如一张小的可怜的灰度图片50*50,本身就只有2500个特征,如果要采用logistic回归来做目标检测的话,则有可能达到上百万的特征了。这样不仅计算量复杂,而且因为特征维数过大容易是学习到的函数产生过拟合现象。总的来说,只有线性回归和logistic回归在现实生活中是远远不够的,因此,神经网络由于它特有的优势就慢慢被研究了。

神经网络模型的表达结构是比较清晰的,输入值和对应的权重相乘然后相加最终加上个偏移值就是输出了。只是数学公式比较繁琐,容易弄错。假设第j层网络有Sj个节点,而第j+1层网络有S(j+1)个节点,则第j层的参数应该是个矩阵,矩阵大小为S(j+1)*(Sj+1),当然了,此时是因为那个权值为1的那个网络节点没有算进去。很显然,为了方便公式的表达,神经网络中经常使用矢量化的数学公式。为什么神经网络最有学习功能呢?首先从生物上来讲,它模拟了人的大脑的功能,而人的大脑就有很强大的学习机制。其次从神经网络的模型中也可以看出,如果我们只看输出层已经和输出层相连的最后一层可以发现,它其实就是一个简单的线性回归方程(如果使输出在0~1之间,则是logistic回归方程),也就是说前面那么多的网络只是自己学习到了一些新的特征,而这些新的特征是很适合作为问题求解的特征的。因此,说白了,神经网络是为了学习到更适合问题求解的一些特征。

表面上看,神经网络的前一层和当前层是直接连接的,前一层的输出值的线性组合构成了当前层的输出,这样即使是有很多层的神经网络,不也只能学习到输入特征的线性组合么?那为什么说神经网络可以学习任意的非线性函数呢?其实是刚才我犯了一个本质错误,因为前一层输出的线性组合并不直接是本层的输出,而是一般还通过一个函数复合,比如说最常见的函数logistic函数(其它的函数比如双曲正切函数也是很常用的),要不然可就真是只能学习到线性的特征了。神经网络的功能是比较强大的,比如说单层的神经网络可以学习到”and”,”or”,,”not”以及非或门等,两层的神经网络可以学习到”xor”门(通过与门和非或门构成的一个或门合成),3层的神经网络是可以学习到任意函数的(不包括输入输出层)等,这些在神经网络的发展过程中有不少有趣的故事。当然了,神经网络也是很容易用来扩展到多分类问题的,如果是n分类问题,则只需在设计的网络的输出层设置n个节点即可。这样如果系统是可分的话则总有一个学习到的网络能够使输入的特征最终在n个输出节点中只有一个为1,这就达到了多分类的目的。

神经网络的损失函数其实是很容易确定的,这里以多分类的神经网络为例。当然了,这里谈到损失函数是在有监督学习理论框架下的,因为只有这样才能够知道损失了多少(最近有发展到无监督学习框架中也是可以计算损失函数的,比如说AutoEncoder等)。假设网络中各个参数均已学到,那么对于每个输入样本,就能够得出一个输出值了,这个输出值和输入样本标注的输出值做比较就能够得到一个损失项。由于多分类中的输出值是一个多维的向量,所以计算它的损失时需要每一维都求(既然是多分类问题,那么训练样本所标注的值也应该为多维的,至少可以转换成多维的)。这样的话,神经网络的损失函数表达式与前面的logistic回归中损失函数表达式很类似,很容易理解。

有了损失函数的表达式,我们就可以用梯度下降法或者牛顿法来求网络的参数了,不管是哪种方法,都需要计算出损失函数对某个参数的偏导数,这样我们的工作重点就在求损失函数对各个参数的偏导数了,求该偏导数中最著名的算法就是BP算法,也叫做反向传播算法。在使用BP算法求偏导数时,可以证明损失函数对第l层的某个参数的偏导与第l层中该节点的误差,以及该参数对应前一层网络编号在本层的输出(即l层)的输出值有关,那么此时的工作就转换成了每一层网络的每一个节点的误差的求法了(当然了,输入层是不用计算误差的)。而又可通过理论证明,每个节点的误差是可以通过下一层网络的所以节点反向传播计算得到(这也是反向传播算法名字的来源)。总结一下,当有多个训练样本时,每次输入一个样本,然后求出每个节点的输出值,接着通过输入样本的样本值反向求出每个节点的误差,这样损失函数对每个节点的误差可以通过该节点的输出值已经误差来累加得到,当所有的样本都经过同样的处理后,其最终的累加值就是损失函数对应位置参数的偏导数了。BP算法的理论来源是一个节点的误差是由前面简单的误差传递过来的,传递系数就是网络的系数。

一般情况下,使用梯度下降法解决神经网络问题时是很容易出错,因为求解损失函数对参数的偏导数过程有不少矩阵,在程序中容易弄错,如果损失函数或者损失函数的偏导数都求错了的话,那么后面的迭代过程就更加错了,导致不会收敛,所以很有必要检查一下偏导数是否正确。Andrew Ng在课程中告诉大家使用gradient checking的方法来检测,即当求出了损失函数的偏导数后,取一个参数值,计算出该参数值处的偏导数值,然后在该参数值附近取2个参数点,利用损失函数在这个两个点值的差除以这2个点的距离(其实如果这2个点足够靠近的话,这个结果就是导数的定义了),比较这两次计算出的结果是否相等,如果接近相等的话,则说明很大程度上,这个偏导数没有计算出错,后面的工作也就可以放心的进行了,这时候一定要记住不要再运行gradient checking,因为在运行gradient checking时会使用BP进行每层的误差等计算,这样很耗时(但是我感觉即使不计算gradient checking,不也要使用BP算法进行反向计算么?)。

在进行网络训练时,千万不要将参数的初始值设置成一样的,因为这样学习的每一层的参数最终都是一样的,也就是说学习到的隐含特征是一样的,那么就多余了,且效果不好。因此明智的做法是对这些参数的初始化应该随机,且一般是满足均值为0,且在0左右附近的随机。

如果采用同样的算法求解网络的参数的话(比如说都是用BP算法),那么网络的性能就取决于网络的结构(即隐含层的个数以及每个隐含层神经元的个数),一般默认的结构是:只取一个隐含层,如果需要取多个隐含层的话就将每个隐含层神经元的个数设置为相同,当然了隐含层神经元的个数越多则效果会越好。

作者:tornadomeet 出处:http://www.cnblogs.com/tornadomeet 欢迎转载或分享,但请务必声明文章出处。

转载 Deep learning:七(基础知识_2)的更多相关文章

  1. 转载 Deep learning:一(基础知识_1)

    前言: 最近打算稍微系统的学习下deep learing的一些理论知识,打算采用Andrew Ng的网页教程UFLDL Tutorial,据说这个教程写得浅显易懂,也不太长.不过在这这之前还是复习下m ...

  2. [Deep Learning] 神经网络基础【转】

    本文转载自:http://www.cnblogs.com/maybe2030/p/5597716.html 阅读目录 1. 神经元模型 2. 感知机和神经网络 3. 误差逆传播算法 4. 常见的神经网 ...

  3. 转载 Deep learning:三(Multivariance Linear Regression练习)

    前言: 本文主要是来练习多变量线性回归问题(其实本文也就3个变量),参考资料见网页:http://openclassroom.stanford.edu/MainFolder/DocumentPage. ...

  4. 转载 Deep learning:六(regularized logistic回归练习)

    前言: 在上一讲Deep learning:五(regularized线性回归练习)中已经介绍了regularization项在线性回归问题中的应用,这节主要是练习regularization项在lo ...

  5. [Deep Learning] 神经网络基础

    目前,深度学习(Deep Learning,简称DL)在算法领域可谓是大红大紫,现在不只是互联网.人工智能,生活中的各大领域都能反映出深度学习引领的巨大变革.要学习深度学习,那么首先要熟悉神经网络(N ...

  6. [转载]Deep Learning(深度学习)学习笔记整理

    转载自:http://blog.csdn.net/zouxy09/article/details/8775360 感谢原作者:zouxy09@qq.com 八.Deep learning训练过程 8. ...

  7. 转载 deep learning:八(SparseCoding稀疏编码)

    转载 http://blog.sina.com.cn/s/blog_4a1853330102v0mr.html Sparse coding: 本节将简单介绍下sparse coding(稀疏编码),因 ...

  8. 转载 Deep learning:四(logistic regression练习)

    前言: 本节来练习下logistic regression相关内容,参考的资料为网页:http://openclassroom.stanford.edu/MainFolder/DocumentPage ...

  9. 转载 Deep learning:五(regularized线性回归练习)

    前言: 本节主要是练习regularization项的使用原则.因为在机器学习的一些模型中,如果模型的参数太多,而训练样本又太少的话,这样训练出来的模型很容易产生过拟合现象.因此在模型的损失函数中,需 ...

随机推荐

  1. ubuntu安装docker

    uname -r #查看内核版本要大于3.10apt-get updateapt-get install linux-image-generic-lts-trusty wget -qO- https: ...

  2. Chapter 14_3 非全局的环境

    关于“环境”的一大问题在于它是全局的,任何对它的修改都会影响程序的所有部分. 例如:若安装一个元表用于控制全局变量的访问,那么整个程序都必须遵循这个规范. 当使用某个库时,没有先声明就使用了全局变量, ...

  3. Office Web Apps安装部署(一)

    来源于:http://www.cnblogs.com/poissonnotes/p/3238238.html 系统要求为Windows Server 2012, 注意:安装Office Web App ...

  4. 接口post +json +bean

    public ReturnBean<DealBean> getMember(String tagtype, String tag) { try { String requestUrl = ...

  5. erlang进程与操作系统线程

    erlang多进程与多线程: 在erlang开发中,我们面对的最小执行单位是进程,当然这个进程并不是系统层面上的进程,也不是线程.而是基于erlang运行时系统的一个进程.那么erlang的多进程是如 ...

  6. Javascript兑现图片预加载【回调函数,多张图片】 (转载)

    Javascript实现图片预加载[回调函数,多张图片] 使用JS实现一组图片动画效果或者使用HTML5 Canvas渲染一系列图片等案例中,需要图片全部加载完成方可运行动画效果.此时程序中就会涉及多 ...

  7. tableIView 区头的一点问题

    要记得设置区头的高度 否则会出现第一行没区头问题

  8. 用Jedis获取redis连接(集群和非集群状态下)

    第一:非集群状态下 非集群状态下用Jedis获取redis连接,得到Jedis对象即可,一共有两种: 1.利用Jedis构造器,仅限用于测试,在实际项目中肯定是用JedisPool. Jedis(St ...

  9. linux yum安装mongodb

    1.yum -y install mongodb-server  mongodb 2.service mongod start                     #启动mongodb 服务 3. ...

  10. cocos2d-x 获得系统语言繁体

    IosLocalUtil.h #ifndef __IOS_LOCALUTIL_H__ #define __IOS_LOCALUTIL_H__ class IosLocalUtil{ public: s ...