Deneyim tekrarlamalı DQN

Python ile Deep Reinforcement Learning

Timothée Carayol

Principal Machine Learning Engineer, Komment

Deneyim Tekrarına Giriş

 

  • Basit DQN ajanı yalnızca son deneyimden öğrenir
    • Ardışık güncellemeler yüksek korelasyonludur
    • Ajan unutkandır
  • Çözüm: Deneyim Tekrarı
    • Deneyimleri bir arabellekte depola
    • Her adımda geçmişten rastgele bir yığından öğren

 

Bir çit labirentinin havadan çekilmiş fotoğrafı

Python ile Deep Reinforcement Learning

Çift Uçlu Kuyruk (Deque)

 

from collections import deque

# Sınırlı kapasiteyle oluştur buffer = deque([1,2,3,4], maxlen=7)
# Sağa genişlet buffer.extend([5,6,7,8])
  • Kapasite aşıldığında en eski öğeler düşer

Yedi kapasiteli, birden dörde etiketli dört öğe içeren bir deque.

Yedi kapasiteli, birden dörde etiketli dört öğe içeren bir deque. Sağda beşten sekize etiketli dört öğe daha görünür.

Yedi kapasiteli, birden yediye etiketli yedi öğe içeren bir deque. Sağda 8 etiketli bir öğe daha görünür.

Yedi kapasiteli, ikiden sekize etiketli yedi öğe içeren bir deque. Solda 1 etiketli bir öğe daha görünür.

Python ile Deep Reinforcement Learning

Tekrar Oynatma Arabelleği Uygulama

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 belleği: sınırlı kapasiteli deque
  • .push():
    • Deneyimi geçiş demeti olarak kaydeder
    • Deneyimi arabelleğe ekler
    • Kapasitede: en eski deneyimi düşürür
Python ile Deep Reinforcement Learning

Tekrar Oynatma Arabelleği Uygulama

...
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

 

  • Geçmiş deneyimlerden rastgele örnek alır
  • batch: geçiş demetleri listesinden...
  • ...listeler demetine...
  • ...PyTorch tensorleri demetine
Python ile Deep Reinforcement Learning

DQN’de Deneyim Tekrarını Entegre Etme

  1. Eğitim döngüsünden önce: replay_buffer = ReplayBuffer(10000)

  2. Eğitim döngüsünde, eylem seçiminin ardından:

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)
  • Replay arabelleğini başlatın
  • Son geçişi arabelleğe ekleyin

Arabellek uzunluğu $\geq$ batch_size ise:

  • Arabellekten rastgele bir yığın çekip kayıp hesabına geçin
  • Kayıp hesabı kavramsal olarak değişmez
  • Replay belleği yığını üzerinde Ortalama Kare Bellman Hatası
    • Öğrenme daha kararlı ve verimli
Python ile Deep Reinforcement Learning

Hadi pratik yapalım!

Python ile Deep Reinforcement Learning

Preparing Video For Download...