下面内容主要来自西瓜书的第五章《神经网络》5.1~5.3节。
1、神经元模型
这一节简单,讲了两个概念,神经元模型以及**函数。先来看神经元模型吧。

因此,第j个神经元的输出为
yj=f(Σi=1nwijxi−θ)=f(Σi=0nwijxi)其中xi为第i个输入,wi,j为第j个神经元第i个输入的权重,θ为门限,且x0=−1,w0j=θ。
上面图和式子里面的f(⋅)为**函数。引用网上博客说明为何要采用**函数:
如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层节点的输入都是上层输出的线性函数,很容易验证,无论你神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机(Perceptron)了,那么网络的逼近能力就相当有限。正因为上面的原因,我们决定引入非线性函数作为激励函数,这样深层神经网络表达能力就更加强大(不再是输入的线性组合,而是几乎可以逼近任意函数)。
作者:StevenSun2014
来源:****
原文:https://blog.****.net/tyhj_sf/article/details/79932893
版权声明:本文为博主原创文章,转载请附上博文链接!
同一篇博客里面指出,早期研究神经网络主要采用sigmoid函数或者tanh函数,输出有界,很容易充当下一层的输入。
近些年Relu函数及其改进型(如Leaky-ReLU、P-ReLU、R-ReLU等)在多层神经网络中应用比较多。这里先只看sigmoid函数吧。

上面是函数图形,其表达式为
sigmoid(x)=1+ex1.
2、感知机与多层网络
这个部分,我觉得可以跟花书上面6.1《实例:学习XOR》结合起来理解。先按照西瓜书上的表达,我们看如何用包含两层神经元的感知机来完成两个输入的逻辑运算。两层神经元感知机的结构示意图如下:

