人工神经网络(ANN)

文章目录

    • 1. 常见的神经网络
    • 2. 全连接神经网络
      • 2.1. 神经元
      • 2.2. 激活函数
      • 2.3. 参数初始化
      • 2.4. 前行传播(Forward propagation,FP)计算结果
      • 2.5. 反向传播(Back propagation,BP)更新权值
      • 2.6. 全连接神经网络的一次batch训练过程
    • 3. 损失函数
      • 3.1. 交叉熵作为损失函数
    • 4. 优化方法
    • 5. 过拟合的应对
      • 5.1. 增加数据量
      • 5.2. 规则化项(正则化项)
      • 5.3. dropout操作
      • 5.4. 提前终止
      • 5.5. 批标准化
    • 6. 梯度消失与梯度爆炸

  人工神经网络是一个模型,配套的东西还有损失函数和优化方法,这样就构成了完整的统计学习方法三要素:模型、策略、学习。

  广义上,深度学习就是利用神经网络进行学习,但严格来说,非线性深层神经网络才是深度学习,由于线性神经网络无法进行异或运算,最近的研究又在不断延伸神经网络的深度和宽度,所以一般提及神经网络,说的都是非线性深层神经网络。

  Deep Learning强大的地方就是可以利用网络中间某一层的输出当做是数据的另一种表达,从而可以将其认为是经过网络学习到的特征。基于该特征,可以进行进一步的相似度比较等。

  Deep Learning算法能够有效的关键其实是大规模的数据,这一点原因在于每个DL都有众多的参数,少量数据无法将参数训练充分。

1. 常见的神经网络

  常见的神经网络有:全连接神经网络(FCNN)、卷积神经网络(CNN)及其分支(ResNet、DenseNet等)、循环神经网络(RNN)及其分支(LSTM等)、径向基神经网络(RBF)、自动编码器(Auto Encoder)、受限玻尔兹曼机(RBM)等等。


2. 全连接神经网络

  全连接神经网络是最简单、最基础的神经网络,本blog主要讲述全连接神经网络,全连接神经网络的后一层神经元,一定和前一层的所有神经元都有连接,数据流向是从前一层神经元流向后一层,全连接神经网络是一个前馈神经网络,没有闭环或回路。

2.1. 神经元

  1943年,McCulloch和Pitts将生物的神经元结构用一种简单的模型进行了表示,构成了一种人工神经元模型,也就是我们现在经常用到的“M-P神经元模型”,全连接神经元利用的就是这种MP神经元,在其他神经网络中,神经元的结构会略有不同,MP神经元结构如下:

人工神经网络(ANN)_第1张图片

  MP神经元结构可以简化成下式: y j = f ( ∑ i = 1 n x i w i j + x 0 w 0 j ) = f ( ∑ i = 1 n x i w i j − θ ) y_{j}=f(\sum\limits_{i=1}^{n}x_{i}w_{ij}+x_{0}w_{0j})=f(\sum\limits_{i=1}^{n}x_{i}w_{ij}-\theta) yj=f(i=1nxiwij+x0w0j)=f(i=1nxiwijθ)

  其中 { x 1 … x n } \{x_{1}\dots x_{n}\} {x1xn}是神经元的输入; { w 1 j … w n j } \{w_{1j}\dots w_{nj}\} {w1jwnj}是输入对应的权重, θ \theta θ是偏置, w w w θ \theta θ是神经网络重点学习的参数对象; f ( ⋅ ) f(·) f()是激活函数,激活函数会在后面单独的说, 经过激活函数的值,又称为激活值


2.2. 激活函数

  MP神经元中,( ∑ i = 1 n x i w i j − θ \sum\limits_{i=1}^{n}x_{i}w_{ij}-\theta i=1nxiwijθ)部分是完全的线性运算,要想实现非线性,必须借助非线性的激活函数,激活函数也是整个神经网络的非线性特性的重要来源。
  sigmoid函数系有两个激活函数logistic-sigmoid与tanh-sigmoid,常用的激活函数还有ReLU激活函数(Rectified Linear Unit,线性整流函数)和softplus激活函数,ReLU激活函数更贴近生物神经元的工作方式。下面给出logistic-sigmoid与tanh的函数曲线:

人工神经网络(ANN)_第2张图片

下面给出softplus与ReLU的函数曲线

人工神经网络(ANN)_第3张图片

真实的人脑神经元激活曲线是这样的

人工神经网络(ANN)_第4张图片

真实的人脑神经元激活曲线有一个很明显的激活阈值,而且是稀疏激活(大脑同时被激活的神经元只有1%~4%)。可见sigmoid函数系完全不像人脑,softplus函数的激活阈值并不明显,ReLU最像人脑的真实神经元激活曲线。


2.3. 参数初始化

  由上面的分析,我们知道全连接神经网络的要训练的参数,主要有权值 w w w和偏置 b b b,在真正开始学习前,我们要先对参数进行初始化。

  常用的初始化方法,是把这些参数按照高斯分布 N ( 0 , σ 2 ) N(0, \sigma^{2}) N(0,σ2)进行初始化,其中 σ \sigma σ是一个很小的值,为何要引入随机性,主要是为了打破对称性,如果层与层之间的权值和偏置是一样的,那么每一层的神经元的输出结果全是一样的,神经网络的学习能力就会受限,这显然不是我们想要的结果。

