繁体   English   中英

为什么我的井字游戏深度 Q 学习实施无法学会阻止对手的动作?

[英]Why does my Tic Tac Toe Deep Q-Learning implementation not learn to block opponent moves?

我正在尝试使用深度 Q 网络解决井字游戏。

环境:

长度为 9 的数组用于表示游戏的 state,其中 1 代表当前玩家的标记位置,-1 代表下一个玩家的位置。 0 用于未标记的位置。 可变轮数用于决定下一个轮到谁。 操作表示为具有行号和列号的列表。 0 对非终止动作和平局给予奖励。 获胜将获得 1 的奖励。

例子:

 x | - | -

 - | - | o 

 - | - | -

表示为 [1,0,0,0,0,0,0,-1,0],这里 x 表示为 1,o 表示为 -1,因为下一轮是 x 的动作 [1,2] 将改变state 至

 x | - | -

 - | - | o 

 - | x | -

表示为[-1,0,0,0,0,-1,0,1,0],这里x表示为-1,o表示为1,因为下一轮是o

深度 Q 网络:

The q function takes in a state and an action to output the q value associated with that move for that state I update the q function by using the target q value for state s and action a as

目标 q 值(s,a) = gamma*(reward(s,a) - q 值(s',a'))

其中 gamma=1, s' 是在 state s 处完成移动 a 后的下一个 state,a' 是由 q ZC1C425268E68385D1AB5074F14ZA 决定的下一个玩家的下一个最佳移动。

根据我对极小极大算法的理解,我从奖励中减去 q 值。

最佳动作是通过使用合法动作列表中的动作来获得当前 state 的 q 值,并且具有最高 q 值的动作被认为是最佳动作

我正在使用在线 q-network 来提供下一个最佳移动,该移动在每个样本期间都会更新,而离线 q-network 提供 q 值以获得目标 q 值,该目标 q 值根据 DDQN 实现更新频率较低。与 epsilon 一起衰变探索和开发。

我也在使用经验回放缓冲区

使用的神经网络是

model = models.Sequential()
model.add(layers.Dense(50, input_dim=11, activation='sigmoid'))
model.add(layers.Dense(20, activation='sigmoid'))
model.add(layers.Dense(1, activation='linear'))

带有学习率的 rmsprop 优化器.01

epsilon=1 to.05,衰减率为.9995

经验回放缓冲区大小 = 500 集

训练的 batch_size = 500 个状态和动作

离线 model 以 500 集为间隔更新在线的权重。

在训练了 20000 集之后,损失是波动的损失曲线

DQN 未能阻止移动,只对完成一行感兴趣。 我想了解这个实现中出了什么问题。 是因为 DQN 不稳定还是我犯了任何缺陷。感谢任何帮助。 这是我第一次发帖,我不熟悉如何写问题,请纠正问题中的错误。

这是代码,但写得不好

如果您还可以发布奖励与时间步长的 plot,那就太好了。

您可以尝试的一件事是通过每集反向传播折扣奖励。 本质上,在每一集结束后,您应该使奖励为:

new_reward = gamma^(Tt)*terminal_reward

您将这些奖励存储在回放缓冲区中,而不是您将从环境中获得的零奖励。 这将缓解稀疏奖励的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM