📜  神经网络中的辍学(1)

📅  最后修改于: 2023-12-03 14:56:32.289000             🧑  作者: Mango

神经网络中的辍学

在神经网络中,辍学(Dropout)是一个被广泛使用的技术,它可以使得神经网络对于噪声和过拟合变得更加鲁棒。本文将介绍什么是辍学,为什么需要辍学,以及如何在神经网络中实现辍学。

什么是辍学

辍学是指在训练神经网络时,随机从网络中删除一些神经元。具体来说,我们会在每一次训练迭代中,随机选择一些神经元,然后将它们的输出设为零。这样做的效果就好比我们是将整个神经网络中的一部分神经元“辍学”了。

辍学可以帮助我们减少神经网络中的过拟合问题。过拟合是指模型在训练数据上表现得很好,但是在测试集上表现很差。为了避免过拟合,我们需要给神经网络加上一些限制。辍学就是其中一个方法。

为什么需要辍学

神经网络在训练的过程中,往往会发生过拟合的问题。简单来说,过拟合就是训练集上的表现很好,而在测试集上表现不佳。过拟合是因为模型在训练集上过度拟合,以致无法泛化到新的数据。

过拟合的现象很大程度上是由于神经网络中的参数太多而引起的。如果我们约束网络的参数,就可以避免或减轻过拟合的现象。在神经网络中,辍学就是一种参数约束的方法。

如何实现辍学

实现辍学的方法,一般有两种:全局辍学和局部辍学。

全局辍学

全局辍学即是在整个神经网络中,随机删除一些神经元。这个方法比较容易理解和实现。全局辍学的具体做法如下:

  • 随机选择 $p$ 个神经元;
  • 删除这 $p$ 个神经元,即将其输出设为零;
  • 残差传输(Residual Connection):将所有的神经元输出乘以 $\frac{1}{1-p}$。

全局辍学的代码实现如下:

class Dropout(nn.Module):
    def __init__(self, p=0.5):
        super().__init__()
        self.p = p
    
    def forward(self, x):
        if not self.training:
            return x
        mask = torch.bernoulli(torch.ones_like(x) * (1 - self.p))
        return mask * x / (1 - self.p)
局部辍学

局部辍学即是在网络的每一层中,随机删除一些神经元。这个方法比较复杂。局部辍学的具体做法如下:

  • 在每一层的前向传播中,随机选择 $p_i$ 个神经元;
  • 删除这 $p_i$ 个神经元,即将其输出设为零;
  • 残差传输(Residual Connection):将所有的神经元输出乘以 $\frac{1}{1-p_i}$。

局部辍学的代码实现如下:

class LocalDropout(nn.Module):
    def __init__(self, p=0.5):
        super().__init__()
        self.p = p
    
    def forward(self, x):
        if not self.training:
            return x
        h = x
        for i in range(x.size(1)):
            mask = torch.bernoulli(torch.ones_like(x[:, i:i+1]) * (1 - self.p))
            h[:, i:i+1] = mask * h[:, i:i+1] / (1 - self.p)
        return h
结论

辍学技术是神经网络中广泛使用的一种技术,它可以帮助我们解决神经网络中的过拟合问题。在实际应用中,我们可以根据需要选择全局辍学或局部辍学。