我正在尝试通过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
来代替它,我该怎么做呢?
谢谢。
答案 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)。