当我使用辍学时,为什么Theano会抛出NaN?

时间:2016-04-03 04:03:04

标签: python theano deep-learning

我正在训练一个简单的前馈模型,在每个(隐藏层+非线性)组合之间有3或4个隐藏层和丢失。 有时在几个纪元(大约10-11)之后,模型开始输出Infs和NaN作为NLL的误差,精度下降到0.0%。当我不使用dropouts时,不会发生此问题。这是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

其中input是我们要应用dropouts的feature-vector。 我还观察到,如果辍学概率(self.p)更高,则NaN的出现会更早发生。 p = 0.5会导致NaNs出现在1或2纪元附近,但p = 0.7会导致NaNs出现在10或11纪元附近。 此外,只有当隐藏的图层大小很大时才会出现NaN。例如(800,700,700)给出了NaN,而(500,500,500)没有。

1 个答案:

答案 0 :(得分:0)

根据我的经验,NaNs在训练网络时通常会因为两个问题而发生:

  • 首先,数学错误,例如负值记录。当您在损失函数中使用log()时可能会发生这种情况。
  • 其次,有一个值太大而python无法处理。

在你的情况下,从你的良好观察,我认为这是第二种情况。您的损失值可能会变得太大而无法通过python处理。尝试扩展网络时尝试初始化较小的权重。或者只是使用不同的方法来初始化权重,如Glorot (2010)He (2015)所述。希望它有所帮助。