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
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ùngtotal_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)