深度学习_模型选择与拟合问题

模型选择

首先我们需要考虑误差!

首先在机器学习模型中误差有如下两种:

  1. 训练误差
  2. 泛化误差

训练误差指模型在训练数据集上表现出的误差

泛化误差指模型在任意一个测试数据样本上表现出的误差的期望

而在机器学习模型中应该关注降低泛化误差

在机器学习中,通常需要评估若干候选模型的表现并从中选择模型。这一过程称为模型选择(model selection)。可供选择的候选模型可以是有着不同超参数的同类模型。以多层感知机为例,我们可以选择隐藏层的个数,以及每个隐藏层中隐藏单元个数和激活函数。为了得到有效的模型,我们通常要在模型选择上下一番功夫。下面,我们来描述模型选择中经常使用的验证数据集(validation data set)。

在机器学习中,我们有两个数据集,一个是训练集,一个是测试集。严格意义讲,测试集只能使用一次。所以我们不能够根据测试集的数据选择模型,调参等。我们也无法从训练误差估计泛化误差,
因此我们也不能够更具训练集选择模型。那么既不能从测试集选择模型,又不能从训练集选择模型,那应该怎么办呢?

K折交叉验证

一种改善的方法是 K 折交叉验证( K -fold cross-validation ).
在 K 折交叉验证中,我们把原始训练数据集分割成 K 个不重合的子数据集,然后我们做 K 次模型训练和验证。每一次,我们使用一个子数据集验证模型,并使用其他 K−1 个子数据集来训练模型。在这 K 次训练和验证中,每次用来验证模型的子数据集都不同。最后,我们对这 K 次训练误差和验证误差分别求平均。

欠拟合和过拟合

模型训练中经常出现的两类典型问题:

  1. 一类是模型无法得到较低的训练误差,我们将这一现象称作欠拟合(underfitting)
  2. 另一类是模型的训练误差远小于它在测试数据集上的误差,我们称该现象为过拟合(overfitting)

模型复杂度

以多项式函数拟合为例,目标是寻找一个K阶多项式函数

\hat{y} = b + \sum_{k=1}^K x^k w_k

来近似y。在上式中,wk是模型的权重参数,b是偏差参数。与线性回归相同,多项式函数拟合也使用平方损失函数。特别地,一阶多项式函数拟合又叫线性函数拟合。

因为高阶多项式函数模型参数更多,模型函数的选择空间更大,所以高阶多项式函数比低阶多项式函数的复杂度更高。因此,高阶多项式函数比低阶多项式函数更容易在相同的训练数据集上得到更低的训练误差。

给定训练数据集,模型复杂度和误差之间的关系通常如图3.4所示。给定训练数据集,如果模型的复杂度过低,很容易出现欠拟合;如果模型复杂度过高,很容易出现过拟合。应对欠拟合和过拟合的一个办法是针对数据集选择合适复杂度的模型。

图 3.4 模型复杂度对欠拟合和过拟合的影响

训练数据集大小

影响欠拟合和过拟合的另一个重要因素是训练数据集的大小。一般来说,如果训练数据集中样本数过少,特别是比模型参数数量(按元素计)更少时,过拟合更容易发生。此外,泛化误差不会随训练数据集里样本数量增加而增大。
因此,在计算资源允许的范围之内,我们通常希望训练数据集大一些,特别是在模型复杂度较高时,例如层数较多的深度学习模型。

多项式函数拟合实验

导入必要的包

import d2lzh as d2l
from mxnet import autograd,nd,gluon
from mxnet.gluon import data as gdata,loss as gloss,nn

生成数据集

我们将生成一个人工数据集。在训练数据集和测试数据集中,给定样本特征 x ,我们使用如下的三阶多项式函数来生成该样本的标签:

y = 1.2x - 3.4x^2 + 5.6x^3 + 5 + \epsilon,

其中噪声项 ϵ 服从均值为0、标准差为0.1的正态分布。训练数据集和测试数据集的样本数都设为100。

#设置训练集和测试集的样本数都为100,再设置w与b
train_n,test_n,true_w,true_b = 100,100,[1.8,-9.6,3.14],2.8
#随机生成特征值
features = nd.random.normal(shape=(train_n+test_n,1))
poly_features = nd.concat(features,nd.power(features,2),nd.power(features,3))

labels = poly_features[:,0]*true_w[0] + poly_features[:,1]*true_w[1] + poly_features[:,2]*true_w[2] + true_b
labels += nd.random.normal(scale=0.01,shape=labels.shape)

看一看生成的数据集的前两个样本。

features[:2],poly_features[:2],labels[:2]
(
 [[-1.680917 ]
  [-2.6438675]]
 <NDArray 2x1 @cpu(0)>, 
 [[ -1.680917    2.8254821  -4.749401 ]
  [ -2.6438675   6.9900355 -18.480726 ]]
 <NDArray 2x3 @cpu(0)>, 
 [ -42.26117 -127.08934]
 <NDArray 2 @cpu(0)>)

定义 训练 测试 模型

#首先定义作图函数semilogy,y轴用了对数尺度
def semilogy(x_vals,y_vals,x_label,y_label,x2_vals=None,y2_vals=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_vals,y_vals)
    if x2_vals and y2_vals:
        d2l.plt.semilogy(x2_vals,y2_vals)
        d2l.plt.legend(legend)
num_epochs, loss = 100, gloss.L2Loss()

def fit_and_plot(train_features, test_features, train_labels, test_labels):
    net = nn.Sequential()
    net.add(nn.Dense(1))
    net.initialize()
    batch_size = min(10, train_labels.shape[0])
    train_iter = gdata.DataLoader(gdata.ArrayDataset(
        train_features, train_labels), batch_size, shuffle=True)
    trainer = gluon.Trainer(net.collect_params(), 'sgd',
                            {'learning_rate': 0.01})
    train_ls, test_ls = [], []
    for _ in range(num_epochs):
        for X, y in train_iter:
            with autograd.record():
                l = loss(net(X), y)
            l.backward()
            trainer.step(batch_size)
        train_ls.append(loss(net(train_features),
                             train_labels).mean().asscalar())
        test_ls.append(loss(net(test_features),
                            test_labels).mean().asscalar())
    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[0].weight.data().asnumpy(),
          '\nbias:', net[0].bias.data().asnumpy())

三阶多项式函数拟合(正常)

fit_and_plot(poly_features[:train_n, :], poly_features[train_n:, :],
             labels[:train_n], labels[train_n:])
final epoch: train loss 0.002419042 test loss 0.0032950742
weight: [[ 1.6981984 -9.568022   3.1638238]] 
bias: [2.7530537]

线性函数拟合(欠拟合)

fit_and_plot(features[:train_n, :], features[train_n:, :],
             labels[:train_n], labels[train_n:])
final epoch: train loss 219.35103 test loss 108.207634
weight: [[14.531894]] 
bias: [-9.7385435]

训练样本不足(过拟合)

fit_and_plot(poly_features[:2, :], poly_features[train_n:, :],
             labels[:2], labels[train_n:])
final epoch: train loss 1.0184645e+16 test loss 596942100000000.0
weight: [[-1407827.5  3514087.  -8941110. ]] 
bias: [579296.6]
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,951评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,606评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,601评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,478评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,565评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,587评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,590评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,337评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,785评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,096评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,273评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,935评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,578评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,199评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,440评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,163评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,133评论 2 352

推荐阅读更多精彩内容