深度学习相关问题解析(梯度消失和过拟合)
对比于单层神经网络,深度学习就是在单层神经网络的基础上增加了多个隐含层。但随着神经网络的层数不断的增加,它的表现并没有很好的提高,甚至有倒退的现象发生。这个主要是因为以下二个方面的原因:
· 梯度消失
· 过度拟合
在这篇文章,主要对以上二个方面进行分析并提出解决方案。正是这些方案的提出,使得深度学习可以快速的发展。
1. 梯度消失问题
在反向传播的过程当中,成本函数输出的误差值要逐步的向输入层进行传播。在传播的过程中,神经网络对应的权重参数将依据传到本层的误差进行修正。梯度消失问题指的是输出层计算出来的误差值无法反向传播到隐藏层,使得权重参数无法进行修正。如果权重参数无法修正,则隐藏层的存在没有任何的意义。
为了解决梯度消失问题,我们把Sigmoid激活函数转变为ReLU激活函数。相对于Sigmoid函数而言,ReLU函数能够更好的向后传播误差信息。ReLU函数的定义为:
ReLU函数的图像为:
因此将ReLU函数配置Cross Entropy的成本函数可以有效的提升深度学习网络的性能。
2. 过度拟合
在深度学习网络中,由于隐含层的层数增加使得神经网络很容易陷入过拟合的状态。过拟合的表现是训练集的输入误差不断的降低,但验证集的误差却不断的提高。这是由于神经网络将训练集中的干扰也进行了学习。为了避免过拟合,在《成本函数(cost function)和学习机制》文章中指出,可以在成本函数中加入权重参数的regularization正则参数,从而降低过拟合的风险。
另外一方面,深度学习网络引入了dropout操作来降低过拟合的风险。Dropout操作是在训练过程中,对整个神经网络中的神经元随机挑选进行训练。通过这样的方式,神经网络每次训练的神经元都不一样,从而有效的降低了过拟合现象,如下图所示。
下面利用ReLU和Dropout来实现1-5的数值图像的辨识。
对于上述问题,我们利用3层隐藏层,每层20个神经元。输入层为25个神经元用于输入5*5的图像矩阵,输出层为5个神经元用于标识1-5的数字的概率。神经网络的结构如下:
ReLU神经网络MATLAB代码如下:
训练数据和程序如下:
测试结果为:
在上面主程序中加入Dropout程序(利用Sigmoid激活函数):
Dropout程序为:
Dropout的程序是选择ratio的比例置为零,其余的数值设置为1/(1-ratio)。
例如程序:
y1 = rand(6,1);
ym = Dropout(y1,0.5);% 50%的y1都设置为零,其余50%的设置为1/(1-0.5)=2;
y1 = y1.*ym;
计算程序为: