除了前一节介绍的权重衰减以外,深度学习模型常常使用丢弃法来应对过拟合问题。丢弃法有一些不同的变体。本节中提到的丢弃法特指倒置丢弃法(inverted dropout)。
2.6.1 方法
回忆一下,“多层感知机”一节的图中描述了一个单隐藏层的多层感知机。其中输入个数为4,隐藏单元个数为5,且隐藏单元(
)的计算表达式为
这里是激活函数,
是输入,隐藏单元
的权重参数为
,偏差参数为
。当对该隐藏层使用丢弃法时,该层的隐藏单元将有一定概率被丢弃掉。设丢弃概率为
,那么有
的概率
会被清零,有1-
的概率
会除以1-
做拉伸。丢弃概率是丢弃法的超参数。具体来说,设随机变量
为0和1的概率分别为
和1-
。使用丢弃法时我们计算新的隐藏单元
由于E(\xi_i) = 1-p,因此
即丢弃法不改变其输入的期望值。让我们对隐藏层呢个使用丢弃法,一种可能的结果如图2.6.1所示,其中和
被清零。这时输出值的计算不再依赖
和
,在反向传播时,与这两个隐藏单元相关的权重的梯度均为0。由于在训练中隐藏层神经单元的丢弃是随机的,即
中的任一个,从而在训练模型时起到正则化的作用,并可以用来应对过拟合。在测试模型时,我们为了拿到更加确定性的结果,一般不使用丢弃法。
图2.6.1 隐藏层使用了丢弃法的多层感知机
2.6.2 从零开始实现
根据丢弃法的定义,我们可以很容易地实现它。下面的dropout函数将以drop_prob的概率丢弃NDArray输入X中的元素。
我们运行几个例子来测试一下dropout函数。其中丢弃概率分别为0、0.5和1。
定义模型参数
实验中,我们依然使用“softmax回归的从零开始实现”一节中介绍的Fashion-MNIST数据集。我们将定义一个包含两个隐藏层的多层感知机,其中两个隐藏层的输出个数都是256。
定义模型
下面定义的模型将全连接层和激活函数ReLU串起来,并对每个激活函数的输出使用丢弃法。我们可以分别设置各个层的丢弃概率。通常的建议是把靠近输入层的丢弃概率设得小一点。在这个实验中,我们把第一个隐藏层的丢弃概率设为0.2,把第二个隐藏层的丢弃概率设为0.5。我们可以通过“自动求梯度”一节中介绍的`is_training`函数来判断运行模式为训练还是测试,并只需在训练模式下使用丢弃法。
训练和测试模型
这部分与之前多层感知机的训练和测试类似。
2.6.3 简洁实现
在Gluon中,我们只需要在全连接层后添加Dropout层并指定丢弃概率。在训练模型时,Dropout层将以指定的丢弃概率随机丢弃上一层的输出元素;在测试模型时,Dropout层并不发挥作用。
下面训练并测试模型