神经网络中容易出现的问题、原因以及解决措施

问题一:梯度消失

神经网络在进行反向传播(BP)的时候会对参数W进行更新,梯度消失就是靠后面网络层(layer3)能够正常的得到一个合理的偏导数,但是靠近输入层的网络层,计算的到的偏导数近乎零,W几乎无法得到更新。

问题二:梯度爆炸 

梯度爆炸的意思是,靠近输入层的网络层,计算的到的偏导数极其大,更新后W变成一个很大的数(爆炸)

梯度消失/梯度爆炸

二者问题问题都是因为网络太深 , 网络权值更新不稳定造成的。
本质上是因为梯度反向传播中的连乘效应。反向传播更新参数 w 的更新过程,对于参数,梯度消失时,越靠近输入层的参数 w 越是几乎纹丝不动;梯度爆炸时,越是靠近输入层的参数 w 越是上蹿下跳。
稳定和突变都不是我们想要的,我们想要的是参数 w 朝着误差减小的方向稳步变化。

梯度消失和梯度爆炸产生的原因

产生梯度消失和梯度爆炸都是因为在神经网络中使用了sigmoid激活函数并且网络很深。

 而sigmoid的导数如下图所示:

可见sigmoid的导数的最大值是0.25。然后我们观察上面的推导式,是三个 的连乘

当初始时        < 1 , 这种概率是很大的,因为一般初始化 w 都是小于 1 , 这时候,经过很多个小于 1 的数的连乘,最终得到的偏导数远远小于 1 ,甚至接近于零,就产生了梯度消失的现象。这个时候,前面的 hidden layer 1 的权值更新会变得很慢,导致前面的层权值几乎不变,仍接近于初始化的权值,这就导致 hidden layer 1 相当于只是一个映射层,对所有的输入做了一个同一映射,这时此深层网络的学习就等价于只有后几层的浅层网络的学习了。

梯度消失/爆炸解决方案

重新设计网络模型:

梯度爆炸可以重新设计层数更少的网络来解决,使用更小的批尺寸对网络训练也有好处。

使用 ReLU 激活函数:

梯度爆炸的发生很大可能是因为激活函数,如之前很流行的 Sigmoid Tanh 函数。使用 ReLU 激活函数可以减少梯度爆炸。采用 ReLU 激活函数是最适合隐藏层的,是目前使用最多的激活函数。relu函数的导数在正数部分是恒等于1的,因此在深层网络中使用relu激活函数就不会导致梯度消失和爆炸的问题。

relu的优点在于:

解决了梯度消失、爆炸的问题;计算方便,计算速度快, 加速了网络的训练。

  缺点在于:由于负数部分恒为0,会导致一些神经元无法激活(可通过设置小学习率部分解决)

leak relu就是为了解决relu0区间带来的影响,而且包含了relu的所有优点,其中kleak系数,一般选择0.01或者0.02,或者通过学习而来。

elu激活函数也是为了解决relu0区间带来的影响,但是elu相对于leakrelu来说,计算要更耗时间一些。

使用长短期记忆网络LSTMLong Short-Term Memory

在循环神经网络中, 梯度爆炸 的发生可能是因为某种网络的训练本身就存在不稳定性,使用长短期记忆( LSTM )单元和相关的门类型神经元结构可以减少梯度爆炸问题。采用 LSTM 单元是适合循环神经网络的序列预测的最新最好实践。

使用梯度截断(Gradient Clipping)


梯度剪切这个方案主要是针对 梯度爆炸 提出的,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内,这可以防止梯度爆炸。

 权重正则化(Weight Regularization)

如果 梯度爆炸 仍然存在,可以尝试检查网络权重的大小,并惩罚产生较大权重值的损失函数,该过程被称为权重正则化。通常使用的是 L1 惩罚项(权重绝对值)或 L2 惩罚项(权重平方)。

预训练加fine-tunning(微调)

