我正在尝试为OpenAI Gym的CartPole v0问题创建一个强化学习神经网络。我知道要找到神经网络的误差,我必须从Bellman方程计算目标Q值,然后从神经网络输出的Q值中减去目标Q值。但这不只是给我其中一个输出的错误吗?例如,如果我的网络输出两个Q值[A = .2,B = .8],则所选操作将为B,因为它具有更大的Q值。然后,使用Bellman方程,在找到下一个状态后,我可以计算动作B的目标Q值。由于不知道是否要选择动作A,因此如何确定A的目标值?
这是我的反向传播代码:
它从32号随机迷你批次中学习
delta_target是所选操作的错误
delta_1是神经网络输出层的错误(仅2个输出)
我将未选择的操作的错误设置为零(应将其设置为??)
def replay(self, b_size):
mini_batch = random.sample(self.memory, b_size)
for c_state, c_action, c_reward, n_state, n_done in mini_batch:
target = c_reward
if not done:
target = (c_reward + self.gamma * np.amax(self.predict(n_state)))
delta_target = self.predict(c_state)[action] - target
self.learn(delta_target, c_action)
if self.epsilon > self.epsilon_min:
self.epsilon *= self.epsilon_decay
def learn(self, d_target, act):
delta_1 = np.zeros((self.action_size, 1))
delta_1[act] = d_target
delta_0 = np.dot(web.weight[1].T, delta_1)
web.weight[1] -= self.alpha * web.layer[1].T * delta_1
web.weight[0] -= self.alpha * web.layer[0].T * delta_0
web.bias[2] -= self.alpha * delta_1
web.bias[1] -= self.alpha * delta_0