基于Numpy的深度学习:两种实现为何输出结果不同?
问题排查:两段MLP代码输出不一致的原因
两段代码输出不同的核心原因是输出层的激活处理不一致:
代码1的
Percep.forward方法中,输出层直接返回线性计算结果:y = np.dot(self.h, self.W2) + self.b2 return y也就是说,输出层没有经过sigmoid激活,返回的是原始的加权和。
代码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
相关产品推荐
相关产品推荐

