[英]Deep Q-Network (DQN) to learn the game 2048 does not improve
我正在嘗試構建一個可以學習玩游戲2048的 Deep Q-Network (DQN) 代理。 我正在將自己定位於基於游戲蛇的其他程序和文章,並且效果很好( 特別是這個)。
作為輸入狀態,我只使用帶有瓷磚的網格作為 numpy 數組,作為獎勵,我使用 (newScore-oldScore-1) 來懲罰根本不給分的動作。 我知道這可能不是最優的,因為最好能獎勵盡可能長時間地活着,但第一步應該沒問題,對吧? 然而,我沒有得到任何好的結果。
我試圖調整模型布局、神經元和層的數量、優化器、伽瑪、學習率、獎勵等。 我還嘗試在 5 步后結束游戲並僅針對前 5 步進行優化,但無論我做什么,我都沒有得到任何明顯的改進。 我已經運行了數千場比賽,但它並沒有變得更好。 事實上,有時我會得到比完全隨機算法更糟糕的結果,因為有時它只是為任何輸入返回相同的輸出並卡住。
所以,我的問題是,如果我從根本上做錯了什么? 我只是在某個地方犯了一個愚蠢的小錯誤嗎? 這是完全錯誤的方法嗎? (我知道沒有 AI 游戲可能很容易解決,但這似乎是一個有趣的項目)
我的 Jupyter 筆記本可以在Github上看到。 抱歉代碼質量很差,我還是個初學者,我知道即使是有趣的小項目,我也需要開始制作文檔。
一些代碼片段:
輸入格式為 1,16 numpy 數組,還嘗試對值進行標准化或僅使用 1 和 0 來表示已占用和空單元格,但這也無濟於事。 這就是為什么我認為這可能更多是一個概念問題?
def get_board(self):
grid = self.driver.execute_script("return myGM.grid.cells;")
mygrid = []
for line in grid:
a = [x['value'] if x != None else 0 for x in line]
#a = [1 if x != None else 0 for x in line]
mygrid.append(a)
return np.array(mygrid).reshape(1,16)
輸出是 {0,3} 的索引,代表向上、向下、向左或向右的動作,它只是具有最高預測分數的值。
prediction = agent.model.predict(old_state)
predicted_move = np.argmax(prediction)
我已經嘗試了很多不同的模型架構,但現在選擇了一個更簡單的網絡,因為我讀到不必要的復雜結構通常是一個問題並且不需要。 但是,我找不到任何可靠的方法來源,除了實驗之外如何獲得最佳布局,所以我很樂意在那里提供更多建議。
model = models.Sequential()
model.add(Dense(16, activation='relu', input_dim=16))
#model.add(Dropout(0.15))
#model.add(Dense(50, activation='relu'))
#model.add(Dropout(0.15))
model.add(Dense(20, activation='relu'))
#model.add(Dropout(0.15))
#model.add(Dense(30, input_dim=16, activation='relu'))
#model.add(Dropout(0.15))
#model.add(Dense(30, activation='relu'))
#model.add(Dropout(0.15))
#model.add(Dense(8, activation='relu'))
#model.add(Dropout(0.15))
model.add(Dense(4, activation='linear'))
opt = Adam(lr=self.learning_rate)
model.compile(loss='mse', optimizer=opt)
超參數調整是一個巨大的時間沉沒兔子洞,您應該避免。 在其他地方進行改進。
我推薦的一個建議是讓您獲取一個現成的庫並使用他們的 DQN 實現來測試這個 2048 環境。 然后比較您的基准並隔離故障點。 您可以更輕松地檢查是否是您的超參數、獎勵、模型、內存大小等。
一目了然,這里有一些突出的東西: epsilon 從 75 隨機范圍開始 0 - 200 可能您的代理探索不夠。 我的理解是,在不到 75 次嘗試中,您的代理正在利用,因為您沒有衰減 epsilon 而是從中減去 1。
獎勵 -10 在某些環境中給了我不穩定的行為。 嘗試-1。
len(memory) > 500: # 幻數——為什么是 500?
進行比較時,請確保您有一個固定的種子。
你的層大小背后的原因是什么? 您是否嘗試過 16、16、4 或 16、8、4? 16、20、4 是否給了你更好的結果?
最難閱讀的部分不是代碼,而是你得到的結果。 我很難看到您的代理獲得了多少獎勵以及何時失敗/通過等。標記您的 X 和 Y。
嘗試訓練超過 1 個 epoch。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.