繁体   English   中英

如何通过强化学习更新函数逼近中的权重?

[英]How do you update the weights in function approximation with reinforcement learning?

我的具有梯度下降特性的SARSA不断使权重呈指数增长。 在第4集第17步中,该值已为nan

Exception: Qa is nan

例如:

6) Qa:
Qa = -2.00890180632e+303

7) NEXT Qa:
Next Qa with west = -2.28577776413e+303

8) THETA:
1.78032402991e+303 <= -0.1 + (0.1 * -2.28577776413e+303) - -2.00890180632e+303

9) WEIGHTS (sample)
5.18266630725e+302 <= -1.58305782482e+301 + (0.3 * 1.78032402991e+303 * 1)

我不知道在哪里寻找我犯的错误。 这是一些代码FWIW:

def getTheta(self, reward, Qa, QaNext):
    """ let t = r + yQw(s',a') - Qw(s,a) """
    theta = reward + (self.gamma * QaNext) - Qa


def updateWeights(self, Fsa, theta):
    """ wi <- wi + alpha * theta * Fi(s,a) """
    for i, w in enumerate(self.weights):
        self.weights[i] += (self.alpha * theta * Fsa[i])

我大约有183个二进制功能。

您需要在每个试验中进行归一化。 这将使权重保持在一定范围内。 (例如[0,1])。 他们用这种方式让您每次都增加重量,只是增加重量,第一次尝试后就没用了。

我会做这样的事情:

self.weights[i] += (self.alpha * theta * Fsa[i])
normalize(self.weights[i],wmin,wmax)

或参见以下示例(来自RL的文献):

在此处输入图片说明

不过,您需要自己编写归一化函数;)

我无权访问您的应用程序中的完整代码,因此我可能是错的。 但是我想我知道你要去哪里错了。 首先,这里不需要标准化。 在这种情况下,体重很快就肿,这说明您的实现存在问题。

我认为您的更新公式应该是:

self.weights [:, action_i] = self.weights [:, action_i] +(self.alpha * theta * Fsa [i])

就是说,您应该更新列而不是行,因为行是针对状态的,而列是针对权重矩阵的操作的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM