内容提要
引子--双控开关和三控开关
|
拓展--数字电路
|
深入--神经网络
--神经网络之感知器:给定模型,通过数据训练参数,可以解决分类问题。
--神经网络之隐藏层:更强大的神经网络(更多参数)
--神经网络之激活函数:超越线性(非线性的引入)
--神经网络之反向传播:质的飞跃(性能大幅提升)
--神经网络之实用关键:算法收敛(快速有效地找到合适的参数)
上文回顾
神经网络引入隐藏层解决异或问题
前面发现,最简单的神经网络模型感知器还是无法解决异或问题。
一个简单的假设:如果一条直线无法划分,那么我画两条直线,不就可以把0和1区分开来了。
很显然,这个不是简单的线性方程可以解决的分类问题。下面我们就引入带隐藏节点的神经网络来解决异或问题。
如上图所示,就是一个最简单的前馈神经网络模型,每一个神经元节点是一个激活函数,V,W是权重值,每一层拥有相同的输入,输入为上一层的输出(第一层为直接输入)。通过神经网络的隐藏层,我们把异或问题分成了两个子问题,第一层先划分部分分类;第二层再继续划分剩下的分类。下图表格就展示了神经网络经过每一层之后的输入和输出值。最终很容易的就解决了异或问题。
激活函数
通过对感知器和神经网络隐藏层的了解,已经对多层神经网络网络有了初步的认识。之前介绍解决异或问题神经网络,可以看成是一个有向无环图。构成神经网络的一个个节点,我们成为神经元,而神经元又是由一个个激活函数构成的。下面我们深入了解下,神奇的激活函数。
激活函数定义(activation function):用于计算一个神经元输入输出关系的函数,称之为激活函数。通常情况下,激活函数在其定义域内是一个处处可微的函数。
激活函数在神经网络中传递过程:上图就显示了一个神经元和它抽象出的数学模型。每个神经元会从它们的树突(dendrites)获得输入信号,然后再将输出信号传给它唯一的轴突(axon)。轴突再通过突触和其他神经元的树突相连。 在神经元的数学模型中,轴突所携带的信号(例如:x0)通过突触进行传递,由于突触的强弱不一,假设我们以w0表示,那么我们传到下一个神经元的树突处的信号就变成了w0x0。其中突触强弱(参数w)是可学的,它控制了一个神经元对另一个神经元影响的大小和方向(正负)。然后树突接收到信号后传递到神经元内部(cell body),与其他树突传递过来的信号一起进行加和,如果这个和的值大于某一个固定的阈值的话,神经元就会被激活,然后传递冲激信号给树突。
常见的激活函数:
1)Sigmoid函数:Sigmoid函数曾被广泛地应用,但由于其自身的一些缺陷,现在很少被使用了。
优点: 1.Sigmoid函数的输出映射在(0,1)之间,单调连续,输出范围有限,优化稳定,可以用作输出层。 2.求导容易。
缺点: 1.由于其软饱和性,容易产生梯度消失,导致训练出现问题。 2.其输出并不是以0为中心的。
2)tanh函数:比起Sigmoid函数我们通常更倾向于tanh函数。
优点: 1.比Sigmoid函数收敛速度更快。 2.相比Sigmoid函数,其输出以0为中心。 缺点: 还是没有改变Sigmoid函数的最大问题——由于饱和性产生的梯度消失。
3)ReLU函数:是最近几年非常受欢迎的激活函数
。
优点: 1.相比起Sigmoid和tanh收敛更快。
2.Sigmoid和tanh涉及了很多很expensive的操作(比如指数),ReLU可以更加简单的实现。 3.有效缓解了梯度消失的问题。 4.在没有无监督预训练的时候也能有较好的表现。
5.提供了神经网络的稀疏表达能力。
缺点: 随着训练的进行,可能会出现神经元死亡,权重无法更新的情况。如果发生这种情况,那么流经神经元的梯度从这一点开始将永远是0。也就是说,ReLU神经元在训练中不可逆地死亡了。
还有很多其他激活函数,这里就不一一介绍了,对于不同的模型可能会有更合适的激活函数。激活函数不是真的要去激活什么。在神经网络中,激活函数的作用是能够给神经网络加入一些非线性因素,使得神经网络可以更好地解决较为复杂的问题。
质的飞跃:反向传播
有了神经网络的理论基础,理论上可以完成各种复杂的逻辑分类问题。虽然早在1958年,心理学家Rosenblatt就提出了神经网络模型,但是直到上世纪80年代,神经网络才有了质的飞跃,而这个质的飞跃就是BP算法的提出。
在讲反向传播之前,我们再看一下最基简单的额神经网络模型。
在上述模型中,输入x1,x2,由神经网络的处理,得到输出y,我们必须知道上图中每条边的参数值,这也是神经网络中最重要的部分。在神经网络中是通过迭代的方法来计算这些参数的,具体来讲就是,首先初始化这些参数,通过神经网络的前向传导过程计算得到输出y,这些值与真实值存在着误差,不妨设累计误差函数为err(x),然后利用梯度法极小化err(x)来更新参数,直至误差值达到要求停止计算。在更新参数这一过程中我们就用到了大名鼎鼎的反向传播算法(BP算法),BP算法中核心的数学工具就是微积分的链式求导法则。下面我们从链式法则到向前传播,再从向前传播到反向传播,逐步了解反向传播的奥义。
微积分的链式求导法则
链式法则的定义就是“由两个函数凑起来的复合函数,其导数等于里边函数代入外边函数的值之导数,乘以里边函数的导数。
向前传播
上图神经网络模型中,x1,x2通过激活函数之后的输入输出分别如下所示:
f1神经元节点: 输入 (x1v11+x2V21) 输出 f1(x1v11+x2V21)
f2神经元节点: 输入 (x1v12+x2V22) 输出 f2(x1v12+x2V22)
f3神经元节点: 输入 f1(x1v11+x2V21)*W11 + f2(x1v12+x2V22)*W21
输出 f3(f1(x1v11+x2V21) *W11 + f2(x1v12+x2V22) *W21 ) 记作 y'
在监督学习中,在已知的训练集合上,已知的输入(x1,x2)输出(y)都可以认为是常量。我们的目的就是需要调整参数V11,V12,V21,V22,W11,W21,使得得到的实际值y'与期望值y的误差最小。当然我们可以使用最小二乘法,感兴趣的同学可以翻阅之前的测距机器人中讲到的内容。
准备工作好了,我们看一个例子。下图是一个3*3的神经网络,总共就3层,每一层只有3个神经元节点。
我看要知道输入X,对于输出Z的影响是怎么样的,那么我们用Z对x做偏导,根据上面的展开类似,我们可以得到这样的结果。
这还只是3*3网络的求偏导结果,猜想一下,如果是一个20*10的网络,那求导结果会是怎样?!!
为了避免这种海量求导模式,数学家们另辟蹊径,提出了一种称之为“反向模式微分(reverse-mode differentiation)”。取代公式上述那种简易的表达方式,
反向传播
看完上述对比图,你一定在疑惑。WTF,这算什么?顺序倒一倒就算什么黑科技了。作为一个求学者,我们应该学习吃瓜群众,搬好板凳,慢慢来看。
在向前传播中,Z对X求偏导过程中,相当于把Y对X求偏导的路径都走了一遍,任何一个关系的确认,都需要将沿途所有路径都计算一遍。这个冗余程度可想而知。特别是当网络很复杂时,连计算机都要罢工了。
而在反向传播中,同样是利用链式法则,发现传播微分方法就能非常机智的避开这种冗余。反向传播,先对先对最后一层进行偏导,并将求导的结果保存在改神经元节点。当再需要对上一层进行求偏导的时候,采用“拿来主义”与链式法则配合使用。反正上一层已经计算好了,确保每一条路径上的计算,只计算一次即可。
好了,下面我们通过一张只管的动态图来结束我们此次神经网络模型初识之旅。