gpt4 book ai didi

python - 训练 DQN 时 Q 值爆炸

转载 作者:行者123 更新时间:2023-11-28 18:14:58 31 4
gpt4 key购买 nike

我正在训练 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 具有与之前完全相同的输出?不,可能不会;从隐藏节点到最后两个输出的连接可能仍然具有相同的权重,但所有三个隐藏节点将具有不同的激活级别。所以不,不能保证其他输出保持不变。

Example Neural Network

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

除此之外,众所周知,DQN 仍然有高估 Q 值的倾向(尽管它通常不应该完全爆炸)。这可以通过使用 Double DQN 来解决。 (注意:这是后来在 DQN 之上添加的改进)。

关于python - 训练 DQN 时 Q 值爆炸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48898104/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com