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.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 万场比赛本身):
Reinforcement learning model report
Iterations: 2000000
Learned states: 4973
Maximum value: 88781786878142287058992045692178302709335321375413536179603017129368394119653322992958428880260210391115335655910912645569618040471973513955473468092393367618971462560382976.000000
Minimum value: 0.000000
奖励函数returns:
- 代理赢得:1
- 特工丢失:-1
- 平局:0
- 游戏继续:0.5
但是你可以看到最小值为零,最大值太高了。
可能值得一提的是,我在 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 算法。
我最近尝试在 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.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 万场比赛本身):
Reinforcement learning model report
Iterations: 2000000
Learned states: 4973
Maximum value: 88781786878142287058992045692178302709335321375413536179603017129368394119653322992958428880260210391115335655910912645569618040471973513955473468092393367618971462560382976.000000
Minimum value: 0.000000
奖励函数returns:
- 代理赢得:1
- 特工丢失:-1
- 平局:0
- 游戏继续:0.5
但是你可以看到最小值为零,最大值太高了。
可能值得一提的是,我在 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 算法。