3.9 dropout正则化
前面我们讨论过过拟合,即一个神经网络在一个特定类型的输入数据上的表现很好,但是在其他的数据上表现很差。可以克服这个问题的技巧是使用dropout正则化。
当一个神经网络正在训练时,每一个单独的神经元都会影响随后层的神经元。随着时间的推移,特别是在大型网络中,一些神经元会变得太过专业,在向下传播的过程中,可能会导致整个网络变得过于专业并导致过拟合。此外,相邻的神经元可能最终会有相似的权重和偏差,并且可以导致整个模型变得专门识别这些神经元所激活的特征。
考虑图3-21中的神经网络,各层分别有2、6、6和2个神经元。中间层的神经元可能最终会有非常相似的权重和偏差。
图3-21:一个简单的神经网络
在训练时,如果你想随机移除一些神经元并忽略它们,它们对下一层神经元的贡献就会被临时阻塞(见图3-22)。
图3-22:使用dropout的神经网络
这降低了神经元变得过于专业的概率。这个网络仍然会学习同样数量的参数,但是它可能更善于泛化,即它更能适应不同的输入。
dropout的概念是由Nitish Srivastava等人在2014年的论文“Dropout: A Simple Way to Prevent Neural Net works from Overfitting”(https://oreil.ly/673CJ)中提出的。
为了在TensorFlow中实现dropout,你可以使用一个简单的Keras层:
这会在指定的层随机丢掉指定百分比的神经元(这里是20%)。值得注意的是,可能需要一定实验才能找到适合你网络的正确百分比。
有一个简单的例子来证明这一点,考虑第2章中的Fashion MNIST分类器。我们更改网络定义来添加更多层:
训练了20个回合之后,会在训练集上达到94%的准确率,以及在验证集上达到88.5%的准确率。这是一个潜在的过拟合的指示。
在每一个密集层之后引入dropout:
当这个网络在同样的数据上训练了同样的时间后,在训练集上的准确率降低至89.5%。在验证集上的准确率几乎一样(88.3%)。这些值非常接近,因此dropout的引入不仅证明了过拟合是存在的,也证明了使用dropout可以帮助移除这样的歧义,来确保网络不会在训练数据上过于专业。
注意,在设计神经网络时,在训练数据上的好结果不一定是一件好事,这可能是过拟合的表现。引入dropout可以帮助你避免这个问题,这样你就可以在其他方面优化你的网络,而没有错误的安全感。