Q-Learning 值太高

Q-Learning values get too high

我最近尝试在 Golang 中实现一个基本的 Q-Learning 算法。请注意,我是强化学习和 AI 的新手,所以这个错误很可能是我的。

以下是我如何实现 m,n,k 游戏环境的解决方案: 在每个给定时间 t,智能体持有最后一个状态动作 (s, a) 及其获得的奖励;智能体根据 Epsilon-greedy 策略选择移动 a' 并计算奖励 r,然后继续为时间 t-1[=33= 更新 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.LearningRate = 0.2agent.DiscountFactor = 0.8 时,由于状态-动作值溢出,代理无法达到 100K 集。 我正在使用 golang 的 float64(标准 IEEE 754-1985 双精度浮点变量),它在 ±1.80×10^308 左右溢出并产生 ±Infiniti。这个值太大了!

这是一个模型的状态,该模型以 0.02 的学习率和 0.08 的折扣因子进行训练,它经历了 200 万集(100 万场比赛本身):

Reinforcement learning model report
Iterations: 2000000
Learned states: 4973
Maximum value: 88781786878142287058992045692178302709335321375413536179603017129368394119653322992958428880260210391115335655910912645569618040471973513955473468092393367618971462560382976.000000
Minimum value: 0.000000

奖励函数returns:

但是你可以看到最小值为零,最大值太高了。

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

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

关于如何解决这个问题有什么想法吗? Q-Learning中那种状态-动作值正常吗?!


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

在那次更改之后,agent 现在表现正常,在 2M episode 之后,模型的状态如下:

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-learning 规则只使用一种奖励(x 是状态,u 是动作):

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