2016-04-03 48 views
1

我正在训练一个简单的前馈模型,每个(隐藏层+非线性)组合之间有3个或4个隐藏层和退出。 有时在几个时代(大约10-11)后,模型开始输出Infs和NaN作为NLL的误差,精度下降到0.0%。当我不使用退出时,这个问题不会发生。这是一个在Theano中退出的已知问题吗?我实现丢失的方式是:为什么Theano会在使用退出时抛出NaN?

def drop(self, input): 
    mask = self.theano_rng.binomial(n=1, p=self.p, size=input.shape, dtype=theano.config.floatX) 
    return input * mask 

其中输入是我们要应用丢失的特征向量。 我也观察到,如果失落概率(self.p)较高,则NaN的发生发生得更早。 p = 0.5会导致NaN出现在时期1或2附近,但是p = 0.7会导致NaN出现在时期10或11附近。 只有当隐藏层大小较大时才会发生NaN。例如(800,700,700)给出了NaN,而(500,500,500)则没有。

回答

0
以我的经验,NaN的

,训练网络通常是因为两个问题发生时:

  • 第一,数学错误,例如负值的日志。当你在损失函数中使用log()时可能会发生这种情况。
  • 其次,有一个值变得太大,所以python无法处理。

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

相关问题