动手深度学习12- 模型选择,欠拟合和过拟合

  • 模型选择、欠拟合和过拟合

    • 训练误差和泛化误差
    • 模型选择
    • K折交叉验证
    • 欠拟合和过拟合
      • 模型复杂度
      • 训练数据集大小
      • 多项式函数拟合实验
      • 定义、训练和测试模型
      • 欠拟合
      • 过拟合
  • 小结

模型选择、欠拟合和过拟合

前几节给予Fashion_MNIST数据集的实验中,我们评价了机器学习模型在训练集合测试集上的表现。通常得到的结果都是训练数据集上更准确时,它在测试集上表现不一定更好,这就涉及到了模型的选择以及拟合程度的选择。

训练误差和泛化误差
  • 训练误差
    是指模型在训练数据集上表现出来的误差
  • 泛化误差
    是指模型在任意一个测试样本上表现出的误差的期望,并通常通过测试数据集的误差来近似
模型选择

从严格意义上讲,测试集只能在所有的超参数和模型参数选定后使用一次,不可以使用测试集选择模型,如调参。由于无法从训练误差估计泛化误差,因此也不应该依赖训练数据选择模型。鉴于此,我们可以预留一部分在训练数据集和测试数据集以外的数据来进行模型选择。这部分数据被称为验证数据集(validation set)。例如,我们可以从给定的训练集中随机选取一部分作为验证集,而剩余部分作为真正的训练集。

K折交叉验证

欠拟合和过拟合

欠拟合:模型无法得到较低的训练误差
过拟合:模型的训练误差远小于它在测试集上的误差
讨论一下两个因素:模型复杂度和训练数据集大小

模型复杂度

为了解释模型复杂度,我们以多项式函数拟合为例。给定一个由标量数据特征x和对应的标量标签y组成的训练数据集,多项式函数拟合的目标是找一个K阶多项式函数
\(\hat{y} = b+ \sum_{k=1}^{K}x^{k}w_{k}\) 来近似y。在上式中,\(w_{k}是模型的权重参数,b为偏置参数\)。与线性回归相同,多项式函数拟合也是用平方损失函数。特别的一阶多项式函数拟合又叫做线性函数拟合。

因为告诫多项式函数模型参数更多,模型函数的选择空间更大,所以告诫多项式函数比低阶多项式函数的复杂程度高。高阶多项式函数比低阶多项式函数更容易在相同的训练集上得到更低的训练误差。给定训练集,如果模型的复杂度过低,会让你容易出现欠拟合,如果模型复杂度过高,很容易出现过拟合。选择合适复杂度的模型可以有效应对欠拟合和过拟合

训练数据集大小

在计算资源允许的情况下,通常希望训练数据集大一些,特别是在模型复杂度较高的时候,例如层数较多的深度学习模型。

多项式函数拟合实验
%matplotlib inline
import torch
import numpy as np
import sys
sys.path.append('..')
import d2lzh_pytorch as d2l

我们将生成一个人工数据集。在训练数据集和测试数据集中,给定样本特征x,我们使用如下的三阶多项式生成该样本的标签:
\(y = 1.2x-3.4x^{2}+5.6x^{3}+5+\epsilon\)
其中噪声项\(\epsilon\)服从均值为0,标准差为0.01的正态分布。
训练数据集和测试数据集的样本数都设为100。

n_train,n_test,true_w,true_b = 100,100,[1.2,-3.4,5.6],5
features = torch.randn((n_train+n_test,1))
ploy_features = torch.cat((features,torch.pow(features,2),torch.pow(features,3)),1)
# 组成三维tensor,与numpy中的concentrate,pandas里面的concat相似
labels = (true_w[0]*ploy_features[:,0]+true_w[1]*ploy_features[:,1]+true_w[2]*ploy_features[:,2]+true_b)
labels +=torch.tensor(np.random.normal(0,0.01,size=labels.size()),dtype=torch.float32)
features[:2],ploy_features[:2],labels[:2]
# 前两个样本名
(tensor([[0.0698],
         [0.8801]]), tensor([[6.9778e-02, 4.8690e-03, 3.3975e-04],
         [8.8014e-01, 7.7465e-01, 6.8180e-01]]), tensor([5.0629, 7.2319]))
定义、训练和测试模型
#定义作图函数 semiplgy 其中y轴使用了对数尺度
def semilogy(x,y,x_label,y_label,x2=None,y2=None,legend=None,figsize=(3.5,2.5)):
    d2l.set_figsize(figsize)
    d2l.plt.xlabel(x_label)
    d2l.plt.ylabel(y_label)
    d2l.plt.semilogy(x,y)
    if x2 and y2:
        d2l.plt.semilogy(x2,y2,linestyle=':')
        d2l.plt.legend(legend)
    

