深度学习(一):神经元模型、感知机与BP算法

下面内容主要来自西瓜书的第五章《神经网络》5.1~5.3节。

1、神经元模型

  这一节简单,讲了两个概念,神经元模型以及**函数。先来看神经元模型吧。
深度学习(一):神经元模型、感知机与BP算法
因此,第jj个神经元的输出为
yj=f(Σi=1nwijxiθ)=f(Σi=0nwijxi) y_j=f(\Sigma_{i=1}^n w_{ij}x_i-\theta)=f(\Sigma_{i=0}^n w_{ij}x_i) 其中xix_i为第ii个输入,wi,jw_{i,j}为第jj个神经元第ii个输入的权重,θ\theta为门限,且x0=1,w0j=θx_0=-1,w_{0j}=\theta
上面图和式子里面的f()f(\cdot)为**函数。引用网上博客说明为何要采用**函数:

如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层节点的输入都是上层输出的线性函数,很容易验证,无论你神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机(Perceptron)了,那么网络的逼近能力就相当有限。正因为上面的原因,我们决定引入非线性函数作为激励函数,这样深层神经网络表达能力就更加强大(不再是输入的线性组合,而是几乎可以逼近任意函数)。


作者:StevenSun2014
来源:****
原文:https://blog.****.net/tyhj_sf/article/details/79932893
版权声明:本文为博主原创文章,转载请附上博文链接!

同一篇博客里面指出,早期研究神经网络主要采用sigmoid函数或者tanh函数,输出有界,很容易充当下一层的输入。
近些年Relu函数及其改进型(如Leaky-ReLU、P-ReLU、R-ReLU等)在多层神经网络中应用比较多。这里先只看sigmoid函数吧。
深度学习(一):神经元模型、感知机与BP算法
上面是函数图形,其表达式为
sigmoid(x)=11+ex. {\rm sigmoid}(x)=\frac{1}{1+e^x}.

2、感知机与多层网络

  这个部分,我觉得可以跟花书上面6.1《实例:学习XOR》结合起来理解。先按照西瓜书上的表达,我们看如何用包含两层神经元的感知机来完成两个输入的逻辑运算。两层神经元感知机的结构示意图如下:
深度学习(一):神经元模型、感知机与BP算法
这里我们假定**函数为符号函数,即y=sgn(xTw)y={\rm sgn}({\bf x}^{\rm T}{\bf w} )。下面我们两个输入神经元分别为x1,x2x_1,x_2,而x0=1x_0=-1w0w_0为门限,即x=[1 x1 x2]T{\bf x}=[-1 \ x_1\ x_2]^{\rm T}以及w=[θ w1 w2]T{\bf w}=[\theta \ w_1\ w_2]^{\rm T}
下面我们来实现逻辑运算:

  • “and”:w=[2,1,1]T{\bf w}=[2,1,1]^{\rm T}
  • “or” :w=[0.5,1,1]T{\bf w}=[0.5,1,1]^{\rm T}
  • “not” :w=[0.5,1.2,0]T{\bf w}=[0.5, -1.2, 0]^{\rm T}

到目前为止,都很顺利。事实上,学习的过程就是逐步调整权重系数向量w\bf w的过程。对于训练样例(x,y)({\bf x},y),若当前感知机的输出为y^\hat y,则如下来调整感知机权重:
wiwi+Δwi w_i\leftarrow w_i+\Delta w_i Δwi=η(yy^)xi. \Delta w_i=\eta(y-\hat y)x_i.
西瓜书上谈到,这种只拥有一层功能神经元(即只有输出层神经元进行**函数处理)的感知机,学习能力非常有限。对于异或运算这类简单的“非线性可分问题”,这样的感知机也没法解决。下面我们切换到花书上,看看《6.1 实例:学习XOR》。

