You need to enable JavaScript to run this app. 仅含线性层的二分类神经网络为何训练失效、始终预测同一类别?
优惠活动
大模型
产品
解决方案
定价
更多

仅含线性层的二分类神经网络为何训练失效、始终预测同一类别?

问题原因
  1. 损失函数与输出层逻辑冲突:PyTorch的nn.CrossEntropyLoss()内部已经集成了log_softmax计算与负对数似然损失计算,要求输入为未经过概率归一化的原始logits。你在模型forward阶段主动执行了F.softmax,会让输出概率被压缩到0-1区间,输入交叉熵损失后梯度会被极度压缩,导致模型参数几乎无法更新,是训练不收敛的核心原因。
  2. 输入特征未做标准化预处理:你的数据集同时包含分类变量和连续变量,不同特征的数值范围差异极大,未做归一化会导致训练过程梯度震荡,无法收敛到最优解。
  3. 类别不平衡影响:数据集正负样本比例为4:1,模型只需要全部预测占比更高的0类就能拿到80%的基础准确率,没有额外约束的情况下模型不会主动学习少数类的特征。
  4. 网络结构与输入维度不匹配:输入特征只有7维,你使用了512、256等超大的隐藏层维度,参数冗余度极高,小样本场景下很容易出现训练停滞或者过拟合问题。
优化方案
  • 首先修复损失与输出层的匹配问题,二选一即可:
    方案1:直接去掉forward中的softmax操作,返回原始logits:
    def forward(self,inputs):
        pred= self.to_class(inputs)
        return pred
    
    方案2:改用更适配二分类的输出结构,将最后一层输出维度改为1,搭配nn.BCEWithLogitsLoss()损失:
    # 修改网络最后一层为 nn.Linear(32,1)
    def forward(self,inputs):
        pred= self.to_class(inputs)
        return pred.squeeze(-1)
    # 损失函数替换为 loss_func = nn.BCEWithLogitsLoss()
    # 预测时输出值大于0即可判定为1类
    
  • 预处理输入特征:连续特征做Z-score标准化(减去均值除以标准差),分类特征做独热编码或者规范化的标签编码,保证所有输入特征的数值范围在同一区间内。
  • 适配类别不平衡场景:
    可以在损失函数中添加类别权重,比如nn.CrossEntropyLoss(weight=torch.tensor([1.0,4.0])),给少数类1更高的损失权重;也可以在数据采样阶段对少数类做过采样;训练时不要仅用准确率作为监控指标,改用F1-score、召回率等更适配不平衡数据的指标。
  • 简化网络结构:7维输入不需要过大的隐藏层,建议调整为16-32维的小隐藏层即可,比如:
    self.to_class=nn.Sequential(
    nn.Linear(input_size,32),
    nn.ReLU(),
    nn.Linear(32,16),
    nn.ReLU(),
    nn.Linear(16,2)
    )
    
  • 额外调优建议:可加入dropout层避免过拟合,训练过程中同时监控验证集指标,若收敛速度过慢可适当调整学习率或者添加学习率衰减策略。

内容的提问来源于stack exchange,提问作者ryszard eggink

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 08:18:04