DQN з повторним відтворенням досвіду

Глибоке навчання з підкріпленням у Python

Timothée Carayol

Principal Machine Learning Engineer, Komment

Вступ до experience replay

 

  • Базовий агент DQN вчиться лише з останнього досвіду
    • Послідовні оновлення сильно корельовані
    • Агент «забудькуватий»
  • Рішення: Experience Replay
    • Зберігайте досвіди в буфері
    • На кожному кроці вчіться на випадковій вибірці минулих досвідів

 

Аерофото живоплотного лабіринту

Глибоке навчання з підкріпленням у Python

Двобічна черга (Deque)

 

from collections import deque

# Instantiate with limited capacity buffer = deque([1,2,3,4], maxlen=7)
# Extend to the right side buffer.extend([5,6,7,8])
  • Після перевищення місткості найстаріші елементи видаляються

Deque місткістю сім, що містить чотири елементи, позначені від одного до чотирьох.

Deque місткістю сім, що містить чотири елементи, позначені від одного до чотирьох. Праворуч видно чотири додаткові елементи, позначені від п'яти до восьми.

Deque місткістю сім, що містить сім елементів, позначених від одного до семи. Праворуч видно один додатковий елемент, позначений 8.

Deque місткістю сім, що містить сім елементів, позначених від двох до восьми. Ліворуч видно один додатковий елемент, позначений 1.

Глибоке навчання з підкріпленням у Python

Реалізація 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 з обмеженою місткістю
  • .push():
    • Досвід як перехід-кортеж
    • Додати досвід у буфер
    • За повної місткості: видаляє найстарший досвід
Глибоке навчання з підкріпленням у Python

Реалізація 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

 

  • Випадково вибирайте з минулих досвідів
  • batch: зі списку кортежів переходів...
  • ...до кортежу списків...
  • ...до кортежу тензорів PyTorch
Глибоке навчання з підкріпленням у Python

Інтеграція experience replay у DQN

  1. Перед циклом навчання: replay_buffer = ReplayBuffer(10000)

  2. У циклі навчання після вибору дії:

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)

DNT_CURLLY_TAG_8

    target_q_values = (
                rewards + 
                gamma * next_states_q_values * (1-dones))

loss = nn.MSELoss()(target_q_values, q_values)
  • Ініціалізуйте replay buffer
  • Додайте останній перехід у буфер

Якщо довжина буфера $\geq$ batch_size:

  • Виберіть випадкову вибірку з буфера й обчисліть втрату
  • Розрахунок втрат концептуально незмінний
  • Середньоквадратична помилка Беллмана на вибірці з replay memory
    • Навчання стабільніше та ефективніше
Глибоке навчання з підкріпленням у Python

Давайте потренуємось!

Глибоке навчання з підкріпленням у Python

Preparing Video For Download...