Bắt đầu ngayBắt đầu miễn phí

Hiện thực thuật toán DQN hoàn chỉnh

Đã đến lúc bắt tay vào làm! Mọi điều kiện tiên quyết đã sẵn sàng; giờ bạn sẽ hiện thực toàn bộ thuật toán DQN và dùng nó để huấn luyện một agent Lunar Lander. Nghĩa là thuật toán của bạn sẽ không chỉ dùng Experience Replay, mà còn có Decayed Epsilon-Greediness và Fixed Q-Targets.

Hàm select_action() hiện thực Decayed Epsilon Greediness đã sẵn sàng để bạn dùng, tương tự như hàm update_target_network() từ bài trước. Việc còn lại là lồng ghép các hàm này vào vòng lặp huấn luyện DQN và đảm bảo bạn dùng đúng Target Network trong phần tính loss.

Bạn cần duy trì một bộ đếm bước mới, total_steps, để giảm dần giá trị của \(\varepsilon\) theo thời gian. Biến này đã được khởi tạo sẵn với giá trị 0.

Bài tập này là một phần của khóa học

Deep Reinforcement Learning bằng Python

Xem khóa học

Hướng dẫn bài tập

  • Dùng select_action() để hiện thực Decayed Epsilon Greediness và chọn hành động của agent; bạn sẽ cần dùng total_steps, tổng tích lũy qua các episode.
  • Trước khi tính TD target, hãy tắt theo dõi gradient.
  • Sau khi có trạng thái kế tiếp, lấy các Q-Value của trạng thái kế tiếp.
  • Cập nhật target network ở cuối mỗi bước.

Bài tập tương tác thực hành trực tiếp

Hãy thử làm bài tập này bằng cách hoàn thành đoạn mã mẫu này.

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)
Chỉnh sửa và Chạy Mã