机器学习:过拟合欠拟合正则化之间的纸短情长~(代码片段)

HanZee HanZee     2022-10-23     353

关键词:

机器学习:过拟合与欠拟合是如何被解决的?

什么是过拟合与欠拟合

机器学习的主要挑战是我们的算法能够在为观测的数据上误差较小,而不是在只在训练集上表现良好,我们这种能力我们称之为泛化

过拟合

如上右图所示,模型通过训练集很好的拟合了观测数据,训练误差很小,但是由于过度的在训练集上拟合,当其用于推理测试数据时,误差很可能会变大,因为数据是有噪声的并且其本身与真实概率分布也有一定偏差,训练集的概率分布与真实概率分布还是有一定差距的,当模型过度的接近训练集的概率分布,那么他就会随着训练轮数的增加而远离真实的概率分布(这里我们假设测试集复合真实概率分布),以上的情况我们称之为过拟合。

欠拟合

如上左图所示,模型通过训练集拟合的直线不能很好的拟合图中的观测值,训练误差和泛化误差都非常高,我们称之为欠拟合

如何解决过拟合

L2正则化(权重衰减)

谈到正则化,我们继续观察上面过拟合图像,函数过度的复杂了(太弯弯绕了~),我们首先想到的一定是降低他的复杂度,也就是说我们要减少权重参数的维度大小(权重衰减),它的维度决定了图像他有个拐点,大小则决定了图像弯曲程度。那么我们就有了一个想法了💡!
我们从权重衰减的方向入手(也就是参数的大小):
我们让权重参数的二范数小于某个值来约束它。在优化损失函数(以MSE为例)的时候可得如下方程组:
min ⁡ 1 n ∑ i = 1 n ( w i x i − y i ) 2 ∥ w ∥ 2 2 < = σ \\begincases\\min \\dfrac1n\\sum ^n_i=1\\left( w_ix_i-y_i\\right) ^2\\\\ \\left\\| w\\right\\| _2^2<= \\sigma\\endcases minn1i=1n(wixiyi)2w22<=σ
这里我们根据拉格朗日乘子法 ,可以把在约束内求最值,改成无范围求最值。得到下方方程(lambda为惩罚系数):
L ( w ) = 1 n ∑ i = 1 n ( w i x i − y i ) + 1 2 λ ∑ i = 1 n ( w i ) 2 L\\left( w\\right) =\\dfrac1n\\sum ^n_i=1\\left( w_ix_i-y_i\\right) + \\dfrac12 \\lambda\\sum ^n_i=1\\left( w_i\\right) ^2 L(w)=n1i=1n(wixiyi)+21λi=1n(wi)2
根据梯度下降法( α \\alpha α为learning rate),我们继续化简:
W n e w = W − α L ( w ) ′ = W − α x − λ α w = ( 1 − α x ) w − α x \\beginalignedW_new=W-\\alpha L\\left( w\\right)^\\prime \\\\ =W-\\alpha x-\\lambda \\alpha w\\\\ =\\left( 1-\\alpha x\\right) w-\\alpha x\\endaligned Wnew=WαL(w)=Wαxλαw=(1αx)wαx
我们发现,参数w每回合都在慢慢减少,权重系数减少,也就是对数据与噪声变得不敏感(曲线越平滑,根据泰勒展开可知),相对来讲,也就是降低了数据的拟合程度从而缓解过拟合。

这里我们要注意,其中衰减的参数包含偏置系数b,因为权重系数决定了模型推理结果的方差,而偏置系数决定了偏差,不能缓解过拟合。

代码实现

%matplotlib inline
import torch
from torch import nn
from d2l import torch as d2l

n_train, n_test, num_inputs, batch_size = 20, 100, 200,5
true_w, true_b = torch.ones((num_inputs, 1))*0.05, 0.05
train_data = d2l.synthetic_data(true_w, true_b,n_train)
train_iter = d2l.load_array(train_data, batch_size)
test_data = d2l.synthetic_data(true_w, true_b, n_train)
test_iter = d2l.load_array(test_data,batch_size, is_train=False)

