我最近尝试在Golang中实现一个基本的Q-Learning算法。请注意,我是强化学习和人工智能的新手,所以错误很可能是我的。
以下是我如何实现m,n,k游戏环境的解决方案:
在每个给定的时间
t
,代理持有最后一个状态操作
(s, a)
以及由此获得的报酬;代理选择移动
a'
基于Epsilon贪婪政策并计算报酬
r
,然后继续更新的值
Q(s, a)
对于时间
t-1
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集。
我在用戈朗的
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
奖励函数返回:
-
代理获胜:1
-
代理丢失:-1
-
绘制:0
-
游戏继续:0.5
但您可以看到最小值为零,最大值太高。
值得一提的是,我在python脚本中找到了一种更简单的学习方法,它工作得非常好,实际上感觉更智能!当我使用它时,大多数时候结果都是平局(如果我玩得不小心,它甚至会赢),而使用标准的Q-Learning方法,我甚至不能让它赢!
agent.values[mState] = oldVal + (agent.LearningRate * (reward - agent.prevScore))
有什么解决办法吗?
这种状态动作值在Q-Learning中正常吗?!
更新:
在阅读了巴勃罗的答案以及尼克对这个问题的轻微但重要的编辑后,我意识到问题是
prevScore
包含上一步骤的Q值(等于
oldVal
)而不是前一步的奖励(在本例中为-1、0、0.5或1)。
更改后,代理现在行为正常,2M集后,模型状态如下:
Reinforcement learning model report
Iterations: 2000000
Learned states: 5477
Maximum value: 1.090465
Minimum value: -0.554718
在与经纪人的5场比赛中,我赢了2场(经纪人没有意识到我连续拿了两块石头),3场平局。