簡體   English   中英

深度Q-Network(DQN)學習游戲2048不提升

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM