НачатьНачать бесплатно

Обучение Double DQN

Теперь вы модифицируете код DQN для реализации Double DQN.

Double DQN требует лишь минимальной корректировки алгоритма DQN, однако это небольшое изменение существенно помогает решить проблему переоценки Q-значений и нередко даёт лучшие результаты по сравнению с обычным DQN.

Это упражнение является частью курса

Глубокое обучение с подкреплением на Python

Посмотреть курс

Инструкции к упражнению

  • Вычислите следующие действия для расчёта Q-цели с помощью online_network(), убедившись, что выбрано правильное действие и получена нужная форма тензора.
  • Оцените Q-значения для этих действий с помощью target_network(), снова убедившись, что получены корректные значения и правильная форма тензора.

Интерактивное практическое упражнение

Попробуйте выполнить это упражнение, дополнив этот пример кода.

for episode in range(10):
    state, info = env.reset()
    done = False
    step = 0
    episode_reward = 0
    while not done:
        step += 1
        total_steps += 1
        q_values = online_network(state)
        action = select_action(q_values, total_steps, start=.9, end=.05, decay=1000)
        next_state, reward, terminated, truncated, _ = env.step(action)
        done = terminated or truncated
        replay_buffer.push(state, action, reward, next_state, done)        
        if len(replay_buffer) >= batch_size:
            states, actions, rewards, next_states, dones = replay_buffer.sample(64)
            q_values = online_network(states).gather(1, actions).squeeze(1)
            with torch.no_grad():
                # Obtain next actions for Q-target calculation
                next_actions = ____.____.____
                # Estimate next Q-values from these actions
                next_q_values = ____.____.____
                target_q_values = rewards + gamma * next_q_values * (1-dones)
            loss = nn.MSELoss()(q_values, target_q_values)
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()
            update_target_network(target_network, online_network, tau=.005)
        state = next_state
        episode_reward += reward    
    describe_episode(episode, reward, episode_reward, step)
Редактировать и запускать код