Q-Learning 值太高

Far*_* K. 5 floating-point go reinforcement-learning q-learning

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

\n\n

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

\n\n
func (agent *RLAgent) learn(reward float64) {\n    var mState = marshallState(agent.prevState, agent.id)\n    var oldVal = agent.values[mState]\n\n    agent.values[mState] = oldVal + (agent.LearningRate *\n        (agent.prevScore + (agent.DiscountFactor * reward) - oldVal))\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

笔记:

\n\n
    \n
  • agent.prevState在采取行动之后和环境响应之前(即在代理移动之后和其他玩家移动之前)保持先前的状态我用它来代替状态动作元组,但我不太确定是否这是正确的做法
  • \n
  • agent.prevScore保留对先前状态动作的奖励
  • \n
  • 参数reward表示当前步骤的状态动作的奖励 ( Qmax)
  • \n
\n\n

由于状态动作值溢出,代理无法达到 100K 集。\n我正在使用 golang 的agent.LearningRate = 0.2(标准 IEEE 754-1985 双精度浮点变量),它在周围溢出并产生。我想说这个值太大了!agent.DiscountFactor = 0.8float64\xc2\xb11.80\xc3\x9710^308\xc2\xb1Infiniti

\n\n

以下是一个模型的状态,该模型的学习率0.02和折扣因子0.08经过 200 万个回合(100 万个游戏):

\n\n
Reinforcement learning model report\nIterations: 2000000\nLearned states: 4973\nMaximum value: 88781786878142287058992045692178302709335321375413536179603017129368394119653322992958428880260210391115335655910912645569618040471973513955473468092393367618971462560382976.000000\nMinimum value: 0.000000\n
Run Code Online (Sandbox Code Playgroud)\n\n

奖励函数返回:

\n\n
    \n
  • 代理获胜:1
  • \n
  • 代理丢失:-1
  • \n
  • 平局:0
  • \n
  • 比赛继续:0.5
  • \n
\n\n

但您可以看到最小值为零,最大值太高。

\n\n

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

\n\n
agent.values[mState] = oldVal + (agent.LearningRate * (reward - agent.prevScore))\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
\n\n

更新: \n在阅读 Pablo 的答案以及 Nick 对此问题提供的轻微但重要的编辑后,我意识到问题是prevScore包含上一步的 Q 值(等于oldVal)而不是上一步的奖励(在本例中, -1、0、0.5 或 1)。

\n\n

进行此更改后,代理现在表现正常,并且在 2M 次之后,模型的状态如下:

\n\n
Reinforcement learning model report\nIterations: 2000000\nLearned states: 5477\nMaximum value: 1.090465\nMinimum value: -0.554718\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n

Pab*_* EM 1

如果我理解得很好,在你的 Q-learning 更新规则中,你正在使用当前的奖励和之前的奖励。然而,Q 学习规则仅使用一种奖励(x状态和u动作): 在此输入图像描述

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

  • 而 `reward` 通常是一个很大的数字(值),而不是 `{-1, 0, 1}`。我想我现在看到了问题所在! (2认同)