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

  • 训练误差(training error)和泛化误差(generalization error)。
    通俗来讲,前者指模型在训练数据集上表现出的误差,后者指模型在任意一个测试数据样本上表现出的误差的期望,并常常通过测试数据集上的误差来近似。计算训练误差和泛化误差可以使用之前介绍过的损失函数,例如线性回归用到的平方损失函数和softmax回归用到的交叉熵损失函数。机器学习模型应关注降低泛化误差。
  • K折交叉验证。
    由于验证数据集不参与模型训练,当训练数据不够用时,预留大量的验证数据显得太奢侈。一种改善的方法是K折交叉验证(K-fold cross-validation)。在K折交叉验证中,我们把原始训练数据集分割成K个不重合的子数据集,然后我们做K次模型训练和验证。每一次,我们使用一个子数据集验证模型,并使用其他K-1个子数据集来训练模型。在这K次训练和验证中,每次用来验证模型的子数据集都不同。最后,我们对这K次训练误差和验证误差分别求平均。
  • 过拟合和欠拟合。
    一类是模型无法得到较低的训练误差,我们将这一现象称作欠拟合(underfitting),通常由于模型复杂度不够产生,可增加复杂度或换更复杂的模型;另一类是模型的训练误差远小于它在测试数据集上的误差,我们称该现象为过拟合(overfitting),通常由于训练样本太少,可增加训练样本或使用权重衰减或者丢弃法调节。
  • 权重衰减。
    权重衰减等价于sklearn 与python版本对应 sklearn pytorch区别_数据集范数正则化(regularization)。正则化通过为模型损失函数添加惩罚项使学出的模型参数值较小,是应对过拟合的常用手段。sklearn 与python版本对应 sklearn pytorch区别_数据集范数正则化在模型原损失函数基础上添加sklearn 与python版本对应 sklearn pytorch区别_数据集范数惩罚项,从而得到训练所需要最小化的函数。sklearn 与python版本对应 sklearn pytorch区别_数据集范数惩罚项指的是模型权重参数每个元素的平方和与一个正的常数的乘积。sklearn 与python版本对应 sklearn pytorch区别_数据集范数正则化令权重sklearn 与python版本对应 sklearn pytorch区别_权重_06先自乘小于1的数,再减去不含惩罚项的梯度。因此,sklearn 与python版本对应 sklearn pytorch区别_数据集范数正则化又叫权重衰减。权重衰减通过惩罚绝对值较大的模型参数为需要学习的模型增加了限制,这可能对过拟合有效。
  • 丢弃法。
    当对某一隐藏层使用丢弃法时,该层的隐藏单元将有一定概率被丢弃掉。丢弃法不改变其输入的期望值。在测试模型时,我们为了拿到更加确定性的结果,一般不使用丢弃法。

梯度消失、梯度爆炸

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

循环神经网络进阶

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

  • GRU
    ⻔控循环神经⽹络:捕捉时间序列中时间步距离较⼤的依赖关系。重置⻔有助于捕捉时间序列⾥短期的依赖关系; 更新⻔有助于捕捉时间序列⾥⻓期的依赖关系。
  • LSTM
    长短期记忆long short-term memory :
    遗忘门:控制上一时间步的记忆细胞 输入门:控制当前时间步的输入。
    输出门:控制从记忆细胞到隐藏状态。
    记忆细胞:⼀种特殊的隐藏状态的信息的流动。
  • 深度循环神经网络
    pytorch中调用nn.LSTM并修改参数num_layers=2或更多,视实验效果而定。
  • 双向循环神经网络
    NLP中常用模型,可兼顾之前以及之后的信息,实际使用视实验效果而定。