神经网络:避免输出任何方向的偏差

时间:2018-01-07 15:10:41

标签: python algorithm numpy machine-learning neural-network

我遇到了CartPole问题。

购物车的输入需要0 or 1作为输入;向左或向右移动。

假设我们的网络为4 inputsbias3 hidden layers,每个1 neuron1 output;哪里 所有权重在floats之间随机0 and 1,输入也将在floats之间随机-10 and 10

因为我随机选择了所有内容,所以我固有地期望输出平均大约为0.5,并且购物车将会向右移动。

事实并非如此;我大约平均得到0.63。这导致了很大的问题,因为购物车从未决定向左走。 这似乎取决于每个隐藏层的神经元数量。

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] )

我通过用output减去0.1来解决问题,但这显然是在作弊;我认为使用0.1作为某种神奇的数字没有数学上的理由。

我相信我正在接近这个问题,或者让我的一些代码搞砸了。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

您的神经网络至少存在一个问题,即您的结果概率存在偏差:模型输出是最后一层的sigmoid,它本身就是sigmoid

这意味着您的logit(即原始分数)位于[0, 1],因此最终概率是在[0, 1]范围内计算的,而不是[-inf, inf]

sigmoid

从上图中可以看出,这使得结果概率为 大于0.5。

解决方案:在没有最后sigmoid的情况下尝试使用相同的网络。