Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在迭代过程中,损失不断增加_Python_Neural Network_Spacy_Loss Function - Fatal编程技术网

Python 在迭代过程中,损失不断增加

Python 在迭代过程中,损失不断增加,python,neural-network,spacy,loss-function,Python,Neural Network,Spacy,Loss Function,我只是对以下几点有点困惑: 我正在训练一个神经网络,让它把损失打印出来。我对它进行了4次迭代的训练,只是为了尝试一下,并使用批处理。我通常将损失函数视为抛物线,在抛物线中,损失将减少到最小值,然后再次增加。但随着迭代的进行,我的损失不断增加 例如,假设每个迭代中有100个批次。在迭代0中,损失从26.3(第0批)开始,上升到1500.7(第100批)。在迭代1中,它从2.4e-14开始,上升到80.8 我遵循spacy()中的一个示例。我是否应该在批次之间比较损失(即,如果我从所有批次0中提取点

我只是对以下几点有点困惑: 我正在训练一个神经网络,让它把损失打印出来。我对它进行了4次迭代的训练,只是为了尝试一下,并使用批处理。我通常将损失函数视为抛物线,在抛物线中,损失将减少到最小值,然后再次增加。但随着迭代的进行,我的损失不断增加

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


我遵循spacy()中的一个示例。我是否应该在批次之间比较损失(即,如果我从所有批次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)
“迭代”是范围内itn的外循环:
(n\u iter)
。从示例代码中,您还可以推断,
loss
在每次迭代中都会被重置。
nlp.update
调用实际上会增加每个调用中的相应损失,即它处理的每个
batch

因此,是的:对于您处理的每个批次,在迭代中损失都会增加。要检查您的模型是否真的在学习任何东西,您需要检查迭代过程中的损失,就像原始代码片段中的
print
语句仅在批处理循环后打印,而不是在批处理过程中打印一样


希望有帮助

注意,这里的损失是在训练集上测量的。所以,通常情况下,你不会看到它恢复(在初始下降之后),但它实际上会继续下降。这就是为什么理想情况下,您需要一个额外的开发/测试数据集来测量性能,以确定模型将开始过度拟合的点。开发数据与测试数据相同吗?我一直在spacy周围看到“发展”数据,但并不确切知道这意味着什么。谢谢,这肯定会把它弄清楚的!不客气!我个人建议至少使用3个单独的数据集:1个用于培训(
update
loop),1个用于“开发”(在培训期间测量性能,确定超参数,如迭代次数、批量大小等),1个用于实际的“测试”,即测试集是您只使用一次的集,在模型设计和培训的最后,确定模型的最终、真实的性能。因为它在训练集(因为训练过的权重)和开发集(因为超参数调整)上会被过度拟合,谢谢!但我只是对如何使用开发集来衡量培训期间的性能和基本上使用它感到困惑。您可以在打印培训损失时读取开发数据集,并将开发准确性与之一起打印。为此,可以使用
Language.evaluate()
,请参阅。