问题标签 [q-learning]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - AI Player 表现不佳?为什么?
我正在尝试实现一个使用 Q-learning 玩Ludo的代理。我使用 e-greedy 动作选择器对其进行了训练,epsilon 为 0.1,学习率为 0.6,折扣因子为 0.8。
我跑了大约 50K 步,但没有赢得一场比赛。这令人费解,因为 Q 表似乎与我想要的非常准确。为什么我会输给随机玩家这么多?如果 Q 表没有发生太大变化,系统是否应该能够获胜,并且通常我需要训练我的代理多少次迭代?
我不确定需要多少信息,如果需要,我会用相关信息更新帖子。
可能的状态,表示为 Q 表中的行:
- 在家
- 在地球上
- 在一颗星星上
- 在目标
- 在赢家路上
- 与同色球员安全
- 在自由空间
可能的操作,表示为每个状态的列:
- 从家里搬出去
- 进入目标
- 移动到地球
- 移星
- 通过星星移动到目标
- 使用相同颜色的令牌进入安全状态
- 进入赢家之路
- 如果对手在地球上,自杀
- 杀死对手
- 动起来
- 不能动
我首先用随机值初始化我的 Q 表,并以在 5000 次迭代后看起来像这样的表结束:
我的即时奖励是基于每个令牌在游戏中的距离乘以常数 10,在执行一个动作之后。起始位置的位置为 -1,目标位置的位置为 99。中间的所有位置的位置都在 0 - 55 之间。如果目标中的代币,将在目标中的每个代币的即时奖励中增加额外奖励 +100 .
通常,我的球员总是向球门移动一个标记……就是这样。
neural-network - DeepMind-Atari-Deep-Q-Learner (DQN) 无法运行除突破之外的游戏 rom
这些天我正在学习https://github.com/kuz/DeepMind-Atari-Deep-Q-Learner 。我成功地在我的机器上训练了突破。但是,当我尝试运行从http://www.atariage.com/下载的游戏时,它们都因 run_cpu 和 run_gpu 而失败。我已经替换了游戏 bin 文件的大写字母。
以下是从http://www.atariage.com/system_items.html?SystemID=2600&ItemTypeID=ROM下载的一些游戏 rom ,只有突破有效。
鉴于我使用的是具有 512GB RAM 和 8 个 Nvidia Titan X GPU 的服务器,硬件应该不是问题。我想知道如何解决这个问题。
go - Q-Learning 价值过高
我最近尝试在 Golang 中实现一个基本的 Q-Learning 算法。请注意,我通常是强化学习和人工智能的新手,所以错误很可能是我的。
以下是我在 m,n,k 游戏环境中实现解决方案的方法: 在每个给定时间t
,代理持有最后一个状态动作(s, a)
及其获得的奖励;代理a'
根据 Epsilon-greedy 策略选择移动并计算奖励r
,然后继续更新Q(s, a)
for time的值t-1
笔记:
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
. 我想说的价值太大了!
以下是使用 2M 集的学习率0.02
和折扣因子训练的模型的状态(1M 游戏本身):0.08
奖励函数返回:
- 代理赢取:1
- 代理丢失:-1
- 平局:0
- 游戏继续:0.5
但是你可以看到最小值为零,最大值太高了。
值得一提的是,我在 python 脚本中发现了一种更简单的学习方法,效果非常好,而且感觉实际上更智能!当我玩它时,大多数时候结果是平局(如果我玩不小心它甚至会赢),而使用标准的Q-Learning方法,我什至不能让它赢!
有想法该怎么解决这个吗?这种状态-动作值在 Q-Learning 中正常吗?!
更新:
在阅读了巴勃罗的回答和尼克为这个问题提供的轻微但重要的编辑之后,我意识到问题是prevScore
包含上一步的 Q 值(等于oldVal
)而不是上一步的奖励(在这个例子中,- 1、0、0.5 或 1)。
更改后,代理现在表现正常,在 2M 集之后,模型的状态如下:
在与经纪人的 5 场比赛中,我赢了 2 场(经纪人没有认出我连续两块石头)和 3 场平局。
reinforcement-learning - 吸收状态的 Q 值
在上面的等式中,有一个术语max(Q_t(s_{t+1},a))
Now say after you take a action in states_t
导致 s _{t+1}
。s_{t+1} 中没有可用的移动。比赛以平局结束,max(Q_t(s_{t+1},a))
那这是什么?
neural-network - 如何提高前馈网络作为 q 值函数逼近器的性能?
我正在尝试通过使用 Q-Learning + 前馈神经网络作为 q 函数逼近器来导航* n gridworld 域中的代理。基本上,代理应该找到到达某个终端目标位置的最佳/最短方式(+10 奖励)。代理采取的每一步都会获得 -1 奖励。在网格世界中,代理也应该避免一些位置(-10 奖励,终端状态)。
到目前为止,我实现了一个 Q 学习算法,它将所有 Q 值保存在 Q 表中,并且代理表现良好。在下一步中,我想用神经网络替换 Q 表,在代理的每一步之后在线训练。我尝试了一个带有一个隐藏层和四个输出的前馈神经网络,代表网格世界(北、南、东、西)中可能动作的 Q 值。作为输入,我使用了一个 nxn 零矩阵,它在代理的当前位置有一个“1”。
为了达到我的目标,我试图从头开始解决问题:
使用标准 Q-Learning 探索网格世界,并在 Q-Learning 完成后使用 Q-map 作为网络的训练数据 --> 工作正常
使用 Q-Learning 并提供 Q-map 的更新作为 NN (batchSize = 1) 的训练数据 --> 效果很好
用 NN 完全替换 Q-Map。(这就是重点,当它变得有趣时!)
-> FIRST MAP:4 x 4 如上所述,我有 16 个“离散”输入,4 个输出,并且它在隐藏层中与 8 个神经元(relu)一起工作得很好(学习率:0.05)。我使用了一个带有 epsilon 的贪婪策略,在 60 集内从 1 减少到 0.1。 此处显示了测试场景。将标准 qlearning 与 q-map 和“神经”qlearning 之间的性能进行比较(在这种情况下,我使用了 8 个神经元和不同的 dropOut 率)。
总结一下:神经 Q-learning 对小网格效果很好,性能还可以而且可靠。
-> 更大的地图:10 x 10
现在我尝试将神经网络用于更大的地图。起初我尝试了这个简单的案例。
在我的例子中,神经网络如下所示:100 个输入;4个输出;一个隐藏层中大约有 30 个神经元(relu);我再次对贪婪策略使用了递减的探索因子;超过 200 集学习率从 0.1 降低到 0.015 以增加稳定性。
首先,我遇到了由离散输入向量引起的单个位置之间的收敛和插值问题。为了解决这个问题,我在向量中添加了一些相邻位置,其值取决于到当前位置的距离。这极大地改善了学习,政策也变得更好。上图显示了 24 个神经元的性能。
总结:简单的情况是由网络解决的,但只是需要大量的参数调整(神经元数量、探索因子、学习率)和特殊的输入变换。
现在这是我仍未解决的问题/问题:
(1) 我的网络能够在 10 x 10 的地图中解决非常简单的案例和示例,但由于问题变得有点复杂,它失败了。在很可能失败的情况下,网络没有任何变化来找到正确的策略。在这种情况下,我对任何可以提高性能的想法持开放态度。
(2) 有没有更聪明的方法来转换网络的输入向量?我敢肯定,一方面将相邻位置添加到输入向量可以改善 q 值在地图上的插值,但另一方面会使训练网络的特殊/重要位置变得更加困难。我已经在早期尝试了标准笛卡尔二维输入(x/y),但失败了。
(3) 除了具有反向传播的前馈网络之外,是否还有另一种网络类型,通常使用 q 函数近似产生更好的结果?您是否看过项目,其中 FF-nn 在更大的地图上表现良好?
machine-learning - 强化学习和深度强化学习有什么区别?
深度强化学习和强化学习有什么区别?我基本上知道强化学习是关于什么的,但具体术语deep在这种情况下代表什么?
javascript - Javascript - 防止 Chrome 在长循环期间杀死页面
当 Chrome 正常运行时,它会在我的 connect-4 浏览器游戏中间不断杀死页面。该游戏是玩家与计算机的设置,游戏本身运行正常且永不崩溃。当我将迭代次数设置得太高而无法训练计算机对手时,页面会崩溃。这些程序使用 qLearning 算法训练人工智能,人工智能在其中发挥自己并为每个遇到的状态存储一个值。如果我将迭代次数设置为大约 125,000 次或更少,那么一切正常(除了对手不是那么好)。我不知道是循环的运行时间(大约需要 30 分钟才能运行)会杀死程序还是其他东西,例如记录状态的内存限制及其相应的 q 值。
如何让程序运行以进行更多的训练迭代而不用 chrome 杀死页面?
javascript - 您如何使用线性函数逼近对权重 q-learning 进行归一化
我正在开发简单的游戏程序来展示线性函数逼近的 q-learning。 截屏
在这个游戏中,有不可数的状态。我必须考虑很多因素,比如玩家的位置、速度和敌人的位置(有 12 ~ 15 个敌方物体)。我最终将我的算法从使用表更改为使用线性函数逼近。
我决定了大约 20 ~ 22 个特征。(常数,玩家位置,玩家速度,所有敌人的位置)。并且有
实施该算法后,我陷入了一些问题。
运行我的程序后,权重值会在几秒钟内溢出。我发现我没有标准化特征和重量。
归一化特征值很容易,因为每个特征都有其界限。然而,仅仅标准化特征值是不够的。它仍然会溢出。
我的问题是如何标准化我的体重。
下面是我实现功能标准化的代码。
下面的代码是在没有任何标准化的情况下更新权重。
machine-learning - 如何使用线性函数逼近选择我的 q 学习的特征
我正在使用强化学习开发人工智能。
这是一个玩家应该避免砖块从天上掉下来的游戏。
我使用带有线性函数的强化学习来实现 AI。
很难选择最佳特征来获得满意的结果。
无论如何,自从我尝试成功以来,它最终获得了最好的成绩。
但这很奇怪。
有一些原因。
- 它在大约 10 次训练时很快达到收敛。
- 我只使用了 6 个功能。
- 通过多次训练,我无法获得更好的分数。(就像我想让我的人工智能像超级玩家一样玩。但看起来不像。)
同时,我尝试使用很多功能。我将特征定义为游戏屏幕尺寸(960 * 640)。
我填充了砖块与玩家相对坐标的那些特征。我希望能取得比上一个更好的结果。我用这个方法训练了 7 个小时,但没有成功。
底线是我应该如何选择功能以使其发挥最佳作用,或者是否有任何不同的方法来解决它?
machine-learning - Q 学习与动态规划
使用查找表(而不是函数逼近)的经典 Q-learning 算法是否等同于动态规划?