我的SARSA渐变下降不断使权重呈指数增长。在第4集第17步,该值已经是纳米
Exception: Qa is nan
e.g:
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)
每次试验都需要标准化。这将使权重保持在有界范围内。 (例如[0,1])。他们每次都会增加权重,只是增加权重,在第一次审判后就没用了。
我会做这样的事情:
self.weights[i] += (self.alpha * theta * Fsa[i])
normalize(self.weights[i],wmin,wmax)
或参见以下示例(来自RL的文献):
您需要自己编写规范化函数;)
答案 1 :(得分:0)
我无权访问您的应用程序中的完整代码,因此我可能是错的。但是我想我知道你要去哪里错了。 首先,这里不需要标准化。在这种情况下,体重很快就so肿,这说明您的实现存在问题。
我认为您的更新公式应为:-
self.weights [:, action_i] = self.weights [:, action_i] +(self.alpha * theta * Fsa [i])
这就是说,您应该更新列而不是行,因为行是针对状态的,列是针对权重矩阵中的操作的。