2.4. 前行传播(Forward propagation,FP)计算结果

  由多个MP神经元,就构成了全连接神经网络的一层,多个层组合成全连接神经网络,下面列出了一个简单的,只有一个隐层的全连接神经网络:

人工神经网络(ANN)_第5张图片

这是一个前馈神经网络的例子,因为这种联接图没有闭环或回路。用矩阵表示隐藏层的输出是
[ a 1 ( 2 ) , a 2 ( 2 ) , a 3 ( 2 ) ] = [ f ( z 1 ( 2 ) ) , f ( z 2 ( 2 ) ) , f ( z 3 ( 2 ) ) ] z 1 ( 2 ) = [ x 1 , x 2 , x 3 ] [ w 11 ( 2 ) w 12 ( 2 ) w 13 ( 2 ) ] + b 1 ( 2 ) z 2 ( 2 ) = [ x 1 , x 2 , x 3 ] [ w 21 ( 2 ) w 22 ( 2 ) w 23 ( 2 ) ] + b 2 ( 2 ) z 3 ( 2 ) = [ x 1 , x 2 , x 3 ] [ w 31 ( 2 ) w 32 ( 2 ) w 33 ( 2 ) ] + b 3 ( 2 ) \begin{aligned} \left [a_{1}^{(2)}, a_{2}^{(2)}, a_{3}^{(2)}\right ] &= \left [f(z_{1}^{(2)}), f(z_{2}^{(2)}), f(z_{3}^{(2)})\right ] \\ z_{1}^{(2)} = &\left[ x_{1}, x_{2}, x_{3}\right] \left[ \begin{matrix} w_{11}^{(2)}\\ w_{12}^{(2)}\\ w_{13}^{(2)} \end{matrix} \right] + b_{1}^{(2)}\\ z_{2}^{(2)} = &\left[ x_{1}, x_{2}, x_{3}\right] \left[ \begin{matrix} w_{21}^{(2)}\\ w_{22}^{(2)}\\ w_{23}^{(2)} \end{matrix} \right] + b_{2}^{(2)} \\ z_{3}^{(2)} = &\left[ x_{1}, x_{2}, x_{3}\right] \left[ \begin{matrix} w_{31}^{(2)}\\ w_{32}^{(2)}\\ w_{33}^{(2)} \end{matrix} \right] + b_{3}^{(2)} \end{aligned} [a1(2),a2(2),a3(2)]z1(2)=z2(2)=z3(2)==[f(z1(2)),f(z2(2)),f(z3(2))][x1,x2,x3]w11(2)w12(2)w13(2)+b1(2)[x1,x2,x3]w21(2)w22(2)w23(2)+b2(2)[x1,x2,x3]w31(2)w32(2)w33(2)+b3(2)

值得注意的一点是,这里 w i j ( m ) w_{ij}^{(m)} wij(m)表示第 m − 1 m-1 m1层的 j j j单元到 m m m层的 i i i单元的权值(-1的操作),在不同的博客中, w i j ( m ) w_{ij}^{(m)} wij(m)右上角的 m m m值可能会表示 m m m层与 m + 1 m+1 m+1层的链接权值(+1的操作),当然 i j ij ij的含义可能也有不同, i i i可能表示前一层的神经元,所以在看别人blog时一定要注意这一点。这篇blog中, w i j ( m ) w_{ij}^{(m)} wij(m)表示第 m − 1 m-1 m1层的 j j j单元到 m m m层的 i i i单元的权值。同时,用矩阵表示输出层的输出就是
[ a 1 ( 3 ) , a 2 ( 3 ) ] = [ f ( z 1 ( 3 ) ) , f ( z 2 ( 3 ) ) ] z 1 ( 3 ) = [ a 1 ( 2 ) , a 2 ( 2 ) , a 3 ( 2 ) ] [ w 11 ( 3 ) w 12 ( 3 ) w 13 ( 3 ) ] + b 1 ( 3 ) z 2 ( 3 ) = [ a 1 ( 2 ) , a 2 ( 2 ) , a 3 ( 2 ) ] [ w 21 ( 3 ) w 22 ( 3 ) w 23 ( 3 ) ] + b 2 ( 3 ) \begin{aligned} \left [a_{1}^{(3)}, a_{2}^{(3)}\right ] &= \left [f(z_{1}^{(3)}), f(z_{2}^{(3)})\right ] \\ z_{1}^{(3)} = &\left[ a_{1}^{(2)}, a_{2}^{(2)}, a_{3}^{(2)}\right] \left[ \begin{matrix} w_{11}^{(3)}\\ w_{12}^{(3)}\\ w_{13}^{(3)} \end{matrix} \right] + b_{1}^{(3)}\\ z_{2}^{(3)} = &\left[ a_{1}^{(2)}, a_{2}^{(2)}, a_{3}^{(2)}\right] \left[ \begin{matrix} w_{21}^{(3)}\\ w_{22}^{(3)}\\ w_{23}^{(3)} \end{matrix} \right] + b_{2}^{(3)} \end{aligned} [a1(3),a2(3)]z1(3)=z2(3)==[f(z1(3)),f(z2(3))][a1(2),a2(2),a3(2)]w11(3)w12(3)w13(3)+b1(3)[a1(2),a2(2),a3(2)]w21(3)w22(3)w23(3)+b2(3)

  这样从输入,一层一层计算各隐藏层的值,最后求得输出值的过程,就是全连接神经网络前向传播的过程,前向传播会得到神经网络的输出结果


