早期深度神经网络的问题

引言

在神经网络最开始被提出来的时候,人们设计的网络大多是这个样子的

神经网络

一个输入层,一个输出层,一个隐藏层,用这样的网络能够解决很多实际的问题。但是一层隐藏层的网络能够学习到的东西毕竟是有限的,自然而然的人们就想到将网络进行扩展,给神经网络多增加隐藏层,那么神经网络就应该能够学习到更加复杂的模型,就如下所示:

两层神经网络

人们发现对于很多问题,增加了一层隐藏层,效果有提升哎,那就就自然而然的继续增加网络的层数,但是诡异的问题发生了,随着层数的不断增加,学习速度越来越慢(对于这一点,人们早就预料到了),但是还有另一个问题,效果不仅不提升,反而越来越劣化。

多层神经网络

这个到底是什么原因呢?是因为网络层次多了,学不到新的东西了?还是各个隐藏层之间发生了反作用? 下面我们就来分析一下早期深度网络存在的问题。

不稳定梯度问题

在早期的多层神经网络中,人们利用下面这样的多层全连接的神经网络,利用梯度下降以及反向传播算法来学习网络的权重。

多层神经网络

那么这种方式有什么问题呢?下面我们简化一下模型,以单个连接的多层网络来举例说明

简化神经网络图

我们来看一下按照这个网络更新权重会发生什么问题呢?

这里先定义一些参数,和之前神经网络章节的定义是一致的, 为第层的激活值, 为第层的带权输入,因此有,假设神经网络的代价函数为,那么根据之前推导的反向传播算法,有:

反向传播算法

其中

且有定义:

对于图中我们简化的神经网络来说,有:

由于,所以

所以有:

这也就意味着输出层的误差(我们是根据输出层的误差来调整参数的权重,进而学习到模型的)传到第一层,已经被乘以了一堆的系数,这些系数通常会导致梯度的消失或者激增。我们来看下为什么会导致梯度的消失或者激增。

我们一般用的激活函数是logistic函数,图形如下所示:

logistic

这个函数的导数图像为:

logistic导数

正常的场景下我们一般会采用[0,1]高斯分布来随机设置 的值,那么就会导致我们的 不会大于1,那么根据

这个公式,至少会衰减为, 这就很难学到东西了。也就意味着随机分配了权重值后,经过反向传播算法训练,最初的几层的权重值会变化很小,也就意味着最初的几层根本就学习不到任何的知识。这也就以为着最初的几层没有用处了,同时实际上还可能起到了副作用,因为将图像的像素点给做了随机的加权,破坏了图像的原始信息。

那大家可能还有一个疑问,如果我把权重设置为很大的值呢?比如说100,这个一样的糟糕,这样就引入了梯度的激增问题,会放大最初的权重,一样的破坏了网络的结构。

因此我们可以看到,多层的全连接网络,必然会导致梯度的不稳定,梯度的不稳定就会导致权重的学习困难。

训练时间长

深度的神经网络还有另外一个问题,就是权重参数非常多,这会导致权重的训练非常耗时。但是随着技术的发展,这个倒也不算是什么大的问题了。

总结

影响深度神经网络的学习的因素非常多,包括激活函数的选择,超参数的选择等等。本节主要介绍了梯度不稳定的问题,这个问题也是影响深度神经网络的一个主要问题了。

显示 Gitment 评论