我在处理CartPole问题时遇到了困难。
Cart的输入可以是0或1
;要么向左移动,要么向右移动。
假设我们有一个网络,具有4个输入
加上偏置
,3个隐藏层
每个层有1个神经元
和1个输出
;所有权重都是在0和1
之间的随机浮点数
,输入也将是-10和10
之间的随机浮点数
。
因为我选择了一切都是随机的,我天然地期望输出的平均值大约是0.5
,并且推车向右移动的次数和向左移动的次数一样多。
实际情况并非如此;我平均得到0.63
。这导致了大问题,因为推车从不决定向左移动。这似乎取决于每隐藏层的neurons数量。
class NeuralNetwork(object): def __init__(self): self.inputLayerSize = 4 self.hiddenLayerCount = 3 self.hiddenLayerSize = 1 self.outputLayerSize = 1 #Initialize weights self.W = [] self.W.append(np.random.rand(self.inputLayerSize + 1, self.hiddenLayerSize)) for _ in range(self.hiddenLayerCount - 1): self.W.append( np.random.rand(self.hiddenLayerSize, self.hiddenLayerSize)) self.W.append( np.random.rand(self.hiddenLayerSize, self.outputLayerSize)) def forward(self, data): layers = [] data = np.append(data, [1]) #ADD BIAS layers.append(data) for h in range(self.hiddenLayerCount + 1): z = np.dot( layers[h], self.W[h] ) a = sigmoid(z) layers.append(a) return sigmoid( layers[self.hiddenLayerCount + 1] )
我通过从输出
中减去0.1
来解决这个问题,但这显然是作弊;我没有看到使用0.1
作为某种魔法数字的数学理由。
我认为我处理问题的方式不对,或者我的代码有些混乱。任何帮助将不胜感激!
回答:
你的神经网络至少有一个问题会使你的结果概率出现偏差:模型输出是最后一层的sigmoid
,而它本身也是一个sigmoid
。
这意味着你的logit(即原始分数)在[0, 1]
范围内,因此最终的概率是在[0, 1]
范围内计算的,而不是[-inf, inf]
。
正如你从上图中看到的,这使得结果的概率大于0.5。
解决方案:尝试在没有最后一个sigmoid
的情况下使用相同的网络。