我正在调试一个序列到序列模型,并故意尝试完美地过度拟合约 200 个样本(长度在 5-50 之间的句子对)的小数据集。我在 pytorch 中使用负对数似然损失。我得到的损失很低 (~1e^-5),但同一数据集上的准确率只有 33%。
我也在 3 个样本上训练了模型并获得了 100% 的准确率,但在训练过程中我出现了损失。我的印象是,如果预测标签和目标标签不匹配,负对数似然只会产生损失(损失位于 ~1e^-5 的同一区域)?
我的代码中可能存在错误吗?
最佳答案
您的代码中没有错误。
深度网络中通常的工作方式是网络预测logits(即对数似然)。然后使用 soft-max(或 sigmoid 函数)将这些 logits 转换为概率。最终根据预测的概率评估交叉熵。
这种方法的优点是数值稳定,并且易于训练。另一方面,由于 soft-max,你的预测永远不可能有“完美”的 0/1 概率:也就是说,即使你的网络具有完美的准确性,它也永远不会将概率 1 分配给正确的预测,而是“接近”到一个”。因此,损失将始终为正(尽管很小)。
关于nlp - 损失函数负对数似然给出损失,尽管完美的准确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62886651/