XOR函数提供了我们想要学习的目标函数y=f(x)y=f^*(x)。我们的模型给出了一个函数y=f(x;θ)y=f(\bf x;\bm \theta),并且我们的学习算法会不断调整参数θ\bm \theta来使得ff尽可能接近ff^*。尽管对于二进制而言,MSE并不是一个合适的代价函数,我们还是先从MSE开始(anyway, we need to start):
J(w)=14ΣxX[f(x)f(x;θ)]2 J({\bf w})=\frac{1}{4}\Sigma_{x\in \mathbb X}[f^*({\bf x})-f({\bf x; \bm \theta})]^2 下面我们来确定f(x;θ)f(\bf x;\bm \theta)的形式。我们选用线性模型,即
f(x;w,b)=xTw+b. f({\bf x;w},b)={\bf x}^{\rm T}{\bf w}+b. 跟上面一样,这个模型没法学习XOR,不过用的方法不一样。西瓜书里面画了超平面,花书里面是这样说明的:如果x1=0x_1=0,那么输出是随着x2x_2的增大而增大;但如果x1=1x_1=1,那么输出是随着x2x_2的增大而减小。可是x2x_2的系数是固定的,线性模型不能随着x1x_1的改变来改变x2x_2的系数,所以这个问题就搞不定了。

  所以书中指出,如果从下面这个空间里面去学习,是能够学出来的。下面的问题就是如何把原来空间变换成这个空间。深度学习(一):神经元模型、感知机与BP算法

  下面我们来学习XOR。我们引入一个非常简单的前馈神经网络,如下图所示。
深度学习(一):神经元模型、感知机与BP算法因此有两个函数:
h=f(1)(x;W,c) {\bf h}=f^{(1)}({\bf x};{\bf W,c})y=f(2)(h;w,b) y=f^{(2)}({\bf h};{\bf w},b) 下面采用**函数,定义
h=g(WTx+c), {\bf h}=g({\bf W^{\rm T}x+c}),且采用**函数为g(z)=max{0,z}g(z)=\max\{0,z\}(ReLU函数,整流线性单元)。由此得到整个网络为
f(x;W,c,w,b)=wTmax{0,WTx+c}+b f({\bf x;W,c,w},b)={\bf w}^{\rm T}\max\{0,W^{\rm T}{\bf x+c}\}+b
书中最后给出了一组解。总之,因为我们用了两层网络,第一次用了非线性的函数,所以能够对这类非线性问题进行学习了。

3、误差逆传播(error back propagation,BP)算法

BP算法是一种非常成功的算法,应用也非常广泛。不过当我们说"BP网络“的时候,指的是多层前馈网络。

  我们先从标准BP算法的流程开始。


输入:
  训练集D={(xk,yk)}k=1mD=\{({\bf x}_k,{\bf y}_k)\}_{k=1}^{m}xkRd{\bf x}_k\in \mathbb{R}^dykRl{\bf y}_k\in \mathbb{R}^l
  学习率η\eta.
过程:
1:在(0,1)范围内随机初始化网络中所有连接权和阈值
2:repeat
3: for all (xk,yk)D({\bf x}_k,{\bf y}_k)\in D do
4:  根据当前参数和式(5.3)计算当前样本的输出y^k\hat {\bf y}_k
5:  根据式(5.10)计算输出层神经元的梯度项gjg_j
6:  根据式(5.15)计算隐层神经元的梯度项ehe_h
7:  根据式(5.11)-(5.14)更新连接权whj,vihw_{hj},v_{ih}与阈值θj\theta_j,γh\gamma_h
8: end for
9:until 达到停止条件
输出:
  连接权与阈值确定的多层前馈神经网络


  下面我们先来看看多层前馈网络的结构,下图为西瓜书图5.7。显然,该网络有dd个输入神经元,ll个输出神经元,qq个隐层神经元。输入层第ii个神经元与隐层第hh个神经元之间的连接权值为vihv_{ih},隐层第hh个神经元与输出层第jj个神经元之间的连接权值为whjw_{hj}。此外,隐层第hh个神经元的阈值为γh\gamma _h,输出层第jj个神经元的阈值为θj\theta_j