def init_params():
    w = torch.normal(0,1,size=(num_inputs,1),requires_grad = True)
    b = torch.zeros(1,requires_grad = True)
    return [w,b]
def l2_penalty(w):
    return torch.sum(torch.abs(w))
num_epochs, lr = 1000, 0.003
def train(lambd):
    w,b = init_params()
    net,loss = lambda X : d2l.linreg(X,w,b), d2l.squared_loss
    animator = d2l.Animator(xlabel='epochs', ylabel='loss', yscale='log',
                            xlim=[5, num_epochs], legend=['train', 'test'])
    
    for epoch in range(num_epochs):
        for X,y in train_iter:
            l = loss(net(X),y)+lambd*l2_penalty(w)
            l.sum().backward()
            d2l.sgd([w,b],lr,batch_size)
        if (epoch + 1) % 5 == 0:
            animator.add(epoch + 1, (d2l.evaluate_loss(net, train_iter, loss),
                                     d2l.evaluate_loss(net, test_iter, loss)))
    print('w的L2范数是:', torch.norm(w).item())
 train(lambd=1)

降维

剔除掉冗余的特征和比重不大的特征,原因
2. 采用合适的模型(控制模型的复杂度)

采用合适的模型

过于复杂的模型会带来过拟合问题。对于模型的设计,目前公认的一个深度学习规律"deeper is better"。国内外各种大牛通过实验和竞赛发现,对于CNN来说,层数越多效果越好,但是也更容易产生过拟合,并且计算所耗费的时间也越长。

根据奥卡姆剃刀法则:在同样能够解释已知观测现象的假设中,我们应该挑选“最简单”的那一个。对于模型的设计而言,我们应该选择简单、合适的模型解决复杂的问题。

数据增强

如何解决欠拟合

欠拟合的问题一般出现在训练开始,随着训练的深入,一般此问题会不攻自破,我们一般采用:

  1. 增加模型的复杂度(比如从直线->曲线)。
  2. 增加数据维度(维度数应该远远小于数据的数量,否则可能出现过拟合)。
  3. 增加数据量。

机器学习欠拟合和过拟合

欠拟合和过拟合1.定义2.原因以及解决办法3.正则化3.1什么是正则化3.2正则化类别4.小结1.定义过拟合:一个假设在训练数据上能够获得比其他假设更好的拟合,但是在测试数据集上却不能很好地拟合数据,此时认为这... 查看详情

python机器学习及实践——进阶篇3(模型正则化之欠拟合与过拟合)(代码片段)

一个需要记住的重要事项:任何机器学习模型在训练集上的性能表现,都不能作为其对未知测试数据预测能力的评估。这里讲详细及时什么是模型的泛化力以及如何保证模型的泛化力,一次会阐述模型复杂度与泛化力... 查看详情

机器学习欠拟合和过拟合

目录1定义2原因以及解决办法3正则化3.1什么是正则化3.2正则化类别4小结1定义过拟合:一个假设在训练数据上能够获得比其他假设更好的拟合,但是在测试数据集上却不能很好地拟合数据,此时认为这个假设出现了过... 查看详情

斯坦福2014机器学习笔记五----正则化

版权声明:本文为博主原创文章,转载请指明转载地址一、纲要  欠拟合和过拟合  代价函数正则化  正则化线性回归  正则化逻辑回归二、内容详述  1、欠拟合和过拟合  欠拟合,也叫高偏差,就是没有很好的拟... 查看详情

正则化详解

