Реализация полного алгоритма DQN
Вот и настал долгожданный момент! Все необходимые компоненты готовы — теперь вы реализуете полный алгоритм DQN и обучите агента для задачи Lunar Lander. Алгоритм будет использовать не только Experience Replay, но и затухающую ε-жадность (Decayed Epsilon-Greediness), а также фиксированные Q-цели (Fixed Q-Targets).
Функция select_action(), реализующая затухающую ε-жадность, уже доступна для использования, как и функция update_target_network() из предыдущего упражнения. Осталось встроить эти функции в цикл обучения DQN и убедиться, что целевая сеть корректно используется при вычислении функции потерь.
Вам понадобится счётчик шагов total_steps, чтобы постепенно уменьшать значение \(\varepsilon\) со временем. Эта переменная уже инициализирована для вас со значением 0.
Это упражнение является частью курса
Глубокое обучение с подкреплением на Python
Инструкции к упражнению
- Используйте
select_action()для реализации затухающей ε-жадности и выбора действия агента; передайте переменнуюtotal_steps— накопленное количество шагов по всем эпизодам. - Перед вычислением TD-цели отключите отслеживание градиентов.
- После получения следующего состояния вычислите Q-значения для этого состояния.
- В конце каждого шага обновите целевую сеть.
Интерактивное практическое упражнение
Попробуйте выполнить это упражнение, дополнив этот пример кода.
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)
# Select the action with epsilon greediness
action = ____(____, ____, 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)
# Ensure gradients are not tracked
with ____:
# Obtain the next state Q-values
next_q_values = ____(next_states).amax(1)
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 the target network weights
____(____, ____, tau=.005)
state = next_state
episode_reward += reward
describe_episode(episode, reward, episode_reward, step)