2

我的梯度下降 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 个二进制特征。

4

2 回答 2

1

您需要在每次试验中进行标准化。这将使权重保持在有界范围内。(例如 [0,1])。他们每次都在增加权重,只是增加了权重,第一次试用后就没用了。

我会做这样的事情:

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

或查看以下示例(来自 RL 的文献):

在此处输入图像描述

您需要自己编写规范化函数;)

于 2014-05-30T12:17:36.413 回答
0

我无权访问您应用程序中的完整代码,所以我可能错了。但我想我知道你哪里出错了。首先,这里不需要标准化。在这种情况下,权重这么快就变得臃肿表明您的实施存在问题。

我认为您的更新方程式应该是:-

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

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

于 2018-12-17T06:03:42.837 回答