参考技术A机器学习模型需要拥有很好地泛化能力来适应训练集中没有出现过的新样本。在机器学习应用时,我们经常会遇到过度拟合(over-fitting)的问题,可能会导致训练出来的模型效果很差。接下来,我们将谈论的正则化(regulari... 查看详情

容量欠拟合过拟合和正则化

1、训练误差和泛化误差机器学习的主要挑战是我们的模型要在未观测数据上表现良好,而不仅仅是在训练数据上表现良好。在未观测数据上表现良好称为泛化(generalization)。通常情况下,我们在训练数据上训练模型时会计算一... 查看详情

ng机器学习视频笔记——过拟合与正则化

ng机器学习视频笔记(五)——过拟合与正则化 (转载请附上本文链接——linhxx) 一、过拟合和欠拟合1、概念        当针对样本集和特征值,进行预测的时候,推导θ、梯度下降等,都在一... 查看详情

纸短情长尤克里里谱

    查看详情

[深度之眼机器学习训练营第四期]过拟合与正则化

基本概念机器学习模型面临的两个主要问题是欠拟合与过拟合。欠拟合,即模型具有较高的偏差,说明模型没有从数据中学到什么,如下左图所示。而过拟合,即模型具有较高的方差,意味着模型的经验误差低而泛化误差高,对... 查看详情

python机器学习及实践——进阶篇3(模型正则化之欠拟合与过拟合)(代码片段)

一个需要记住的重要事项:任何机器学习模型在训练集上的性能表现,都不能作为其对未知测试数据预测能力的评估。这里讲详细及时什么是模型的泛化力以及如何保证模型的泛化力,一次会阐述模型复杂度与泛化力... 查看详情

机器学习基础---过拟合问题及正则化技术(代码片段)

...够有效地解决许多问题,但是当将它们应用到某些特定的机器学习应用时,会遇到过拟合(over-fitting)的问题,可能会导致它们效果很差。一:过度拟合问题(一)线性回归中的过拟合问题继续使用线性回归来预测房价的例子,我... 查看详情

梯度下降,过拟合,正则化之机器学习

目录补充梯度下降​补充损失函数,代价函数,目标函数定义正则化 查看详情

机器学习100天(二十三):023欠拟合与过拟合

机器学习100天,今天讲的是欠拟合与过拟合!《机器学习100天》完整目录:目录一、过拟合与欠拟合机器学习中,我们构建一个模型,通常可能会遇到欠拟合或者过拟合的问题。以这张图为例,面对同样一批数据,我们建立了3... 查看详情

机器学习100天(二十三):023欠拟合与过拟合

机器学习100天,今天讲的是欠拟合与过拟合!《机器学习100天》完整目录:目录一、过拟合与欠拟合机器学习中,我们构建一个模型,通常可能会遇到欠拟合或者过拟合的问题。以这张图为例,面对同样一批数据,我们建立了3... 查看详情

机器学习汇总----线性回归和正则化

1.什么是线性回归线性:两个变量之间的关系是一次函数关系的——图象是直线,叫做线性。非线性:两个变量之间的关系不是一次函数关系的——图象不是直线,叫做非线性。回归:人们在测量事物的时候因为客观... 查看详情

判断模型是不是过拟合、欠拟合、数据问题?

...么知道知道自己的模型是过拟合,欠拟合,数据问题?1)学习曲线(learningcurves)2)交叉验证(corss-validation)3)我们可以先通过训练集和测试集准确率的大小,直观的判断模型是否过拟合;当没有把握断定模型是否过拟合时,再借助学... 查看详情

机器学习:过拟合与正则化

过拟合的定义:过拟合是指模型过度拟合训练集,学到训练集中过多的噪音或随机波动,导致模型泛化能力差的情况。它表现为在训练集上表现良好,在测试集上表现差。解决方法:1.重新清洗数据,导致过拟合的一个原因也有可... 查看详情

机器学习入门-过拟合欠拟合

机器学习最重要的就是模型训练训练结果怎么反馈,一般有三种叫法,欠拟合,拟合,过拟合。下面介绍下白话介绍下具体含义下面三个图分别展示的是欠拟合,合适拟合,过拟合针对线性回归模型:... 查看详情