Целевая сеть с глубоким Q-learning ведет себя иначе, чем сеть идентичных политик - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь реализовать глубокое Q-обучение с использованием PyTorch и среды OpenAI CartPole-v1. Мой агент использует сеть политик и целевую сеть, которая является просто копией сети политик, выполняемой каждые n итераций. Тем не менее, я получаю другое поведение при использовании целевой сети по сравнению с использованием сети политики , даже если n равно 1 (т.е. целевая сеть копируется из сети политики каждый раз, когда она используется) .

Например, в приведенном ниже коде, если я вычислю next_q_value, используя закомментированную строку с сетью политик вместо отдельной целевой сети, агенту (как правило) удается со временем улучшиться. Но использование целевой сети (которая имеет точно такие же параметры и рассчитывает точно такое же значение потерь) означает, что агент никогда не работает лучше, чем случайный.

class DeepQLearningActor():
    def __init__(self, environment, learning_rate, discount_rate, hidden_width):
        input_width = environment.observation_space.shape[0]
        output_width = environment.action_space.n
        self.policy_network = self.init_network(input_width, hidden_width, output_width)
        self.target_network = self.init_network(input_width, hidden_width, output_width)
        self.target_network.load_state_dict(self.policy_network.state_dict())

        self.optimizer = optim.SGD(self.policy_network.parameters(), lr=learning_rate)
        self.gamma = discount_rate

    def init_network(self, input_width, hidden_width, output_width):
        return nn.Sequential(
            nn.Linear(input_width, hidden_width),
            nn.ReLU(),
            nn.Linear(hidden_width, output_width)
        )

    # ...

    def update(self, state, action, reward, next_state):
        self.optimizer.zero_grad()

        current_q_value = self.policy_network(torch.tensor([state], dtype=torch.float32))[0][action]
        self.target_network.load_state_dict(self.policy_network.state_dict())
        next_q_value = self.target_network(torch.tensor([next_state], dtype=torch.float32))[0].max()
        # next_q_value = self.policy_network(torch.tensor([next_state], dtype=torch.float32))[0].max()
        target_q_value = next_q_value * self.gamma + reward

        loss = F.mse_loss(current_q_value, target_q_value)
        loss.backward()
        self.optimizer.step()

Я не понимаю, что здесь происходит. Я предполагаю, что разница в поведении должна быть введена loss.backward() и / или self.optimizer.step(), но что именно они делают по-разному в каждом случае? И почему это полностью препятствует улучшению агента, а не просто замедляет его?

...