1

Keras我正在尝试通过强化学习来训练神经网络玩井字游戏Python。目前,网络获取当前板的输入:

    array([0,1,0,-1,0,1,0,0,0])
1 = X 
-1 = O
0 = an empty field

如果网络赢得了一场比赛,它会从它所做的每一个动作(输出)中获得奖励。 [0,0,0,0,1,0,0,0,0] 如果网络输了,我想用不好的奖励来训练它。 [0,0,0,0,-1,0,0,0,0]

但目前我得到了很多 0.000e-000 准确度。

我可以训练一个“坏奖励”吗?或者如果不能用-1我应该怎么做呢?

提前致谢。

4

1 回答 1

3

您需要反向传播在游戏结束时获得的奖励。看看这个教程。

简而言之,从本教程:

# at the end of game, backpropagate and update states value
def feedReward(self, reward):
    for st in reversed(self.states):
        if self.states_value.get(st) is None:
            self.states_value[st] = 0
        self.states_value[st] += self.lr * (self.decay_gamma * reward 
                    - self.states_value[st])
        reward = self.states_value[st]

如您所见,假设 5(游戏结束)步骤中的奖励在 (4,3,2,1) 之前的所有步骤中以衰减率反向传播(不是在导数意义上)。这是要走的路,因为井字游戏是一种延迟奖励的游戏,与经典的强化学习环境相反,在经典强化学习环境中,我们通常在每一步都有奖励(正面或负面)。这里在 T 处的行动奖励取决于在 T+something 处的最终行动。如果最后一个动作以胜利结束游戏,则奖励为 1,如果对手执行最后一个动作并获胜,则奖励为 -1。

至于准确性,我们不将其用作强化学习的指标。一个好的指标是观察平均累积奖励(如果你的代理赢了一半的时间,这将是 0,如果它学到了一些东西,则为 > 0,否则为 < 0)。

于 2020-01-05T11:04:25.023 回答