上一章介绍了使用逻辑回归处理分类问题。尽管逻辑回归是个非常好用的模型,但是在处理非线性问题时仍然显得力不从心,下图就是一个例子:

  线性模型已经无法很好地拟合上面的样本,所以选择了更复杂的模型,得到了复杂的分类曲线:

  然而这个模型存在两个问题:过拟合和模型复杂度。过拟合问题可参考《ML(附录3)——过拟合与欠拟合》,这里重点讲模型复杂度。

  还是非线性分类,现在将输入扩充为100个,为了拟合数据,我们构造了更多的特征:

  约有 1002/2 = 5000个特征。由此看来,对于n个输入,二次项特征的个数大约以n2/2的数量级增长,在真实世界中面临的输入何止成千上万个,此时将得到噩梦般的模型。

  在计算机视觉中,几何数量级的特征无处不在:

  如上图所示,虽然人眼能够马上识别出图片是汽车,但是机器就没那么容易,它所看到的仅仅是像素的矩阵。假设仅抽取汽车轮毂和方向盘上的两个点判断图片是否是汽车:

  右图中得到了一个非线性曲线。实际上,即使仅有50 × 50的灰度图片,也会有2500个输入值;如果使用全二次项构造特征值,会产生 25002/2 ≈ 3000,000个特征值。由此看来,只是简单的增加二次项或者三次项之类的逻辑回归算法并不是一个解决复杂非线性问题的好办法,因为当n很大时将会产生非常多的特征项。

  神经网络就是在解决复杂非线性分类问题上的一种好得多的算法,即使输入的特征维数n很大。

神经网络

  1997年世界上发生过两件大事,一是克隆羊多利诞生,另一件是IBM 电脑“深蓝”击败国际象棋世界冠军。就在这一年,我从一本电子游戏杂志上看到了一篇关于计算机不可能战胜职业围棋选手的文章。

  二十年过去了,2016 年一月底,谷歌在自然杂志上正式公开发表论文,宣布其以深度学习技术为基础的电脑程序 AlphaGo,在 2015年 十月,连续五局击败欧洲冠军、职业二段樊辉。这是第一次机器击败职业围棋选手。

  在这篇文章中,我尝试介绍深度学习的前身——神经网络。

神经元模型

  神经元是神经网络中的一个重要概念。其实我觉得,神经网络和神经元都是看似高逼格的名词,这让我们联想到脑神经,从而心生畏惧。我们经常看到下面的图示:

  我想说,把脑神经都丢到垃圾桶里吧!

  然而我们还是需要知道什么是神经元,如下图所示:

  可以把这个神经元看作感知器模型:

  这是一个特殊的有向图,θ称为权重,x0称为偏置项,函数f是激活函数。在感知器模型中,激活函数是sign;在逻辑回归中,激活函数是sigmoid。

  上图的神经元模型似乎有点类似数字电路中的电路门,实际上神经元模型确实可以实现一些电路门运算:

神经网络模型

  单个神经元模型和感知器模型没什么区别,对非线性分类有些力不从心,比如“异或否(not (x1 xor x2))”的判别:

  这就需要使用多层神经网络:

  一个典型的神经网络如下图所示:

  上图是一个三层神经网络,分为输入层、隐藏层和输出层。在隐藏层中,不能通过训练样本观测到节点的值。上图神经网络中有3个输入节点(偏置节点不计在内,通常也不单独画出),3个隐藏节点(偏置节点不计在内)及一个输出节点。

  节点的上标表示神经网络的层数,a(2)表示第二层的节点,下标表示节点的序号,包括x0在内,所有偏置节点的序号都是0,值都是1。用大写的Θ表示每一层的权重,第一层的权重是Θ(1)。每个隐藏节点连同它的输入和输出,可看作一个神经元模型,由此:

  权重的下标分为两部分:第一部分表示指向该权重指向的隐藏节点的序号,第二部分表示权重的序号。Θ2,3(1)表示该权重处于第一层,它是指向a2(2)节点的第3个权重。可以将a2(2)单独列出:

  如果神经网络的第j层有Sj个节点,第j+1层有Sj+1个节点,那么第j层权重Θ(j)的权重总数是 Sj+1×(Sj+1 + 1), +1是因为计算了偏置节点。

  现在尝试用矩阵表示上面的神经网络模型:

  第一层节点x表示输入向量,Θ(1)表示第1层的权重。现在,用z(l)表示第 l 层的输入:

  神经网络可以有多个隐藏层,每一层都会计算出更复杂的特征,但只有一个输入层和一个输出层:

激活函数

  激活函数的作用是给神经网络加入一些非线性因素,使得神经网络更好地解决较为复杂的问题。

  常见的激活函数是sigmoid函数,在《ML(4)——逻辑回归》中介绍过,还有很多其它的激活函数。

  如果使用sigmoid作为激活函数,其区间是[0,1],当神经元的输出为1时,表示该神经元被激活,否则称为未被激活。类似地,如果激活函数是双曲正切tanh,其区间是[-1, 1],当神经元输出为1是表示激活,-1表示未被激活。

  本节其余部分转自 https://www.cnblogs.com/dudumiaomiao/p/6014205.html

  传统神经网络中最常用的两个激活函数,Sigmoid系(Logistic-Sigmoid、Tanh-Sigmoid)被视为神经网络的核心所在.从数学上来看,非线性的Sigmoid函数对中央区的信号增益较大,对两侧区的信号增益小,在信号的特征空间映射上,有很好的效果,通过对加权的输入进行非线性组合产生非线性决策边界.从神经科学上来看,中央区酷似神经元的兴奋态,两侧区酷似神经元的抑制态,因而在神经网络学习方面,可以将重点特征推向中央区,将非重点特征推向两侧区.

  Relu函数为现在深度学习使用比较广泛的激活函数,相比前面两个,其优点在于计算简单,导数简单,收敛快,单侧抑制 ,相对宽阔的兴奋边界 ,稀疏激活性;缺点在于在训练的时候,网络很脆弱,很容易出现很多神经元值为0,从而再也训练不动.一般将学习率设置为较小值来避免这种情况的发生.

  比较:

  激活函数的一些可取的属性包括:

  非线性:当激活函数是非线性的,然后一个两层神经网络可以证明是一个通用函数近似值.而identity激活函数不满足这个属性.当多层网络使用identity激活函数,整个网络就相当于一个单层模型.

  连续可微的:这个属性对基于梯度优化方法是必要的.二进制激活函数在0点没有可微性,它在其他值上全部可导为0,基于梯度优化方法对于它毫无进展.

  范围:当激活函数的范围是有限的,基于梯度的训练方法往往更稳定,因为模式显著影响几个有限权重.当范围是无限的,训练通常更有效率,因为模式显著影响大部分权重.在后一种情况下,较小的学习利率通常是必要的.

  单调:当激活函数是单调时,与单层模型相关的错误表面是凸的.

  平滑性:有单调导数的平滑函数已经被证明在某些情况下推广地更好.这些属性表明这些激活函数和Occam's razor更一致.

  原点附近近似identity当激活函数有这个属性,对于小的随机值初始化权重,神经网络将有效地学习.当激活函数没有这个属性,在初始化权值必须使用特殊例子.在下面的表中,激活函数,表明有该属性

多分类

  神经网络也可以处理多分类。现在我们有一个能够区分行人、小汽车、摩托车和货车的四分类神经网络,如下图所示:

  输出层在这里有四个节点,其基本思路和上一章《逻辑回归》的多分类一致,但是对输出需要稍加变动:

  如果输出结果是<0, 1, 0, 0>,则判断图片是小汽车。

参考:

Ng视频《Neural Networks》

《数学之美》第二版

《集体智慧编程》


  作者:我是8位的

  出处:http://www.cnblogs.com/bigmonkey

  本文以学习、研究和分享为主,如需转载,请联系本人,标明作者和出处,非商业用途!

  扫描二维码关注公众号“我是8位的”

  