深度学习(一):神经元模型、感知机与BP算法  显然,我们可以得到第hh个隐层神经元的输入为
αh=Σi=1dvihxi, \alpha_h=\Sigma_{i=1}^{d}v_{ih}x_i, jj个输出层神经元的输入为
βj=Σh=1qwhjbh. \beta_j=\Sigma_{h=1}^{q}w_{hj}b_h.
  下面我们来看学习的过程,即如何更新参数。注意这里需要更新的参数,包括连接权值v,w\bf v,w以及阈值γ,θ\bm \gamma,\theta。对于训练样本(xk,yk)({\bf x}_k,{\bf y}_k),若神经网络输出为y^k=(y^1k,y^2k,,y^lk)\hat{\bf y}_k=(\hat y_1^k,\hat y_2^k,\ldots,\hat y_l^k),则有
y^jk=f(βjθj),     (5.3) \hat y_j^k=f(\beta_j-\theta_j),\ \ \ \ \ (5.3) 则网络在(xk,yk)({\bf x}_k,{\bf y}_k)上的均方误差为
Ek=12Σj=1l(y^jkyjk)2.   (5.4) {\rm E}_k=\frac{1}{2}\Sigma_{j=1}^{l}(\hat y_j^k-y_j^k)^2.\ \ \ (5.4)
我们来看看需要确定的参数个数。权值v\bf vdqdq个,权值w\bf wlqlq个,阈值γ\bm \gammaqq个,阈值θ\bm \thetall个,因此一共有(d+l+1)q+l(d+l+1)q+l个。BP算法是个迭代学习的过程,任意参数vv的更新估计式为
vv+Δv.v\leftarrow v+\Delta v.

下面以whjw_{hj}为例来进行推导。BP算法基于梯度下降策略。由于要最小化均方误差Ek{\rm E}_k,因此给定学习率η\eta,有
Δwhj=ηEkwhj. \Delta w_{hj}=-\eta\frac{\partial{\rm E}_k}{\partial w_{hj}}. 注意到whjw_{hj}先影响到第jj个输出神经元的输入值βj\beta_j,再影响到它的输出值y^jk\hat y_j^k,然后影响到Ek{\rm E}_k,有
Ekwhj=Eky^jky^jkβjβjwhj. \frac{\partial{\rm E}_k}{\partial w_{hj}}=\frac{\partial{\rm E}_k}{\partial \hat y^k_j}\cdot \frac{\partial \hat y^k_j}{\partial \beta_{j}}\cdot \frac{\partial \beta_j}{\partial w_{hj}} . 由于βj=Σh=1qwhjbh\beta_j=\Sigma_{h=1}^{q}w_{hj}b_h,因此βjwhj=bh\frac{\partial \beta_j}{\partial w_{hj}}=b_h
  进一步,我们设
gj=Eky^jky^jkβj g_j=-\frac{\partial{\rm E}_k}{\partial \hat y^k_j}\cdot \frac{\partial \hat y^k_j}{\partial \beta_{j}} ,
Δwhj=ηgjbh. \Delta w_{hj}=\eta g_j b_h. 根据式(5.4)可以得到
gj=(y^jkyjk)f(βjθj). g_j=-(\hat y_j^k-y_j^k)\cdot f'(\beta_j-\theta_j). 又由于如果采用Sigmoid函数,存在一个很好的性质f(x)=f(x)(1f(x))f'(x)=f(x)(1-f(x)),因此计算流程图里的step-5:
gj=(yjky^jk)y^jk(1y^jk).   (5.10) g_j=(y_j^k-\hat y_j^k)\cdot \hat y_j^k\cdot(1-\hat y_j^k).\ \ \ (5.10)

  同样可以得到其它参数的更新算法