2.5. 反向传播(Back propagation,BP)更新权值

  所谓传播,一定是一层一层传播,一层一层计算,这点在前向传播中也有体现,所以BP算法需要找到层与层之间的迭代关系。对于前向传播得到的结果,我们会与真实值进行比较,这里利用最简单的平方损失函数为例, J ( h ( x , w , b ) , y ) = 1 2 ∣ ∣ h ( x , w , b ) − y ∣ ∣ 2 = ∑ i = 1 S n 1 2 ( h ( x i , w , b ) − y i ) 2 J(h(x,w,b),y) = \frac{1}{2}||h(x,w,b)-y||^{2} = \sum\limits_{i=1}^{S_{n}}\frac{1}{2}(h(x_{i},w,b)-y_{i})^{2} J(h(x,w,b),y)=21h(x,w,b)y2=i=1Sn21(h(xi,w,b)yi)2

h ( x , w , b ) h(x,w,b) h(x,w,b)是神经网络对输入 x x x的输出, y y y是期望输出, w w w是神经网络的权值, b b b是神经网络的偏置, S n S_{n} Sn是输出层的神经元个数,也就是一共有 S n S_{n} Sn个输出。同时为了增加其鲁棒性,加入了规则化项 J ( h ( x , w , b ) , y ) = 1 2 ∣ ∣ h ( x , w , b ) − y ∣ ∣ 2 + λ 2 ∑ l = 1 n ∑ i = 1 S l ∑ j = 1 S l − 1 ( w i j ( l ) ) 2 J(h(x,w,b),y) = \frac{1}{2}||h(x,w,b)-y||^{2}+\frac{\lambda}{2} \sum\limits_{l=1}^{n}\sum\limits_{i=1}^{S_{l}}\sum\limits_{j=1}^{S_{l-1}}(w_{ij}^{(l)})^{2} J(h(x,w,b),y)=21h(x,w,b)y2+2λl=1ni=1Slj=1Sl1(wij(l))2

其中, λ \lambda λ是超参数,用于控制规则化项对损失的影响, n n n是神经网络的隐藏层和输出层的总计层数, S l S_{l} Sl S l − 1 S_{l-1} Sl1是第 l l l层与 l − 1 l-1 l1层的神经元数,在规则化项中不包含偏置 b b b,根据blog说明,一般来说,将偏置项包含在规则化项(权重衰减项)中只会对最终的神经网络产生很小的影响。优化方法利用批量随机梯度下降法(Mini-batch SGD),一批有m个数据,则对权值 w w w和偏置 b b b的更新如下: w i j ( l ) = w i j ( l ) + α [ 1 m ( ∑ t = 1 m ∂ J ( h ( x t , w , b ) , y t ) ∂ w i j ( l ) ) ] b i ( l ) = b i ( l ) + α [ 1 m ( ∑ t = 1 m ∂ J ( h ( x t , w , b ) , y t ) ∂ b i ( l ) ) ] w_{ij}^{(l)} =w_{ij}^{(l)} + \alpha [\frac{1}{m}(\sum\limits_{t=1}^{m} \frac{\partial J(h(x_{t},w,b),y_{t})}{\partial w_{ij}^{(l)}})] \\ b_{i}^{(l)} =b_{i}^{(l)} + \alpha [\frac{1}{m}(\sum\limits_{t=1}^{m} \frac{\partial J(h(x_{t},w,b),y_{t})}{\partial b_{i}^{(l)}})] wij(l)=wij(l)+α[m1(t=1mwij(l)J(h(xt,w,b),yt))]bi(l)=bi(l)+α[m1(t=1mbi(l)J(h(xt,w,b),yt))]

其中, α \alpha α是学习步长(学习率),属于超参数,所以关键就是求 ∂ J ( h ( x t , w , b ) , y t ) ∂ w i j ( l ) \frac{\partial J(h(x_{t},w,b),y_{t})}{\partial w_{ij}^{(l)}} wij(l)J(h(xt,w,b),yt) ∂ J ( h ( x t , w , b ) , y t ) ∂ b i ( l ) \frac{\partial J(h(x_{t},w,b),y_{t})}{\partial b_{i}^{(l)}} bi(l)J(h(xt,w,b),yt)。为了进一步求解这两个导数式子,就是反向传播算法的精髓了,需要灵活的运用复合函数的链式求导法则以及多元复合函数的链式求导法则。注意下面的推导, x t x_{t} xt t t t省略,即我们不考虑输入输出是batch中的第几个。

  损失函数对权值的偏导数变换如下: ∂ J ( h ( x , w , b ) , y t ) ∂ w i j ( l ) = ∂ J ( h ( x , w , b ) , y t ) ∂ z i ( l ) ∂ z i ( l ) ∂ w i j ( l ) \begin{aligned} \frac{\partial J(h(x,w,b),y_{t})}{\partial w_{ij}^{(l)}} &= \frac{\partial J(h(x,w,b),y_{t})}{\partial z_{i}^{(l)}} \frac{\partial z_{i}^{(l)}}{\partial w_{ij}^{(l)}}\\ \end{aligned} wij(l)J(h(x,w,b),yt)=zi(l)J(h(x,w,b),yt)wij(l)zi(l)

