ElitesAI·动手学深度学习PyTorch版-第二次打卡task01

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

1.1 模型选择、过拟合和欠拟合

在解释上述现象之前,我们需要区分训练误差(training error)泛化误差(generalization error)
训练误差指模型在训练数据集上表现出的误差;
泛化误差指模型在任意一个测试数据样本上表现出的误差的期望,并常常通过测试数据集上的误差来近似。
计算训练误差和泛化误差可以使用之前介绍过的损失函数,例如线性回归用到的平方损失函数和softmax回归用到的交叉熵损失函数。

机器学习模型应关注降低泛化误差。

  • 模型选择
    从严格意义上讲,测试集只能在所有超参数和模型参数选定后使用一次。不可以使用测试数据选择模型,如调参。由于无法从训练误差估计泛化误差,因此也不应只依赖训练数据选择模型。鉴于此,我们可以预留一部分在训练数据集和测试数据集以外的数据来进行模型选择。这部分数据被称为验证数据集,简称验证集(validation set)。例如,我们可以从给定的训练集中随机选取一小部分作为验证集,而将剩余部分作为真正的训练集。
    (一般比例下而言,整个数据集可以分为6:2:2的比例分配。训练集、验证集和测试集。当然更多情况是根据数据集的大小来灵活分配)
  • K折交叉验证
    由于验证数据集不参与模型训练,当训练数据不够用时,预留大量的验证数据显得太奢侈。一种改善的方法是K折交叉验证(K-fold cross-validation)。在K折交叉验证中,我们把原始训练数据集分割成K个不重合的子数据集,然后我们做K次模型训练和验证。每一次,我们使用一个子数据集验证模型,并使用其他K-1个子数据集来训练模型。在这K次训练和验证中,每次用来验证模型的子数据集都不同。最后,我们对这K次训练误差和验证误差分别求平均。

ElitesAI·动手学深度学习PyTorch版-第二次打卡task01具体方法是:首先将训练数据集分为5份(测试集已经被单独分开了)。在这5份数据集里,先对fold1、2、3、4进行训练,将fold5作为验证集,并以在验证集上的变现重新修改超参数。再次进行第二次训练,第二次训练时,将fold1、2、3、5进行训练,将fold4作为验证集,进行验证,并以此修改超参数。然后再可进行第三次训练。同理,可将fold1、2、4、5作为训练数据,再fold3作为验证集,并修改超参数。并依次进行,判断是否需要继续进行训练~~。这种方法称之为cross-validation。
注:在深度学习中,计算资源耗费非常大,再数据集很大的情况下,不建议这么做!!!

1.2 过拟合和欠拟合

接下来,我们将探究模型训练中经常出现的两类典型问题:

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

在实践中,我们要尽可能同时应对欠拟合和过拟合。虽然有很多因素可能导致这两种拟合问题,在这里我们重点讨论两个因素:模型复杂度和训练数据集大小。

针对模型复杂度而言,degree of polynomial d就可以表示,d 越大模型自然也就越复杂,关系如下。

ElitesAI·动手学深度学习PyTorch版-第二次打卡task01
对于训练集的大小则有训练曲线如下。

ElitesAI·动手学深度学习PyTorch版-第二次打卡task01
ElitesAI·动手学深度学习PyTorch版-第二次打卡task01

1.3 机器学习基础

首先通过评估训练集或者训练数据的表现性能来判断是否high bias(高偏差)?
如果偏差确实很高,甚至无法拟合训练集,则需要选择一个新网络,比如包含有更多的隐层或者隐藏单元的网络、花费更多的时间去训练网络、或者尝试更加先进的优化算法,当然也可以完全采用另外一种全新的网络架构(虽然不一定真的有用),一般采用规模更大的神经网络都是有点用处的。just try!!!
最终都是要去解决偏差高的问题,反复尝试,直到数据拟合为止,至少必须拟合训练集。一般把偏差降到可以接受的程度之后,就可以开始检查方差(variance)有没有问题。评估方差,一般是查看验证集的性能,训练集的理想性能不能推断出验证集的表现性能也会理想。
如果方差高,最好的解决办法就是增加更多的数据,但一般数据是很难获得的,又或者可以采取正则化来减少过拟合。同样,也是需要反复尝试。但是如果在尝试的过程中,发现了一个更加合适的神经网络框架,那就很幸运了,可以同时减少方差和偏差。
最终的结果是形成的结果就是,方差和偏差都很低。以上都是存在顺序的。

注意:
1) 高偏差和高方差是两种完全不同的情况,后续处理的方式也可能完全不同。通常都是采用验证集来争端算法是否存在偏差或者方差问题,或者是两者都有问题。根据结果选择各自对应合适的方法不断尝试!!!
2) 关于偏差方差权衡的探讨问题,原因是我们可以尝试的方法有很多,可以增加偏差,减少方差,也可以两者都减少。在深度学习的早期,很难实现只减少一个而不影响另外一个。但是在当前深度学习和大数据时代,只要持续训练一个规模大的神经网络,以及准备更多的数据,当然还有其它情况。总的来说,采取正则化适度,然后采取更大的网络架构,就可以实现在不影响方差的同时减小偏差。而采用更多的数据,通常就可以在不过多影响偏差的同时,减少方差。

