【问题标题】:Deep Q-Network (DQN) to learn the game 2048 does not improveDeep Q-Network (DQN) 学习游戏 2048 不提升
【发布时间】:2019-10-28 09:16:11
【问题描述】:

我正在尝试构建一个可以学习玩游戏 2048 的深度 Q 网络 (DQN) 代理。我正在研究基于游戏蛇的其他程序和文章,它运行良好 (specifically this one)。

作为输入状态,我只使用带有瓦片的网格作为 numpy 数组,作为奖励,我使用 (newScore-oldScore-1) 来惩罚根本不给任何分数的移动。我知道这可能不是最佳选择,因为最好的奖励是尽可能长时间地活着,但第一步应该没问题,对吧?然而,我没有得到任何好的结果。

我尝试调整模型布局、神经元和层数、优化器、伽玛、学习率、奖励等。我还尝试在 5 步后结束游戏并仅针对前 5 步进行优化,但无论我做什么,我都没有得到任何明显的改进。我已经运行了数千场比赛,但它并没有变得更好。事实上,有时我得到的结果比完全随机的算法更糟糕,因为有时它只会为任何输入返回相同的输出并卡住。

所以,我的问题是,如果我做错了什么?我只是在某个地方犯了一个愚蠢的小错误吗?这完全是错误的方法吗? (我知道如果没有 AI,这个游戏可能会很容易解决,但这似乎是一个有趣的项目)

我的 Jupyter 笔记本可以在这里看到 Github。很抱歉代码质量差,我还是个初学者,我知道即使是有趣的小项目,我也需要开始制作文档。

一些代码sn-ps:

输入被格式化为 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)

【问题讨论】:

    标签: python keras artificial-intelligence reinforcement-learning


    【解决方案1】:

    超参数调优是一个你应该避免的巨大时间沉没的兔子洞。 在其他地方进行改进。

    我推荐的一个建议是让您获取一个现成的库 并使用他们的 DQN 实现来测试这个 2048 环境。然后比较 您的基准测试并隔离问题点。你会更容易 检查是否是你的超参数、奖励、模型、内存大小等。

    一目了然,这里有一些突出的东西: epsilon 从 75 开始 随机范围 0 - 200 您的代理可能没有进行足够的探索。我的理解是,在不到 75 次尝试中,您的代理正在利用,因为您没有衰减您的 epsilon,而是从中减去 1。

    奖励 -10 让我在某些环境中表现得不稳定。试试 -1。

    len(memory) > 500: # Magic number -- 为什么是 500?

    在进行比较时确保你有一个固定的种子。

    图层大小背后的原因是什么? 你试过16、16、4还是16、8、4? 16、20、4 是否给了你更好的结果?

    最难阅读的不是代码,而是你得到的结果。 我很难看到您的代理获得了多少奖励以及何时失败/通过等。标记您的 X 和 Y。

    尝试训练超过 1 个 epoch。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-09
      • 1970-01-01
      • 2020-08-03
      • 2016-09-26
      • 2018-03-28
      • 1970-01-01
      • 2015-03-17
      • 2019-06-15
      相关资源
      最近更新 更多