令残差 δ i ( l ) \delta_{i}^{(l)} δi(l) δ i ( l ) = ∂ J ( h ( x , w , b ) , y t ) ∂ z i ( l ) \begin{aligned} \delta_{i}^{(l)} = \frac{\partial J(h(x,w,b),y_{t})}{\partial z_{i}^{(l)}} \\ \end{aligned} δi(l)=zi(l)J(h(x,w,b),yt)

同时根据前向传播 z i ( l ) = ∑ m = 1 S l − 1 ( a m ( l − 1 ) w i m ( l ) ) + b i ( l ) = ∑ m = 1 S l − 1 ( f ( z m ( l − 1 ) ) w i m ( l ) ) + b i ( l ) \begin{aligned} z_{i}^{(l)} = \sum\limits_{m=1}^{S_{l-1}}(a_{m}^{(l-1)}w_{im}^{(l)})+b_{i}^{(l)}=\sum\limits_{m=1}^{S_{l-1}}(f(z_{m}^{(l-1)})w_{im}^{(l)})+b_{i}^{(l)}\\ \end{aligned} zi(l)=m=1Sl1(am(l1)wim(l))+bi(l)=m=1Sl1(f(zm(l1))wim(l))+bi(l)

则权值的偏导数可以进一步变换为 (1) ∂ J ( h ( x , w , b ) , y t ) ∂ w i j ( l ) = ∂ J ( h ( x , w , b ) , y t ) ∂ z i ( l ) ∂ z i ( l ) ∂ w i j ( l ) = δ i ( l ) ∂ ( ∑ m = 1 S l − 1 ( f ( z m ( l − 1 ) ) w i m ( l ) ) + b i ( l ) ) ∂ w i j ( l ) = δ i ( l ) f ( z j ( l − 1 ) ) = δ i ( l ) a j ( l − 1 ) \begin{aligned} \frac{\partial J(h(x,w,b),y_{t})}{\partial w_{ij}^{(l)}} &= \frac{\partial J(h(x,w,b),y_{t})}{\partial z_{i}^{(l)}} \frac{\partial z_{i}^{(l)}}{\partial w_{ij}^{(l)}}\\ &= \delta_{i}^{(l)} \frac{\partial (\sum\limits_{m=1}^{S_{l-1}}(f(z_{m}^{(l-1)})w_{im}^{(l)})+b_{i}^{(l)})}{\partial w_{ij}^{(l)}} \\ &= \delta_{i}^{(l)} f(z_{j}^{(l-1)})\\& = \delta_{i}^{(l)} a_{j}^{(l-1)} \tag{1} \end{aligned} wij(l)J(h(x,w,b),yt)=zi(l)J(h(x,w,b),yt)wij(l)zi(l)=δi(l)wij(l)(m=1Sl1(f(zm(l1))wim(l))+bi(l))=δi(l)f(zj(l1))=δi(l)aj(l1)(1)

其中 a j ( l − 1 ) a_{j}^{(l-1)} aj(l1)是在前向传播中, l − 1 l-1 l1层第 j j j个神经元的激活值,属于已知值。

误差函数对偏置的偏导数可以进一步变化为 (2) ∂ J ( h ( x , w , b ) , y t ) ∂ b i ( l ) = ∂ J ( h ( x , w , b ) , y t ) ∂ z i ( l ) ∂ z i ( l ) ∂ b i ( l ) = δ i ( l ) ∂ ( ∑ m = 1 S l − 1 ( f ( z m ( l − 1 ) ) w i m ( l ) ) + b i ( l ) ) ∂ b i ( l ) = δ i ( l ) \begin{aligned} \frac{\partial J(h(x,w,b),y_{t})}{\partial b_{i}^{(l)}} &= \frac{\partial J(h(x,w,b),y_{t})}{\partial z_{i}^{(l)}} \frac{\partial z_{i}^{(l)}}{\partial b_{i}^{(l)}}\\ &= \delta_{i}^{(l)} \frac{\partial (\sum\limits_{m=1}^{S_{l-1}}(f(z_{m}^{(l-1)})w_{im}^{(l)})+b_{i}^{(l)})}{\partial b_{i}^{(l)}} \\ &= \delta_{i}^{(l)}\tag{2} \end{aligned} bi(l)J(h(x,w,b),yt)=zi(l)J(h(x,w,b),yt)bi(l)zi(l)=δi(l)bi(l)(m=1Sl1(f(zm(l1))wim(l))+bi(l))=δi(l)(2)

根据(1)(2)两个式子,我们可以看出来,如果 δ i ( l ) \delta_{i}^{(l)} δi(l)已知,那么根据(1)(2)两式,可以求出损失函数在所有权值和偏置处的偏导数,就可以利用Mini-batch SGD的公式更新权值和偏置。已知 δ i ( l ) = ∂ J ( h ( x t , w , b ) , y t ) ∂ z i ( l ) \begin{aligned} \delta_{i}^{(l)} = \frac{\partial J(h(x_{t},w,b),y_{t})}{\partial z_{i}^{(l)}} \\ \end{aligned} δi(l)=zi(l)J(h(xt,w,b),yt)

