gpt4 book ai didi

python - 训练回归网络时的 NaN 损失

转载 作者:IT老高 更新时间:2023-10-28 20:35:51 29 4
gpt4 key购买 nike

我有一个具有 260,000 行和 35 列的“单热编码”(全一和零)数据矩阵。我正在使用 Keras 训练一个简单的神经网络来预测一个连续变量。制作网络的代码如下:

model = Sequential()
model.add(Dense(1024, input_shape=(n_train,)))
model.add(Activation('relu'))
model.add(Dropout(0.1))

model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.1))

model.add(Dense(256))
model.add(Activation('relu'))
model.add(Dropout(0.1))
model.add(Dense(1))

sgd = SGD(lr=0.01, nesterov=True);
#rms = RMSprop()
#model.compile(loss='categorical_crossentropy', optimizer=rms, metrics=['accuracy'])
model.compile(loss='mean_absolute_error', optimizer=sgd)
model.fit(X_train, Y_train, batch_size=32, nb_epoch=3, verbose=1, validation_data=(X_test,Y_test), callbacks=[EarlyStopping(monitor='val_loss', patience=4)] )

但是,在训练过程中,我看到损失很好地减少了,但是在第二个 epoch 的中间,它转到了 nan:

Train on 260000 samples, validate on 64905 samples
Epoch 1/3
260000/260000 [==============================] - 254s - loss: 16.2775 - val_loss:
13.4925
Epoch 2/3
88448/260000 [=========>....................] - ETA: 161s - loss: nan

我尝试使用 RMSProp 而不是 SGD,我尝试使用 tanh 而不是 relu,我尝试使用 and没有辍学,一切都无济于事。我尝试了一个较小的模型,即只有一个隐藏层,同样的问题(它在不同的点变成了 nan)。但是,它确实适用于较少的特征,即如果只有 5 列,并且给出了相当好的预测。似乎有某种溢出,但我无法想象为什么——损失一点也不大。

Python 版本 2.7.11,在 linux 机器上运行,仅 CPU。我用最新版本的 Theano 测试了一下,也得到了 Nans,所以我尝试去 Theano 0.8.2 也遇到了同样的问题。用最新版的 Keras 也有同样的问题,而且用的是 0.3.2 版本。

最佳答案

神经网络的回归很难发挥作用,因为输出是无限的,所以你特别容易出现 exploding gradients problem (nans的可能原因)。

从历史上看,爆炸梯度的一个关键解决方案是降低学习率,但随着像 Adam 这样的按参数自适应学习率算法的出现,您不再需要设置学习率来获得良好的性能。除非您是神经网络爱好者并且知道如何调整学习计划,否则几乎没有理由再使用 SGD 和动量。

您可以尝试以下一些方法:

  1. 通过 quantile normalizing 标准化你的输出或 z scoring .严格地说,在训练数据上计算这种转换,而不是在整个数据集上。例如,对于分位数归一化,如果一个示例位于训练集的第 60 个百分位,则它的值为 0.6。 (您也可以将分位数归一化值下移 0.5,使第 0 个百分位为 -0.5,第 100 个百分位为 +0.5)。

  2. 添加正则化,可以通过增加 dropout 率或在权重中添加 L1 和 L2 惩罚。 L1 正则化类似于特征选择,既然你说将特征数量减少到 5 个可以提供良好的性能,那么 L1 也可以。

  3. 如果这些仍然没有帮助,请缩小网络规模。这并不总是最好的主意,因为它会损害性能,但在您的情况下,相对于输入特征 (35),您有大量的第一层神经元 (1024),因此它可能会有所帮助。

  4. 将批量大小从 32 增加到 128。128 是相当标准的,可能会增加优化的稳定性。

关于python - 训练回归网络时的 NaN 损失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37232782/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com