和线性回归一样,多项式函数拟合也是用平方损失函数,因为我们尝试使用不同的复杂度的模型来拟合生成的数据集,所以我们把模型定义部分放在fit_and_plot函数中。多项式函数拟合的训练和测试步骤与softmax回归中的步骤相似。

num_epochs,loss = 100,torch.nn.MSELoss()

def fit_and_plot(train_features,test_features,train_labels,test_labels):
    net = torch.nn.Linear(train_features.shape[-1],1)
    # Linear文档中lpytorch已经将参数初始化了,所以不必再手动初始化
    batch_size = min(10,train_labels.shape[0])
    dataset = torch.utils.data.TensorDataset(train_features,train_labels)
    train_iter = torch.utils.data.DataLoader(dataset,batch_size,shuffle=True)
    optimizer  = torch.optim.SGD(net.parameters(),lr =0.01)
    train_ls,test_ls = [],[]
    for _ in range(num_epochs):
        for X,y in train_iter:
            l = loss(net(X),y.view(-1,1))
            optimizer.zero_grad()
            l.backward()
            optimizer.step()
        train_labels = train_labels.view(-1,1)
        test_labels = test_labels.view(-1,1)
        train_ls.append(loss(net(train_features),train_labels).item())
        test_ls.append(loss(net(test_features),test_labels).item())
    print('final epoch:train loss',train_ls[-1],'test loss',test_ls[-1])
    semilogy(range(1,num_epochs+1),train_ls,'epochs','loss',
        range(1,num_epochs+1),test_ls,['train','test'])
    print('weight',net.weight.data,
     '\nbias',net.bias.data)
fit_and_plot(ploy_features[:n_train,:],ploy_features[n_train:,:],
            labels[:n_train],labels[n_train:])
final epoch:train loss 0.00012625716044567525 test loss 9.9329357908573e-05
weight tensor([[ 1.2012, -3.4010,  5.5998]])
bias tensor([5.0000])

欠拟合
fit_and_plot(features[:n_train,:],features[n_train:,:],
            labels[:n_train],labels[n_train:])
final epoch:train loss 159.88214111328125 test loss 137.93870544433594
weight tensor([[18.9767]])
bias tensor([3.2336])

过拟合
fit_and_plot(features[:20,:],features[n_train:,:],
            labels[0:20],labels[n_train:])
final epoch:train loss 59.23940658569336 test loss 193.23995971679688
weight tensor([[12.1020]])
bias tensor([5.6643])

小结

  • 由于无法从训练误差估计泛化误差,一味地降低训练误差不一定能减低泛化误差。机器学习模型应该关注降低泛华误差。
  • 可以使用验证数据集来进行模型选择
  • 欠拟合是指模型无法得到较低的训练误差,过拟合是指模型的训练误差远小于他在测试集的误差。
  • 应选择复杂度合适的模型并避免使用过少的训练样本,保证模型复杂度始终,训练样本足够。

原文地址:https://www.cnblogs.com/onemorepoint/p/11822258.html

时间: 2024-08-28 14:47:54

动手深度学习12- 模型选择,欠拟合和过拟合的相关文章

机器学习(ML)七之模型选择、欠拟合和过拟合

训练误差和泛化误差 需要区分训练误差(training error)和泛化误差(generalization error).前者指模型在训练数据集上表现出的误差,后者指模型在任意一个测试数据样本上表现出的误差的期望,并常常通过测试数据集上的误差来近似.计算训练误差和泛化误差可以使用之前介绍过的损失函数,例如线性回归用到的平方损失函数和softmax回归用到的交叉熵损失函数. 直观地解释训练误差和泛化误差这两个概念.训练误差可以认为是做往年高考试题(训练题)时的错误率,泛化误差则可以通过真正参加高

欠拟合和过拟合的一般解决方法

简单来说,欠拟合是指模型在训练集.验证集和测试集上均表现不佳的情况:过拟合是指模型在训练集上表现很好,到了验证和测试阶段就大不如意了,即模型的泛化能力很差.欠拟合和过拟合一直是机器学习训练中的难题,在进行模型训练的时候往往要对这二者进行权衡,使得模型不仅在训练集上表现良好,在验证集以及测试集上也要有出色的预测能力.下面对解决欠拟合和过拟合的一般方法作一总结,说明大致的处理方向,具体应用还得结合实际的任务.数据和算法模型等. 解决欠拟合(高偏差)的方法 1.模型复杂化 对同一个算法复杂化.例如回归

