在生物学神经网络中,每个神经元与其他神经元连接,当它“兴奋”时,就会向相邻的神经元发送化学物质,从而改变这些神经元的电位,如果某神经元的电位超过一个阈值,那么它就会被激活(兴奋),向其他神经元发送化学物质。
1943年,McCulloch and Pitts基于生物神经元模型抽象出了经典的M-P神经元模型
。神经元接收来自n个其他神经元传递来的输入信号,这些输入信号通过带权重的连接进行传递,神经元接收到的总输入值
将与神经元的阈值
进行比较,然后通过激活函数处理以产生神经元的输出。
在面对线性可分的数据集的时候,简单的用线性分类器即可解决分类问题。但是现实生活中的数据往往不是线性可分的,面对这样的数据,一般有两个方法:引入非线性函数
、线性变换
。
就是把当前特征空间通过一定的线性映射转换到另一个空间,让数据能够更好的被分类。
在神经网络中,为了避免单纯的线性组合,在每一层的输出后面都添加一个激活函数(sigmoid、tanh、ReLu等等)。每一层的输出通过这些激活函数之后,就变得比以前复杂很多,从而提升了神经网络模型的表达能力。当然怎么选择这个激活函数,还是很需要结合问题进行分析。
理想中的激活函数
应该是将任意输入值映射为 0(抑制)或 1(兴奋),即阶跃函数。但是阶跃函数具有不连续、不光滑等不好的性质。因此,实际中经常使用 sigmoid 函数作为激活函数,它把可能在较大范围内变化的输入值挤压到了(0,1)输出值范围内(所以也叫也叫挤压函数)。下图中为阶跃函数
(左)和sigmoid函数
(右)。
它是常用的非线性的激活函数,能够把输入的连续实值压缩
到0和1之间。
特别的,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1。
sigmoid 函数曾经被使用的很多,不过近年来,用它的人越来越少了。主要是因为它的一些缺点
:
梯度消失问题
: 把许多个这样的神经元模型按一定的层次结果连接起来,就得到了神经网络。事实上神经网络模型只是类比神经网络给出了概念,并非真正模拟了神经网络,其本质
上是若干个函数的嵌套(带入而得),有效的神经网络模型大多以数学模型进行支撑。
感知机(perceptron)由两层神经元组成,输入层接收外界信号后传入输出层(一个M-P神经元)。
一般地,给定训练集,权重 以及阈值 θ 都可以通过学习得到(阈值 θ 可以看作一个固定输入的“哑节点”,所对应的连接权重
,就可以全部统一为权重的学习)。
ŋ∈(0,1)为学习率, xi 用于控制每个 wi 的不同变化率。若感知机预测准确,则,感知机不发生变化,否则根据错误的程度进行权重调整。
感知机只有一层功能神经元
,只能解决线性可分问题,若两类模式是线性可分
的,则一定存在线性超平面将其分开,所以只要求得适当的权向量,感知机一定会收敛,但是对于非线性可分问题,感知机就会出现震荡,不能求得合适解,如:异或问题。
要解决异或问题,需要多层功能神经元,于是就引入了隐含层,隐含层和输出层都是拥有激活函数的功能神经元。
下图为解决异或问题的两层感知机:
多层网络中每层神经元与下层神经元全互连,同层神经元之间不互连,不相邻层神经元之间不互连,这种神经网络就叫“多层前馈神经网络”(“前馈”并不是信号不能向后传递,是指网络拓扑结构中不存在环或回路)。
下图为两种多层感知机:
神经网络学到的东西,就蕴含在连接权(含激活阈值)中。
给定训练集 (输入是 d 个属性,输出是 l 维实向量),得如下多层前馈网络结构,其中输出层第 j 个神经元第阈值用 θj 表示,隐层第 h 个神经元第阈值用 γh 表示。 下图为多层前馈网络(BP网络)结构:
假设隐层和输出层神经元都使用sigmoid函数(sigmoid函数很多,这里实际是一个对率函数)。
网络在 (x_k,y_k) 上的均方误差为
易知上面网络中有 (d + i + 1)q + l 个参数需要确定,BP迭代学习算法在每一轮迭代中采用广义第感知器学习规则对参数更新估计,即 ʋ ← ʋ + △ʋ
以 为例
BP算法基于梯度下降,以目标的负梯度方向对参数进行调整,给定学习率 ŋ ,则
根据链式法则
显然
对率函数有
类似地令 e_h 为
故
ŋ 的选择直接影响了算法的收敛效果,常让隐藏层到输出层之间用一个 ŋ1 ,而输入层到隐藏层之间用另一个 ŋ2 。
BP算法模型:
BP算法大概工作流程: 先将输入示例提供给输入神经元,然后逐层将信号前传,直到产生输出层的结果;然后计算输出层的误差,再将误差逆向传播至隐藏神经元,最后根据隐藏神经元的误差来对连接权和阈值进行调整,以此循环迭代,直至达到某个停止条件。
BP算法的目标: 最小化训练集上的累计误差
上面(标准BP)的推导是基于单个 Ek 的,即每次只针对一个训练样例更新链接权和阈值。如果基于累计误差最小化更新规则,就得到了累计误差逆传播(累计BP)。
标准BP更新非常频繁,而且不同样例之间可能出现抵消现象,因此为了达到相同的累计误差极小点,标准BP 需要更多第迭代次数;累计BP 读取完整个训练集 i 一边后才对参数进行更新,更新频率小很多,但是累计误差在下降到一定程度后,下降会非常缓慢(特别是训练集非常大时),这是标准BP 的收敛速度会更快。
只要神经元足够,BP 算法能以任意精度毕竟任意连续函数,正由于其强大的表示能力,BP 神经网络经常过拟合
,常用解决方法是提前终止
(训练集误差降低但验证集误差升高则终止)和正则化
。
正则化基本思想是定义约束和惩罚,上面的提前终止就是一种约束,以惩罚为例,则目标误差函数可以改写为
增加正则项后,传输网络会更加“光滑”。