1.4 关于偏差和方差的调优方法

整理过一篇博客如下:
https://blog.csdn.net/qq_40896597/article/details/102895898

2、梯度消失、梯度爆炸

深度模型有关数值稳定性的典型问题是消失(vanishing)和爆炸(explosion)。
ElitesAI·动手学深度学习PyTorch版-第二次打卡task01

  • 随机初始化模型参数:

在神经网络中,通常需要随机初始化模型参数。下面我们来解释这样做的原因。

回顾多层感知机一节描述的多层感知机。为了方便解释,假设输出层只保留一个输出单元(删去和以及指向它们的箭头),且隐藏层使用相同的**函数。如果将每个隐藏单元的参数都初始化为相等的值,那么在正向传播时每个隐藏单元将根据相同的输入计算出相同的值,并传递至输出层。在反向传播中,每个隐藏单元的参数梯度值相等。因此,这些参数在使用基于梯度的优化算法迭代后值依然相等。之后的迭代也是如此。在这种情况下,无论隐藏单元有多少,隐藏层本质上只有1个隐藏单元在发挥作用。因此,正如在前面的实验中所做的那样,我们通常将神经网络的模型参数,特别是权重参数,进行随机初始化。

  • PyTorch的默认随机初始化

随机初始化模型参数的方法有很多。在线性回归的简洁实现中,我们使用torch.nn.init.normal_()使模型net的权重参数采用正态分布的随机初始化方式。不过,PyTorch中nn.Module的模块参数都采取了较为合理的初始化策略(不同类型的layer具体采样的哪一种初始化方法的可参考https://github.com/pytorch/pytorch/tree/master/torch/nn/modules),因此一般不用我们考虑。

  • Xavier随机初始化:
    还有一种比较常用的随机初始化方法叫作Xavier随机初始化。 假设某全连接层的输入个数为,输出个数为,Xavier随机初始化将使该层中权重参数的每个元素都随机采样于均匀分布
    ElitesAI·动手学深度学习PyTorch版-第二次打卡task01
    它的设计主要考虑到,模型参数初始化后,每层输出的方差不该受该层输入个数影响,且每层梯度的方差也不该受该层输出个数影响。

3、ModernRNN

RNN存在的问题:梯度较容易出现衰减或爆炸(BPTT);
门控循环神经⽹络:捕捉时间序列中时间步距离较⼤的依赖关系。
ElitesAI·动手学深度学习PyTorch版-第二次打卡task01

3.1 GRU

其实就是“捕获某种长期依赖效应”,并且保持。直至下一个依赖效应的到来,通过这个单元来决定是否更新这个依赖。途中还正好解决了梯度消失的问题。

''表示元素对应相乘,这里因为gammer_u永远不会等于1或者0。只是我们确定它要么为1要么为0,实际计算是不会等于0。也正是由于不会等于0的特性,在前向传播的过程中,保证gammer_u来确定从c(t)需不需要更新的一个门限单元,门限单元可以是非常非常小但是不为0的一个实数,也就总能保证前向传播的参数不会为0 ,也就不存在“梯度消失”的问题了。ElitesAI·动手学深度学习PyTorch版-第二次打卡task01
'
'表示元素对应相乘,这里因为gammer_u永远不会等于1或者0。只是我们确定它要么为1要么为0,实际计算是不会等于0。也正是由于不会等于0的特性,在前向传播的过程中,保证gammer_u来确定从c(t)需不需要更新的一个门限单元,门限单元可以是非常非常小但是不为0的一个实数,也就总能保证前向传播的参数不会为0 ,也就不存在“梯度消失”的问题了。

ElitesAI·动手学深度学习PyTorch版-第二次打卡task01
• 重置⻔有助于捕捉时间序列⾥短期的依赖关系;
• 更新⻔有助于捕捉时间序列⾥⻓期的依赖关系。

3.2 LSTM

长短期记忆long short-term memory :

  • 遗忘门:控制上一时间步的记忆细胞
  • 输入门:控制当前时间步的输入
  • 输出门:控制从记忆细胞到隐藏状态
  • 记忆细胞:⼀种特殊的隐藏状态的信息的流动
    ElitesAI·动手学深度学习PyTorch版-第二次打卡task01
    ElitesAI·动手学深度学习PyTorch版-第二次打卡task01

3.3 两种单元的比较

ElitesAI·动手学深度学习PyTorch版-第二次打卡task01
GRU:只有两个门,所以更简单,所以更容易,计算成本较低。也就更容易创建一个更大的网络。计算性能也好,运行也就更快。也更方便扩大模型的规模。
LSTM:因为三个门的存在,使得其更加强大和灵活。实际上出现得更早,运用得也比较广泛,很多人直接设置为default选择。