Machine learning 利用梯度讨论实现SARSA

Machine learning 利用梯度讨论实现SARSA,machine-learning,reinforcement-learning,sarsa,Machine Learning,Reinforcement Learning,Sarsa,我已经使用表查找成功地实现了一个SARSA算法(一步式和使用资格跟踪)。本质上,我有一个q值矩阵,其中每一行对应一个状态,每一列对应一个动作 比如: [Q(s1,a1), Q(s1,a2), Q(s1,a3), Q(s1,a4)] [Q(s2,a1), (Q(s2,a2), Q(s2a3), Q(s2, a2] . . . [Q(sn,a1), Q(sn,a2), Q(sn,a3), Q(sn,a4)] [0 0 0 1 0 0] X [ 4 7 9 3] [

我已经使用表查找成功地实现了一个SARSA算法(一步式和使用资格跟踪)。本质上,我有一个q值矩阵,其中每一行对应一个状态,每一列对应一个动作

比如:

[Q(s1,a1), Q(s1,a2), Q(s1,a3), Q(s1,a4)]
[Q(s2,a1), (Q(s2,a2), Q(s2a3), Q(s2, a2]
.
.
.
[Q(sn,a1), Q(sn,a2), Q(sn,a3), Q(sn,a4)]
[0 0 0 1 0 0] X [ 4 7 9 3]
                [ 5 3 2 9]
                [ 3 5 6 9]
                [ 9 3 2 6]
                [ 2 5 7 8]
                [ 8 2 3 5]
在每个时间步,从矩阵中选取一行,并根据策略,根据SARSA规则选取和更新操作

我现在正试图用梯度下降法将其实现为一个神经网络

我的第一个假设是创建一个两层网络,输入层具有与状态相同的输入神经元,输出层具有与动作相同的输出神经元。每个输入将完全连接到每个输出。(因此,事实上,它看起来就像上面的矩阵)

我的输入向量是1xn行向量,其中n是输入神经元的数量。输入向量中的所有值都将为0,与当前状态对应的索引除外,该索引将为1。即:

[0 0 0 1 0 0]
将是处于状态4的代理的输入向量

所以,这个过程应该是这样的:

[Q(s1,a1), Q(s1,a2), Q(s1,a3), Q(s1,a4)]
[Q(s2,a1), (Q(s2,a2), Q(s2a3), Q(s2, a2]
.
.
.
[Q(sn,a1), Q(sn,a2), Q(sn,a3), Q(sn,a4)]
[0 0 0 1 0 0] X [ 4 7 9 3]
                [ 5 3 2 9]
                [ 3 5 6 9]
                [ 9 3 2 6]
                [ 2 5 7 8]
                [ 8 2 3 5]
我创建了一个随机的样本权重矩阵

结果将是:

[9 3 2 6]
这意味着,如果选择贪婪策略,则应选择动作1,并且第四个输入神经元和第一个输出神经元之间的连接应通过以下方式加强:

dw = dw_old + learning_rate*(reward + discount*network_output - dw_old)
(方程式取自SARSA算法)

然而,这个实现并不能说服我。根据我所读到的,网络权重应该用来计算状态-动作对的Q值,但我不确定它们是否应该代表这样的值。(特别是因为我通常看到权重值仅包含在0和1之间。)


有什么建议吗?

总结:您当前的方法是正确的,只是不应该将输出值限制在0到1之间

有一个很好的解释,我将在这里总结。它没有具体讨论SARSA,但我认为它所说的一切都应该翻译

结果向量中的值确实应该代表神经网络对与每个状态相关的Q值的估计。因此,通常建议您不要将允许值的范围限制在0到1之间(因此只需将值乘以连接权重求和,而不是使用某种sigmoid激活函数)

至于如何表示状态,一种选择是根据代理拥有或理论上可能拥有的传感器来表示状态。例如,在下面的示例中,机器人有三个“触角”传感器,每个传感器可以处于三种状态之一。它们一起为机器人提供它将获得的关于它处于哪个状态的所有信息


然而,如果你想给你的代理提供完美的信息,你可以想象它有一个传感器,可以准确地告诉它处于什么状态,如本章末尾所示。这将完全按照当前网络设置的方式工作,每个状态都有一个输入。

Hi@seaotternerd,谢谢!:)作为一个简单的问题,我注意到,如果我不将权重标准化/将输出重新限制为某个sigmoid函数,这些函数往往会变得不成比例。特别是如果我在大量的历史中训练网络。在MatLab中,较大的值最终变成NaN。有什么建议吗?我一直在寻找一些可能的解释,但我没有找到任何。在许多方面,建立有效的神经网络(特别是对于像这样复杂的学习问题)在很大程度上仍然是一门艺术。相对于MatLab所能代表的最大数字,您的奖励的数量是否非常大?是的,特别是因为对于我遇到的问题类型,奖励可能会根据各种条件而变化。我已经设法通过使用一个sigmoid函数来模拟网络的输出来解决这个问题。不理想的人似乎正在做这项工作。谢谢你的帮助!:)