ML(5)——神经网络1(神经元模型与激活函数)的更多相关文章

  1. Pytorch_第九篇_神经网络中常用的激活函数

    神经网络中常用的激活函数 Introduce 理论上神经网络能够拟合任意线性函数,其中主要的一个因素是使用了非线性激活函数(因为如果每一层都是线性变换,那有啥用啊,始终能够拟合的都是线性函数啊).本文 ...

  2. Coursera ML笔记 - 神经网络(Representation)

    前言 机器学习栏目记录我在学习Machine Learning过程的一些心得笔记,涵盖线性回归.逻辑回归.Softmax回归.神经网络和SVM等等,主要学习资料来自Standford Andrew N ...

  3. 神经网络中的Softmax激活函数

    Softmax回归模型是logistic回归模型在多分类问题上的推广,适用于多分类问题中,且类别之间互斥的场合. Softmax将多个神经元的输出,映射到(0,1)区间内,可以看成是当前输出是属于各个 ...

  4. 吴裕雄 python 神经网络——TensorFlow训练神经网络:不使用激活函数

    import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data INPUT_NODE = 784 ...

  5. 神经网络中的激活函数tanh sigmoid RELU softplus softmatx

    所谓激活函数,就是在神经网络的神经元上运行的函数,负责将神经元的输入映射到输出端.常见的激活函数包括Sigmoid.TanHyperbolic(tanh).ReLu. softplus以及softma ...

  6. matlab神经网络实验

    第0节.引例  本文以Fisher的Iris数据集作为神经网络程序的测试数据集.Iris数据集可以在http://en.wikipedia.org/wiki/Iris_flower_data_set  ...

  7. 神经网络及其简单实现(MATLAB)

    转自:http://www.cnblogs.com/heaad/archive/2011/03/07/1976443.html 第0节.引例  本文以Fisher的Iris数据集作为神经网络程序的测试 ...

  8. bp神经网络及matlab实现

    本文主要内容包含: (1) 介绍神经网络基本原理,(2) AForge.NET实现前向神经网络的方法,(3) Matlab实现前向神经网络的方法 . 第0节.引例  本文以Fisher的Iris数据集 ...

  9. OpenCV 之 神经网络 (一)

    人工神经网络(ANN) 简称神经网络(NN),能模拟生物神经系统对真实物体所作出的交互反应,是由具有适应性的简单单元(称为神经元)组成的广泛并行互连网络. 1  神经元 1.1  M-P 神经元 如下 ...

随机推荐

  1. VCL界面控件DevExpress VCL发布v18.2.2|附下载

    DevExpress VCL Controls是 Devexpress公司旗下最老牌的用户界面套包.所包含的控件有:数据录入,图表,数据分析,导航,布局,网格,日程管理,样式,打印和工作流等,让您快速 ...

  2. python中变量命名的基本规则,标识符和关键字

    变量的命名 目标 标识符和关键字 变量的命名规则 0.1 标识符和关键字 1.1 标识符 标示符就是程序员定义的 变量名.函数名 名字 需要有 见名知义 的效果,见下图:  标示符可以由 字母.下划 ...

  3. 从Oracle数据库中的本地命名文件tnsnames.ora来看服务别名、服务名和实例名的区别。

    tnsnames.ora的作用这里就不多述了,各位应该都知道. 首先先看两个例子: test1 = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCO ...

  4. MySQL:常用的数据模型

     常用的数据模型 一.定义 数据模型是对现实世界数据特征的抽象:通俗的讲数据模型就是现实世界的模拟: 数据模型是严格定义的一组概念的集合 是用来抽象.表示和处理现实世界中的数据和信息的工具 是对现实世 ...

  5. C点滴成海------Ubuntu怎么运行C语言

    Ubuntu怎么运行C语言 一.安装相关软件 安装vim:输入 sudo apt-get install vim: 安装gcc:输入 sudo apt-get install g++. 二.编写代码 ...

  6. getHibernateTemplate().save(t)执行不成功,数据不能插入到数据库

    BaseDaoImpl类中的代码如下 public void save(T t) {System.out.println(666);getHibernateTemplate().save(t);    ...

  7. springboot区分开发、测试、生产多环境的应用配置

    转:https://blog.csdn.net/daguairen/article/details/79236885 springboot区分开发.测试.生产多环境的应用配置(一) Spring可使用 ...

  8. KB/MB/GB。。单位换算

    今天遇到一个需求,需要把数据单位进行换算,记录一下.写的不好请勿见怪. function bytesToSize( bytes ) {//单位转化         var k = 1024,      ...

  9. 4.App测试与Web测试的不同

    注释:*蓝色为不同点,红色为测试类型* 测试工具不同 Web自动化用Selenium APP自动化用Appium 软件架构不同 App为C/S架构 Web为B/S架构 需要进行安装卸载更新测试 第一次 ...

  10. pycharm 4注册码

    pycharm 4 注册码 (4.x版均可使用) 用户名:pycharmLicense key: ===== LICENSE BEGIN =====2581-D36230T00000QoX2zbDCV ...