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

基于Numpy的深度学习:两种实现为何输出结果不同?

问题排查:两段MLP代码输出不一致的原因

两段代码输出不同的核心原因是输出层的激活处理不一致:

  1. 代码1的Percep.forward方法中,输出层直接返回线性计算结果:

    y = np.dot(self.h, self.W2) + self.b2
    return y
    

    也就是说,输出层没有经过sigmoid激活,返回的是原始的加权和。

  2. 代码2中,对输出层的加权和额外应用了sigmoid激活:

    v2 = np.dot(h1, mlp.W2)+ mlp.b2
    h2 = sigmoid(v2)  # 此处多了sigmoid激活步骤
    y= identify(h2)
    

另外需要注意,代码1的反向传播逻辑存在矛盾:

  • 反向传播中计算delta2 = error * (y_pred * (1 - y_pred)),这是sigmoid激活函数的导数公式,但forward过程中输出层并没有使用sigmoid,这会导致梯度计算错误,训练效果不佳。

如果想让两段代码输出一致,有两种修正方式:

  • 方式一:修改代码1的forward方法,让输出层也经过sigmoid激活:

    def forward(self, x):
        self.h = sigmoid(np.dot(x, self.W1) + self.b1)
        y = sigmoid(np.dot(self.h, self.W2) + self.b2)  # 添加sigmoid激活
        return y
    

    这样代码1的输出就和代码2一致,同时反向传播的梯度计算也能匹配输出层的激活函数。

  • 方式二:修改代码2,去掉输出层的sigmoid激活:

    v2 = np.dot(h1, mlp.W2)+ mlp.b2
    h2 = v2  # 直接使用线性计算结果
    y= identify(h2)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 03:23:23