基于预训练嵌入的二分类神经网络初始损失异常如何排查?
问题解答
初始损失低于0.7的核心原因
常规二分类任务随机初始化后的初始损失约为0.693(即ln2),这个结论的前提是:输入为无区分度的随机特征,模型对两类样本的预测概率均接近0.5。
你当前的输入是预训练模型输出的embedding,本身已经携带了用于区分两类样本的语义信息,随机初始化的线性分类头天然就有一定的分类准确率,所以初始损失远低于0.7属于正常现象。
你贴的16组样本logits和标签可以直接验证这点:16个样本中仅有2个预测错误,其余14个样本的logits最大值对应的类别都和标签匹配,平均损失计算下来自然在0.4左右,和你打印的结果完全一致。
代码存在的可修复问题
- 缩进错误:你贴的代码片段中
ClassNet的forward方法内部的代码没有正确缩进,属于语法错误,实际运行需要先修正缩进。 - 入参缺失:
forward方法当前仅接收inputs参数,但内部直接调用了labels变量,属于严重的逻辑隐患,你能正常运行大概率是恰好调用了全局作用域的labels,后续很容易出现不可预期的错误,需要把labels加入forward的入参列表。 - 损失重复计算:你已经在
ClassNet的forward方法里计算了交叉熵损失,训练循环里不需要再用loss_fct二次计算,直接取outputs.loss用于反向传播即可,减少冗余计算。 - 损失打印逻辑错误:当前判断条件为
i % 2000 == 1,也就是每轮仅跑了2个batch就用累计损失除以2000计算平均值,输出的损失值完全失真,建议改成i % 2000 == 1999,或者调整打印逻辑保证平均值计算正确。
内容的提问来源于stack exchange,提问作者skidjoe
相关产品推荐
相关产品推荐