机器学习之欠拟合和过拟合(一)

1.欠拟合(underfitting)与过拟合(overfitting) 在机器学习中,我们的主要思想是通过对数据集的学习来生成我们的假设模型.在对数据集进行拟合的过程中,我们可能会遇到欠拟合和过拟合的问题.以身高预测的例子为例,这里给出7-18岁男生的身高标准(数据来源:7 岁-18 岁儿童青少年身高发育等级评价),如图1: 将中位数随年龄的变化绘制成散点图,如图2: 由图2中的散点可知,先开始身高随年龄几乎成一条直线关系,后来增长率逐渐下降.如果我们采用线性函数取拟合,这显然是不合理的(线性

神经网络- 深度学习optimizer的选择

optimizer是在训练中,运用到的训练方法,最常用的是梯度下降法,去寻找最优loss,tf中常见的optimizer有: 通过Dr.Sebastian Ruder 的论文An overview of gradient descent optimization algorithms来详细了解一些优化器的选择. 论文地址:https://arxiv.org/pdf/1609.04747.pdf 1. 首先讨论 Batch gradient descent, 公式为: θ = θ ? η · ?θ

深度学习计算模型中“门函数(Gating Function)”的作用

/* 版权声明:可以任意转载,转载时请标明文章原始出处和作者信息 .*/ author: 张俊林 看深度学习文献,门函数基本上已经是你必然会遇到的一个概念了,最典型的就是LSTM,首先上来你就得过得去"遗忘门""输入门""输出门"这三个门.门函数本身是个独立概念,不过LSTM使用多个门函数来组合出一个带有状态记忆的计算模型而已.随着LSTM大行其道,各种计算模型开始在计算过程中引入门函数的概念,相信这些论文你也没少看,其实这也是一种研究模式,比如

深度学习之模型压缩

一.背景 深度学习让计算机视觉任务的性能到达了一个前所未有的高度.但,复杂模型的同时,带来了高额的存储空间.计算资源消耗,使其很难落实到各个硬件平台. 为了解决这些问题,压缩模型以最大限度地减小模型对于计算空间和时间的消耗. 二.理论基础 必要性:目前主流的网络,如VGG16,参数量1亿3千多万,占用500多MB空间,需要进行300多亿次浮点运算才能完成一次图像识别任务. 可行性:在深度卷积网络中,存在着大量冗余地节点,仅仅只有少部分(5-10%)权值参与着主要的计算,也就是说,仅仅训练小部分的

机器学习之拟合和过拟合问题

过拟合:当某个模型过度的学习训练数据中的细节和噪音,以至于模型在新的数据上表现很差,我们称过拟合发生了,通俗点就是:模型在训练集中测试的准确度远远高于在测试集中的准确度. 过拟合问题通常发生在变量特征过多的时候.这种情况下训练出的方程总是能很好的拟合训练数据,也就是说,我们的代价函数可能非常接近于0或者就为0,使其拟合只局限于训练样本中,无法很好预测其他新的样本. 欠拟合:在训练数据和未知数据上表现都很差 解决过拟合问题的方法主要有: 1. 减少特征数量,通过人工或者算法选择哪些特征有用保留,哪

深度学习的模型是怎么训练/优化出来的

以典型的分类问题为例,来梳理模型的训练过程.训练的过程就是问题发现的过程,一次训练是为下一步迭代做好指引. 1.数据准备 准备: 数据标注前的标签体系设定要合理 用于标注的数据集需要无偏.全面.尽可能均衡 标注过程要审核 整理数据集 将各个标签的数据放于不同的文件夹中,并统计各个标签的数目 如:第一列是路径,最后一列是图片数目. PS:可能会存在某些标签样本很少/多,记下来模型效果不好就怨它. 样本均衡,样本不会绝对均衡,差不多就行了 如:控制最大类/最小类<\(\delta\),\(\delt

深度学习数据集+模型说明

1.mnist Google实验室的Corinna Cortes和纽约大学柯朗研究所的Yann LeCun建的一个手写数字数据库,训练库有60,000张手写数字图像,测试库有10,000张.对应的手写识别模型为LeNet. 数据地址:http://yann.lecun.com/exdb/mnist/ 2.cifar10 由Hinton的两个大弟子Alex Krizhevsky.Ilya Sutskever收集的一个用于普适物体识别的数据集.Cifar是加拿大牵头投资的一个先进科学项目研究所. C