其基本思想是每次训练一层隐藏层节点,将上一层隐藏层的输出作为输入,而本层隐节点的输出作为下一层隐节点的输入,这就是逐层预训练。在预训练完成后,再对整个网络进行“微调”( fine-tunning )。 Hinton 在训练深度信念网络( Deep Belief Networks 中,使用了这个方法,在各层预训练完成后,再利用 BP 算法对整个网络进行训练。此思想相当于是先寻找局部最优,然后整合起来寻找全局最优,此方法有一定的好处,但是目前应用的不是很多了。现在基本都是直接拿 imagenet 的预训练模型直接进行 fine-tunning

批量归一化

Batchnorm 具有加速网络收敛速度,提升训练稳定性的效果, Batchnorm 本质上是解决反向传播过程中的梯度问题。 batchnorm 全名是 batch normalization ,简称 BN ,即批规范化,通过规范化操作将输出信号 x 规范化保证网络的稳定性。

残差结构

残差网络的出现导致了 image net 比赛的终结,自从残差提出后,残差可以很轻松的构建几百层,一千多层的网络而不用担心梯度消失过快的问题,原因就在于残差的捷径( shortcut )部分,残差网络通过加入 shortcut connections ,变得更加容易被优化。

问题三:退化现象

在增加网络层数的过程中, training accuracy 逐渐趋于饱和,继续增加层数, training accuracy 就会出现下降的现象,而这种下降不是由过拟合造成的。实际上较深模型后面添加的不是恒等映射,而是一些非线性层。因此,退化问题也表明了:通过多个非线性层来近似恒等映射可能是困难的。
恒等映射亦称恒等函数:是一种重要的映射,对任何元素,象与原象相同的映射。
解决方案 :学习残差。 Resnet 正是基于此问题提出。
当我们提高训练轮次训练时就会发现,训练到后面模型的准确率反而下降了,这是因为模型把训练样本学习的太好了,把某些样本 自身特点当作普遍特征 ,于是便出现了 泛化性能下降 的情况,我们把这种现象称作 “过拟合” overfitting )。与过拟合相对的就是 “欠拟合” underfitting ),这是指训练样本的一般性质尚未学习好。
过拟合:模型的训练误差远小于它在测试数据集上的误差。
一般来说,训练过程会是如下所示的一个曲线图:

训练刚开始的时候,模型还在学习过程中,处于欠拟合区域。随着训练的进行,训练误差和测试误差都下降。在到达一个临界点之后,训练集的误差下降,测试集的误差上升了,这个时候就进入了过拟合区域——由于训练出来的网络过度拟合了训练集,对训练集以外的数据却不工作 

模型的目的是要识别叶子,过拟合的情况下模型可能把叶片上的锯齿当作叶子的一个必要特征,没有锯齿的叶子都不会被分类为叶子;而在欠拟合的情况下模型可能还没有学习到比较深层的特征(比如纹理,形状),只学习到了颜色,那么这个模型可能误把所有绿色的东西分类为叶子。

为什么会欠拟合?

欠拟合是指模型不能在训练集上获得足够低的误差。换句换说,就是模型复杂度低,模型在训练集上就表现很差,没法学习到数据背后的规律。
如何解决?
欠拟合基本上都会发生在训练刚开始的时候,经过不断训练之后欠拟合应该不怎么考虑了。但是如果真的还是存在的话,可以通过 增加网络复杂度 或者在模型中 增加特征 ,这些都是很好解决欠拟合的方法。

为什么会过拟合?

1 训练数据集样本单一,样本不足 。如果训练样本只有负样本,然后那生成的模型去预测正样本,这肯定预测不准。所以训练样本要尽可能的全面,覆盖所有的数据类型。
2 训练数据中噪声干扰过大 。噪声指训练数据中的干扰数据。过多的干扰会导致记录了很多噪声特征,忽略了真实输入和输出之间的关系。
3 模型过于复杂。 模型太复杂,已经能够“死记硬背”记下了训练数据的信息,但是遇到没有见过的数据的时候不能够变通,泛化能力太差。我们希望模型对不同的 数据 都有稳定的输出。模型太复杂是过拟合的重要因素。

如何防止过拟合?

