완전한 DQN 알고리즘 구현하기
드디어 그 시간이 왔어요! 필요한 준비를 모두 마쳤으니, 이제 전체 DQN 알고리즘을 구현하고 이를 사용해 Lunar Lander 에이전트를 학습시켜 볼 거예요. 이 말은 곧, Experience Replay뿐 아니라 Decayed Epsilon-Greediness와 Fixed Q-Targets까지 모두 사용한다는 뜻이에요.
Decayed Epsilon Greediness를 구현한 select_action() 함수와 지난 연습 문제에서 만든 update_target_network() 함수가 준비되어 있어요. 이제 남은 일은 이 함수들을 DQN 학습 루프에 맞게 넣고, 손실을 계산할 때 Target Network를 올바르게 사용하는지 확인하는 거예요.
시간에 따라 \(\varepsilon\) 값을 감소시키려면 새로운 스텝 카운터 total_steps를 유지해야 해요. 이 변수는 0으로 초기화되어 있어요.
이 연습은 강의의 일부입니다
Python으로 배우는 Deep Reinforcement Learning
연습 안내
- Decayed Epsilon Greediness를 구현하기 위해
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)