天天看点

神经网络的过拟合问题以及L1、L2正则化

所谓过拟合,指的是当一个模型过为复杂之后,它可以很好的“记忆”每一个训练数据中随机噪音的部分而忘记了要去“学习”训练数据中通用的趋势。

举一个极端的例子,如果一个模型的参数比训练数据的总说还多,那么只要训练数据不冲突,这个模型完全可以记住所有训练数据的结果从而使得损失函数为0。然而,过度拟合训练数据中的随机噪音虽然可以得到非常小的损失函数,但是对于未知数据可能无法做出可靠的判断。

下图显示了模型训练的三种不同情况。分别展示了模型欠拟合、just right、以及模型过拟合。

神经网络的过拟合问题以及L1、L2正则化

为了避免过拟合问题,一个常用的方法就是正则化。简单而言,正则化的思想就是在损失函数中假如刻画模型复杂程度的指标。通俗点说,假设损失函数为J(θ),那么在优化时不仅仅优化J(θ),而是优化J(θ)+λR(w),其中R(w)刻画的是模型的复杂程度,而λ表示模型复杂损失在总损失中的比例。这里θ表示的是一个神经网络中所有的参数,包括权重w和偏置项b。一般而言模型的复杂度只由权重w决定。

神经网络中常用的正则化方法和一般机器学习的正则化类似,有两种,一种是L1正则化,计算公式为

神经网络的过拟合问题以及L1、L2正则化

另一种是L2正则化,计算公式是:

神经网络的过拟合问题以及L1、L2正则化

无论以上哪一种正则化方式,基本的思想都是希望通过限制权重的大小,使得模型不能任意拟合训练数据中的随机噪声。但是这两种正则化的方法有很大区别。首先,L1正则化会让参数变得稀疏,而L2正则化不会。所谓参数变得更加稀疏是指会有更多的参数变成0,这样可以达到类似特征选取的功能。下图解释了L1会让参数变得稀疏的原因,从上到下依次为L1正则化、L2正则化。

神经网络的过拟合问题以及L1、L2正则化
神经网络的过拟合问题以及L1、L2正则化

其次,L1正则化的计算公式不可导,而L2正则化公式可导,因为在优化时需要计算损失函数的偏导数,所以对含有L2正则化损失函数的优化要更加简洁,优化带有L1正则化的损失函数要更加复杂。在实践中,也可以将L1正则化和L2正则化同时使用:

神经网络的过拟合问题以及L1、L2正则化

在TensorFlow中,

L1正则:

tf.contrib.layers.l1_regularizer(scale, scope=None)

L2正则:

tf.contrib.layers.l2_regularizer(scale, scope=None)

L1正则和L2正则同时使用:

tf.contrib.layers.l1_l2_regularizer(scale_l1=1.0, scale_l2=1.0, scope=None)

以下代码给出了使用这两个函数的样例,其中λ取0.5:

神经网络的过拟合问题以及L1、L2正则化

在简单神经网络中,这样的方式就可以很好的计算带有正则化的损失函数了。

继续阅读