- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在训练 DQN 来玩 OpenAI 的 Atari 环境,但我的网络的 Q 值迅速爆炸,远高于现实水平。
这是代码的相关部分:
for state, action, reward, next_state, done in minibatch:
if not done:
# To save on memory, next_state is just one frame
# So we have to add it to the current state to get the actual input for the network
next_4_states = np.array(state)
next_4_states = np.roll(next_4_states, 1, axis=3)
next_4_states[:, :, :, 0] = next_state
target = reward + self.gamma * \
np.amax(self.target_model.predict(next_4_states))
else:
target = reward
target_f = self.target_model.predict(state)
target_f[0][action] = target
self.target_model.fit(state, target_f, epochs=1, verbose=0)
折扣因子为 0.99(折扣因子为 0.9 时不会发生这种情况,但也不会收敛,因为它不能考虑得足够远)。
单步执行代码,它发生的原因是所有不打算更新的 Q 值(我们没有采取的行动的值)略有增加。据我了解,在训练期间将网络自己的输出传递给网络应该保持输出不变,而不是增加或减少。我的模型有问题吗?有什么方法可以屏蔽更新,使其只更新相关的 Q 值吗?
编辑:我的模型创建代码在这里:
def create_model(self, input_shape, num_actions, learning_rate):
model = Sequential()
model.add(Convolution2D(32, 8, strides=(4, 4),
activation='relu', input_shape=(input_shape)))
model.add(Convolution2D(64, 4, strides=(2, 2), activation='relu'))
model.add(Convolution2D(64, 3, strides=(1, 1), activation='relu'))
model.add(Flatten())
model.add(Dense(512, activation='relu'))
model.add(Dense(num_actions))
model.compile(loss='mse', optimizer=Adam(lr=learning_rate))
return model
我创建了其中两个。一种用于在线网络,一种用于目标。
最佳答案
Stepping through the code, the reason it's happening is all the Q values that aren't meant to be updated (the ones for actions we didn't take) increase slightly. It's my understanding that passing the networks own output to the network during training should keep the output the same, not increase or decrease it.
下面我画了一个非常简单的神经网络,有 3 个输入节点、3 个隐藏节点和 3 个输出节点。假设您只为第一个 Action 设置了一个新目标,并再次将现有预测用作其他 Action 的目标。对于第一个操作/输出,这只会导致非零(为简单起见,我假设大于零)错误(在图像中用 delta
表示),以及 0 的错误
对于其他人。
我用粗体画出了错误从输出传播到隐藏层的连接。请注意隐藏层中的每个节点仍然会出错。当这些节点随后将它们的错误传播回输入层时,它们将通过输入层和隐藏层之间的所有连接来执行此操作,因此所有这些权重都可以是所有修改的。
因此,想象一下所有这些权重都已更新,现在想象一下使用原始输入进行新的前向传递。您是否希望输出节点 2 和 3 具有与之前完全相同的输出?不,可能不会;从隐藏节点到最后两个输出的连接可能仍然具有相同的权重,但所有三个隐藏节点将具有不同的激活级别。所以不,不能保证其他输出保持不变。
Is there some way I can mask the update so it only updates the relevant Q value?
如果有的话,也不容易。问题是除了最后一对之间的连接之外,成对层之间的连接不是特定于 Action 的,我认为您也不希望它们是特定于 Action 的。
Is there something wrong with my model?
我看到的一件事是您似乎正在更新用于生成目标的同一个网络:
target_f = self.target_model.predict(state)
和
self.target_model.fit(state, target_f, epochs=1, verbose=0)
两者都使用 self.target_model
。您应该为这两条线使用单独的网络副本,并且仅在较长时间后才将更新后的网络权重复制到用于计算目标的网络中。有关更多信息,请参阅 this post 中的添加 3 .
除此之外,众所周知,DQN 仍然有高估 Q 值的倾向(尽管它通常不应该完全爆炸)。这可以通过使用 Double DQN 来解决。 (注意:这是后来在 DQN 之上添加的改进)。
关于python - 训练 DQN 时 Q 值爆炸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48898104/
我正在尝试使用 keras 在 Python 中编写自己的 DQN。我认为我的逻辑是正确的。我正在 CartPole 环境中尝试,但奖励在 50,000 集后并没有增加。任何帮助将不胜感激。目前我不关
我一直在尝试使用本文中的 DQN 解决 OpenAI 登月游戏 https://arxiv.org/pdf/2006.04938v2.pdf 问题是训练 50 集需要 12 个小时,所以一定是出了什么
我有一个或多或少标准的 DQN 实现来解决 Atari“Breakout”(来自 Coursera 强化学习类(class)),它在不同的计算机上表现完全不同: 在我的笔记本电脑上它收敛每次我运行它
QLearning方法有着明显的局限性,当状态和动作空间是离散的且维数不高时可使用Q-Table存储每个状态动作的Q值,而当状态和动作时高维连续时,该方法便不太适用。可以将Q-Table的更新问题变
对于强化学习,我读到张量板并不理想,因为它提供了每集和/或步骤的输入。由于强化学习有数千个步骤,因此它并没有给我们内容的概述。我在这里看到了这个修改后的张量板类:https://pythonprogr
对于强化学习,我读到张量板并不理想,因为它提供了每集和/或步骤的输入。由于强化学习有数千个步骤,因此它并没有给我们内容的概述。我在这里看到了这个修改后的张量板类:https://pythonprogr
我创建了一个深度 Q 网络来玩贪吃蛇。该代码运行良好,但在训练周期中性能并未真正提高。最后,它与采取随机操作的代理几乎没有区别。这是训练代码: def train(self): sel
编辑:以下似乎也是 FrozenLake-v0 的情况.请注意,我对简单的 Q 学习不感兴趣,因为我想看到适用于连续观察空间的解决方案。 我最近创建了 banana_gym OpenAI 环境。场景如
我正在使用 DQN 算法在我的环境中训练代理,如下所示: 代理通过选择离散 Action (左、右、上、下)来控制汽车 目标是以理想的速度行驶而不会撞到其他汽车 状态包含代理的汽车和周围汽车的速度和位
我正在实现简单的 DQN算法使用 pytorch , 解决来自 gym 的 CartPole 环境.我已经调试了一段时间,我无法弄清楚为什么模型没有学习。 观察: 使用 SmoothL1Loss性能比
我正在尝试构建一个可以学习玩游戏的深度 Q 网络 (DQN) 代理 2048 。我正在关注基于蛇游戏的其他程序和文章,并且效果很好( specifically this one )。 作为输入状态,我
我的任务涉及大型网格世界类型的环境(网格大小可能为 30x30、50x50、100x100,最大为 200x200)。该网格中的每个元素包含 0 或 1,它们在每个情节中随机初始化。我的目标是训练一个
我正在改编 Tabor 的 DQN 类(class) (https://github.com/philtabor/Deep-Q-Learning-Paper-To-Code) 中的 Pytorch 代
我正在使用 keras 构建 DQN,并使用具有经验回放内存的经典 DQN 算法对其进行训练。由于在 dqn 中,您需要多次调用 model.fit,这意味着每次从重播内存中采样批量数据时,使用 ke
我正在改编 Tabor 的 DQN 类(class) (https://github.com/philtabor/Deep-Q-Learning-Paper-To-Code) 中的 Pytorch 代
鉴于 OpenAI Gym 环境 MountainCar-v0总是返回 -1.0 作为奖励(即使目标实现了),我不明白 DQN 与经验回放如何收敛,但我知道它会收敛,因为我有 working code
我正在训练 DQN 来玩 OpenAI 的 Atari 环境,但我的网络的 Q 值迅速爆炸,远高于现实水平。 这是代码的相关部分: for state, action, reward, next_st
我最近开始研究神经网络。我目前正在试验 DQN。我已经能够让他们使用大量的 Atari 教程,但发现我无法理解整个问题,所以我为 DQN 编写了一个简单的模式来处理它只是 A 比 B 大,如果不是,则
您好,我正在尝试训练 DQN 来解决健身房的 Cartpole 问题。出于某种原因 Loss看起来像这样(橙色线)。你们能看看我的代码并帮助解决这个问题吗?我对超参数进行了一些尝试,所以我认为它们不是
所以我一直在关注 DQN 代理示例/教程,并按照示例中的方式进行设置,唯一的区别是我构建了自己的自定义 python 环境,然后将其包装在 TensorFlow 中。然而,无论我如何塑造我的观察和行动
我是一名优秀的程序员,十分优秀!