시작하기무료로 시작하기

완전한 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)
코드 편집 및 실행