爱收集资源网

(每日一题)如何解决过拟合的方法方法?

网络整理 2023-09-27 16:02

本文目录

参考资料:

1. 什么是过拟合?

过拟合 = 过度自信 = 自负

Overfitting 也被称为过度学习,过度拟合。 它是机器学习中常见的问题。 举个Classification(分类)的反例。

尽管overfitting模型的曲线很精确的分辨了所有的训练数据,但是并没有描述数据的整体特点,对新测试数据的适应性较差。

2. 解决过拟合的方式 方法一:增加数据量

大部分过拟合形成的诱因是因为数据量太少了. 如果我们有成千上万的数据, 红线也会渐渐被剪短, 变得没这么扭曲 .

从数据源头获得更多数据:多拍点相片等。

数据提高(data augmentation):通过一定规则来扩展数据,比如旋转,平移,亮度,切割等手段一张图片得到多张。 (一般图象处理会使用数据降低)

方法二:运用正规化

L1, l2 regularization等等, 这些技巧适用于大多数的机器学习, 包括神经网路. 他们的做法大同小异, 我们简化机器学习的关键公式为 y=Wx . W为机器须要学习到的各类参数. 在过拟合中, W 的值常常变化得非常大或非常小. 为了不让W变化太大, 我们在计算误差上做些四肢.

原始的 cost 误差是这样估算, cost = 预测值-真实值的平方. 如果 W 变得太大, 我们就让 cost 也跟随变大, 变成一种惩罚机制. 所以我们把 W 自己考虑进来. 这里 abs 是绝对值. 这一种方式的 正规化, 叫做 l1 正规化.

L2 正规化和 l1 类似, 只是绝对值换成了平方. 其他的l3, l4 也都是换成了立方和4次方等等. 形式类似. 用这种方式,我们能够保证让学下来的腰线不会过分扭曲。

(总结:让大参数的loss减小以惩罚)

Dropout(正规化方式)

专门用在神经网路的正规化的方式, 叫作 dropout。

在训练的时侯, 我们随机忽视掉一些神经元和神经连结 , 是这个神经网路显得”不完整”. 用一个不完整的神经网路训练一次。

到第二次再随机忽视另一些, 变成另一个不完整的神经网路. 有了这种随机 drop 掉的规则, 我们可以想象虽然每次训练的时侯, 我们都让每一次预测结果都不会依赖于其中某部份特定的神经元。

像l1, l2正规化一样, 过度依赖的 W , 也就是训练参数的数值会很大, l1, l2会惩罚那些大的 参数。Dropout 的做法是从根本上让神经网路没机会过度依赖。

(总结:随机忽视个别神经元,用不完整的神经网路训练)

方法三:简化模型

Dropout 会随机删掉一些神经元,以在不同批量上训练不同的神经网路构架。

过拟合主要是有两个缘由导致的:数据太少+模型太复杂。

我们可以通过使用合适复杂度的模型来避免过拟合问题,让其足够拟合真正的规则,同时又不至于拟合太多抽样误差。

对于神经网路而言,我们可以从以下四个方面来限制网路能力:

1. 网络结构(Architecture): 减少隐藏层,神经元个数。

2. 训练时间(Early stopping): 因为我们在初始化网路的时侯通常都是初始为较小的残差。训练时间越长,部分网路残差可能越大。如果我们在合适时间停止训练,就可以将网路的能力限制在一定范围内。

3. 限制残差(weight-decay)= 正规化(regularization): 原理与训练时间一样,但是这类方式直接将残差的大小加入到 Cost 里,在训练的时侯限制残差变大。以 L2 regularization为例:

训练过程须要增加整体的 Cost,这时候,一方面能减少实际输出与样本之间的偏差 ,也能减少残差大小。

4. 增加噪音(noise): 在输入中加噪音(噪声会随着网路传播,按照残差的平方放大,并传播到输出层,对偏差 Cost 产生影响。)在残差上加噪音。

方法四:多种模型组合

训练多个模型,以每位模型的平均输出作为结果。

从 N 个模型里随机选择一个作为输出的期望误差,会比所有模型的平均输出的偏差大。

1. Bagging

简单理解,就是分段函数的概念:用不同的模型拟合不同部份的训练集。 以随机森林(Rand Forests)为例,就是训练了一堆互不关联的决策树。但因为训练神经网路本身就须要花费较多自由,所以通常不单独使用神经网路做Bagging。

2. Boosting

机器学习防止过拟合_sgd防止过拟合_如何防止过拟合

既然训练复杂神经网路比较慢,那我们就可以只使用简单的神经网路(层数、神经元数限制等)。通过训练一系列简单的神经网路,加权平均其输出。

3. Dropout

这是一个很高效的方式。 在训练时,每次随机(如50%机率)忽略隐层的个别节点;这样,我们相当于随机从2H2^H2H个模型中取样选择模型;同时,由于每位网路只见过一个训练数据(每次都是随机的新网路),所以类似 bagging 的做法,这就是我为何将它分类到「结合多种模型」中;

此外,而不同模型之间残差共享(共同使用这 H 个神经元的联接残差),相当于一种残差正则方式,实际疗效比 L2 regularization 更好。

3. 激活函数之ReLU函数

首先,relu函数是常见的激活函数中的一种,表达方式如下:

f(x)=max(0,x)f(x)=max(0,x)f(x)=max(0,x)

ReLU函数的图象和导数后图象如下:

从表达式和图象可以明显地看出:Relu虽然就是个取最大值的函数。

ReLU函数虽然是分段线性函数,把所有的负值都变为0,而正值不变,这种操作被成为单侧抑制。

(也就是说:在输入是负值的情况下,它会输出0,那么神经元就不会被激活。这意味着同一时间只有部份神经元会被激活,从而促使网路很稀疏,进而对估算来说是十分有效率的。 )正由于有了这单侧抑制机器学习防止过拟合,才促使神经网路中的神经元也具有了稀疏激活性。尤其彰显在深度神经网路模型(如CNN)中,当模型降低N层以后,理论上ReLU神经元的激活率将增加2的N次方倍。

为什么要神经元稀疏? 暂时不清楚,如果有大鳄晓得机器学习防止过拟合,请告诉我一下!

使用Relu函数有哪些优势?

1.没有饱和区,不存在梯度消失问题。

2.没有复杂的指数运算,计算简单、效率提升。

3.实际收敛速率较快,比 Sigmoid/tanh 快好多。

4.比 Sigmoid 更符合生物学神经激活机制。

当然relu也存在不足: 就是训练的时侯很”脆弱”,很容易就”die”了。举个反例:一个特别大的梯度流过一个 ReLU 神经元,更新过参数以后,这个神经元再也不会对任何数据有激活现象了。如果这个情况发生了,那么这个神经元的梯度就永远就会是0。实际操作中,如果你的learning rate 很大,那么很有可能你网路中的40%的神经元都”dead”了。 当然,如果你设置了一个合适的较小的learning rate,这个问题发生的情况似乎也不会太频繁。(一句话总结,如果学习率太会议造成神经元梯度变0的机率变高,而小学习率不会造成这个问题。)

机器学习防止过拟合