损失在迭代中不断增加

Losses keep increasing within iteration

我只是对以下内容有点困惑: 我正在训练一个神经网络并让它打印出损失。我正在对其进行超过 4 次迭代的训练,只是为了尝试一下,并使用批次。我通常将损失函数视为抛物线,其中损失会在再次增加之前减少到最低点。但是随着迭代的进行,我的损失不断增加。

例如,假设每次迭代有 100 个批次。在迭代 0 中,损失从 26.3(批次 0)开始上升到 1500.7(批次 100)。在第 1 次迭代中,它从 2.4e-14 开始,上升到 80.8。

我正在关注来自 spacy (https://spacy.io/usage/examples#training-ner) 的示例。我是否应该比较跨批次的损失(即,如果我从所有批次 0 中获取点,它应该类似于抛物线)?

如果您使用的代码与链接的代码完全相同,则此行为是可以预料的。

for itn in range(n_iter):
        random.shuffle(TRAIN_DATA)
        losses = {}
        # batch up the examples using spaCy's minibatch
        batches = minibatch(TRAIN_DATA, size=compounding(4.0, 32.0, 1.001))
        for batch in batches:
            texts, annotations = zip(*batch)
            nlp.update(
                texts,  # batch of texts
                annotations,  # batch of annotations
                drop=0.5,  # dropout - make it harder to memorise data
                losses=losses,
            )
        print("Losses", losses)

一个"iteration"是外循环:for itn in range(n_iter)。从示例代码中,您还可以推断出 losses 每次迭代都会被重置。 nlp.update 调用实际上会在每次调用中增加适当的损失,即它处理的每个 batch

所以是的:对于您处理的每个批次,损失在迭代中增加。要检查您的模型是否真的在学习任何东西,您需要检查迭代之间的损失,类似于原始代码片段中的 print 语句仅在循环批处理后打印,而不是在循环期间打印。

希望对您有所帮助!