You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么我的二分类神经网络无法正确分类且梯度除首次外均为零

核心问题根因

你遇到的梯度消失、输出全为单类的问题,是全零权重初始化+softmax饱和特性共同导致的:

  • 你将权重W、偏置b全部初始化为0,第一次前向传播时两个类别的线性输出完全相同,经过softmax后每个类别的概率均为0.5。
  • 第一次梯度更新时,权重会被拉向当前batch占比更高的类别方向,高学习率会直接让softmax进入饱和区:所有样本的预测概率极度偏向其中一类,正确类别的预测概率几乎为0、错误类别几乎为1。
  • 饱和状态下softmax的输入变化不会改变输出分布,梯度直接变为0,后续所有迭代参数都不会更新,就出现了全部分类为单类的现象。每次训练时数据加载顺序不同,首次batch的类别占比有差异,就会出现第一次全识别为肉类、第二次全识别为鸡蛋的情况。

可直接落地的修复方案

  • 修改权重初始化方式,禁止全零初始化,改用小方差随机初始化:
# 替换原有全零初始化的代码
W = tf.Variable(tf.random.normal([196608, 2], mean=0.0, stddev=0.01, dtype=tf.float32))
b = tf.Variable(tf.random.normal([2], mean=0.0, stddev=0.01, dtype=tf.float32))

可选优化点

  • 降低学习率,当前0.25的学习率过高,极易一步让模型进入饱和区,建议调整为learning_rate=1e-4 ~ 1e-3区间
  • 数据读取部分设置固定seed参数,保证每次数据加载顺序一致,方便复现训练效果
  • 自定义交叉熵损失可除以batch size,避免损失量级随batch大小波动:
def cross_entropy(y_label, y_pred):
    return (-tf.reduce_sum(y_label * tf.math.log(y_pred + 1.e-10))) / tf.cast(tf.shape(y_label)[0], tf.float32)
  • 也可直接调用TensorFlow官方实现的交叉熵损失tf.keras.losses.CategoricalCrossentropy(),避免自定义实现的数值稳定性问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 04:45:04