本文共 2042 字,大约阅读时间需要 6 分钟。
在神经网络最开始被提出来的时候,人们设计的网络大多是这个样子的
一个输入层,一个输出层,一个隐藏层,用这样的网络能够解决很多实际的问题。但是一层隐藏层的网络能够学习到的东西毕竟是有限的,自然而然的人们就想到将网络进行扩展,给神经网络多增加隐藏层,那么神经网络就应该能够学习到更加复杂的模型,就如下所示:
人们发现对于很多问题,增加了一层隐藏层,效果有提升哎,那就就自然而然的继续增加网络的层数,但是诡异的问题发生了,随着层数的不断增加,学习速度越来越慢(对于这一点,人们早就预料到了),但是还有另一个问题,效果不仅不提升,反而越来越劣化。
这个到底是什么原因呢?是因为网络层次多了,学不到新的东西了?还是各个隐藏层之间发生了反作用? 下面我们就来分析一下早期深度网络存在的问题。
在早期的多层神经网络中,人们利用下面这样的多层全连接的神经网络,利用梯度下降以及反向传播算法来学习网络的权重。
那么这种方式有什么问题呢?下面我们简化一下模型,以单个连接的多层网络来举例说明
我们来看一下按照这个网络更新权重会发生什么问题呢?
这里先定义一些参数,和之前章节的定义是一致的, aj a j 为第 j j 层的激活值, zj z j 为第 j j 层的带权输入,因此有 aj=σ(zj) a j = σ ( z j ) , zj=wjaj−1+bj z j = w j a j − 1 + b j ,假设神经网络的代价函数为 C C ,那么根据之前推导的反向传播算法,有:
其中
且有定义:
对于图中我们简化的神经网络来说,有:
由于
所以有:
这也就意味着输出层的误差(我们是根据输出层的误差来调整参数的权重,进而学习到模型的)传到第一层,已经被乘以了一堆的系数,这些系数通常会导致梯度的消失或者激增。我们来看下为什么会导致梯度的消失或者激增。
我们一般用的激活函数是logistic函数,图形如下所示:
这个函数的导数图像为:
正常的场景下我们一般会采用[0,1]高斯分布来随机设置 w w 和 b b 的值,那么就会导致我们的 w w 不会大于1,那么根据
∂C∂b1=∂C∂a4w4σ′(z4)w3σ′(z3)w2σ′(z2)σ′(z1) ∂ C ∂ b 1 = ∂ C ∂ a 4 w 4 σ ′ ( z 4 ) w 3 σ ′ ( z 3 ) w 2 σ ′ ( z 2 ) σ ′ ( z 1 ) 这个公式, ∂C∂b1 ∂ C ∂ b 1 至少会衰减为 ∂C∂a4 ∂ C ∂ a 4 的 164 1 64 , 这就很难学到东西了。也就意味着随机分配了权重值后,经过反向传播算法训练,最初的几层的权重值会变化很小,也就意味着最初的几层根本就学习不到任何的知识。这也就以为着最初的几层没有用处了,同时实际上还可能起到了副作用,因为将图像的像素点给做了随机的加权,破坏了图像的原始信息。那大家可能还有一个疑问,如果我把权重 w w 设置为很大的值呢?比如说100,这个一样的糟糕,这样就引入了梯度的激增问题,会放大最初的权重,一样的破坏了网络的结构。
因此我们可以看到,多层的全连接网络,必然会导致梯度的不稳定,梯度的不稳定就会导致权重的学习困难。
深度的神经网络还有另外一个问题,就是权重参数非常多,这会导致权重的训练非常耗时。但是随着技术的发展,这个倒也不算是什么大的问题了。
影响深度神经网络的学习的因素非常多,包括激活函数的选择,超参数的选择等等。本节主要介绍了梯度不稳定的问题,这个问题也是影响深度神经网络的一个主要问题了。