首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的神经网络在第一个时期后仍停留在高损失值

为什么我的神经网络在第一个时期后仍停留在高损失值
EN

Stack Overflow用户
提问于 2019-12-03 16:51:42
回答 3查看 8.3K关注 0票数 5

我正在用神经网络做回归。对于神经网络来说,这应该是一个简单的任务,我有10个特征和1个输出,我想预测。我正在为我的项目使用pytorch,但我的模型学习得不好。损失从一个非常高的值(40000)开始,然后在最初的5-10个时代之后,损失迅速减少到6,000-7,000,然后它停留在那里,无论我做什么。我甚至尝试更改为skorch而不是pytorch,这样我就可以使用交叉验证功能,但这也没有帮助。我尝试了不同的优化器,并向网络中添加了层和神经元,但这没有帮助,它停留在6000,这是一个非常高的损失值。我在这里做回归,我有10个特征,我试图预测一个连续值。这应该很容易做到,这就是为什么它让我更困惑的原因。

这是我的网络:我在这里尝试了所有的可能性,从制作更复杂的架构,比如添加层和单元,到批量规范化,更改激活等。什么都没起作用

代码语言:javascript
复制
class BearingNetwork(nn.Module):
    def __init__(self, n_features=X.shape[1], n_out=1):
        super().__init__()
        self.model = nn.Sequential(

            nn.Linear(n_features, 512), 
            nn.BatchNorm1d(512),
            nn.LeakyReLU(),
            nn.Linear(512, 64),
            nn.BatchNorm1d(64),
            nn.LeakyReLU(),
            nn.Linear(64, n_out),
#             nn.LeakyReLU(),
#             nn.Linear(256, 128),
#             nn.LeakyReLU(),
#             nn.Linear(128, 64),
#             nn.LeakyReLU(),
#             nn.Linear(64, n_out)
        )

    def forward(self, x):
        out = self.model(x)
        return out

这里是我的设置:使用skorch比使用pytorch更容易。在这里,我还在监控R2指标,并将RMSE作为自定义指标来监控我的模型的性能。我也为Adam尝试了amsgrad,但没有帮助。

代码语言:javascript
复制
R2 = EpochScoring(r2_score, lower_is_better=False, name='R2')
explained_var_score = EpochScoring(EVS, lower_is_better=False, name='EVS Metric')
custom_score = make_scorer(RMSE)
rmse = EpochScoring(custom_score, lower_is_better=True, name='rmse')

bearing_nn = NeuralNetRegressor(

    BearingNetwork,
    criterion=nn.MSELoss,
    optimizer=optim.Adam,
    optimizer__amsgrad=True,
    max_epochs=5000,
    batch_size=128,
    lr=0.001,
    train_split=skorch.dataset.CVSplit(10),
    callbacks=[R2, explained_var_score, rmse, Checkpoint(), EarlyStopping(patience=100)],
    device=device

)

我还对输入值进行了标准化。

我的输入是这样的:

代码语言:javascript
复制
torch.Size([39006, 10])

输出的形状是:

代码语言:javascript
复制
torch.Size([39006, 1])

我使用128作为我的Batch_size,但我也尝试了其他值,如32、64、512甚至1024。虽然归一化输出不是必须的,但我也试过了,当我预测值时,它不起作用,损失很大。请有人在这方面帮助我,我将感谢每一个有用的建议。我还将添加我的训练和val损失的屏幕截图,以及历代的指标,以可视化损失如何在前5个时期减少,然后它将永远保持在值6000,这对于损失来说是一个非常高的值。

EN

回答 3

Stack Overflow用户

发布于 2019-12-03 18:26:30

考虑到您的训练和开发损失随着时间的推移而减少,看起来您的模型训练是正确的。关于您对培训和开发损失价值的担忧,这完全取决于您的目标值的规模(您的目标值有多大?)以及用于计算训练和开发损失的度量。如果你的目标值很大,而你想要更小的训练和发展损失值,你可以标准化目标值。

从我收集到的关于你的实验以及你的R2分数来看,你似乎在错误的领域寻找解决方案。在我看来,考虑到你的R2分数很低,你的功能似乎不够强大,这可能意味着你有数据质量问题。这也解释了为什么你的架构调优没有提高你的模型的性能,因为这不是你的模型的问题。因此,如果我是你,我会考虑我可以添加哪些新的有用的功能,看看这是否有帮助。在机器学习中,一般的规则是,模型的好坏取决于它们所训练的数据。我希望这能帮到你!

票数 2
EN

Stack Overflow用户

发布于 2019-12-10 11:37:50

您应该查看的度量是R^2,而不是损失函数的大小。损失函数的目的只是让优化器知道它是否走在正确的方向上--它不是一种在数据集和学习设置之间具有可比性的拟合度量。这就是R^2的用途。

您的R^2分数表明您解释了输出中约三分之一的总方差,对于只有10个特征的数据集来说,这通常是一个非常好的结果。实际上,考虑到你的数据的形状,你的隐藏层很可能比必要的要大得多,并且存在过度拟合的风险。

要真正评估这个模型,您需要知道(1) R^2得分与OLS等更简单的回归方法相比如何,以及(2)为什么您应该有信心认为输入变量应该捕获超过30%的输出方差。

对于#1,至少R^2不应该更糟。至于#2,请考虑规范的数字分类示例。我们知道识别数字所需的所有信息都非常准确(即R^2接近1),因为人类可以做到这一点。其他数据集不一定是这种情况,因为有一些重要的方差来源没有在源数据中捕获。

票数 1
EN

Stack Overflow用户

发布于 2019-12-12 13:44:09

当你的损失从40000减少到6000时,这意味着你的NN模型已经学习了流行关系,但不是所有的。您可以通过转换预测变量,然后将它们作为派生变量提供给您的模型来帮助学习,看看这是否有帮助。您可以尝试通过首先添加最有影响力的预测器来逐步向NN模型添加特征。在每次迭代中,评估模型的性能(即训练损失)。

如果第一步没有帮助,并且您愿意使用其他方法,那么假设您的数据动态,高斯过程回归或分位数回归应该会有所帮助,因为这些方法没有像线性回归技术这样的假设。此外,它还应该有助于探索自变量和因变量之间关系的不同方面。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59153248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档