[英]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.