如何用分类神经网络训练不良奖励?

时间:2020-01-04 15:13:44

标签: python keras reinforcement-learning reward

我正在尝试通过KerasPython的强化学习训练一个神经网络来玩井字游戏。 当前,网络获得了当前板的输入:

    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来代替它,我该怎么做呢?

谢谢。

1 个答案:

答案 0 :(得分:3)

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

简而言之,来自本教程:

# 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 +处的最终动作。如果最终游戏以获胜告终,则奖励为1;如果对手玩了最后一局并获胜,则奖励为-1。

关于准确性,我们没有将其用作强化学习的指标。一个好的度量标准是观察平均累积奖励(如果您的代理赢得一半的时间,则为0;如果获悉某些信息,则为> 0,否则为<0)。

相关问题