过拟合与欠拟合

机器学习的主要目的是从训练集上学习到数据的真实模型,从而能够在未见过的测试集上面也能够表现良好,这种能力称为泛化能力。

独立同分布假设

训练集和测试集都采样自某个相同的数据分布 p(x),采样到的样本是相互独立的,但是又来自于相同的分布

过拟合(Overfitting)

当模型的容量过大时,网络模型除了学习到训练集数据的模态之外,还把额外的观测误差也学习进来,导致学习的模型在训练集上面表现较好,但是在未见的样本上表现不佳(模型训练误差较低,训练准确率较高,但验证误差较高,验证准确率较低)

解决办法:重新设计网络模型的容量,如降低网络的层数、降低网络的参数量,添加假设空间的约束等

欠拟合(Underfitting)

当模型的容量过小时,模型不能够很好的学习到训练集数据的模态,导致训练集上表现不佳,同时在未见得样本上表现也不佳(训练集和验证集的误差都较高,准确率较低)

解决办法:增大网络的容量,如加深网络的层数、增加网络的参数量,尝试更复杂的网络结构

现代神经网络中过拟合现象非常容易出现,主要是因为神经网络的表达能力非常强,很容易就出现了神经网络的容量偏大的现象。

检测并抑制过拟合现象的方法:

  1. 数据集划分:切分为 训练集、验证集、测试集

    训练集用于训练模型参数,测试集用于测试模型的泛化能力

    但将数据集划分为 训练集与测试集是不够的,由于测试集的性能不能作为模型训练的反馈,而我们需要在模型训练时能够挑选出较合适的模型超参数,判断模型是否过拟合等,因此需要将训练集再次切分为 训练集和验证集,验证集用于选择模型的超参数

    验证集功能包括:

    • 根据验证集的性能表现来调整学习率,权值衰减系数,训练次数等
    • 根据验证集的性能表现来重新调整网络拓扑结构
    • 根据验证集的性能表现判断是否过拟合和欠拟合
  2. 提前停止

    训练集中的一个 Batch 运算更新一次叫做一个 step,对训练集的所有样本循环迭代一次叫做一个 Epoch。验证集可以在数次 Step 或 数次 Epoch 后使用。

    记录模型的验证准确率,并监控其变化,当发现验证准确率连续多个 Epoch 没有下降时,可以预测已经达到了最合适的 epoch 附近,从而提前终止训练。

  3. 设计合适的网络层数

  4. 正则化

    在损失函数上添加额外的参数稀疏性惩罚项

    用 𝛺(𝜃) 表示对网络参数 𝜃 的稀疏性约束函数,参数 𝜃 的稀疏性约束可通过约束参数 𝜃 的 𝐿 范数实现

    常用的正则化方式有 L0、L1、L2 正则化

    • L0 正则化

      采用 L0 范数作为稀疏性惩罚项,定义为 𝜃𝑖 中非零元素的个数。可以迫使网络中的连接权值大部分为 0,从而降低网络的实际参数量和网络容量,但由于其不可导,应用不多

    • L1 正则化

      采用 L1 范数作为稀疏性惩罚项,定义为张量 𝜃𝑖 中所有元素的绝对值之和,其连续可导,在神经网络中应用广泛

    • L2 正则化

      采用 L2 范数作为稀疏性惩罚项,定义为张量 𝜃𝑖 中所有元素的平方和的开平方,应用最广

  5. Dropout

    通过随机断开神经网络的连接,减少每次训练时实际参与计算的模型的参数量,但在测试时,Dropout 会恢复所有的连接,保证模型测试时获得更好的性能

    在 tensorflow 中有两种方式可以实现 Dropout 功能:

    # 添加 dropout 操作(rate 参数设置断开的概率值p)
    x = tf.nn.dropout(x, rate=0.5)
    # 添加 Dropout 层
    model.add(layers.Dropout(rate=0.5))
    
  6. 数据增强(Data Augmentation)

    指在维持样本标签不变的条件下,根据先验知识改变样本的特征,使得新产生的样本也符合或者近似符合数据的真实分布

posted @ 2020-05-18 10:51  -费费  阅读(166)  评论(0编辑  收藏  举报