本文主要是介绍PyTorch 入坑十:模型泛化误差与偏差(Bias)、方差(Variance),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
问题
阅读正文之前尝试回答以下问题,如果能准确回答,这篇文章不适合你;如果不是,可参考下文。
- 为什么会有偏差和方差?
- 偏差、方差、噪声是什么?
- 泛化误差、偏差和方差的关系?
- 用图形解释偏差和方差。
- 偏差、方差窘境。
- 偏差、方差与过拟合、欠拟合的关系?
- 偏差、方差与模型复杂度的关系?
- 偏差、方差与bagging、boosting的关系?
- 偏差、方差和K折交叉验证的关系?
- 如何解决偏差、方差问题?
本文主要参考知乎文章,如有侵权,请联系作者删除。
偏差、方差和噪声
原文请参考链接,主要结论总结如下:
为什么会有偏差和方差?
对学习算法除了通过实验估计其泛化性能之外,人们往往还希望了解它为什么具有这样的性能。偏差-方差分解(bias-variance decomposition)就是从偏差和方差的角度来解释学习算法泛化性能的一种重要工具。
在机器学习/深度学习中,我们用训练数据集去训练一个模型,通常的做法是定义一个误差函数,通过将这个误差的最小化过程,来提高模型的性能。然而我们学习一个模型的目的是为了解决训练数据集这个领域中的一般化问题(或者说,如果模型学习到了过多非全局性的特征则认为产生了过拟合),单纯地将训练数据集的损失最小化,并不能保证在解决更一般的问题时模型仍然是最优,甚至不能保证模型是可用的。
这个训练数据集的损失与一般化的数据集的损失之间的差异就叫做泛化误差(generalization error)
而泛化误差可以分解为偏差(Biase)、方差(Variance)和噪声(Noise)
偏差、方差、噪声是什么?
我们能够用来学习的训练数据集只是全部数据中的一个子集。
如果我们能够获得所有可能的数据集合,并在这个数据集合上将损失最小化,那么学习得到的模型就可以称之为“真实模型”。当然,在现实生活中我们不可能获取并训练所有可能的数据,所以“真实模型”肯定存在,但是无法获得。我们的最终目的是学习一个模型使其更加接近这个真实模型。
Bias和Variance分别从两个方面来描述我们学习到的模型与真实模型之间的差距。
Bias是用所有可能的训练数据集训练出的所有模型的输出的平均值与真实模型的输出值之间的差异
Variance是不同的训练数据集训练出的模型输出值之间的差异。 方差度量了同样大小的训练集的变动所导致的学习性能的变化,即刻画了数据扰动所造成的影响。
Noise描述了标签和真实标签的差异,表达了在当前任务上任何学习算法所能达到的期望泛化误差下界,刻画的是学习问题本身的难度。
偏差、方差窘境
一般来说,偏差与方差是有冲突的,这称为偏差-方差窘境(bias-variance dilemma)。下图给出了一个示意图。给定学习任务,假定我们能控制学习算法的训练程度,则在训练不足时,学习器的拟合能力不够强,训练数据的扰动不足以使学习器产生显著变化,此时偏差主导了泛化错误率;随着训练程度的加深,学习器的拟合能力逐渐增强,训练数据发生的扰动渐渐能被学习器学到,方差逐渐主导了泛化错误率;在训练程度充足后,学习器的拟合能力已经非常强,训练数据发生的轻微扰动都会导致学习器发生显著变化,若训练数据自身的、非全局的特性被学习器学到了,则将发生过拟合。
偏差、方差与过拟合、欠拟合的关系?
一般来说,简单的模型会有一个较大的偏差(比如用一个线性拟合非线性的问题)和较小的方差,复杂的模型偏差较小方差较大。
欠拟合:模型不能适配训练样本,有一个很大的偏差。
举个例子:我们可能有本质上是多项式的连续非线性数据,但模型只能表示线性关系。在此情况下,我们向模型提供多少数据不重要,因为模型根本无法表示数据的基本关系,模型不能适配训练样本,有一个很大的偏差,因此我们需要更复杂的模型。那么,是不是模型越复杂拟合程度越高越好呢?也不是,因为还有方差。
过拟合:模型很好的适配训练样本,但在测试集上表现很糟,有一个很大的方差。
方差就是指模型过于拟合训练数据,以至于没办法把模型的结果泛化。而泛化正是机器学习要解决的问题,如果一个模型只能对一组特定的数据有效,换了数据就无效,我们就说这个模型过拟合。这就是模型很好的适配训练样本,但在测试集上表现很糟,有一个很大的方差。
偏差、方差与模型复杂度的关系
复杂度高的模型通常对训练数据有很好的拟合能力,但是对测试数据就不一定了。而复杂度太低的模型又不能很好的拟合训练数据,更不能很好的拟合测试数据。因此,模型复杂度和模型偏差和方差具有如下图所示关系。
那么针对一个具体问题,如何选择模型的复杂度呢?–未解,待定
偏差、方差与bagging、boosting的关系?
Bagging算法是对训练样本进行采样,产生出若干不同的子集,再从每个数据子集中训练出一个分类器,取这些分类器的平均,所以是降低模型的方差(variance)。Bagging算法和Random Forest这种并行算法都有这个效果。
Boosting则是迭代算法,每一次迭代都根据上一次迭代的预测结果对样本进行权重调整,所以随着迭代不断进行,误差会越来越小,所以模型的偏差(bias)会不断降低。
偏差、方差和K折交叉验证的关系
没看太懂,待总结
如何解决偏差、方差问题
整体思路:首先,要知道偏差和方差是无法完全避免的,只能尽量减少其影响。
(1)在避免偏差时,需尽量选择正确的模型,一个非线性问题而我们一直用线性模型去解决,那无论如何,高偏差是无法避免的。
(2)有了正确的模型,我们还要慎重选择数据集的大小,通常数据集越大越好,但大到数据集已经对整体所有数据有了一定的代表性后,再多的数据已经不能提升模型了,反而会带来计算量的增加。而训练数据太小一定是不好的,这会带来过拟合,模型复杂度太高,方差很大,不同数据集训练出来的模型变化非常大。
(3)最后,要选择合适的模型复杂度,复杂度高的模型通常对训练数据有很好的拟合能力。
针对偏差和方差的思路:
偏差:实际上也可以称为避免欠拟合。
1、寻找更好的特征 – 具有代表性。
2、用更多的特征 – 增大输入向量的维度。(增加模型复杂度)
方差:避免过拟合
1、增大数据集合 – 使用更多的数据,减少数据扰动所造成的影响
2、减少数据特征 – 减少数据维度,减少模型复杂度
3、正则化方法
4、交叉验证法
这篇关于PyTorch 入坑十:模型泛化误差与偏差(Bias)、方差(Variance)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!