则当 l = n l=n l=n,即最后一层第 i i i个神经元的残差 δ i ( n ) \delta_{i}^{(n)} δi(n)为: (3) δ i ( n ) = ∂ J ( h ( x , w , b ) , y t ) ∂ z i ( n ) = ∂ 1 2 ∑ j = 1 S n ( f ( z j ( n ) ) − y j ) 2 ∂ z i ( n ) = ( f ( z i ( n ) ) − y i ) f ′ ( z i ( n ) ) \begin{aligned} \delta_{i}^{(n)} &= \frac{\partial J(h(x_,w,b),y_{t})}{\partial z_{i}^{(n)}} \\ &= \frac{\partial \frac{1}{2} \sum\limits_{j=1}^{S_{n}}(f(z_{j}^{(n)})-y_{j})^{2}}{\partial z_{i}^{(n)}} \\ &=(f(z_{i}^{(n)})-y_{i}) f'(z_{i}^{(n)})\tag{3} \end{aligned} δi(n)=zi(n)J(h(x,w,b),yt)=zi(n)21j=1Sn(f(zj(n))yj)2=(f(zi(n))yi)f(zi(n))(3)

f ( z i ( n ) ) 、 y i 、 f ′ ( z i ( n ) ) f(z_{i}^{(n)})、y_{i}、f'(z_{i}^{(n)}) f(zi(n))yif(zi(n))均是已知的,所以 δ i ( n ) \delta_{i}^{(n)} δi(n)已知,下面利用类似数学归纳法的思想,推导 δ ( l ) \delta^{(l)} δ(l) δ ( l + 1 ) \delta^{(l+1)} δ(l+1)的关系。我们假设 δ i ( l + 1 ) , i = 1 , 2 … S l + 1 \delta_{i}^{(l+1)}, i=1,2\dots S_{l+1} δi(l+1),i=1,2Sl+1已知,则 δ i ( l ) = ∂ J ( h ( x , w , b ) , y ) ∂ z i ( l ) = ∑ j = 1 S l + 1 ∂ J ( h ( x , w , b ) , y ) ∂ z j ( l + 1 ) ∂ z j ( l + 1 ) ∂ z i ( l ) \begin{aligned} \delta_{i}^{(l)} &= \frac{\partial J(h(x,w,b),y)}{\partial z_{i}^{(l)}} \\ &= \sum\limits_{j=1}^{S_{l+1}}\frac{\partial J(h(x,w,b),y)}{\partial z_{j}^{(l+1)}} \frac{\partial z_{j}^{(l+1)}}{\partial z_{i}^{(l)}} \end{aligned} δi(l)=zi(l)J(h(x,w,b),y)=j=1Sl+1zj(l+1)J(h(x,w,b),y)zi(l)zj(l+1)

这里利用了多元函数的链式求导法则,可以把损失函数看成 z j ( l + 1 ) z_{j}^{(l+1)} zj(l+1)的函数, J = g ( z 1 ( l + 1 ) , z 2 ( l + 1 ) … z S l + 1 ( l + 1 ) ) J=g(z_{1}^{(l+1)},z_{2}^{(l+1)} \dots z_{S_{l+1}}^{(l+1)}) J=g(z1(l+1),z2(l+1)zSl+1(l+1)),所有的 z j ( l + 1 ) z_{j}^{(l+1)} zj(l+1)都包含因变量 z i ( l ) z_{i}^{(l)} zi(l)如果不是全连接,这里就是 l l l层第 i i i个神经元与 l + 1 l+1 l+1层的神经元有多少链接,就有多少项。所以 (4) δ i ( l ) = ∑ j = 1 S l + 1 ∂ J ( h ( x , w , b ) , y ) ∂ z j ( l + 1 ) ∂ z j ( l + 1 ) ∂ z i ( l ) = ∑ j = 1 S l + 1 δ j ( l + 1 ) ∂ z j ( l + 1 ) ∂ z i ( l ) = ∑ j = 1 S l + 1 δ j ( l + 1 ) ∂ ( ∑ m = 1 S l ( f ( z m ( l ) ) w j m ( l + 1 ) ) + b j ( l + 1 ) ) ∂ z i ( l ) = ∑ j = 1 S l + 1 δ j ( l + 1 ) f ′ ( z i ( l ) ) w j i ( l + 1 ) \begin{aligned} \delta_{i}^{(l)} &= \sum\limits_{j=1}^{S_{l+1}}\frac{\partial J(h(x,w,b),y)}{\partial z_{j}^{(l+1)}} \frac{\partial z_{j}^{(l+1)}}{\partial z_{i}^{(l)}} \\ &= \sum\limits_{j=1}^{S_{l+1}}\delta_{j}^{(l+1)}\frac{\partial z_{j}^{(l+1)}}{\partial z_{i}^{(l)}} \\ &= \sum\limits_{j=1}^{S_{l+1}}\delta_{j}^{(l+1)}\frac{\partial (\sum\limits_{m=1}^{S_{l}}(f(z_{m}^{(l)})w_{jm}^{(l+1)})+b_{j}^{(l+1)})}{\partial z_{i}^{(l)}} \\ &= \sum\limits_{j=1}^{S_{l+1}}\delta_{j}^{(l+1)}f'(z_{i}^{(l)})w_{ji}^{(l+1)} \tag{4}\\ \end{aligned} δi(l)=j=1Sl+1zj(l+1)J(h(x,w,b),y)zi(l)zj(l+1)=j=1Sl+1δj(l+1)zi(l)zj(l+1)=j=1Sl+1δj(l+1)zi(l)(m=1Sl(f(zm(l))wjm(l+1))+bj(l+1))=j=1Sl+1δj(l+1)f(zi(l))wji(l+1)(4)

