DQN với experience replay

Deep Reinforcement Learning bằng Python

Timothée Carayol

Principal Machine Learning Engineer, Komment

Giới thiệu về experience replay

 

  • DQN tối giản chỉ học từ trải nghiệm mới nhất
    • Các cập nhật liên tiếp tương quan mạnh
    • Tác tử dễ quên
  • Giải pháp: Experience Replay
    • Lưu trải nghiệm vào buffer
    • Mỗi bước, học từ một batch ngẫu nhiên các trải nghiệm cũ

 

Ảnh chụp từ trên cao của một mê cung hàng rào

Deep Reinforcement Learning bằng Python

Hàng đợi hai đầu (Deque)

 

from collections import deque

# Khởi tạo với dung lượng giới hạn buffer = deque([1,2,3,4], maxlen=7)
# Thêm vào phía phải buffer.extend([5,6,7,8])
  • Vượt dung lượng, phần tử cũ nhất sẽ bị loại

Một deque dung lượng bảy, chứa bốn phần tử nhãn một đến bốn.

Một deque dung lượng bảy, chứa bốn phần tử nhãn một đến bốn. Bốn phần tử nhãn năm đến tám ở bên phải.

Một deque dung lượng bảy, chứa bảy phần tử nhãn một đến bảy. Một phần tử nhãn 8 ở bên phải.

Một deque dung lượng bảy, chứa bảy phần tử nhãn hai đến tám. Một phần tử nhãn 1 ở bên trái.

Deep Reinforcement Learning bằng Python

Triển khai Replay Buffer

import random

class ReplayBuffer:
def __init__(self, capacity):
self.memory = deque([], maxlen=capacity)
def push(self, state, action, reward, next_state, done):
experience_tuple = (state, action, reward, next_state, done)
self.memory.append(experience_tuple)
def __len__(self): return len(self.memory)
...
  • Replay memory: deque dung lượng giới hạn
  • .push():
    • Trải nghiệm là bộ chuyển tiếp
    • Thêm trải nghiệm vào buffer
    • Đầy dung lượng: loại bỏ trải nghiệm cũ nhất
Deep Reinforcement Learning bằng Python

Triển khai Replay Buffer

...
def sample(self, batch_size):

batch = random.sample(self.memory, batch_size)
states, actions, rewards, next_states, dones = ( zip(*batch))
states_tensor = torch.tensor( states, dtype=torch.float32) ... # repeat identically for # rewards, next_states, dones
actions_tensor = torch.tensor( actions, dtype=torch.long).unsqueeze(1)
return states_tensor, actions_tensor, rewards_tensor, next_states_tensor, dones_tensor

 

  • Lấy ngẫu nhiên từ trải nghiệm quá khứ
  • batch: từ danh sách các bộ chuyển tiếp...
  • ...thành bộ các danh sách...
  • ...thành bộ các tensor PyTorch
Deep Reinforcement Learning bằng Python

Tích hợp Experience Replay trong DQN

  1. Trước vòng lặp huấn luyện: replay_buffer = ReplayBuffer(10000)

  2. Trong vòng lặp, sau khi chọn hành động:

replay_buffer.push((state, action, 
                    reward, next_state, done))

if len(replay_buffer) >= batch_size:
states, actions, rewards, next_states, dones = ( replay_buffer.sample(batch_size))
q_values = ( q_network(states).gather(1, actions).squeeze(1))
next_states_q_values = q_network(next_states).amax(1)
target_q_values = ( rewards + gamma * next_states_q_values * (1-dones))
loss = nn.MSELoss()(target_q_values, q_values)
  • Khởi tạo replay buffer
  • Đẩy chuyển tiếp mới nhất vào buffer

Nếu độ dài buffer $\geq$ batch_size:

  • Lấy một batch ngẫu nhiên và tính loss
  • Cách tính loss về cơ bản không đổi
  • Mean Squared Bellman Error trên batch của replay memory
    • Học ổn định và hiệu quả hơn
Deep Reinforcement Learning bằng Python

Ayo berlatih!

Deep Reinforcement Learning bằng Python

Preparing Video For Download...