我正在尝试实现一个使用Q-learning玩飞行棋的智能体。我用e-greedy动作选择器对其进行了训练,epsilon值为0.1,学习率为0.6,折扣因子为0.8。
我运行了大约5万步的游戏,但一次都没有赢过。这很令人困惑,因为Q表似乎与我期望的非常接近。为什么我输给随机玩家那么多?如果Q表变化不大,系统不应该能够赢吗?一般来说,我需要训练我的智能体多少次迭代?
我不确定需要多少信息,如果需要,我会更新帖子以提供相关信息。
可能的状态,表示为Q表中的行:
- 在家中
- 在地球上
- 在星星上
- 在终点
- 在胜利之路上
- 与同色玩家在安全区
- 在自由空间
可能的动作,表示为每个状态的列:
- 从家中移动出来
- 进入终点
- 移动到地球
- 移动到星星
- 通过星星移动到终点
- 与同色棋子进入安全区
- 进入胜利之路
- 如果对手在地球上则自杀
- 杀死对手
- 只是移动
- 无法移动
我首先用随机值初始化我的Q表,经过5000次迭代后,表格看起来像这样:
-21.9241 345.35 169.189 462.934 308.445 842.939 256.074 712.23 283.328 137.078 -32.8398.895 968.8 574.977 488.216 468.481 948.541 904.77 159.578 237.928 29.7712 417.5991314.25 756.426 333.321 589.25 616.682 583.632 481.84 457.585 683.22 329.132 227.3291127.58 1457.92 1365.58 1429.26 1482.69 1574.66 1434.77 1195.64 1231.01 1232.07 1068807.592 1070.17 544.13 1385.63 883.123 1662.97 524.08 966.205 1649.67 509.825 909.006225.453 1141.34 536.544 242.647 1522.26 1484.47 297.704 993.186 589.984 689.73 1340.891295.03 310.461 361.776 399.866 663.152 334.657 497.956 229.94 294.462 311.505 1428.26
我的即时奖励基于每个棋子在游戏中的位置乘以常数10,在执行动作后计算。家位置为-1,终点位置为99,中间的所有位置在0到55之间。如果一个棋子在终点,每个在终点的棋子会额外增加100的即时奖励。
通常,我的玩家总是将一个棋子移动到终点…仅此而已。
回答:
为什么我输给随机玩家那么多?如果Q表变化不大,系统不应该能够赢吗?
这可能是你的Q-learning实现中的一个错误。你说学习后的Q表中的值接近你期望的值。如果值在收敛,那么我认为这不太可能是错误,而更可能是…
你的智能体在给定的状态表示下尽了最大努力。
Q表条目收敛到在给定状态下采取动作的最优值。为了使这种“最优策略”真正转化为我们所说的好的飞行棋玩法,智能体学习的状态需要直接对应于棋盘游戏的状态。看看你的状态,你可以看到棋盘上多种棋子排列映射到同一个状态。例如,如果你允许玩家拥有多个棋子,状态空间并不代表所有棋子的位置(动作空间也是如此)。这可能是你观察到智能体只移动一个棋子然后停止的原因:它认为自己已经完成了任务,看不到有其他动作可以采取!再举一个例子来说明这是一个问题,注意智能体可能希望根据对手棋子的位置采取不同的动作,因此为了最优玩法,智能体也需要这些信息。这些信息需要包含在你的状态表示中。
你可以开始向Q表添加行,但你会遇到的问题是:飞行棋中有太多可能的状态,无法通过表格学习(使用Q表)来可行地学习。表格的大小将是所有当前状态的乘积,再乘以棋盘上每个其他棋子的所有可能位置。
所以回答这个问题:
一般来说,我需要训练我的智能体多少次迭代?
使用准确代表棋盘所有排列的状态空间,需要的迭代次数太多了,无法实现。你需要研究定义状态的特征来进行学习。这些特征将突出状态之间的重要差异并忽略其他差异,因此你可以将其视为压缩智能体学习的状态空间。然后你还可以考虑使用函数逼近器来代替Q表,以应对可能仍然非常多的特征。你可以在《强化学习:引论》中阅读更多相关内容,特别是围绕3.9的部分。