问题标签 [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.
machine-learning - Q 学习 vs 时间差异 vs 基于模型的强化学习
我在大学学习一门名为“智能机器”的课程。我们被介绍了 3 种强化学习的方法,并且通过这些方法,我们得到了何时使用它们的直觉,我引用:
- Q-Learning - 当 MDP 无法解决时最好。
- 时间差异学习——当 MDP 已知或可以学习但无法解决时最好。
- 基于模型 - 最好在无法学习 MDP 时使用。
有没有很好的例子来解释何时选择一种方法而不是另一种方法?
deep-learning - 深度神经网络结合qlearning
我使用来自 Kinect 相机的关节位置作为我的状态空间,但我认为它会太大(25 个关节 x 每秒 30 个),无法仅输入 SARSA 或 Qlearning。
现在我正在使用 Kinect Gesture Builder 程序,该程序使用监督学习将用户移动与特定手势相关联。但这需要我想摆脱的监督培训。我认为该算法可能会拾取关节之间的某些关联,就像我自己对数据进行分类时那样(例如,举起手来,向左走,向右走)。
我认为将这些数据输入深度神经网络,然后将其传递给强化学习算法可能会给我带来更好的结果。
最近有一篇关于这个的论文。https://www.cs.toronto.edu/~vmnih/docs/dqn.pdf
我知道 Accord.net 既有深度神经网络又有 RL,但有人将它们结合在一起吗?有什么见解吗?
python - 如何在每次迭代后返回控制的强化学习程序中使用 Tensorflow Optimizer 而无需重新计算激活?
编辑(1/3/16):相应的 github 问题
我正在使用 Tensorflow(Python 接口)来实现一个q-learning
使用stochastic gradient descent
.
在实验的每次迭代中,代理中的一个阶跃函数被调用,它根据新的奖励和激活来更新逼近器的参数,然后选择一个新的动作来执行。
这是问题(使用强化学习术语):
- 代理计算其状态-动作值预测以选择动作。
- 然后将控制权交还给另一个模拟环境中的步骤的程序。
- 现在为下一次迭代调用代理的阶跃函数。我想使用 Tensorflow 的 Optimizer 类为我计算梯度。但是,这需要我在最后一步计算的状态-动作值预测和它们的图表。所以:
- 如果我在整个图上运行优化器,那么它必须重新计算状态-动作值预测。
- 但是,如果我将预测(针对所选操作)存储为变量,然后将其作为占位符提供给优化器,则它不再具有计算梯度所需的图形。
- 我不能只在同
sess.run()
一个语句中运行它,因为我必须放弃控制并返回选择的动作才能获得下一个观察和奖励(用于损失函数的目标)。
那么,有没有一种方法可以(没有强化学习术语):
- 计算我的图表的一部分,返回 value1。
- 将 value1 返回给调用程序以计算 value2
- 在下一次迭代中,使用 value2 作为我的梯度下降损失函数的一部分,而无需重新计算计算 value1 的图形部分。
当然,我考虑过显而易见的解决方案:
只需对梯度进行硬编码:对于我现在使用的非常简单的近似器来说,这很容易,但如果我在大型卷积网络中尝试不同的过滤器和激活函数,那就真的很不方便了。如果可能的话,我真的很想使用 Optimizer 类。
从代理内部调用环境模拟: 这个系统是这样做的,但它会使我的更复杂,并且去除了很多模块化和结构。所以,我不想这样做。
我已经多次阅读 API 和白皮书,但似乎无法提出解决方案。我试图想出某种方法将目标输入到图形中以计算梯度,但无法想出一种自动构建该图形的方法。
如果事实证明这在 TensorFlow 中还不可能,您认为将其作为新运算符实现会非常复杂吗?(我已经有几年没用过 C++了,所以 TensorFlow 源代码看起来有点吓人。)或者我最好切换到 Torch 之类的东西,它具有命令式微分 Autograd,而不是符号微分?
感谢您花时间帮助我解决这个问题。我试图让它尽可能简洁。
编辑:在做了一些进一步的搜索后,我遇到了这个先前提出的问题。它与我的有点不同(他们试图避免在 Torch 中每次迭代更新 LSTM 网络两次),并且还没有任何答案。
如果有帮助,这里有一些代码:
algorithm - 如何使用强化学习向神经网络教授棋盘游戏策略?
我需要使用强化学习来教神经网络棋盘游戏的策略。我选择 Q-learning 作为特定的算法。
我希望神经网络具有以下结构:
- 层 -
rows * cols + 1
神经元 - 输入 - 棋盘上连续字段的值(0
为空,1
或2
代表玩家),该状态下的动作(自然数) - 层 - (??) 神经元 - 隐藏
- 层 - 1 神经元 - 输出 - 给定状态下的动作值(浮点数)
我的第一个想法是从创建状态、动作和价值观的地图开始,然后尝试教授神经网络。如果教学过程不成功,我可以增加神经元的数量并重新开始。
但是,我很快遇到了性能问题。首先,我需要从简单的内存 Python 切换dict
到数据库(没有足够的 RAM)。现在数据库似乎是一个瓶颈(简单地说,有太多可能的状态,以至于检索动作值需要相当长的时间)。计算需要数周时间。
我想可以即时教授神经网络,而中间没有地图层。但是我如何在隐藏层上选择正确数量的神经元呢?我怎么知道我正在丢失大量保存(学习)的数据?
deep-learning - Deepmind 深度 Q 网络 (DQN) 3D 卷积
我正在阅读 DQN 网络上的 deepmind 自然论文。我几乎得到了一切,除了一个。我不知道为什么以前没有人问过这个问题,但无论如何对我来说似乎有点奇怪。
我的问题:DQN 的输入是 84*84*4 图像。第一个卷积层由 32 个 8*8 的滤波器组成,步长为 4。我想知道这个卷积阶段的结果到底是什么?我的意思是,输入是 3D,但我们有 32 个过滤器,它们都是 2D。第三维(对应于游戏中的最后 4 帧)如何参与卷积?
有任何想法吗?谢谢阿明
python - 带有切片的 Q-network 损失的 Tensorflow 实现
我正在通过 TensorFlow 中的深度强化学习 (Mnih et al. 2015) 实现人类水平控制中所述的 Q 网络。
为了逼近 Q 函数,他们使用了神经网络。Q 函数将状态和动作映射到标量值,称为 Q 值。即它是一个类似 Q(s,a) = qvalue 的函数。
但是,它们不是将状态和动作都作为输入,而是仅将状态作为输入,并以给定的顺序输出一个向量,其中每个合法动作都有一个元素。因此 Q(s,a) 变为 Q'(s) = array([val_a1, val_a2, val_a3,...])
,其中val_a1
是 Q(s,a1)。
这就提出了如何修改损失函数的问题。损失函数是根据目标 (y) 和 Q(s,a) 的差异计算的 L2 损失函数。
我的想法是创建一个新的 TF 操作并使用一个二进制掩码来指示我想要训练哪个动作并将其与网络的输出相乘。有效地产生一个向量,[0, 0, val_a3, 0, ...]
如果有问题的动作是a3
.
然后将新操作的结果提供给损失操作,然后 TF 正在最小化损失操作。
问题:
这是个好主意吗?或者有没有更好的方法来解决这个问题?
TensorFlow如何解决这个问题?
在类似的东西上有一个 SO 线程(在 Tensor - TensorFlow 中调整单个值),但我想借助
tf.placeholder
我可以在运行时提供给网络的 a 来选择列值。仅用占位符替换该示例中的静态列表时,它似乎不起作用。
machine-learning - 井字游戏机器学习 - 有效动作
我在玩机器学习。尤其是 Q-Learning,你有一个状态和动作,并根据网络的表现给予奖励。
现在对于初学者来说,我给自己设定了一个简单的目标:训练一个网络,使它发出有效的井字游戏(对抗随机对手)动作作为动作。我的问题是网络根本没有学习,甚至随着时间的推移变得更糟。
我做的第一件事是接触torch 和一个深度q 学习模块:https ://github.com/blakeMilner/DeepQLearning 。
然后我编写了一个简单的井字游戏,其中一个随机玩家与神经网络竞争,并将其插入此示例https://github.com/blakeMilner/DeepQLearning/blob/master/test.lua的代码中。网络的输出由 9 个节点组成,用于设置相应的单元格。
如果网络选择了一个空单元格(其中没有 X 或 O),则移动是有效的。据此,我给予正奖励(如果网络选择空单元)和负奖励(如果网络选择被占用的单元)。
问题是它似乎永远学不会。我尝试了很多变化:
- 将井字游戏字段映射为 9 个输入(0 = 单元格为空,1 = 玩家 1,2 = 玩家 2)或 27 个输入(例如,对于空单元格 0 [empty = 1, player1 = 0, player2 = 0 ])
- 在 10 到 60 之间改变隐藏节点数
- 尝试了多达 60k 次迭代
- 学习率在 0.001 和 0.1 之间变化
- 对失败给予负奖励或只对成功给予奖励,不同的奖励值
没有任何效果:(
现在我有几个问题:
- 由于这是我第一次尝试 Q-Learning,我有什么根本上做错的吗?
- 哪些参数值得更改?“大脑”的东西有很多:https ://github.com/blakeMilner/DeepQLearning/blob/master/deepqlearn.lua#L57 。
- 隐藏节点的数量是多少?
- https://github.com/blakeMilner/DeepQLearning/blob/master/deepqlearn.lua#L116中定义的简单网络结构对于这个问题来说太简单了吗?
- 我是不是太不耐烦了,必须训练更多的迭代?
谢谢,
-马蒂亚斯
python - 为什么我的 Deep Q Network 没有掌握一个简单的 Gridworld (Tensorflow)?(如何评估 Deep-Q-Net)
我尝试熟悉 Q-learning 和深度神经网络,目前尝试使用深度强化学习来实现 Playing Atari。
为了测试我的实现并使用它,我坚持尝试一个简单的网格世界。我有一个 N x N 网格,从左上角开始,在右下角结束。可能的动作有:左、上、右、下。
尽管我的实现与此非常相似(希望它是一个好的实现),但它似乎并没有学到任何东西。看看它需要完成的总步骤(我猜平均会在 500 左右,网格大小为 10x10,但也有非常低和高的值),它对我来说比其他任何东西都更加随机。
我尝试了使用和不使用卷积层并使用了所有参数,但老实说,我不知道我的实现是否有问题或者它需要训练更长时间(我让它训练了相当长的时间)或者什么曾经。但至少它似乎收敛了,这里是损失值的情节一个训练:
那么在这种情况下有什么问题呢?
但也许更重要的是,我如何“调试”这个 Deep-Q-Nets,在监督训练中有训练、测试和验证集,例如,通过精确度和召回率可以评估它们。对于使用 Deep-Q-Nets 进行无监督学习,我有哪些选择,以便下次我可以自己修复它?
最后是代码:
这是网络:
这里是培训:
感谢您的每一个帮助和想法!
machine-learning - TD 学习与 Q 学习
在一个完美的信息环境中,我们能够知道一个动作之后的状态,比如下棋,有没有理由使用 Q 学习而不是 TD(时间差分)学习?
据我了解,TD学习会尝试学习V(状态)值,但Q学习会学习Q(状态动作值)值,这意味着Q学习学习速度较慢(因为状态动作组合不仅仅是状态),是对吗?