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

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

1、神经元模型

  这一节简单,讲了两个概念,神经元模型以及激活函数。先来看神经元模型吧。
在这里插入图片描述
因此,第 j j 个神经元的输出为
y j = f ( Σ i = 1 n w i j x i θ ) = f ( Σ i = 0 n w i j x i ) y_j=f(\Sigma_{i=1}^n w_{ij}x_i-\theta)=f(\Sigma_{i=0}^n w_{ij}x_i) 其中 x i x_i 为第 i i 个输入, w i , j w_{i,j} 为第 j j 个神经元第 i i 个输入的权重, θ \theta 为门限,且 x 0 = 1 , w 0 j = θ x_0=-1,w_{0j}=\theta
上面图和式子里面的 f ( ) f(\cdot) 为激活函数。引用网上博客说明为何要采用激活函数:

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


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

同一篇博客里面指出,早期研究神经网络主要采用sigmoid函数或者tanh函数,输出有界,很容易充当下一层的输入。
近些年Relu函数及其改进型(如Leaky-ReLU、P-ReLU、R-ReLU等)在多层神经网络中应用比较多。这里先只看sigmoid函数吧。
在这里插入图片描述
上面是函数图形,其表达式为
s i g m o i d ( x ) = 1 1 + e x . {\rm sigmoid}(x)=\frac{1}{1+e^x}.

2、感知机与多层网络

  这个部分,我觉得可以跟花书上面6.1《实例:学习XOR》结合起来理解。先按照西瓜书上的表达,我们看如何用包含两层神经元的感知机来完成两个输入的逻辑运算。两层神经元感知机的结构示意图如下:
在这里插入图片描述
这里我们假定激活函数为符号函数,即 y = s g n ( x T w ) y={\rm sgn}({\bf x}^{\rm T}{\bf w} ) 。下面我们两个输入神经元分别为 x 1 , x 2 x_1,x_2 ,而 x 0 = 1 x_0=-1 w 0 w_0 为门限,即 x = [ 1   x 1   x 2 ] T {\bf x}=[-1 \ x_1\ x_2]^{\rm T} 以及 w = [ θ   w 1   w 2 ] 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 ,则如下来调整感知机权重:
w i w i + Δ w i w_i\leftarrow w_i+\Delta w_i Δ w i = η ( y y ^ ) x i . \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 来使得 f f 尽可能接近 f f^* 。尽管对于二进制而言,MSE并不是一个合适的代价函数,我们还是先从MSE开始(anyway, we need to start):
J ( w ) = 1 4 Σ x X [ 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 ) = x T w + b . f({\bf x;w},b)={\bf x}^{\rm T}{\bf w}+b. 跟上面一样,这个模型没法学习XOR,不过用的方法不一样。西瓜书里面画了超平面,花书里面是这样说明的:如果 x 1 = 0 x_1=0 ,那么输出是随着 x 2 x_2 的增大而增大;但如果 x 1 = 1 x_1=1 ,那么输出是随着 x 2 x_2 的增大而减小。可是 x 2 x_2 的系数是固定的,线性模型不能随着 x 1 x_1 的改变来改变 x 2 x_2 的系数,所以这个问题就搞不定了。

  所以书中指出,如果从下面这个空间里面去学习,是能够学出来的。下面的问题就是如何把原来空间变换成这个空间。在这里插入图片描述

  下面我们来学习XOR。我们引入一个非常简单的前馈神经网络,如下图所示。
