过拟合和欠拟合

1. 过拟合和欠拟合

欠拟合 (underfitting) : 模型无法得到较低的训练误差
过拟合 (overfitting) : 模型的训练误差远小于它在测试数据集上的误差

  • 模型越简单, 容易欠拟合, 模型越复杂, 容易过拟合
  • 训练数据越少越容易过拟合

2. 过拟合解决方法

2.0增大训练集

2.1 权重衰减

权重衰减等价于 范数正则化 (regularization) . 正则化通过为模型损失函数添加惩罚项使学出的模型参数值较小, 是应对过拟合的常用手段. 范数正则化是在模型的原损失函数基础上添加范数惩罚项, 从而得到新的目标函数.

范数惩罚项是模型权重参数每个元素的平方和与一个常数的乘积.

# 正则项
def l2_penalty(w):
    return (w**2).sum() / 2
net, loss = d2l.linreg, d2l.squared_loss
l = loss(net(X, w, b), y) + lambd * l2_penalty(w) # 新损失项

# 或者torch.optim.SGD中自带了权重衰减参数
torch.optim.SGD(params=[net.weight], lr=lr, weight_decay=wd) 

2.2 丢弃法

以前面学习过的多层感知机为例, 使用丢弃法. 当对该隐藏层使用丢弃法时, 该层的隐藏单元将有一定概率被丢弃掉.

对多层感知机的隐层使用丢弃法


设丢弃概率为, 那么有的概率会被清零, 有的概率会除以做拉伸. 丢弃概率是丢弃法的超参数. 具体来说, 设随机变量为和的概率分别为和 . 新的隐藏单元, 而, 则. 即丢弃法不改变其输入的期望值.

 

由于在训练中隐藏层神经元的丢弃是随机的,即 都有可能被清零,输出层的计算无法过度依赖中的任一个,从而在训练模型时起到正则化的作用,并可以用来应对过拟合。在测试模型时,我们为了拿到更加确定性的结果,一般不使用丢弃法

从头实现

 

def dropout(X, drop_prob):
    X = X.float()
    assert 0 <= drop_prob <= 1
    keep_prob = 1 - drop_prob
    # 这种情况下把全部元素都丢弃
    if keep_prob == 0:
        return torch.zeros_like(X)
    mask = (torch.rand(X.shape) < keep_prob).float()
    
    return mask * X / keep_prob

drop_prob1, drop_prob2 = 0.2, 0.5

def net(X, is_training=True):
    X = X.view(-1, num_inputs)
    H1 = (torch.matmul(X, W1) + b1).relu()
    if is_training:  # 只在训练模型时使用丢弃法
        H1 = dropout(H1, drop_prob1)  # 在第一层全连接后添加丢弃层
    H2 = (torch.matmul(H1, W2) + b2).relu()
    if is_training:
        H2 = dropout(H2, drop_prob2)  # 在第二层全连接后添加丢弃层
    return torch.matmul(H2, W3) + b3

简洁实现
直接使用torch.nn模块中的Dropout类构建模型

 

        d2l.FlattenLayer(),
        nn.Linear(num_inputs, num_hiddens1),
        nn.ReLU(),
        nn.Dropout(drop_prob1),
        nn.Linear(num_hiddens1, num_hiddens2), 
        nn.ReLU(),
        nn.Dropout(drop_prob2),
        nn.Linear(num_hiddens2, 10)
        )

1. 梯度消失和梯度爆炸

这是DL中有关数值稳定性的经典问题, 当神经网络的层数较多时容易出现. 例如, 在激活函数为恒等变换时 (math?formula=%5Cphi(x)%3Dxuploading.4e448015.gif转存失败重新上传取消\phi(x)=x), 给定输入math?formula=%5Cboldsymbol%7BX%7Duploading.4e448015.gif转存失败重新上传取消\boldsymbol{X},多层感知机的第层的输出math?formula=%5Cboldsymbol%7BH%7D%5E%7B(l)%7D%20%3D%20%5Cboldsymbol%7BX%7D%20%5Cboldsymbol%7BW%7D%5E%7B(1)%7D%20%5Cboldsymbol%7BW%7D%5E%7B(2)%7D%20%5Cldots%20%5Cboldsymbol%7BW%7D%5E%7B(l)%7Duploading.4e448015.gif转存失败重新上传取消\boldsymbol{H}^{(l)} = \boldsymbol{X} \boldsymbol{W}^{(1)} \boldsymbol{W}^{(2)} \ldots \boldsymbol{W}^{(l)}, 若所有层的权重都是标量如0.2和5, 则在第30层处的输出为math?formula=0.2%5E%7B30%7D%5Cto0uploading.4e448015.gif转存失败重新上传取消0.2^{30}\to0 (消失) 和math?formula=5%5E30%5Cto%5Cinftyuploading.4e448015.gif转存失败

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
过拟合欠拟合是机器学习中常见的两个问题,它们都与模型的泛化能力有关。 过拟合(Overfitting)指的是模型在训练数据上表现得很好,但在新的未见过的数据上表现较差。过拟合通常是由于模型过于复杂,过度拟合了训练数据中的噪声和细节,导致对新数据的泛化能力较差。过拟合的特征包括训练集上表现很好但测试集上表现较差,模型参数较多,模型对训练数据中的噪声过于敏感等。 欠拟合(Underfitting)指的是模型无法很好地拟合训练数据,无法捕捉到数据中的关键特征和模式。欠拟合通常是由于模型过于简单或者训练数据量不足导致的,模型无法充分学习到数据的规律。欠拟合的特征包括训练集和测试集上表现都较差,模型无法捕捉到数据中的复杂关系等。 解决过拟合欠拟合问题的方法有很多,以下是一些常见的方法: 1. 增加训练数据量:通过增加更多的训练样本,可以帮助模型更好地学习数据的规律,减少过拟合欠拟合的问题。 2. 简化模型:减少模型的复杂度,可以降低过拟合的风险。可以通过减少模型的参数数量、降低模型的层数或者使用正则化等方法来简化模型。 3. 特征选择:选择对问题有用的特征,去除冗余和无关的特征,可以提高模型的泛化能力。 4. 正则化:通过在损失函数中引入正则化项,限制模型参数的大小,可以减少过拟合的问题。 5. 交叉验证:使用交叉验证来评估模型的性能,选择最优的模型参数和超参数,可以帮助避免过拟合欠拟合

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值