铺垫了两节的内容,现在介绍本讲的主题:如何防止神经网络的过拟合,或者说如何给神经网络加正则化项?正如前文所说的有监督机器学习的核心公式——式(2.1),假设这里已经给神经网络采用了交叉熵损失函数作为第一项,现在需要给核心公式加上正则化项,假设加的是L2正则化项。如此一来,带正则化的交叉熵损失函数就变为如下形式。
不加正则化项的损失函数的神经网络对二分类数据训练的效果如图2.3所示,加L2正则化后的效果如图2.4所示。图2.3中红蓝两类有较多误分类点,分类决策边界也不够平滑,可见,不加正则化项的深度神经网络的训练结果存在着明显的过拟合现象,分类结果存在较大的误差。图2.4所示是加了正则化项的神经网络模型训练效果,相较于图2.3,图2.4中虽然也有一些误分类点,但是分类决策边界要平滑许多。
图2.3 不加正则化项的效果
图2.4 加L2正则化后的效果
除给损失函数加正则化项之外,神经网络还有自己独特的方法可以避免由过多的隐藏层带来的过拟合问题,这便是随机失活(Dropout)。从字面上理解,可以把它理解为丢弃、失活等含义,Dropout的真正含义是指在神经网络训练过程中,对所有神经元按照一定的概率进行消除的处理方式。在训练深度神经网络时,Dropout能够在很大程度上简化神经网络结构,防止神经网络过拟合。所以,从本质上来说,Dropout也是一种神经网络的正则化方法。
假设这里要训练一个三层(两个隐藏层)的神经网络,该神经网络存在着过拟合。于是使用Dropout方法来处理,Dropout为该网络每一层的神经元设定一个失活(Drop)概率,在神经网络训练过程中,会丢弃一些神经元节点,在网络图上则表示为该神经元节点的进出连线被删除,如图2.5(b)所示。最后会得到一个神经元更少、模型相对简单的神经网络,这样一来原先的过拟合情况就会大大得到缓解。这样说似乎并没有将Dropout正则化原理解释清楚,下面继续深入一下:为什么Dropout可以通过正则化发挥防止过拟合的作用?
图2.5 三层全连接网络及其Dropout
因为Dropout可以随时随机地丢弃任何一个神经元,神经网络的训练结果不会依赖于任何一个输入特征,每一个神经元都以这种方式进行传播,并为神经元的所有输入增加一点权重,Dropout通过传播所有权重产生类似于L2正则化收缩权重的平方范数的效果,这样的权重压缩类似于L2正则化的权值衰减,这种外层的正则化起到了防止过拟合的作用。
总体而言,Dropout的作用类似于L2正则化,但又有所区别。这里可以将Dropout理解为对神经网络中的每一个神经元加上一道概率流程,使得在神经网络训练时能够随机使某个神经元失效。需要注意的是,对于一个多层的神经网络,Dropout某层神经元的概率并不是一刀切的。对于不同神经元个数的神经网络层,可以设置不同的失活或保留概率;对于含有较多权值的层,可以选择设置较大的失活概率(较小的保留概率)。所以,总结起来就是如果你担心某些层所含神经元较多或比其他层更容易发生过拟合,那么可以将该层的失活概率设置得更高一些。与前面L2正则化一样,基于同样的数据对神经网络模型加上Dropout后的效果,如图2.6所示。
图2.6 加Dropout后的效果
可见,带有Dropout结构的神经网络模型的效果类似于L2正则化,二者同样可以防止神经网络过拟合。在实际的深度学习试验中,除L2正则化和Dropout之外,还可以通过对验证集效果进行监测来执行早停(Early Stopping)策略以防止过拟合。
当然,过拟合作为数据与生俱来的一种特性,几乎不可能完全避免,生产环境下数据脏、乱、差现象普遍,包含各种各样的噪声也在所难免。虽然不能完全避免过拟合,但是可以通过本讲所说的各种手段来缓解过拟合。历史的车轮滚滚向前,只要机器学习一直发展下去,与过拟合的斗争就会一直持续下去。
Dropout在原理上较为简单,但在具体实现上有诸多的细节问题需要注意。在实现Dropout时,通常不使用原始的实现方式,而是采用一种叫作Inverted Dropout的实现方法。查阅相关资料并手动实现Inverted Dropout的基本过程。