当前位置: 首页 > 面试题库 >

训练回归网络时NaN损失

傅泉
2023-03-14
问题内容

我有一个“一键编码”(全1和全0)的数据矩阵,具有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)] )

但是,在训练过程中,我看到损失下降得很好,但是在第二个时期的中间,它就变成了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,尝试使用和不使用辍学,但都无济于事。我尝试使用较小的模型,即仅具有一个隐藏层,并且存在相同的问题(在不同的点它变得很困难)。但是,它确实具有较少的功能,即只有5列,并且给出了很好的预测。似乎有某种溢出,但我无法想象为什么-
损失根本不是不合理的大。

Python版本2.7.11,仅在CPU上的Linux机器上运行。我使用最新版的Theano进行了测试,并且我也得到了Nans,因此我尝试使用Theano
0.8.2并遇到了同样的问题。与最新版本的Keras具有相同的问题,并且也与0.3.2版本相同。


问题答案:

由于输出是无穷大的,因此难以使用神经网络进行回归,因此,您特别容易出现爆炸梯度问题(可能是nans的原因)。

从历史上看,爆炸梯度的一种关键解决方案是降低学习率,但是随着像Adam这样的每参数自适应学习率算法的出现,您不再需要设置学习率即可获得良好的性能。除非您是神经网络的恶魔并且知道如何调整学习时间表,否则几乎没有理由再使用SGD了。

您可以尝试以下操作:

  1. 通过分位数归一化或z评分对输出进行归一化。为严格起见,请根据训练数据而不是整个数据集计算此转换。例如,使用分位数归一化,如果示例位于训练集的第60个百分位数中,则其值为0.6。(您也可以将分位数归一化值向下移动0.5,以使第0个百分位数为-0.5,第100个百分位数为+0.5)。

  2. 通过增加辍学率或对权重添加L1和L2惩罚来增加正则化。L1正则化类似于特征选择,并且由于您说过将特征数减少到5可以提供良好的性能,因此L1也可以。

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

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



 类似资料:
  • 我正在尝试在Haskell中实现一个神经网络架构,并在MNIST上使用它。 我使用包来处理线性代数。我的培训框架是使用包构建的。 我的代码会编译,不会崩溃。但问题是,层大小(例如1000)、小批大小和学习速率的某些组合会在计算中产生值。经过一些检查,我看到极小的值()最终出现在激活中。但是,即使这种情况没有发生,训练仍然不起作用。它的损耗和精确度都没有改善。 我检查了一遍又一遍我的代码,我不知道问

  • 我有一个关于卷积神经网络()训练的问题。 我成功地使用tensorflow训练了一个网络,它获取一个输入图像(1600像素),然后输出三个匹配的类中的一个。 使用不同的培训课程测试网络,效果良好。然而当我给它一个不同的第四个图像(不包含任何经过训练的3个图像)时,它总是返回一个随机匹配到其中一个类。 我的问题是,如何训练网络来分类图像不属于这三个训练图像中的任何一个?类似的例子是,如果我针对mni

  • 在本章中,我们将了解可以使用TensorFlow框架实现的神经网络训练的各个方面。 以下几个建议,可以评估 - 1. 反向传播 反向传播是计算偏导数的简单方法,其中包括最适合神经网络的基本形式的合成。 2. 随机梯度下降 在随机梯度下降中,批处理是示例的总数,用户用于在单次迭代中计算梯度。到目前为止,假设批处理已经是整个数据集。最好的例子是谷歌规模; 数据集通常包含数十亿甚至数千亿个示例。 3.

  • 第 10 章介绍了人工神经网络,并训练了第一个深度神经网络。 但它非常浅,只有两个隐藏层。 如果你需要解决非常复杂的问题,例如检测高分辨率图像中的数百种类型的对象,该怎么办? 你可能需要训练更深的 DNN,也许有 10 层或更多,每层包含数百个神经元,通过数十万个连接相连。 这可不像公园散步那么简单,可能碰到下面这些问题: 你将面临棘手的梯度消失问题(或相关的梯度爆炸问题):在反向传播过程中,梯度

  • 第 10 章介绍了人工神经网络,并训练了我们的第一个深度神经网络。 但它是一个非常浅的 DNN,只有两个隐藏层。 如果你需要解决非常复杂的问题,例如检测高分辨率图像中的数百种类型的对象,该怎么办? 你可能需要训练更深的 DNN,也许有 10 层,每层包含数百个神经元,通过数十万个连接来连接。 这不会是闲庭信步: 首先,你将面临棘手的梯度消失问题(或相关的梯度爆炸问题),这会影响深度神经网络,并使较

  • 我们现在将学习如何训练神经网络。 我们还将学习Python深度学习中的反向传播算法和反向传递。 我们必须找到神经网络权重的最佳值,以获得所需的输出。 为了训练神经网络,我们使用迭代梯度下降法。 我们最初从权重的随机初始化开始。 在随机初始化之后,我们使用前向传播过程对数据的某个子集进行预测,计算相应的成本函数C,并将每个权重w更新为与dC/dw成比例的量,即成本函数的导数。重量。 比例常数称为学习