浅谈过拟合问题与梯度爆炸问题

算法常见面试问题总结

前言:

这几天忙着秋招,也没时间总结自己最近学习的知识点,由于自己应聘的是算法岗位,所以就把最近面试时遇到的问题和大家一起分享一下,有什么不对的还需各位读者指出来。最后希望自己和我的那个她能够找到一份满意的工作。

解决过拟合的问题

1.什么是过拟合?

一般提及到过拟合就是说在训练集上模型表现很好,但是在测试集上效果很差,即模型的泛化能力不行。过拟合是模型训练过程中参数拟合的问题,由于训练数据本身有采样误差,拟合模型参数时这些采样误差都拟合进去就会带来所谓的过拟合问题。

2.机器学习中为什么会容易出现过拟合?

传统的函数拟合问题,一般是通过物理、数学等推导出的一个含参数的模型(数学建模),模型复杂度是确定的,没有多余的能力拟合噪声。而机器学习算法的复杂度更高,一般都远高于具体问题的复杂度。也就说数据量不足有支撑庞大的模型(也可以说是参数)。

怎么样解决过拟合?

1.获取更多的数据

一方面可以获取更多的源数据,另一方面也可以在现有数据的基础上进行数据增强(图像平移,旋转等)

2.使用合适的模型

这主要是解决数据量与模型参数之间的矛盾,即固定数据量只能支撑对应的参数量的模型的拟合(通俗的说,几十个几百个数据就不要使用深度网络了)。该方法主要可以从四个方面入手:

a.简化网络结构,如层数,单层神经元个数

b. early stopping,每个神经元激活函数在不同数值区间的性能是不同的,值较小时为线性区,适当增大后为非线性区,过度增大则为饱合区(梯度消失)。初始化时,神经元一般工作在线性区(拟合能力有限),训练时间增大时,部分值会增大进入非线性区(拟合能力提高),但是训练时间过大时,就会进入饱合区,神经元就“死掉”。所以应该在适当时间内就stopping训练。

c.限制权值,正则化

d.增加噪声:在输入中增加噪声(效果类似正则化);在权值中加入噪声(非零初始化);

3.集成多种模型

a. bagging,类似于分段函数的概念,不同部分的训练集使用不同模型拟合;

b. boosting,综合多个简单的模型的结果得到一个‘靠谱的结果。

c. dropout,实际效果其实是用不同的训练集训练了不同的网络模型,然后这些网络模型形成了一个整体的模型。

梯度爆炸的相关问题

梯度爆炸:指神经网络训练过程中大的误差梯度不断累积,导致模型权重出现重大更新。会造成模型不稳定,无法利用训练数据学习。

什么是梯度爆炸?

误差梯度是神经网络训练过程中计算的方向和数量,用于以正确的方向和合适的量更新网络权重。 在深层网络或循环神经网络中,误差梯度可在更新中累积,变成非常大的梯度,然后导致网络权重的大幅更新,并因此使网络变得不稳定。在极端情况下,权重的值变得非常大,以至于溢出,导致 NaN 值。 网络层之间的梯度(值大于 1.0)重复相乘导致的指数级增长会产生梯度爆炸。

梯度爆炸引发的问题

在深度多层感知机网络中,梯度爆炸会引起网络不稳定,最好的结果是无法从训练数据中学习,而最坏的结果是出现无法再更新的 NaN 权重值。

如何修复梯度爆炸问题?

1.重新设计网络模型

在深度神经网络中,梯度爆炸可以通过重新设计层数更少的网络来解决。 使用更小的批尺寸对网络训练也有好处。 在循环神经网络中,训练过程中在更少的先前时间步上进行更新(沿时间的截断反向传播,truncated Backpropagation through time)可以缓解梯度爆炸问题。

2. 使用 ReLU 激活函数

在深度多层感知机神经网络中,梯度爆炸的发生可能是因为激活函数,如之前很流行的 Sigmoid 和 Tanh 函数。 使用 ReLU 激活函数可以减少梯度爆炸。采用 ReLU 激活函数是最适合隐藏层的新实践。

3. 使用长短期记忆网络

在循环神经网络中,梯度爆炸的发生可能是因为某种网络的训练本身就存在不稳定性,如随时间的反向传播本质上将循环网络转换成深度多层感知机神经网络。 使用长短期记忆(LSTM)单元和相关的门类型神经元结构可以减少梯度爆炸问题。 采用 LSTM 单元是适合循环神经网络的序列预测的最新最好实践。

4. 使用梯度截断(Gradient Clipping)

在非常深且批尺寸较大的多层感知机网络和输入序列较长的 LSTM 中,仍然有可能出现梯度爆炸。 如果梯度爆炸仍然出现,你可以在训练过程中检查和限制梯度的大小。这就是梯度截断。

5. 使用权重正则化(Weight Regularization)

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

L1与L2的区别:

机器学习中几乎都可以看到损失函数后面会添加一个额外项,常用的额外项一般有两种,中文称作 L1正则化 和 L2正则化,或者 L1范数 和 L2范数。L1正则化和L2正则化可以看做是损失函数的惩罚项。所谓『惩罚』是指对损失函数中的某些参数做一些限制。对于线性回归模型,使用L1正则化的模型建叫做Lasso回归,使用L2正则化的模型叫做Ridge回归(岭回归)。

一般回归分析中回归www表示特征的系数,从上式可以看到正则化项是对系数做了处理(限制)。L1正则化和L2正则化的说明如下:

  • L1正则化是指权值向量www中各个元素的绝对值之和

  • L2正则化是指权值向量www中各个元素的平方和然后再求平方根(可以看到Ridge回归的L2正则化项有平方符号)

那添加L1和L2正则化有什么用?下面是L1正则化和L2正则化的作用,这些表述可以在很多文章中找到。

  • L1正则化可以产生稀疏权值矩阵,即产生一个稀疏模型,可以用于特征选择

  • L2正则化可以防止模型过拟合(overfitting);一定程度上,L1也可以防止过拟合

 

 

 

参考链接:

1.https://blog.csdn.net/dulingtingzi/article/details/80254038

2.http://baijiahao.baidu.com/s?id=1587462776558160221&wfr=spider&for=pc

3.https://blog.csdn.net/jinping_shi/article/details/52433975

posted on 2019-09-07 22:47  玩转机器学习  阅读(1008)  评论(0编辑  收藏  举报