训练误差:模型在训练数据上的误差
泛化误差:模型在新数据上的误差
训练数据集:训练模型参数
验证数据集:一个用来评估模型好坏的数据集,选择模型超参数
测试数据集:只使用一次的数据集
模型容量:拟合各种函数的能力
低容量的模型难以拟合训练数据,高容量的模型可以记住所有训练数据
深度学习的核心:在模型足够大的情况下,通过各种手段来控制模型容量,进而降低泛化误差。
很难在不同的种类算法之间比较模型容量
给定一个模型种类,将有两个主要因素:参数的个数,参数值的选择范围
对于一个分类模型,VC维等于一个最大数据集的大小,不管如何给定标号,都存在一个模型来对它及进行完美分类。VC维提供为什么一个模型好的理论依据,可以衡量训练误差和泛化误差之间的间隔,在深度学习中的使用是不常见的。
数据的复杂度有多个重要因素:样本个数、每个样本的元素个数、时间空间结构、多样性等。
模型容量需要匹配数据复杂度,否则可能导致欠拟合和过拟合,统计机器学习提供数学工具来衡量模型复杂度,实际中一般依靠观察训练误差和验证误差。
代码实现
# 通过多项式拟合来交互的探索模型选怎、欠拟合和过拟合的现象
import math
import numpy as np
import torch
from torch import nn
from d2l import torch as d2l
# 使用三阶多项式来生成训练数据和测试数据的标签
# 特征维度
max_degree =20
n_train,n_test=100,100
true_w=np.zeros(max_degree)
true_w[0:4] = np.array([5,1.2,-3.4,5.6])
features = np.random.normal(size=(n_train+n_test,1))
np.random.shuffle(features)
poly_features = np.power(features,np.arange(max_degree).reshape(1,-1))
for i in range(max_degree):
poly_features[:,i] /= math.gamma(i+1)
labels = np.dot(poly_features,true_w)
labels += np.random.normal(scale=0.1,size