所以根据 δ ( l + 1 ) \delta^{(l+1)} δ(l+1),可以求出 δ i ( l ) \delta_{i}^{(l)} δi(l),又最开始的 δ i ( n ) \delta_{i}^{(n)} δi(n)可以求出,所以所有的残差 δ \delta δ均可以求出来。进而公式(1)(2)可以求出对权值和偏置的偏导数,进而由mini_batch SGD可以更新权值和偏置。

  公式(4)是整个BP算法的核心公式。由于公式(4)的迭代特性,BP算法叫做反向“传播”算法。

2.6. 全连接神经网络的一次batch训练过程

  1. 对batch中的m条数据,分别通过前向传播计算其输出、各层经过激活函数前的z值以及经过激活函数后的激活值;
  2. 对batch中的m条数据,分别根据公式(3)(4)计算残差 δ \delta δ
  3. 对batch中的m条数据,分别根据公式(1)(2)计算权值和偏置的偏导数;
  4. 利用mini-batch SGD的更新公式,更新权值和偏置。

3. 损失函数

  可供选择的损失函数有很多种,对于分类问题,常用交叉熵(CrossEntropy)作为损失函数; H ( A , B ) = ∑ i = 1 − p A ( x i ) l o g ( p B ( x i ) ) H(A,B)=\sum\limits_{i=1}- p_{A}(x_{i})log(p_{B}(x_{i})) H(A,B)=i=1pA(xi)log(pB(xi))

对于回归问题,常用均方误差(mean squared error,MSE)作为损失函数 M S E = ∑ i = 1 n ( h ( x i ) − y i ) 2 2 n MSE = \frac{\sum\limits_{i=1}^{n}(h(x_{i})-y_{i})^{2}}{2n} MSE=2ni=1n(h(xi)yi)2

3.1. 交叉熵作为损失函数

  我按照知乎讨论以及一篇Blog中,关于交叉熵的讨论来解释交叉熵作为损失函数的合理性,先介绍熵,然后介绍KL散度,最后推出交叉熵在满足一定条件下可以替代KL散度。

  我们先探讨熵的意义,总所周知的是,熵可以表示信息的不确定性,也可以表示信息的信息量,熵越大,信息的不确定性越大,所含信息量也越多。以通信领域为例,信源A在下一时刻可以在一个符号集中选择任何一个来传输,该符号集表示为 { x 1 , x 2 , x 3 …   } \{x_{1} ,x_{2},x_{3}\dots \} {x1,x2,x3},传输的可能性分别是 { p ( X = x 1 ) , p ( X = x 2 ) , p ( X = x 3 ) …   } \{p(X=x_{1}) ,p(X=x_{2}),p(X=x_{3})\dots \} {p(X=x1),p(X=x2),p(X=x3)},其中 X X X是信源A在下一时刻所传符号的随机变量。我们想设计一个指标来衡量这种不确定性或者信息量的多少,这个指标是关于概率 p p p的函数,我们用 f ( p ) f(p) f(p)表示这个指标,同时这个指标应该满足下面的性质:

1.负相关:与概率 p p p的变化方向相反,即概率 p p p越高, f ( p ) f(p) f(p)越低,当 p ( X = x i ) = 1 p(X=x_{i})=1 p(X=xi)=1,则要求 f ( p ( X = x i ) ) = 0 f(p(X=x_{i}))=0 f(p(X=xi))=0,即下一时刻传输的符号一定是 x i x_{i} xi,已经完全确定,所以不确定性为0,信息量也为0;

2.可加性:同时这个指标具有可加性,假设还存在另一个信源B,下一时刻所传符号的随机变量为 Y Y Y X , Y X,Y X,Y相互独立,则 f ( p ( X = a ) p ( Y = b ) ) = f ( p ( X = a ) ) + f ( p ( Y = b ) ) f(p(X=a)p(Y=b))=f(p(X=a))+f(p(Y=b)) f(p(X=a)p(Y=b))=f(p(X=a))+f(p(Y=b))

结合上面两个性质,我们不难找到 f ( p ) = − l o g ( p ) f(p)=-log(p) f(p)=log(p)来表示这一指标,即对于信源A,我们定义单个符号 x i x_{i} xi的不确定性或信息量 f ( p ( X = x i ) ) = − l o g ( p ( X = x i ) ) f(p(X=x_{i}))=-log(p(X=x_{i})) f(p(X=xi))=log(p(X=xi)),该式理解为符号的概率越大,下一时刻传这个符号的概率也越大,即下一时刻传这个符号的不确定性就小,真传了这个符号,我们也不惊讶,所以其信息量也小。那么整个信源的不确定性或信息量就可以定义成单个符号不确定性或信息量的期望,即 H ( X ) = ∑ i = 1 − p ( X = x i ) l o g ( p ( X = x i ) ) H(X)=\sum\limits_{i=1}- p(X=x_{i})log(p(X=x_{i})) H(X)=i=1p(X=xi)log(p(X=xi))

