立即收敛以进行简单的神经进化,我做错了什么吗?

时间:2018-12-28 10:49:30

标签: python neural-network deep-learning evolutionary-algorithm

因此,我建立了一个进化神经网络算法,该算法播放准系统版本的“ Flappy Bird”。

一切正常,并且立即收敛为“完美”的解决方案。...太完美了...所以我有一个假设,为什么它学习基本没有代代相传的最优策略(我会在最后提到它为首先,我想向您展示我的结果。

这是一个示范:

gif

再次..这是重量初始化后立即进行的。

注意:模型固定为3个输入层,2个隐藏层,1个输出(跳跃或不跳跃)。

因为这是一个简单的问题,所以我选择不使用像glorot这样的特殊初始化方法,而是从均匀分布中退出。

初始化方法:

def randomize_net(self):
    self.layer_weights = []

    for i in range(len(NET_DIMS)-1):
        self.layer_weights.append(
            np.random.uniform(
                size=(NET_DIMS[i], NET_DIMS[i+1])
            )
        )

输入功能:(注意:它们未标准化。)

def look(self, pipe: Pipe):
    # Get distance from the pipe's X
    x_dist = pipe.pos[0] - self.pos[0]
    if x_dist < 0:
        x_dist = 0

    # Get distance from pipe's upper bound
    y_upper_dist = (pipe.pos[1] + HALF_GAP) - self.pos[1]

    # Get distance from pipe's lower bound
    y_lower_dist = (pipe.pos[1] - HALF_GAP) - self.pos[1]

    self.vision = [
        x_dist,
        y_upper_dist,
        y_lower_dist
    ]

输出计算:

def think(self):
    # Calculate the network's output.
    output = self.vision

    l = len(self.layer_weights)-1
    for i, weight_layer in enumerate(self.layer_weights):
        output = np.matmul(output, weight_layer)

        # Activate all layer outputs EXCEPT output layer.
        if i != l:
            self.activate_layer(output)

    self.net_outputs = output

我希望这些鸟至少经过几代的反复试验才能学习,但是它们第一次反应完美。

之所以将其带入StackOverflow是为了查看我的模型是否混乱,但由于特殊情况而无法正常工作。

假设:

我相信可能与Y距离乘以0有关。如果将权重乘以0的Y距离,则可能会向前传播,尽管权重值仍然小于0.5(我的阈值)。

我可能还有一段路要走,我什至不确定那是否有意义。但是,我喜欢局外人的观点,所以请分享您的想法。

源代码:

顺便说一句,它是开源的,因此,如果您想自己here it is来运行它。

0 个答案:

没有答案