Go Q-学习值太高

Go Q-学习值太高,go,floating-point,reinforcement-learning,q-learning,Go,Floating Point,Reinforcement Learning,Q Learning,我最近尝试在Golang实现一个基本的Q-学习算法。请注意,我一般不熟悉强化学习和人工智能,因此错误很可能是我的 以下是我如何在m、n、k游戏环境中实现解决方案: 在每个给定的时间t,代理持有最后一个状态动作(s,a),以及为此获得的奖励;代理基于Epsilon贪婪策略选择移动a',并计算奖励r,然后继续更新时间t-1的Q(s,a)值 func (agent *RLAgent) learn(reward float64) { var mState = marshallState(agen

我最近尝试在Golang实现一个基本的Q-学习算法。请注意,我一般不熟悉强化学习和人工智能,因此错误很可能是我的

以下是我如何在m、n、k游戏环境中实现解决方案: 在每个给定的时间
t
,代理持有最后一个状态动作
(s,a)
,以及为此获得的奖励;代理基于Epsilon贪婪策略选择移动
a'
,并计算奖励
r
,然后继续更新时间
t-1的
Q(s,a)

func (agent *RLAgent) learn(reward float64) {
    var mState = marshallState(agent.prevState, agent.id)
    var oldVal = agent.values[mState]

    agent.values[mState] = oldVal + (agent.LearningRate *
        (agent.prevScore + (agent.DiscountFactor * reward) - oldVal))
}
注:

  • agent.prevState
    在采取行动之后和环境响应之前(即,在代理移动之后和其他玩家移动之前),我使用它来代替状态-行动元组,但我不确定这是否是正确的方法
  • agent.prevScore
    持有对先前状态操作的奖励
  • reward
    参数表示当前步骤状态操作的奖励(
    Qmax
使用
agent.LearningRate=0.2
agent.DiscountFactor=0.8
时,由于状态操作值溢出,代理无法达到100K集。 我使用的是golang的
float64
(标准IEEE 754-1985双精度浮点变量),它的溢出量约为
±1.80×10^308
,并产生
±Infiniti
。我觉得这个值太大了

以下是一个学习率为
0.02
且折扣系数为
0.08
的模型的状态,该模型通过了200万集(100万场游戏本身)的训练:

奖励函数返回:

  • 韩元:1
  • 代理丢失:-1
  • 抽签:0
  • 游戏继续:0.5
但是你可以看到最小值是零,最大值太高

值得一提的是,我在python脚本中发现了一种更简单的学习方法,它工作得非常好,而且感觉更加智能!当我玩它的时候,大多数时候结果都是平局(如果我玩得不小心,它甚至会赢),而用标准的Q-Learning方法,我甚至不能让它赢

agent.values[mState] = oldVal + (agent.LearningRate * (reward - agent.prevScore))
有没有办法解决这个问题? 这种状态-动作值在Q-学习中正常吗


更新: 在阅读了Pablo的答案和Nick对这个问题所做的轻微但重要的编辑后,我意识到问题是
prevScore
包含上一步的Q值(等于
oldVal
),而不是上一步的奖励(在本例中为-1、0、0.5或1)

在该更改之后,代理现在的行为正常,在2百万集之后,模型的状态如下:

Reinforcement learning model report
Iterations: 2000000
Learned states: 5477
Maximum value: 1.090465
Minimum value: -0.554718

在与经纪人的5场比赛中,我赢了2场(经纪人没有意识到我有两个连续的石头)和3场平局。

奖励功能可能是问题所在。强化学习方法试图最大化预期总回报;游戏中的每一步都会得到积极的奖励,因此最佳策略是玩得越久越好!定义价值函数的q值(在状态下采取行动然后表现最佳的预期总回报)正在增长,因为正确的预期是无限的。为了激励赢球,你应该在每一步都有一个负的奖励(有点像告诉经纪人赶快赢球)


参见3.2强化学习中的目标和奖励:导言,了解奖励信号的目的和定义。您面临的问题实际上是本书中的练习3.5。

如果我理解得很好,在您的Q-learning更新规则中,您使用的是当前奖励和以前的奖励。但是,Q-学习规则只使用一种奖励(
x
是状态,
u
是动作):


另一方面,您假设当前奖励与
Qmax
值相同,这是不正确的。因此,您可能误解了Q-learning算法。

这是一个有趣的观点,我完全没有注意到。当游戏继续进行时,我尝试过使用不同的值:任何高于
-0.45
的值都会导致相同的问题,而较低的值会对所有状态操作产生负面奖励(最大值=0),代理仍然无法获胜。有什么想法吗?这个问题可能与不受欢迎的最优政策或行为有关,但不能证明Q值的差异是合理的……谢谢尼克,这篇编辑确实帮助我了解了巴勃罗想说什么!为了理解这一点,我使用了github的python实现作为源代码,但显然我选择了错误的实现,并且占用了太多的资源!很可能是我选择了错误的学习来源。在当前系统中,
prevScore=value of(s,a)
奖励=value of(s',a')
奖励通常是一个大数字(value),而不是
{-1,0,1}
。我想我现在看到问题了!“是的,我是索莱塔·迪达姆。”“埃桑杰哈尼,我在这里呆了几天!”!当我开始工作的时候真的很有趣
Reinforcement learning model report
Iterations: 2000000
Learned states: 5477
Maximum value: 1.090465
Minimum value: -0.554718