1.1.3 神经网络的拟合能力和泛化能力
理论上来说,如果参数量足够大,一个两层的神经网络就具有拟合任何函数的能力,这便是所谓的万能近似定理(Universal Approximation Theorem)。若是输入和输出的函数特别复杂,模型无法拟合,可以通过增加第一层的神经元数目来提高模型的拟合能力。
如此简单的结构竟能拟合任意复杂的函数,读者们一定非常疑惑。其实道理并不复杂,只要第一层的神经元数目足够多,产生的特征f1维度足够大,中间层f1也可以通过直接记录输入、输出对应关系的方式进行拟合。但这种理论上的拟合能力只对训练数据集有效,对于不属于训练数据集的数据不一定有效。模型对新数据的拟合能力被称为模型的泛化(Generalization)能力。
为了评测模型在新数据上的精度表现,往往会额外建立一个验证数据集(Validation Set),它包含了训练集中没有的数据,专门用来评测模型的泛化能力。一般而言,80%的数据用来建立训练集,20%的数据用来建立验证集。工程师常常使用验证集来调整模型的超参数(Hyper-Parameters),所谓超参数是指模型的层数、每一层神经元的数目等需要自行定义的参数,这些参数无法通过训练获得。训练集用于优化模型的可训练参数,验证集用于优化模型的超参数。为了更严格地评测模型的泛化能力,有时还会提取约10%的数据建立测试集(Testing Set),测试集可以用于最终评估模型的性能。因为在训练和调整模型超参数时,验证集的反馈可能会对模型的泛化性能产生影响,因此,测试集是一个相对独立的数据集,用于验证模型的泛化性能,并确保模型能够良好地适应未知数据。
在机器学习中,模型对训练数据拟合良好却对验证数据拟合不佳的现象称为过拟合(Overfitting),顾名思义,过拟合是指模型对训练数据进行了过度的拟合,这种情况很可能是因为模型过于复杂。如图1-4所示,深色数据点是训练数据,浅色数据点是验证数据,深色曲线表示的模型完美地拟合了每一个训练数据点,却和验证样本相差甚远。浅色直线表示的模型虽然对训练数据拟合不完美,却能更好地拟合验证样本,泛化性也更强。
• 图1-4 过拟合
除了过拟合,还有欠拟合(Underfitting),需要拟合的函数很复杂,但模型太简单就会导致欠拟合。对于神经网络而言,欠拟合比较好解决,一旦观察到训练误差太大,可以通过增加层数或增加神经元数量来提升模型的拟合能力。前文也提到了,如果神经元数量增加到一定程度,甚至可以直接把训练数据集记录下来,达到完美的拟合效果。
但训练一个神经网络,目的并不是记录训练集,而是希望模型能从训练集中学习提取有价值的特征,从而具备对新数据的认知能力,也就是所谓的泛化能力。打个比方,如果读者想要训练一个神经网络来识别偶数,最终的目的是让神经网络学习到“能够被2整除的数字是偶数”这个特征,而不是让它把训练集里的偶数记下来。如果神经网络只是把训练集里的偶数记了下来,一旦出现了一个新的偶数,模型就失效了。简而言之,如果模型没有从训练集中学习到有意义的特征,只是简单地把训练集记下来,就是过拟合;对于参数量太少的模型,既没能学习到有意义的特征,也没能把训练集记下来,就是欠拟合。
在训练的过程中,每一次更新完成后都会记录模型的损失值,以监测模型的训练情况。模型在训练集上的损失值会越来越小,最后稳定在低位。模型在验证集上的表现就没有这么乐观了。一开始模型在验证集上的损失会变小,但经过了一个临界点之后,模型在验证集上的损失会变得越来越大,这就说明模型过拟合了。最终会保存那个在验证集上损失最小的模型。
在经过了过拟合临界点之后,我们已经得到了泛化性能最好的模型,那是不是就可以停止训练了?工程师们一度就是这么做的,这个技术称为提前停止(Early Stopping)。如图1-5中所示的虚线,经过了第一个过拟合点之后,模型在验证集上的损失越来越大,继续训练已经没有意义了,因此可以停止训练。然而一篇由OpenAI的研究人员发表于2019年的论文指出,神经网络会出现所谓“二次下降”(Double Descent)现象[1],也就是说,模型在验证集上的损失值短时间内似乎越来越大了,但随后又会变小,甚至比之前的最小值还要小。如图1-5中所示的深色实线表现的就是这个现象。考虑到这个特性,为了不要错失最优模型,一般会让训练持续到最后,然后选择整个训练过程中的最佳模型,而不是提前停止。
• 图1-5 深度神经网络的二次下降现象