Pytorch_第八篇_深度学习 (DeepLearning) 基础 [4]---欠拟合、过拟合与正则化

深度学习 (DeepLearning) 基础 [4]---欠拟合、过拟合与正则化


Introduce

在上一篇“深度学习 (DeepLearning) 基础 [3]---梯度降低法”中咱们介绍了梯度降低的主要思想以及优化算法。本文将继续学习深度学习的基础知识,主要涉及:html

  • 欠拟合和过拟合
  • 正则化

如下均为我的学习笔记,如有错误望指出。git


欠拟合和过拟合

要理解欠拟合和过拟合,咱们须要先清楚一对概念,即误差和方差。
误差和方差是深度学习中很是有用的一对概念,尤为是能够帮助咱们理解模型的欠拟合和过拟合github

  • 误差:模型对于训练集的拟合能力,通俗理解来讲,误差表明模型可以正确预测训练集的程度(也就是说,模型在训练集上表现出的精度)。误差越高表明模型在训练集上的精度越低。
  • 方差:模型对于除训练集以外其余数据的预测能力,即泛化能力。通俗理解来讲,方差表明模型可以正确预测测试集的程度(也就是说,模型在测试集上表现出的精度)。方差越高表明模型在各测试集上的精度明显低于训练集上的精度。

理解了误差和方差的概念以后,那模型欠拟合和过拟合又是什么呢?算法

  • 欠拟合对应于高误差的状况,即模型不能很好地拟合训练数据,在训练集上的预测精度很低。以下图所示(蓝色线为预测的模型,能够发现并不能很好滴拟合训练数据):

  • 过拟合对应于高方差的状况,即模型虽然在训练集上的精度很高,可是在测试集上的表现确差强人意。这是因为模型过分拟合了训练集,将训练集特有的性质当成了全部数据集的通常性质,致使其在其余数据集上的泛化能力特别差。以下图所示(蓝色线为预测的模型,能够发现彷佛过分拟合了训练数据):网络

  • 正确模型的拟合曲线以下图所示(与上面欠拟合和过拟合的曲线图对比,能够更好地帮助咱们理解欠拟合和过拟合):架构

在理解了模型欠拟合和过拟合的概念以后,若是咱们在训练模型的过程当中遇到了这两类问题,咱们怎么解决呢?函数

  • 解决欠拟合学习

    (1) 使用更复杂的网络结构,如增长隐藏层数目,隐藏层结点数等。(由于神经网络若是层数和节点数足够的话,是能够模拟任何函数的测试

    (2) 训练更长时间,即增长神经网络模型的参数更新次数。(更新次数不够可能使得模型还没找到合适的参数使损失最小化,下降了模型精度优化

    (3) 使用其余更合适的神经网络架构,如前馈神经网络、卷积神经网络(CNN)、循环神经网络(RNN)、深度信念网络(DBN)等等(后续将进一步学习各类类型的神经网络);

  • 解决过拟合

    (1) 使用更多的训练数据。(如果咱们能把当前领域内全部的训练数据都拿来学习个够,那么咱们的模型还会在这个领域的数据上表现差吗?不可能的,对吧!

    (2) 为模型添加正则化模块 (regularization)。(对于正则化概念以及为何正则化能解决过拟合问题,在本文后续进行介绍

    (3) 使用其余更合适的神经网络架构。

对于以上策略通常的思考顺序,不管是欠拟合仍是过拟合,当咱们遇到了,都是优先考虑能不能使用上述中讲到的 (1) 和 (2) 来解决。若是不行的话再考虑 (3),由于重构一个神经网络的话相对于其余解决方法开销比较大。


正则化

直观理解:正则化是用来防止模型过拟合的一种方法,其作法是经过在模型损失函数中加入一项正则项,使得其在训练数据拟合损失和模型复杂度中达到一种权衡。

一般加入正则化的损失函数为以下形式:

\[loss = E_{loss} + {1\over \lambda}\sum_j|w_j|^q \]

其中第一项为模型本来的损失函数,第二项
为正则化项,w为权值参数矩阵。若q=1,则为咱们经常使用的L1正则化;若q=2,则为咱们经常使用的L2正则化。

理解了正则化概念以及加入正则化的损失函数的形式以后,回归到一个更重要的问题,即为何正则化可以防止模型过拟合呢?如下分别从三个角度来理解正则化在模型训练中的做用。

(1) 从模型拟合曲线的函数形式来看

为了回答上述问题,咱们须要先理解过拟合状况下学习出来的拟合函数是什么样子的。能够看到上述过拟合部分的拟合曲线图(emm,就是扭来扭去的那张),图中的数据点实际上只须要一个二次函数就可以很好拟合了可是从图中来看,过拟合状况下学习到的函数,确定是大于二次的高次函数了。 假设该过拟合获得的函数为p次函数,以下所示:

\[f = w_0 + w_1x + w_2x^2 + w_3x^3 + ... +w_px^p \]

实际上正确的拟合函数为二次函数,以下所示:

\[f = w_0 + w_1x + w_2x^2 \]

咱们能够发现,要是咱们可以更新权值参数w,使得w中的w0、w1和w2非0,而其他的权值均为0的话,咱们是能够获得一个可以比较好地拟合上述曲线的模型的。而正则化就是起到上述这个做用(让一些没必要要的权值参数为0),从而来防止模型过拟合的。

(2) 从神经网络模型的复杂度来看

如今回过头来看上述对于正则化的直观理解,里面有讲到模型复杂度,那模型复杂度是什么呀?咱们能够将其通俗理解成权值参数的个数,由于网络的权值参数越多表明着神经网络更庞大(拥有更多的层和更多的节点以及更多的边),天然而然模型就更复杂了(若是网络中某条边的权重w为0的话,那这条边不就没了嘛,那模型不就更简单一些了嘛,这就是正则化要作的事吧,以上为我的理解)。

(3) 从加了正则化项的损失函数来看

如今再来看上述加入正则化的损失函数的通常形式,第一项为本来的损失函数,第二项为正则化项。如下分为两点来进行分析

  • 假设没有添加正则化项的话,模型训练的结果会使得损失函数尽量小,也就是说使得模型拟合训练样本集的能力最大化,这就可能致使模型将训练样本集的一些特殊性质当成数据的广泛性质,使得模型泛化能力差,从而致使过拟合现象。
  • 假设添加了正则项,正则项起到什么做用了?首先咱们的目标是最小化损失函数,从某种程度上也须要最小化正则项,而由上述L一、L2正则项的形式来看,最小化正则项无非是把其中的某些不重要的权值参数wi设置为0,或者设置一个比较小的值。所以从这个层面上来理解,正则化也是经过将某些不重要权值参数设置为0来防止过拟合的。

须要说明的是:虽然L1正则化和L2正则化均可以防止模型过拟合,可是L1正则化相比于L2正则化会更容易产生稀疏权值矩阵(也就是说,权值矩阵中更多的权值为0)。至于缘由,因为我的能力问题,可能解释不太清楚,能够参考知乎问题--L1 相比于 L2 为何容易得到稀疏解?


本文参考-1

本文参考-2

本文参考-3

相关文章
相关标签/搜索