值得一体的是,熵一般衡量离散信源,对于连续信源的情况,不确定性或信息量无限大。

  接着我们看KL散度,KL散度用于衡量两个随机变量概率分布的差异,如果两个分布完全一样,例如均是 N ( 0 , 1 ) N(0,1) N(0,1)的高斯分布,其KL散度值应是0,所以KL散度可以作为损失函数,比较模型输出与真实值的分布差异。对于离散随机变量A,B,KL散度定义如下 D K L ( A ∣ ∣ B ) = ∑ i = 1 p A ( x i ) l o g ( p A ( x i ) p B ( x i ) ) = − ∑ i = 1 − p A ( x i ) l o g ( p A ( x i ) ) + ∑ i = 1 − p A ( x i ) l o g ( p B ( x i ) ) \begin{aligned} D_{KL}(A||B)&=\sum\limits_{i=1} p_{A}(x_{i})log(\frac{p_{A}(x_{i})}{p_{B}(x_{i})})\\ &=-\sum\limits_{i=1} -p_{A}(x_{i})log(p_{A}(x_{i})) +\sum\limits_{i=1}- p_{A}(x_{i})log(p_{B}(x_{i}))\\ \end{aligned} DKL(AB)=i=1pA(xi)log(pB(xi)pA(xi))=i=1pA(xi)log(pA(xi))+i=1pA(xi)log(pB(xi))

KL散度不满足交换律,即 D K L ( A ∣ ∣ B )   ≠   D K L ( B ∣ ∣ A ) D_{KL}(A||B)~\neq~D_{KL}(B||A) DKL(AB) ̸= DKL(BA)。同时,不难看出KL散度有两部分构成,第一部分就是A的熵,第二部分就是交叉熵,所以KL散度可以写成下式 D K L ( A ∣ ∣ B ) = H ( A , B ) − H ( A ) D_{KL}(A||B)=H(A,B)-H(A) DKL(AB)=H(A,B)H(A)

H ( A ) H(A) H(A)是一个常数时,KL散度和交叉熵的度量特性一致,而在机器学习中,H(A)一般是训练集的分布,也确实是一个常数值。由于交叉熵更简单,所以我们用交叉熵替代KL散度用于损失函数

  连续分布的KL散度定义如下 D K L ( A ∣ ∣ B ) = ∫ p A ( x ) l o g ( p A ( x ) p B ( x ) ) d x \begin{aligned} D_{KL}(A||B)&=\int p_{A}(x)log(\frac{p_{A}(x)}{p_{B}(x)}) dx\\ \end{aligned} DKL(AB)=pA(x)log(pB(x)pA(x))dx其余分析类似

  这里用概率分布说明一下真实分布 P ( r e a l ) P(real) P(real),训练集分布 P ( t r a i n i n g ) P(training) P(training)和模型的输出分布 P ( m o d e l ) P(model) P(model)的关系,由于我们一般很难知道真实分布,所以会用训练集的分布来近似当做真实分布,即 P ( r e a l ) ≃ P ( t r a i n i n g ) P(real) \simeq P(training) P(real)P(training),我们训练的目的,也是让模型的输出分布接近训练集分布,即 P ( m o d e l ) ≃ P ( t r a i n i n g ) P(model) \simeq P(training) P(model)P(training),所以我们通过这种传递建立了模型输出分布与真实分布的脆弱关系 P ( r e a l ) ≃ P ( t r a i n i n g ) ≃ P ( m o d e l ) P(real) \simeq P(training)\simeq P(model) P(real)P(training)P(model)为何是脆弱关系?因为model既不能十分接近训练集的分布(过拟合),也不能十分不符合训练集的分布(学习失败)。

  值得一提的是,说是概率分布,训练集的概率分布要更加的极端,例如在分类问题中,输入是 { x 1 , x 2 …   } \{x_{1}, x_{2} \dots \} {x1,x2},一共3个类别,神经网络输出层也有3个输出,对应这3个类别。如果在训练集中,输入是 { x 1 , x 2 …   } \{x_{1}, x_{2} \dots \} {x1,x2}的类别是 y 2 y_{2} y2,则训练集概率分布是 P t r a i n i n g ( x 1 , x 2 …   ; y 1 = 1 , y 2 = 0 , y 3 = 0 ) = 0 P t r a i n i n g ( x 1 , x 2 …   ; y 1 = 0 , y 2 = 1 , y 3 = 0 ) = 1 P t r a i n i n g ( x 1 , x 2 …   ; y 1 = 0 , y 2 = 0 , y 3 = 2 ) = 0 P_{training}(x_{1}, x_{2} \dots ;y_{1}=1, y_{2}=0,y_{3} = 0)=0 \\ P_{training}(x_{1}, x_{2} \dots ;y_{1}=0, y_{2}=1,y_{3} = 0)=1 \\ P_{training}(x_{1}, x_{2} \dots ;y_{1}=0, y_{2}=0,y_{3} = 2)=0 \\ Ptraining(x1,x2;y1=1,y2=0,y3=0)=0Ptraining(x1,x2;y1=0,y2=1,y3=0)=1Ptraining(x1,x2;y1=0,y2=0,y3=2)=0

