Я пытаюсь реализовать глубокое 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()
, но что именно они делают по-разному в каждом случае? И почему это полностью препятствует улучшению агента, а не просто замедляет его?