为什么 Theano 在我使用 dropout 时会抛出 NaN?
Why does Theano throw NaNs when I use dropouts?
我正在训练一个简单的前馈模型,其中包含 3 或 4 个隐藏层和每个(隐藏层 + 非线性)组合之间的丢失。
有时在几个 epoch(大约 10-11)之后,模型开始输出 Infs 和 NaNs 作为 NLL 的误差并且准确度下降到 0.0%。当我不使用辍学时,不会发生这个问题。这是 Theano 中辍学的已知问题吗?我实现辍学的方式是:
def drop(self, input):
mask = self.theano_rng.binomial(n=1, p=self.p, size=input.shape, dtype=theano.config.floatX)
return input * mask
其中输入是我们要应用 dropout 的特征向量。
我还观察到,如果 dropout 概率 (self.p) 较高,则 NaN 的出现会更早。 p = 0.5 会导致 NaN 出现在 epoch 1 或 2 左右,而 p = 0.7 会导致 NaN 出现在 epoch 10 或 11 附近。
此外,NaN 的出现仅在隐藏层尺寸较大时才会发生。例如 (800,700,700) 给出 NaN,而 (500,500,500) 不给出。
根据我的经验,训练网络时出现 NaN 通常是因为两个问题:
- 首先,数学错误,例如负值的日志。当您在损失函数中使用 log() 时,可能会发生这种情况。
- 其次,有一个值变得太大,python无法处理。
你的情况,从你的观察来看,我认为是第二种情况。您的损失值可能变得太大而无法由 python 处理。当您尝试扩展网络时,请尝试初始化较小的权重。或者只是使用不同的方法来初始化权重,如 Glorot (2010) or He (2015) 所解释的那样。希望对你有帮助。
我正在训练一个简单的前馈模型,其中包含 3 或 4 个隐藏层和每个(隐藏层 + 非线性)组合之间的丢失。 有时在几个 epoch(大约 10-11)之后,模型开始输出 Infs 和 NaNs 作为 NLL 的误差并且准确度下降到 0.0%。当我不使用辍学时,不会发生这个问题。这是 Theano 中辍学的已知问题吗?我实现辍学的方式是:
def drop(self, input):
mask = self.theano_rng.binomial(n=1, p=self.p, size=input.shape, dtype=theano.config.floatX)
return input * mask
其中输入是我们要应用 dropout 的特征向量。 我还观察到,如果 dropout 概率 (self.p) 较高,则 NaN 的出现会更早。 p = 0.5 会导致 NaN 出现在 epoch 1 或 2 左右,而 p = 0.7 会导致 NaN 出现在 epoch 10 或 11 附近。 此外,NaN 的出现仅在隐藏层尺寸较大时才会发生。例如 (800,700,700) 给出 NaN,而 (500,500,500) 不给出。
根据我的经验,训练网络时出现 NaN 通常是因为两个问题:
- 首先,数学错误,例如负值的日志。当您在损失函数中使用 log() 时,可能会发生这种情况。
- 其次,有一个值变得太大,python无法处理。
你的情况,从你的观察来看,我认为是第二种情况。您的损失值可能变得太大而无法由 python 处理。当您尝试扩展网络时,请尝试初始化较小的权重。或者只是使用不同的方法来初始化权重,如 Glorot (2010) or He (2015) 所解释的那样。希望对你有帮助。