要想解决过拟合问题,就要显著减少测试误差而不过度增加训练误差,从而提高模型的泛化能力。我们可以使用正则化( Regularization )方法。
正则化是指修改学习算法,使其降低泛化误差而非训练误差
常用的正则化方法根据具体的使用策略不同可分为:
1 )直接提供正则化约束的参数正则化方法,如 L1/L2 正则化;
2 )通过工程上的技巧来实现更低泛化误差的方法,如提前终止 (Early stopping) Dropout
3 )不直接提供约束的隐式正则化方法,如数据增强等。
1. 获取和使用更多的数据(数据集增强) —— 解决过拟合的根本性方法
让机器学习或深度学习模型泛化能力更好的办法就是使用更多的数据进行训练。但是,在实践中,我们拥有的数据量是有限的。解决这个问题的一种方法就是 创建“假数据”并添加到训练集中 —— 数据集增强 。通过增加训练集的额外副本来增加训练集的大小,进而改进模型的泛化能力。
我们以图像数据集举例,能够做:旋转图像、缩放图像、随机裁剪、加入随机噪声、平移、镜像等方式来增加数据量。另外补充一句,在物体分类问题里, CNN 在图像识别的过程中有强大的“不变性”规则,即待辨识的物体在图像中的形状、姿势、位置、图像整体明暗度都不会影响分类结果 。我们就可以通过图像平移、翻转、缩放、切割等手段将数据库成倍扩充。
2. 采用合适的模型(控制模型的复杂度)
过于复杂的模型会带来过拟合问题。对于模型的设计,目前公认的一个深度学习规律 "deeper is better" 。国内外各种大牛通过实验和竞赛发现,对于 CNN 来说,层数越多效果越好,但是也更容易产生过拟合,并且计算所耗费的时间也越长。
3. 降低特征的数量
对于一些特征工程而言,可以降低特征的数量 —— 删除冗余特征,人工选择保留哪些特征。这种方法也可以解决过拟合问题。

梯度下降时权重 w 更新变为:
w=0 时, |w| 是不可导的。所以我们仅仅能依照原始的未经正则化的方法去更新 w
w>0 时, sgn (n)>0 则梯度下降时更新后的 w 变小。
w<0 时, sgn (n)>0, 则梯度下降时更新后的 w 变大。
换句换说, L1 正则化使得权重 w 0 靠,使网络中的权重尽可能为 0 ,也就相当于减小了网络复杂度,防止过拟合。
这也就是 L1 正则化会产生更稀疏( sparse )的解 的原因。此处稀疏性指的是最优值中的一些参数为 0 L1 正则化的稀疏性质已经被广泛地应用于特征选择 机制,从可用的特征子集中选择出有意义的特征。

 5. Dropout

Dropout 是在训练网络时用的一种技巧( trike ),相当于在隐藏单元增加了噪声。
Dropout 指的是在训练过程中每次按一定的概率(比如 50% )随机地“删除”一部分隐藏单元(神经元)。 所谓的“删除”不是真正意义上的删除,其实就是将该部分神经元的激活函数设为 0 (激活函数的输出为 0 ),让这些神经元不计算而已。
Dropout 为什么有助于防止过拟合呢?
a )在训练过程中会产生不同的训练模型,不同的训练模型也会产生不同的的计算结果。随着训练的不断进行,计算结果会在一个范围内波动,但是均值却不会有很大变化,因此可以把最终的训练结果看作是不同模型的平均输出。
b )它消除或者减弱了神经元节点间的联合,降低了网络对单个神经元的依赖,从而增强了泛化能力。
6. Early stopping (提前终止)
对模型进行训练的过程即是对模型的参数进行学习更新的过程,这个参数学习的过程往往会用到一些迭代方法,如梯度下降( Gradient descent )。 Early stopping 是一种迭代次数截断的方法来防止过拟合的方法,即在模型对训练数据集迭代收敛之前停止迭代来防止过拟合
为了获得性能良好的神经网络,训练过程中可能会经过很多次 epoch (遍历整个数据集的次数,一次为一个 epoch )。如果 epoch 数量太少,网络有可能发生欠拟合;如果 epoch 数量太多,则有可能发生过拟合。 Early stopping 旨在解决 epoch 数量需要手动设置的问题。具体做法:每个 epoch (或每 N epoch )结束后,在验证集上获取测试结果,随着 epoch 的增加,如果在验证集上发现测试误差上升,则停止训练,将停止之后的权重作为网络的最终参数。
为什么能防止过拟合?
当还未在神经网络运行太多迭代过程的时候, w 参数接近于 0 ,因为随机初始化 w 值的时候,它的值是较小的随机值。当你开始迭代过程, w 的值会变得越来越大。到后面时, w 的值已经变得十分大了。所以 early stopping 要做的就是在中间点停止迭代过程。我们将会得到一个中等大小的 w 参数,会得到与 L2 正则化相似的结果,选择了 w 参数较小的神经网络。Early Stopping 缺点:
没有采取不同的方式来解决优化损失函数和过拟合这两个问题 ,而是用一种方法同时解决两个问题 ,结果就是要考虑的东西变得更复杂。之所以不能独立地处理,因为如果你停止了优化损失函数,你可能会发现损失函数的值不够小,同时你又不希望过拟合。
  • 20
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值