Я пытаюсь создать обучающую нейронную сеть для задачи CartPole v0 из OpenAI Gym. Я понимаю, что, чтобы найти ошибку нейронной сети, я должен вычислить целевое значение Q из уравнения Беллмана и вычесть его из значения Q, выведенного нейронной сетью. Но разве это не дает мне ошибку только для одного из выходов? Например, если моя сеть выдает два значения Q [A = .2, B = .8], выбранное действие будет B, поскольку оно имеет большее значение Q. Затем, используя уравнение Беллмана, я могу вычислить целевое значение Q действия B после того, как найду следующее состояние. Как мне найти целевое значение для 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