也就是在训练集中是就是是,不是就是不是。而神经网络学习的就是这样的分布,即对于同样的输入,输出的 P m o d e l ( x 1 , x 2 …   ; y 1 = 0 , y 2 = 1 , y 3 = 0 ) P_{model}(x_{1}, x_{2} \dots ;y_{1}=0, y_{2}=1,y_{3} = 0) Pmodel(x1,x2;y1=0,y2=1,y3=0)要尽可能的大(接近1),其余类别的输出尽可能小(接近0)。


4. 优化方法

  优化方法有很多,最基本的要属BGD,BGD在机器学习中也很常见,在其基础上提出了SGD以及使用更广泛的进化版本mini-batch SGD,mini-batch SGD的方法在上面计算反向传播时有用到,大体就是先对数据进行shuffle,然后分成M批数据,每一批有m个数据,以批为单位进行训练(本blog的2.6中的步骤),当把这M批数据全部训练一遍,就算一次epoch。GD的基本思想是更新下面的式子。 θ = θ − α ∂ J ∂ θ \theta = \theta - \alpha \frac{\partial J}{\partial \theta} θ=θαθJ其中 α \alpha α是学习率(步长)。

  但mini-batch SGD速度还是偏慢,因此提出了改进方法Momentum和Adagrad,综合Momentum和Adagrad的优点,又提出了RMSProp和Adam,大多数时候,使用Adam可以又快又好的收敛。除此之外,还有adadelta、NAG等方法。


5. 过拟合的应对

5.1. 增加数据量

  增加数据量,也就是说我们让 P ( t r a i n i n g ) P(training) P(training)无限接近于 P ( r e a l ) P(real) P(real),这样我们的模型在逼近训练集时,同时也更加的逼近真实情况了。

5.2. 规则化项(正则化项)

  像传统机器学习方法一样,对损失函数加上一个规则化项,上面在推导反向传播算法时,也考虑了这样的操作。
  常见的正则化方法有L1,L2正则化法。

5.3. dropout操作

  在一次训练前,我们随机忽略一些神经元及其链接,用剩下的神经网络进行学习。在下次训练前,把上一次忽略的神经元及其链接补回,再随机忽略一些神经元及其链接,再用剩下的神经网络进行学习,这样来回迭代。通过这种方法,训练的神经网络不会过分依赖神经网络中的某些特定部分,也就是说,训练好的神经网络中,不会存在某些部分的权值或者偏置很大。
  最终输出的模型,一定要是最完整的神经网络。

5.4. 提前终止

  通过观察验证集,当验证集的误差呈现增大趋势,我们就提前终止模型的训练。

5.5. 批标准化

  另一篇blog专门去说。

6. 梯度消失与梯度爆炸

  在BP算法中,根据公式(3)(4),我们知道偏导数中存在激活函数 f ( ⋅ ) f(·) f()的导数以及权值 w w w,如果激活函数是logistic-sigmoid或者tanh函数,它们的导数值域均在[0,1]之间,所以随着层数的增多,反向传播会持续缩小残差 δ \delta δ的值,造成远离输出层的权值与偏差的梯度不断的缩小(根据公式(1)(2)),从深层网络角度来讲,不同的层学习的速度差异很大,表现为网络中靠近输出的层学习的情况很好,靠近输入的层学习的很慢,有时甚至训练了很久,前几层的权值和刚开始随机初始化的值差不多,导致靠近输入层的隐层相当于只是映射层,对所有的输入做了一个函数映射,这时此深度神经网络的学习就等价于只有靠近输出层的隐藏层网络在学习,这就是梯度消失现象。同理,如果初始化的权值 w w w很大,造成反向传播过程中 l l l层残差 δ \delta δ一定大于 l + 1 l+1 l+1层,这种大于会以指数增长的形式累计下去,就造成了梯度爆炸,靠近神经网络输入层的权值或偏置的偏导数巨大,更新速度过快。相对来说梯度消失现象更容易出现。

  造成梯度消失或爆炸的根源是反向传播机制(成也反向传播!败也反向传播?),直接原因是激活函数的不合适以及较深的网络结构

  最简单的梯度消失问题解决方法就是使用导数值域较宽的激活函数,例如ReLU函数、softplus函数等。当然还有一种有效的解决梯度消失问题的方法,就是批标准化。


参考文献:
《TensorFlow 实战Google深度学习框架》
神经网络的类别:https://baijiahao.baidu.com/s?id=1590362274035183205&wfr=spider&for=pc
M-P神经元模型: https://www.cnblogs.com/xueqiuqiu/articles/7606293.html
激活函数:https://www.jianshu.com/p/68d44a4295d1
反向传播:https://blog.csdn.net/qq_29762941/article/details/80343185
反向传播:https://blog.csdn.net/qq_32865355/article/details/80260212
GD优化方法:https://www.cnblogs.com/wujingqiao/p/9559969.html
交叉熵:https://www.zhihu.com/question/65288314
交叉熵:https://blog.csdn.net/tsyccnh/article/details/79163834
过拟合:https://www.cnblogs.com/bonelee/p/8993812.html
梯度消失、爆炸:https://blog.csdn.net/qq_25737169/article/details/78847691
梯度消失、爆炸:https://www.cnblogs.com/pinking/p/9418280.html

你可能感兴趣的:(深度学习)