| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 从零实现深度学习框架——过拟合与欠拟合 -> 正文阅读 |
|
[人工智能]从零实现深度学习框架——过拟合与欠拟合 |
引言
本文主要介绍机器学习中常见的过拟合和欠拟合的概念,最后用一个实例展示过拟合的现象。 拆分数据集我们在前面已经了解了机器学习简单流程:
该数据集有一些为训练而收集的样本组成,称为训练数据集(training dataset),或称为训练集(train set)。然后在训练数据上表现良好的模型,并不一定在新数据集上有同样的效果,这里的新数据集通常称为测试数据集(test dataset),或称为测试集(test set),测试集由随机选取的、未曾在训练集中出现的数据样本构成。 这样,训练集用于拟合模型参数,测试集用于评估拟合的模型,所谓的拟合是指模型对于测试集的适应效果怎么样。 机器学习的主要挑战是我们的模型必须能在之前未观测的新样本上表现良好,而不只是在训练集上表现良好。在之前未观测到的样本上表现良好的能力称为泛化(generalization)。 当我们训练机器学习模型时,我们可以使用某个训练集,在训练数集上计算得到的误差,称为训练误差(training error),学习的目标是降低训练误差。机器学习也希望泛化误差(generalization error,也被称为测试误差(test error)) 很低。泛化误差被定义为新输入样本的误差期望,期望的计算基于不同的可能输入,这些输入来自于模型在现实中遇到的分布。 问题是,我们永远不能准确地计算出泛化误差,因为真实环境具有无限多的数据样本。实际上,我们只能通过将模型应用于一个独立的测试集(test set) 来估计泛化误差。 我们在训练集上训练模型,然后在测试集上测试模型,用测试集上的误差假设为模型对真实场景中的泛化误差。因此,我们只需要让训练好的模型在测试集上误差最小即可。 这是比较常见的做法,但如果可以的话,我们还可以拆分出一个验证集(dev set,开发集)。 由于在训练的时候,模型不能“看”到测试集的数据,我们不能直接根据测试集来调整模型,因此我们可以在训练集上训练好后,然后在验证集上测试不同的思路(比如超参数、权重初始化方法等),从中选择一个,然后不断迭代去改善验证集上的表现,最后得到满意的模型,再去测试集上评估。 模型在验证集上的误差就是验证误差(validation error)。 但是在具体拆分数据集时,有一些要注意的事项,最重要的是验证集应该和测试集保持同一分布。 还有有了一批数据后,具体要如何拆分呢? 按照吴恩达老师的说法,数据量较少的时候,比如在十万级别以内的,可以用60%的数据作为训练集,20%的数据作为验证集,剩下20%的数据最为测试集;或者说你不想要验证集,那么建议70%的数据作为训练集,剩下30%的数据都作为测试集。 当数据量较大的时候,比如百万级以上,那么训练集/验证集/测试集按照98%/1%/1%的比例分就可以了。 用了这些数据集的概念后,我们就可以来了解过拟合和欠拟合问题了。 过拟合和欠拟合我们说,训练集用于拟合模型参数,测试集用于评估拟合的模型。当一个模型在训练集上表现良好,但不能推广到测试集时(在测试集上拟合不好),我们说这个模型是过拟合(overfitting) 的。如果训练出来的模型表现不好(误差高),甚至在训练集上都表现不好,我们说这个模型是欠拟合(underfitting) 的。 通常我们可以通过比较训练误差和验证误差来判断模型训练的效果:
最终,我们更关心验证误差,而不是训练误差和验证误差之间的差距。 是否过拟合或欠拟合可能取决于模型复杂性和可用训练集的大小。
模型复杂性我们看一个经典的多项式例子。给定由单个特征
x
x
x和对应实数标签
y
y
y组成的训练数据,我们试图找到下面的
d
d
d阶多项式来估计标签
y
y
y: 高阶多项式函数比低阶多项式函数复杂得多。高阶多项式的参数较多,模型函数的选择范围较广。因此在训练集不变的情况下,高阶多项式通常比低阶多项式的训练误差更低。当数据样本包含了 x x x的不同值时,函数阶数等于数据样本数量的多项式函数可以完美拟合训练集。在下图中,我们直观地描述了多项式的阶数和欠拟合与过拟合之间的关系: 上图来自深度学习花书,横轴描述的是容量,我们可以理解为模型复杂度,纵轴表示误差。最佳复杂度在上图红线指向的位置。在红线左边属于欠拟合,红线右边属于过拟合。比较直观的就是,红线右边的泛化误差和训练误差的差距越来越大。 数据集大小训练数据集中的样本越少,我们就越有可能过拟合。随着训练数据量的增加,泛化误差通常会减少。不管怎样,更多的数据不会有什么坏处,但是要注意训练数据集的数据分布和真实数据的分布问题。 通过实例理解过拟合与欠拟合
本节我们通过多项式回归这个例子来理解过拟合与欠拟合。 给定
x
x
x,我们使用以下三阶多项式来生成训练和测试数据的标签:
然后我们从生成的数据集中看一下前2个样本:
然后我们定义训练函数:
该函数会进行多项式模型的训练,同时画出训练误差和验证误差,最后打印出模型训练得到的权重。 正常拟合我们先看一下正常拟合,让它与生成数据的阶数相同相同,即三阶多项式,包含偏置。
可以看到损失由100降低到了0.01级别,能有效降低训练损失和测试损失,学习到的模型参数也接近于真实 w = [ 5 , 1.2 , ? 3.4 , 5.6 ] w=[5, 1.2, -3.4, 5.6] w=[5,1.2,?3.4,5.6]??。
欠拟合我们再看看没有多项式的线性函数拟合。
此时减少模型的训练损失很困难。在最后一个迭代完成后,训练损失仍然很高。 过拟合我们尝试使用一个阶数过高的多项式来训练模型。
此时,这个过于复杂的模型会受到训练数据中噪声的影响。虽然训练损失可以有效地降低,但测试损失仍然很高。结果表示,复杂模型对数据造成了过拟合。 References
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 17:25:22- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |