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

从零构建的Numpy实现神经网络输出与预期不符(XOR示例)

排查XOR神经网络训练异常的常见方向

1. 先确认数据集正确性

你的预期输出写的是[0,0,0,1],这和XOR的逻辑不符——XOR的正确目标输出应该是[[0],[1],[1],[0]](对应输入[[0,0],[0,1],[1,0],[1,1]]),先检查数据集是否匹配,这是最基础的问题。

2. 激活函数与导数实现

  • 如果用sigmoid作为激活,确保导数计算正确:直接用已计算的输出值推导,公式为sigma * (1 - sigma),避免重新计算sigmoid(x)导致的误差。
  • 输出层必须用sigmoid(或其他能输出0-1区间的激活),如果误用ReLU这类激活,最后输出无法逼近0/1的分类结果。

3. 损失函数与反向传播逻辑

  • 优先用交叉熵损失替代均方误差(MSE):sigmoid输出搭配交叉熵的梯度计算更稳定,不会出现饱和区梯度消失的问题。交叉熵的输出层误差直接是output - target,而MSE需要额外乘上sigmoid导数。
  • 反向传播的链式法则别搞混:
    • 隐藏层误差 = 输出层权重的转置 @ 输出层误差 × 隐藏层激活的导数
    • 矩阵维度必须匹配,比如输入是(4,2),隐藏层是(2,2),那权重矩阵是(2,2),转置后是(2,2),才能和输出层误差(4,2)做矩阵运算。

4. 权重与偏置初始化

  • 绝对不能用全零初始化:会导致神经元对称,无法学到差异化特征。推荐用:
    # Xavier初始化(适配sigmoid)
    weights_input_hidden = np.random.randn(2, 2) / np.sqrt(2)
    weights_hidden_output = np.random.randn(2, 1) / np.sqrt(2)
    
  • 偏置可以初始化为全零或小随机值,但必须在正向传播时加上,别漏写偏置项。

5. 训练参数调整

  • 学习率:试试0.1~0.5区间,太大容易梯度爆炸(损失飙升),太小会导致训练收敛极慢。
  • 训练轮次:XOR至少需要5000轮以上的迭代,别跑几百轮就停止。
  • 打印每轮损失:如果损失一直居高不下,说明梯度计算错误;如果损失波动大,调小学习率。

6. 代码细节检查

  • 矩阵乘法顺序:正向传播时是X @ weights + bias,不是weights @ X,维度不匹配会导致计算结果完全错误。
  • 权重更新方向:必须是weights -= learning_rate * gradient,写成加号会让损失越来越大。
  • 反向传播时的梯度平均:如果用全批次训练,偏置更新要对误差求均值,避免样本数量影响更新幅度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 05:22:07