sigmoid函数是一种常见的挤压函数,其将较大范围的输入挤压到 (0,1) 区间内,其函数的表达式与形状如下图所示:
该函数常被用于分类模型,因为其具有很好的一个特性 f′(x)=f(x)(1−f(x)) 。这个函数也会被用于下面的神经网络模型中做激活函数。
生物的神经网络系统中,最简单最基本的结构是神经元。每个神经元都是接受其他多个神经元传入的信号,然后将这些信号汇总成总信号,对比总信号与阈值,如果超过阈值,则产生兴奋信号并输出出去,如果低于阈值,则处于抑制状态。McCulloch在1943年将该过程抽象成如下图所示的简单模型:
该模型称为“M-P神经元模型”。通过上图我们可以知道,当前神经元的输入是来自其他n个神经元的带权值的输出,而激活函数 f() 是一个如下图所示的阶跃函数
我们可以看到当总的输入小于阈值的时候,神经元处于抑制状态,输出为0,而当总输入大于阈值,则神经元被激活为兴奋状态,输出1。但是我们发现该函数是不连续且不光滑的,使用起来会很不方便,因此在实际应用中常常使用sigmoid函数代替阶跃函数做神经元的激活函数。
感知器模型,是一种最简单的神经网络模型结构,其网络结构包括输入层与输出层两层,如下图所示:
其为具有两个输入神经元,一个输出神经元的感知器模型。我们知道该模型是可以做与或非运算的。这是因为如果我们要做与或非运算,那么对于输入 x1,x2 来说,其取值只能是0或1,而我们的输出 y=f(∑2i=1ωixi−θ) ,如果要做与运算,那令阈值 ω1=1,ω2=1,θ=2 ,则只有在 x1=1,x2=1 的时候才能激活输出层神经元,输出1,其余情况均输出0。同样,如果做或运算,那令阈值 ω1=1,ω2=1,θ=1 ,则只要有一个输入 xi=1 ,即可激活输出神经元,输出1,如果对 x1 做非运算,那么可以令阈值 ω1=−0.6,ω2=0,θ=−0.5 ,则如果 x1=1,x2=0 ,总输入为 −0.6 ,小于阈值,输出0,如果 x1=0,x2=0 ,总输入为0,大于阈值,输出1。这里的激活函数为阶跃函数。这个通过下面的三幅图也可以看得出来
但是我们可以发现,对于只有输入层与输出层的感知机模型, ∑2i=1ωixi−θ 是线性的,其只能对线性数据进行划分,对于如下图的异或模型,其实无法准确划分的。
因为任何一条线都无法将 (1,0),(0,1) 划为一类, (0,0),(1,1) 划为一类。但如果是像图(a)中那样的两层网络(这里的两层指的是隐层与输出层,因为只有这两层中的节点是有激活函数的),在隐层有两个节点,那么此时就可以得到两条线性函数,再在输出节点汇总之后,将会得到由两条直线围成的一个面,如图(b)所示,这时就可以成功的将异或问题解决。
因此我们可以看到,随着网络深度的增加,每一层节点个数的增加,都可以加强网络的表达能力,网络的复杂度越高,其表示能力就越强,也就可以表达更复杂的模型。
通过上面你的示例,我们也可以看到,对网络的学习其实主要是对网络中各个节点之间的连接权值和阈值的学习,即寻找最优的连接权值和阈值从而使得该模型可以达到最优(一般是局部最优)。下面主要介绍多隐层前馈神经网络模型参数的学习方法。
对于多隐层前馈神经网络,其网络中相邻两层是全连接,而层内是没有连接的,跨层之间也没有连接,如下图所示:
这里是一个单隐层的前馈神经网络,可以看到该网络的参数主要是输入层与隐层之间的连接权值 ωhj ,隐层的阈值 θ ,隐层与输出层之间的连接权值 vih ,输出层的阈值 rh 。这里假设输出层的节点个数为 l 个,隐层的节点个数为 q 个,输入层的节点个数为 d 个,那么我们需要学习的参数个数就为 d∗q+q+q∗l+l 个参数,其中 d∗q 与 q∗l 分别是输入层与隐层的连接权值与隐层和输出层的连接权值个数, q,l 分别是隐层和输出层的阈值个数。这样我们就可以将对神经网络的学习问题转化为参数的优化问题。而优化问题最常用的方法就是梯度下降方法,就是让目标参数沿着梯度的方向变化从而达到最优值,即 ωi+1=ωi+ηΔω ,其中 η 为步长, Δω 为沿梯度方向的变化量。
假设隐层与输出层的激活函数均为sigmoid函数,该网络的输出为 Yˆ=(yˆ1,...,yˆj,...,yˆl) ,那么其第 j 个节点的输入为 βj=∑qi=1ωijbi ,其输出 yˆj=f(βj−rj) ,那么该网络的均方误差值即为 E=12∑li=1(yi−yˆi)2 。
这里我们将隐层第 h 个节点与输出层第 j 个节点的连接权值 ωhj 作为优化的目标参数,那么基于梯度下降方法我们知道该参数的变化量
注:图片均来自周志华老师的机器学习书的第五章神经网络,如有侵权,请联系我删除,谢谢。