这里我们假定**函数为符号函数,即y=sgn(xTw)。下面我们两个输入神经元分别为x1,x2,而x0=−1,w0为门限,即x=[−1 x1 x2]T以及w=[θ w1 w2]T。
下面我们来实现逻辑运算:
- “and”:w=[2,1,1]T
- “or” :w=[0.5,1,1]T
- “not” :w=[0.5,−1.2,0]T
到目前为止,都很顺利。事实上,学习的过程就是逐步调整权重系数向量w的过程。对于训练样例(x,y),若当前感知机的输出为y^,则如下来调整感知机权重:
wi←wi+ΔwiΔwi=η(y−y^)xi.
西瓜书上谈到,这种只拥有一层功能神经元(即只有输出层神经元进行**函数处理)的感知机,学习能力非常有限。对于异或运算这类简单的“非线性可分问题”,这样的感知机也没法解决。下面我们切换到花书上,看看《6.1 实例:学习XOR》。
XOR函数提供了我们想要学习的目标函数y=f∗(x)。我们的模型给出了一个函数y=f(x;θ),并且我们的学习算法会不断调整参数θ来使得f尽可能接近f∗。尽管对于二进制而言,MSE并不是一个合适的代价函数,我们还是先从MSE开始(anyway, we need to start):
J(w)=41Σx∈X[f∗(x)−f(x;θ)]2下面我们来确定f(x;θ)的形式。我们选用线性模型,即
f(x;w,b)=xTw+b.跟上面一样,这个模型没法学习XOR,不过用的方法不一样。西瓜书里面画了超平面,花书里面是这样说明的:如果x1=0,那么输出是随着x2的增大而增大;但如果x1=1,那么输出是随着x2的增大而减小。可是x2的系数是固定的,线性模型不能随着x1的改变来改变x2的系数,所以这个问题就搞不定了。
所以书中指出,如果从下面这个空间里面去学习,是能够学出来的。下面的问题就是如何把原来空间变换成这个空间。
下面我们来学习XOR。我们引入一个非常简单的前馈神经网络,如下图所示。
因此有两个函数:
h=f(1)(x;W,c)与y=f(2)(h;w,b)下面采用**函数,定义
h=g(WTx+c),且采用**函数为g(z)=max{0,z}(ReLU函数,整流线性单元)。由此得到整个网络为
f(x;W,c,w,b)=wTmax{0,WTx+c}+b
书中最后给出了一组解。总之,因为我们用了两层网络,第一次用了非线性的函数,所以能够对这类非线性问题进行学习了。
3、误差逆传播(error back propagation,BP)算法
BP算法是一种非常成功的算法,应用也非常广泛。不过当我们说"BP网络“的时候,指的是多层前馈网络。
我们先从标准BP算法的流程开始。
输入:
训练集D={(xk,yk)}k=1m,xk∈Rd,yk∈Rl;
学习率η.
过程:
1:在(0,1)范围内随机初始化网络中所有连接权和阈值
2:repeat
3: for all (xk,yk)∈D do
4: 根据当前参数和式(5.3)计算当前样本的输出y^k;
5: 根据式(5.10)计算输出层神经元的梯度项gj;
6: 根据式(5.15)计算隐层神经元的梯度项eh;
7: 根据式(5.11)-(5.14)更新连接权whj,vih与阈值θj,γh
8: end for
9:until 达到停止条件
输出:
连接权与阈值确定的多层前馈神经网络
下面我们先来看看多层前馈网络的结构,下图为西瓜书图5.7。显然,该网络有d个输入神经元,l个输出神经元,q个隐层神经元。输入层第i个神经元与隐层第h个神经元之间的连接权值为vih,隐层第h个神经元与输出层第j个神经元之间的连接权值为whj。此外,隐层第h个神经元的阈值为γh,输出层第j个神经元的阈值为θj。
显然,我们可以得到第h个隐层神经元的输入为
αh=Σi=1dvihxi,第j个输出层神经元的输入为
βj=Σh=1qwhjbh.
下面我们来看学习的过程,即如何更新参数。注意这里需要更新的参数,包括连接权值v,w以及阈值γ,θ。对于训练样本(xk,yk),若神经网络输出为y^k=(y^1k,y^2k,…,y^lk),则有
y^jk=f(βj−θj), (5.3)则网络在(xk,yk)上的均方误差为
Ek=21Σj=1l(y^jk−yjk)2. (5.4)
我们来看看需要确定的参数个数。权值v有dq个,权值w有lq个,阈值γ有q个,阈值θ有l个,因此一共有(d+l+1)q+l个。BP算法是个迭代学习的过程,任意参数v的更新估计式为
v←v+Δv.
下面以whj为例来进行推导。BP算法基于梯度下降策略。由于要最小化均方误差Ek,因此给定学习率η,有
Δwhj=−η∂whj∂Ek.注意到whj先影响到第j个输出神经元的输入值βj,再影响到它的输出值y^jk,然后影响到Ek,有
∂whj∂Ek=∂y^jk∂Ek⋅∂βj∂y^jk⋅∂whj∂βj.由于βj=Σh=1qwhjbh,因此∂whj∂βj=bh。
进一步,我们设
gj=−∂y^jk∂Ek⋅∂βj∂y^jk,即
Δwhj=ηgjbh.根据式(5.4)可以得到
gj=−(y^jk−yjk)⋅f′(βj−θj).又由于如果采用Sigmoid函数,存在一个很好的性质f′(x)=f(x)(1−f(x)),因此计算流程图里的step-5:
gj=(yjk−y^jk)⋅y^jk⋅(1−y^jk). (5.10)
同样可以得到其它参数的更新算法
Δθj=−ηgj,(5.12)Δvih=ηehxi,(5.13)Δγh=−ηeh,(5.14)其中
eh=bh(1−bh)Σwhjgj.(5.15)
下面我们来推导下上面的结果,设
Δθj=−η∂θj∂Ek,由于θj为第j个输出层神经元的阈值,因此它直接影响输出值y^jk,即
∂θj∂Ek=∂y^jk∂Ek⋅∂θj∂y^jk,由(5.3)可知,
∂y^jk∂Ek⋅∂θj∂y^jk=−∂y^jk∂Ek⋅∂βj∂y^jk=gj,
即可得(5.12)。进一步,由于
Δvih=−η∂vih∂Ek,注意到vih先影响到第h个隐层神经元的输入αh,随后影响到第h个隐层神经元的输出bh进一步影响所有l个输出层神经元的输入以及输出,故可以得到
∂vih∂Ek=[j=1∑l∂y^j∂Ek⋅∂βj∂y^j⋅∂bh∂βj]⋅∂αh∂bh⋅∂vih∂αh由于
∂y^j∂Ek⋅∂βj∂y^j=−gj,∂bh∂βj=wih,
∂αh∂bh=f′(αh−γh),∂vih∂αh=xi,有
eh=−∂bh∂Ek⋅∂αh∂bh=j=1∑lgjwihf′(αh−γh),,进一步考虑Sigmoid函数,有
eh=bh(1−bh)j=1∑lwihgj.
上面介绍的“标准BP算法”每次仅仅针对一个训练样本更新参数,即基于单个Ek来更新。如果基于累积误差
E=m1k=1∑mEk来进行更新,就得到了累积BP算法。
由于具有强大的表示能力,因此BP网络经常遭遇过拟合,即训练误差持续降低,但测试误差却可能上升。两种缓和的策略包括:1)早停;2)正则化。
参考文献
[1] 周志华,《机器学习》,清华大学出版社。
[2] Ian Goodfellow等,《深度学习》,人民邮电出版社。