Deep Q Learning: вопрос о обратном распространении - PullRequest
1 голос
/ 19 марта 2020

Я пытаюсь создать обучающую нейронную сеть для задачи 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
...