Δθj=ηgj,(5.12) \Delta \theta_j=-\eta g_j,\qquad (5.12) Δvih=ηehxi,(5.13) \Delta v_{ih}=\eta e_h x_i,\qquad (5.13) Δγh=ηeh,(5.14) \Delta \gamma_h=-\eta e_h,\qquad (5.14)其中
eh=bh(1bh)Σwhjgj.(5.15) e_h=b_h(1-b_h)\Sigma w_{hj}g_j.\qquad (5.15)

下面我们来推导下上面的结果,设
Δθj=ηEkθj, \Delta \theta_j=-\eta \frac{\partial {\rm E}_k}{\partial \theta_j}, 由于θj\theta_j为第jj个输出层神经元的阈值,因此它直接影响输出值y^jk\hat y_j^k,即
Ekθj=Eky^jky^jkθj, \frac{\partial {\rm E}_k}{\partial \theta_j}=\frac{\partial {\rm E}_k}{\partial \hat y_j^k}\cdot \frac{\partial \hat y_j^k}{\partial \theta_j}, 由(5.3)可知,
Eky^jky^jkθj=Eky^jky^jkβj=gj, \frac{\partial {\rm E}_k}{\partial \hat y_j^k}\cdot \frac{\partial \hat y_j^k}{\partial \theta_j}=- \frac{\partial {\rm E}_k}{\partial \hat y_j^k}\cdot \frac{\partial \hat y_j^k}{\partial \beta_j}=g_j,
即可得(5.12)。进一步,由于
Δvih=ηEkvih, \Delta v_{ih}=-\eta \frac{\partial {\rm E}_k}{\partial v_{ih}}, 注意到vihv_{ih}先影响到第hh个隐层神经元的输入αh\alpha_h,随后影响到第hh个隐层神经元的输出bhb_h进一步影响所有ll个输出层神经元的输入以及输出,故可以得到
Ekvih=[j=1lEky^jy^jβjβjbh]bhαhαhvih \frac{\partial {\rm E}_k}{\partial v_{ih}}= [\sum_{j=1}^l\frac{\partial {\rm E}_k}{\partial \hat y_j}\cdot\frac{\partial \hat y_j}{\partial \beta_j}\cdot\frac{\partial \beta_j}{\partial b_h}]\cdot\frac{\partial b_h}{\partial \alpha_h}\cdot\frac{\partial \alpha_h}{\partial v_{ih}} 由于
Eky^jy^jβj=gj, \frac{\partial {\rm E}_k}{\partial \hat y_j}\cdot\frac{\partial \hat y_j}{\partial \beta_j}=-g_j, βjbh=wih, \frac{\partial \beta_j}{\partial b_h}=w_{ih},
bhαh=f(αhγh), \frac{\partial b_h}{\partial \alpha_h}=f'(\alpha_h-\gamma_h), αhvih=xi, \frac{\partial \alpha_h}{\partial v_{ih}}=x_i,
eh=Ekbhbhαh=j=1lgjwihf(αhγh),, e_h=-\frac{\partial{\rm E}_k}{\partial b_h}\cdot \frac{\partial b_h}{\partial \alpha_h}=\sum_{j=1}^lg_jw_{ih}f'(\alpha_h-\gamma_h), ,进一步考虑Sigmoid函数,有
eh=bh(1bh)j=1lwihgj. e_h=b_h(1-b_h)\sum_{j=1}^lw_{ih}g_j.

  上面介绍的“标准BP算法”每次仅仅针对一个训练样本更新参数,即基于单个Ek{\rm E}_k来更新。如果基于累积误差
E=1mk=1mEk {\rm E}=\frac{1}{m}\sum_{k=1}^m {\rm E}_k来进行更新,就得到了累积BP算法。
  由于具有强大的表示能力,因此BP网络经常遭遇过拟合,即训练误差持续降低,但测试误差却可能上升。两种缓和的策略包括:1)早停;2)正则化。


参考文献
[1] 周志华,《机器学习》,清华大学出版社。
[2] Ian Goodfellow等,《深度学习》,人民邮电出版社。