问题标签 [temporal-difference]
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.
reinforcement-learning - 在强化学习中实现损失函数 (MSVE)
我正在尝试为奥赛罗建立一个时间差异学习代理。虽然我的其余实现似乎按预期运行,但我想知道用于训练我的网络的损失函数。在 Sutton 的《Reinforcement learning: An Introduction》一书中,Mean Squared Value Error(MSVE)被呈现为标准损失函数。它基本上是 Mean Square Error 乘以 on policy 分布。(Sum over all states s ( onPolicyDistribution(s ) * [V(s) - V'(s,w)]² ) )
我现在的问题是:当我的策略是学习价值函数的电子贪心函数时,我如何在策略分布上获得这个?如果我只使用 MSELoss 代替,它甚至有必要吗?有什么问题?
我在 pytorch 中实现了所有这些,所以在那里轻松实现的奖励积分:)
reinforcement-learning - 使用时间差异学习有什么意义?
据我所知,对于一个特定的策略 \pi,时间差异学习让我们计算该策略 \pi 之后的期望值,但是知道一个具体的策略有什么意义呢?
我们不应该尝试为给定环境找到最佳策略吗?完全使用时间差异学习来做一个特定的 \pi 有什么意义呢?
c++ - 我的神经网络没有学习正确的答案
首先,我是一个完全的业余爱好者,所以我可能会混淆一些术语。
我一直在研究神经网络来玩 Connect 4 / Four In A Row。
网络模型的当前设计是 170 个输入值、417 个隐藏神经元和 1 个输出神经元。网络是全连接的,即每个输入都连接到每个隐藏神经元,每个隐藏神经元都连接到输出节点。
每个连接都有一个独立的权重,每个隐藏节点和单个输出节点都有一个带有权重的附加偏置节点。
Connect 4 游戏状态的 170 个值的输入表示为:
- 42 对值(84 个输入变量),表示空间是否被玩家 1、玩家 2 占用或空置。
0,0
意味着它是免费的1,0
表示这是玩家 1 的位置0,1
表示这是玩家 2 的位置1,1
不可能
- 另外 42 对值(84 个输入变量)表示在此处添加一块是否会给玩家 1 或玩家 2 一个“连接 4”/“连续四人”。值的组合含义同上。
- 2个最终输入变量来表示轮到谁:
1,0
玩家 1 的回合0,1
玩家 2 的回合1,1
并且0,0
不可能
我测量了 100 场比赛的平均均方误差,超过 10,000 场不同配置的比赛,得出:
- 417个隐藏神经元
- Alpha 和 Beta 学习率在开始时为 0.1,并在 epoch 总数中线性下降至 0.01
- λ 值为 0.5
- 100 次移动中的 90 次在开始时是随机的,在前 50% 的时期之后下降到每 100 次中的 10 次。所以在中间点,100 个动作中有 10 个是随机的
- 前 50% 的 epoch 以随机移动开始
- 每个节点都使用 Sigmoid 激活函数
此图像显示了以对数刻度绘制的各种配置的结果。这就是我确定要使用的配置的方式。
-1
我通过将获胜状态下的棋盘输出与玩家 2 获胜和玩家 1 获胜的输出进行比较来计算这个均方误差1
。我每 100 场比赛将这些值相加,然后将总数除以 100,得到 1000 个值以绘制在上图中。即代码片段是:
我训练网络的方式是让它一遍又一遍地与自己对抗。这是一个前馈网络,我正在使用 TD-Lambda 来训练它的每一步(每一步都不是随机选择的)。
给予神经网络的董事会状态是通过以下方式完成的:
它是模板化的,以便以后更容易更改。我不相信上面有什么问题。
我的 Sigmoid 激活函数:
我的神经元课
我的神经网络课
模板类神经网络 { 公共:
我相信我可能遇到问题的地方之一是神经网络类中的BackPropagate
和BackPropagateFinal
方法。
这是我main
正在训练网络的功能:
我认为我可能遇到问题的一个地方是选择最佳移动的极小极大。
还有一些我认为与我遇到的问题不太相关的部分。
问题
我训练 1000 场比赛还是 3000000 场比赛似乎并不重要,玩家 1 或玩家 2 将赢得绝大多数比赛。100 场比赛中有 90 场由一名球员赢得。如果我输出实际的单个游戏移动和输出,我可以看到其他玩家赢得的游戏几乎总是幸运随机移动的结果。
同时,我注意到预测输出某种“支持”玩家。即输出似乎在 的负数一侧
0
,因此玩家 1 总是做出最好的动作,例如,但它们似乎都被预测为玩家 2 获胜。有时是玩家 1 赢得多数,其他时候是玩家 2。我假设这是由于随机权重对一名玩家初始化轻微。
大约第一场比赛不喜欢一个球员而不是另一个球员,但它很快就开始以一种方式“倾斜”。
我现在已经尝试训练超过 3000000 场比赛,这需要 3 天时间,但网络似乎仍然无法做出正确的决定。我已经通过在 riddles.io Connect 4 comp 上播放其他“机器人”来测试网络。
- 它没有意识到它需要连续阻挡对手4个
- 即使在 3000000 场比赛之后,它也不会将中柱作为第一步,我们知道这是你唯一可以保证获胜的开始动作。
任何帮助和指导将不胜感激。具体来说,我对 TD-Lambda 反向传播的实现是否正确?
neural-network - 如何判断我的自我游戏神经网络过度拟合
我有一个旨在玩 Connect 4 的神经网络,它衡量游戏状态对玩家 1 或玩家 2 的价值。
为了训练它,我让它与自己对战n
数场比赛。
我发现,即使每 100 场比赛的均方平均值在 100,000 个 epoch 中不断提高,1000 场比赛的游戏效果也比 100,000 场要好。
(我通过挑战http://riddles.io上排名第一的玩家来确定这一点)
因此,我得出的结论是发生了过度拟合。
考虑到自我博弈,你如何成功地测量/确定/估计已经发生过拟合?即,我如何确定何时停止自我播放?
machine-learning - 坚持理解 TD(0) 和 TD(λ) 的更新用途之间的区别
我正在从这篇文章中学习时间差异学习。这里 TD(0) 的更新规则对我来说很清楚,但是在 TD(λ) 中,我不明白所有先前状态的效用值是如何在一次更新中更新的。
这是用于比较机器人更新的图表:
上图解释如下:
在 TD(λ) 中,由于资格跟踪,结果被传播回所有先前的状态。
我的问题是,即使我们使用具有资格跟踪的以下更新规则,如何在一次更新中将信息传播到所有先前的状态?
在一次更新中,我们只更新单个状态Ut(s)
的实用程序,那么之前所有状态的实用程序是如何更新的呢?
编辑
根据答案,很明显,此更新适用于每一步,这就是传播信息的原因。如果是这种情况,那么它再次让我感到困惑,因为更新规则之间的唯一区别是资格跟踪。
因此,即使先前状态的资格跟踪值不为零,在上述情况下,delta 的值也将为零(因为最初奖励和效用函数初始化为 0)。那么,先前的状态如何在第一次更新时获得除零以外的其他效用值?
同样在给定的 python 实现中,在单次迭代后给出以下输出:
这里只更新了 2 个值,而不是如图所示的所有 5 个先前状态。我在这里缺少什么?
reinforcement-learning - 这是真的 ?预期 SARSA 和双 Q-Learning 怎么样?
我正在学习Reinforcement Learning
,我在理解 SARSA、Q-Learning、预期 SARSA、双 Q 学习和时间差异之间的区别时遇到了问题。你能解释一下区别并告诉我什么时候使用它们吗?而对e-greedy和greedy move有什么影响呢?
沙萨:
我处于状态St
,在策略的帮助下选择了一个动作,因此它将我移动到另一个状态St+1
根据状态中的策略,St+1
一个动作被执行,因此我Reward
的 inSt
将由于预期Reward
的前瞻性状态而被更新St+1
。
Q-学习:
我在状态St
,在政策的帮助下选择了一个动作,所以它让我进入状态St+1
,这一次它不会依赖于政策,而是它将观察状态中预期Reward
(贪婪Reward
)的最大值St+1
并通过它状态奖励St
将被更新。
预计 SARSA:
这将与 Q-learning 相同,而不是Reward
在贪婪的移动的帮助下更新我的St+1
我接受所有行动的预期回报:
时间差异:
当前Reward
将使用观察到的奖励Rt+1
和估计值V(St+1)
At更新timepoint t + 1
:
我得到的是真的还是我错过了什么?那么双Q学习呢?
以 0.5 的概率:
别的:
有人可以解释一下吗!!
machine-learning - 何时使用 Monte Carlo 而不是 TD 学习,反之亦然
在研究强化学习时,确切地说,当涉及到无模型强化学习时,我们通常使用两种方法:
- TD学习
- 蒙特卡洛
什么时候使用它们中的每一个?换句话说,我们如何确定哪种方法最适合我们的问题?
python - 实现 TD-Gammon 算法
我正在尝试从Gerald Tesauro的TD-Gammon 文章中实现算法。以下段落描述了学习算法的核心:
我决定有一个隐藏层(如果这足以在 1990 年代初玩世界级的西洋双陆棋,那对我来说就足够了)。我很确定除了train()
函数之外的一切都是正确的(它们更容易测试),但我不知道我是否正确地实现了这个最终算法。
我使用它的方式是玩一整场游戏(或者更确切地说,神经网络与自己对战),然后我将该游戏的状态从开始到结束发送到train()
,以及最终结果。然后它获取这个游戏日志,并应用上述公式使用第一个游戏状态,然后是第一个和第二个游戏状态,以此类推,直到最后一次,当它使用整个游戏状态列表时。然后我重复了很多次,并希望网络学习。
需要明确的是,我不是在对我的代码编写进行反馈。这绝不是一个快速而肮脏的实现,以确保我在正确的位置拥有所有的螺母和螺栓。
但是,我不知道它是否正确,因为到目前为止我还无法让它能够在任何合理的水平上玩井字游戏。这可能有很多原因。也许我没有给它足够的隐藏节点(我使用了 10 到 12 个)。也许它需要更多的游戏来训练(我已经使用了 200 000)。也许使用不同的归一化函数会做得更好(我已经尝试过不同变体的 sigmoid 和 ReLU,有泄漏和无泄漏)。也许学习参数没有正确调整。也许井字游戏及其确定性游戏玩法意味着它“锁定”了游戏树中的某些路径。或者也许培训实施是错误的。这就是我在这里的原因。
我误解了 Tesauro 的算法吗?