深度学习是一个在给定的训练数据上优化一个给定的损失函数的过程。然而在真实应用中想要的并不是让模型尽量模拟训练数据的行为,而是希望通过训练出来的模型对未来的数据给出判断。模型在训练数据上的表现并不一定代表它在未知数据上的表现。而过拟合问题就是导致这个差距存在的一个很重要的因素。
所谓过拟合,指的是当一个模型过于复杂之后,它可以很好地“记忆”每一个训练数据中随机噪音的部分而忘记了要去“学习”训练数据中通用的趋势。
举一个极端的例子,如果一个模型中的参数比训练数据的总数还多,那么只要训练数据不冲突,这个模型完全可以记住所有训练数据的结果从而使得损失函数为 0 。可以直观地想象一个包含 n 个变量和 n 个等式的方程组,当方程不冲突时,这个方程组是可以通过数学的方法来求解的。
过度拟合训练数据中的随机噪音虽然可以得到非常小的损失函数,但是对于未知数据可能无法做出可靠的判断。
为了避免过拟合问题,一个非常常用的方法是正则化。正则化的思想就是在损失函数中加入刻画模型复杂程度的指标。假设用于刻画模型在训练数据上表现的损失函数为 J(θ) ,那么在优化时不是直接优化 J(θ) ,而是优化 J(θ) + λR(w) 。其中 R(w) 刻画的是模型的复杂程度,而 λ 表示模型复杂损失在总损失中的比例。注意这里 θ 表示的是一个神经网络中所有的参数,它包括边上的权重 w 和偏置项 b 。一般来说模型的复杂度只由权重 w 决定。
常用的刻画模型复杂度的函数 R(w) 有两种,一种是 L1 正则化,计算公式是:
另一种是 L2 正则化,计算公式是:
无论是哪一种正则化,基本的思想都是希望通过限制权重的大小,使得模型不能任意拟合训练数据中的随机噪音。但这两种正则化的方法有很大的区别。
首先 L1 正则化会让参数变得更稀疏,而 L2 正则化不会。所谓参数变得更稀疏是指会有更多的参数变为 0 ,这样可以达到类似特征选取的功能。之所以 L2 正则化不会让参数变得稀疏的原因是参数很小时,比如 0.001 ,这个参数的平方基本就可以忽略了,于是模型不会进一步将这个参数调整为 0 。
其次, L1 正则化的计算公式不可导,而 L2 正则化公式可导。因为在优化时需要计算损失函数的偏导数,所以对含有 L2 正则化损失函数的优化要更加简洁。优化带 L1 正则化的损失函数要更加复杂,而且优化方法也有很多种。
在实践中,也可以将 L1 正则化和 L2 正则化同时使用: