D2L-pytorch版 Task03笔记

本文探讨了机器学习中的过拟合和欠拟合问题,包括它们的定义、产生的原因及解决方案。文章介绍了如何通过K折交叉验证、权重衰减和丢弃法来改进模型性能,避免过拟合,同时讨论了如何调整模型复杂度以解决欠拟合问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

过拟合、欠拟合及其解决方案

  • 训练误差(training error)和泛化误差(generalization error)。
    通俗来讲,前者指模型在训练数据集上表现出的误差,后者指模型在任意一个测试数据样本上表现出的误差的期望,并常常通过测试数据集上的误差来近似。计算训练误差和泛化误差可以使用之前介绍过的损失函数,例如线性回归用到的平方损失函数和softmax回归用到的交叉熵损失函数。机器学习模型应关注降低泛化误差。

  • K折交叉验证。
    由于验证数据集不参与模型训练,当训练数据不够用时,预留大量的验证数据显得太奢侈。一种改善的方法是K折交叉验证(K-fold cross-validation)。在K折交叉验证中,我们把原始训练数据集分割成K个不重合的子数据集,然后我们做K次模型训练和验证。每一次,我们使用一个子数据集验证模型,并使用其他K-1个子数据集来训练模型。在这K次训练和验证中,每次用来验证模型的子数据集都不同。最后,我们对这K次训练误差和验证误差分别求平均。

  • 过拟合和欠拟合。
    一类是模型无法得到较低的训练误差,我们将这一现象称作欠拟合(underfitting),通常由于模型复杂度不够产生,可增加复杂度或换更复杂的模型;另一类是模型的训练误差远小于它在测试数据集上的误差,我们称该现象为过拟合(overfitting),通常由于训练样本太少,可增加训练样本或使用权重衰减或者丢弃法调节。

  • 权重衰减。
    权重衰减等价于 L 2 L_2 L2范数正则化(regularization)。正则化通过为模型损失函数添加惩罚项使学出的模型参数值较小,是应对过拟合的常用手段。 L 2 L_2 L2范数正则化在模型原损失函数基础上添加 L 2 L_2 L2范数惩罚项,从而得到训练所需要最小化的函数。 L 2 L_2 L2范数惩罚项指的是模型权重参数每个元素的平方和与一个正的常数的乘积。 L 2 L_2 L2范数正则化令权重 w w w先自乘小于1的数,再减去不含惩罚项的梯度。因此, L 2 L_2 L2范数正则化又叫权重衰减。权重衰减通过惩罚绝对值较大的模型参数为需要学习的模型增加了限制,这可能对过拟合有效。

  • 丢弃法。
    当对某一隐藏层使用丢弃法时,该层的隐藏单元将有一定概率被丢弃掉。丢弃法不改变其输入的期望值。在测试模型时,我们为了拿到更加确定性的结果,一般不使用丢弃法。

梯度消失、梯度爆炸

  • 当神经网络的层数较多时,模型的数值稳定性容易变差,梯度的计算容易出现消失或爆炸。
  • 随机初始化模型参数。
    如果将每个隐藏单元的参数都初始化为相等的值,那么在正向传播时每个隐藏单元将根据相同的输入计算出相同的值,并传递至输出层。在反向传播中,每个隐藏单元的参数梯度值相等。因此,这些参数在使用基于梯度的优化算法迭代后值依然相等。之后的迭代也是如此。在这种情况下,无论隐藏单元有多少,隐藏层本质上只有1个隐藏单元在发挥作用。因此,正如在前面的实验中所做的那样,我们通常将神经网络的模型参数,特别是权重参数,进行随机初始化。PyTorch中nn.Module的模块参数都采取了较为合理的初始化策略;Xavier随机初始化将使该层中权重参数的每个元素都随机采样于均匀分布,模型参数初始化后,每层输出的方差不该受该层输入个数影响,且每层梯度的方差也不该受该层输出个数影响。

循环神经网络进阶

RNN存在的问题:梯度较容易出现衰减或爆炸(BPTT)

  • GRU
    ⻔控循环神经⽹络:捕捉时间序列中时间步距离较⼤的依赖关系。重置⻔有助于捕捉时间序列⾥短期的依赖关系; 更新⻔有助于捕捉时间序列⾥⻓期的依赖关系。
  • LSTM
    长短期记忆long short-term memory :
    遗忘门:控制上一时间步的记忆细胞 输入门:控制当前时间步的输入。
    输出门:控制从记忆细胞到隐藏状态。
    记忆细胞:⼀种特殊的隐藏状态的信息的流动。
  • 深度循环神经网络
    pytorch中调用nn.LSTM并修改参数num_layers=2或更多,视实验效果而定。
  • 双向循环神经网络
    NLP中常用模型,可兼顾之前以及之后的信息,实际使用视实验效果而定。
PyTorch中实现双分支神经网络,可以通过定义两个独立的分支,并将它们合并在一起来实现。以下是一个示例代码,展示了如何修改VGG网络实现双分支输入。 ```python import torch from torch import nn from d2l import torch as d2l # 定义VGG网络的一个卷积块 def vgg_block(num_convs, in_channels, out_channels): layers = [] for _ in range(num_convs): layers.append(nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1)) layers.append(nn.ReLU()) in_channels = out_channels layers.append(nn.MaxPool2d(kernel_size=2, stride=2)) return nn.Sequential(*layers) # 定义双分支神经网络 class TwoBranchNet(nn.Module): def __init__(self, num_classes): super(TwoBranchNet, self).__init__() self.branch_a = vgg_block(2, 3, 64) # 第一个分支 self.branch_b = vgg_block(3, 3, 64) # 第二个分支 self.fc = nn.Linear(64 * 8 * 8, num_classes) # 全连接层 def forward(self, x_a, x_b): out_a = self.branch_a(x_a) out_b = self.branch_b(x_b) out = torch.cat((out_a, out_b), dim=1) # 将两个分支的输出拼接在一起 out = out.view(out.size(0), -1) out = self.fc(out) return out # 创建模型实例 model = TwoBranchNet(num_classes=10) ``` 在这个示例中,我们定义了两个独立的分支`branch_a`和`branch_b`,然后将它们的输出使用`torch.cat`函数在维度1上进行拼接,即将它们的通道数相加。最后,我们通过全连接层将拼接后的输出映射到所需的类别数。 请注意,这只是一个简单的示例,具体的架构和超参数应根据任务和数据的特点进行调整和优化。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [深度学习笔记其六:现代卷积神经网络和PYTORCH](https://blog.csdn.net/qq_28087491/article/details/126628880)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [pytorch+VGG16 双分支输入 图像分类](https://blog.csdn.net/qq_41638200/article/details/115725586)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值