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

CartPole问题神经网络输出偏差求助:随机初始化后输出均值偏离0.5

解决CartPole神经网络输出偏移的问题

嘿,我找到你问题的核心原因了!你在输出层重复应用了sigmoid激活函数,这直接导致了输出均值偏高到0.63左右。

让我仔细看你的代码:在forward方法的循环里,你已经对每一层(包括最后一层输出层)计算了sigmoid(z)并把结果存入layers数组了。但最后返回的时候,你又额外套了一次sigmoid——相当于输出层的结果被连续两次压缩到0-1区间。

举个直观的例子:如果第一次sigmoid后的输出均值是0.5(符合你的预期),经过第二次sigmoid后,结果就是sigmoid(0.5) ≈ 0.625,刚好和你观察到的0.63完全吻合!这就是为什么小车几乎从不向左移动的原因。

具体修复步骤

1. 去掉重复的sigmoid调用

这是最关键的一步,修改forward方法的返回值,直接返回最后一层的激活结果就行:

return layers[self.hiddenLayerCount + 1]

2. 优化权重初始化(可选,但能让模型更稳定)

你现在的权重都是0到1的随机数,结合-10到10的输入,第一层的加权和z很容易变得过大或过小,导致sigmoid进入饱和区(输出接近0或1),不利于后续的学习。推荐用Xavier初始化,它能让每层的输入输出方差保持一致:

# 初始化第一层权重(包含偏置神经元)
self.W.append(np.random.uniform(
    -1/np.sqrt(self.inputLayerSize + 1), 
    1/np.sqrt(self.inputLayerSize + 1), 
    (self.inputLayerSize + 1, self.hiddenLayerSize)
))
# 初始化隐藏层之间的权重
for _ in range(self.hiddenLayerCount - 1):
    self.W.append(np.random.uniform(
        -1/np.sqrt(self.hiddenLayerSize), 
        1/np.sqrt(self.hiddenLayerSize), 
        (self.hiddenLayerSize, self.hiddenLayerSize)
    ))
# 初始化输出层权重
self.W.append(np.random.uniform(
    -1/np.sqrt(self.hiddenLayerSize), 
    1/np.sqrt(self.hiddenLayerSize), 
    (self.hiddenLayerSize, self.outputLayerSize)
))

3. 简化或优化隐藏层结构(可选)

你用了3层隐藏层但每层只有1个神经元,这种结构其实和1层隐藏层1个神经元的表达能力差不多——因为多层单神经元的线性变换加sigmoid,本质上可以被单一层的sigmoid近似。如果想提升模型的能力,不如试试增加每层的神经元数量(比如每层8-16个),或者减少隐藏层的层数。

修复后的效果

做完第一步修复后,你会发现初始输出的均值会接近0.5,小车左右移动的次数会变得均衡,再也不需要手动减去0.1这种没有依据的“取巧”操作了。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:31:12