[英]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.