簡體   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