在这里插入图片描述因此有两个函数:
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 ( W T x + 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 ) = w T max { 0 , W T x + 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 = { ( x k , y k ) } k = 1 m D=\{({\bf x}_k,{\bf y}_k)\}_{k=1}^{m} x k R d {\bf x}_k\in \mathbb{R}^d y k R l {\bf y}_k\in \mathbb{R}^l
  学习率 η \eta .
过程:
1:在(0,1)范围内随机初始化网络中所有连接权和阈值
2:repeat
3: for all ( x k , y k ) D ({\bf x}_k,{\bf y}_k)\in D do
4:  根据当前参数和式(5.3)计算当前样本的输出 y ^ k \hat {\bf y}_k
5:  根据式(5.10)计算输出层神经元的梯度项 g j g_j
6:  根据式(5.15)计算隐层神经元的梯度项 e h e_h
7:  根据式(5.11)-(5.14)更新连接权 w h j , v i h w_{hj},v_{ih} 与阈值 θ j \theta_j , γ h \gamma_h
8: end for
9:until 达到停止条件
输出:
  连接权与阈值确定的多层前馈神经网络


  下面我们先来看看多层前馈网络的结构,下图为西瓜书图5.7。显然,该网络有 d d 个输入神经元, l l 个输出神经元, q q 个隐层神经元。输入层第 i i 个神经元与隐层第 h h 个神经元之间的连接权值为 v i h v_{ih} ,隐层第 h h 个神经元与输出层第 j j 个神经元之间的连接权值为 w h j w_{hj} 。此外,隐层第 h h 个神经元的阈值为 γ h \gamma _h ,输出层第 j j 个神经元的阈值为 θ j \theta_j
在这里插入图片描述  显然,我们可以得到第 h h 个隐层神经元的输入为
α h = Σ i = 1 d v i h x i , \alpha_h=\Sigma_{i=1}^{d}v_{ih}x_i, j j 个输出层神经元的输入为
β j = Σ h = 1 q w h j b h . \beta_j=\Sigma_{h=1}^{q}w_{hj}b_h.
  下面我们来看学习的过程,即如何更新参数。注意这里需要更新的参数,包括连接权值 v , w \bf v,w 以及阈值 γ , θ \bm \gamma,\theta 。对于训练样本 ( x k , y k ) ({\bf x}_k,{\bf y}_k) ,若神经网络输出为 y ^ k = ( y ^ 1 k , y ^ 2 k , , y ^ l k ) \hat{\bf y}_k=(\hat y_1^k,\hat y_2^k,\ldots,\hat y_l^k) ,则有
y ^ j k = f ( β j θ j ) ,       ( 5.3 ) \hat y_j^k=f(\beta_j-\theta_j),\ \ \ \ \ (5.3) 则网络在 ( x k , y k ) ({\bf x}_k,{\bf y}_k) 上的均方误差为
E k = 1 2 Σ j = 1 l ( y ^ j k y j k ) 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 v d q dq 个,权值 w \bf w l q lq 个,阈值 γ \bm \gamma q q 个,阈值 θ \bm \theta l l 个,因此一共有 ( d + l + 1 ) q + l (d+l+1)q+l 个。BP算法是个迭代学习的过程,任意参数 v v 的更新估计式为
v v + Δ v . v\leftarrow v+\Delta v.

下面以 w h j w_{hj} 为例来进行推导。BP算法基于梯度下降策略。由于要最小化均方误差 E k {\rm E}_k ,因此给定学习率 η \eta ,有
Δ w h j = η E k w h j . \Delta w_{hj}=-\eta\frac{\partial{\rm E}_k}{\partial w_{hj}}. 注意到 w h j w_{hj} 先影响到第 j j 个输出神经元的输入值 β j \beta_j ,再影响到它的输出值 y ^ j k \hat y_j^k ,然后影响到 E k {\rm E}_k ,有
E k w h j = E k y ^ j k y ^ j k β j β j w h j . \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 = 1 q w h j b h \beta_j=\Sigma_{h=1}^{q}w_{hj}b_h ,因此 β j w h j = b h \frac{\partial \beta_j}{\partial w_{hj}}=b_h
  进一步,我们设
g j = E k y ^ j k y ^ j k β j g_j=-\frac{\partial{\rm E}_k}{\partial \hat y^k_j}\cdot \frac{\partial \hat y^k_j}{\partial \beta_{j}} ,
Δ w h j = η g j b h . \Delta w_{hj}=\eta g_j b_h. 根据式(5.4)可以得到
g j = ( y ^ j k y j k ) f ( β j θ j ) . g_j=-(\hat y_j^k-y_j^k)\cdot f'(\beta_j-\theta_j). 又由于如果采用Sigmoid函数,存在一个很好的性质 f ( x ) = f ( x ) ( 1 f ( x ) ) f'(x)=f(x)(1-f(x)) ,因此计算流程图里的step-5:
g j = ( y j k y ^ j k ) y ^ j k ( 1 y ^ j k ) .     ( 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 = η g j , ( 5.12 ) \Delta \theta_j=-\eta g_j,\qquad (5.12) Δ v i h = η e h x i , ( 5.13 ) \Delta v_{ih}=\eta e_h x_i,\qquad (5.13) Δ γ h = η e h , ( 5.14 ) \Delta \gamma_h=-\eta e_h,\qquad (5.14) 其中
e h = b h ( 1 b h ) Σ w h j g j . ( 5.15 ) e_h=b_h(1-b_h)\Sigma w_{hj}g_j.\qquad (5.15)

下面我们来推导下上面的结果,设
Δ θ j = η E k θ j , \Delta \theta_j=-\eta \frac{\partial {\rm E}_k}{\partial \theta_j}, 由于 θ j \theta_j 为第 j j 个输出层神经元的阈值,因此它直接影响输出值 y ^ j k \hat y_j^k ,即
E k θ j = E k y ^ j k y ^ j k θ 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)可知,
E k y ^ j k y ^ j k θ j = E k y ^ j k y ^ j k β j = g j , \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)。进一步,由于
Δ v i h = η E k v i h , \Delta v_{ih}=-\eta \frac{\partial {\rm E}_k}{\partial v_{ih}}, 注意到 v i h v_{ih} 先影响到第 h h 个隐层神经元的输入 α h \alpha_h ,随后影响到第 h h 个隐层神经元的输出 b h b_h 进一步影响所有 l l 个输出层神经元的输入以及输出,故可以得到
E k v i h = [ j = 1 l E k y ^ j y ^ j β j β j b h ] b h α h α h v i h \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}} 由于
E k y ^ j y ^ j β j = g j , \frac{\partial {\rm E}_k}{\partial \hat y_j}\cdot\frac{\partial \hat y_j}{\partial \beta_j}=-g_j, β j b h = w i h , \frac{\partial \beta_j}{\partial b_h}=w_{ih},
b h α h = f ( α h γ h ) , \frac{\partial b_h}{\partial \alpha_h}=f'(\alpha_h-\gamma_h), α h v i h = x i , \frac{\partial \alpha_h}{\partial v_{ih}}=x_i,
e h = E k b h b h α h = j = 1 l g j w i h f ( α 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函数,有
e h = b h ( 1 b h ) j = 1 l w i h g j . e_h=b_h(1-b_h)\sum_{j=1}^lw_{ih}g_j.

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


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

猜你喜欢

转载自blog.csdn.net/tanghonghanhaoli/article/details/88840841
今日推荐