Tam DQN algoritması

Python ile Deep Reinforcement Learning

Timothée Carayol

Principal Machine Learning Engineer, Komment

DQN algoritması

 

 

  • Deneyim Tekrarı ile DQN’i inceledik
  • İlk yayımlanan DQN’e (2015) yakın
  • Hâlâ iki bileşen eksik:
    • Epsilon-açgözlülük -> daha fazla keşif
    • Sabit Q-hedefleri -> daha kararlı öğrenme

Bir maceracı duruyor, yanında Yunan harfi epsilon

Buz bloğuna donmuş büyük Q harfi

Python ile Deep Reinforcement Learning

DQN’de epsilon-açgözlülük

  • select_action() içinde Azalan Epsilon-açgözlülüğünü uygulayın
def select_action(q_values, step, start, end, decay):

# Bu adım için eşik değerini hesaplayın epsilon = ( end + (start-end) * math.exp(-step / decay))
# 0 ile 1 arasında rastgele bir sayı çekin sample = random.random()
if sample < epsilon: # Rastgele bir eylem indeksi döndürün return random.choice(range(len(q_values)))
# En yüksek Q-değerine sahip eylem indeksini döndürün return torch.argmax(q_values).item()
  • $\varepsilon = end + (start-end) \cdot e^{-\frac{step}{decay}}$
  • Olasılık $\varepsilon$ ile rastgele eylem alın
  • Olasılık $1 - \varepsilon$ ile en yüksek değerli eylemi alın

Farklı decay değerleri için Epsilon azalma çizelgesini gösteren bir grafik.

Python ile Deep Reinforcement Learning

Sabit Q-hedefleri

 

  • Bellman Hatasında:
    • Q-Değeri ve TD-Hedefi hesaplarında aynı Q-Ağı
    • Hedefin kayması kararsızlık yaratır

 

  • Hedefi dengelemek için hedef ağı tanıtılır

 

Bellman Hatası: (r_t+1 + gamma max(Q(s_t+1, a))) - Q(s_t, a_t)

(r_t+1 + gamma max(Q_target(s_t+1, a))) - Q_online(s_t, a_t)

Python ile Deep Reinforcement Learning

Sabit Q-hedeflerinin uygulanması

online_network = QNetwork(state_size, action_size)
target_network = QNetwork(state_size, action_size)

target_network.load_state_dict( online_network.state_dict())
def update_target_network( target_network, online_network, tau):
target_net_state_dict = target_network.state_dict() online_net_state_dict = online_network.state_dict() for key in online_net_state_dict:
target_net_state_dict[key] = ( online_net_state_dict[key] * tau + target_net_state_dict[key] * (1 - tau))
target_network.load_state_dict( target_net_state_dict)
return None
  • Başta Çevrimiçi Ağ = Hedef Ağ
  • Bir ağın state dict’i tüm ağırlıkları içerir: bir ağın durum sözlüğünün gösterimi; fc1.weight, fc1.bias ve fc2.weight girdileri var; her girdinin değeri bir tensör.
  • Her adımda Hedef Ağın her ağırlığı Çevrimiçi Ağa biraz yaklaşır
Python ile Deep Reinforcement Learning

Sabit Q-hedefleriyle kayıp hesabı

# İç döngüde, eylem seçiminden sonra
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))
with torch.no_grad():
next_q_values = ( target_network(next_states).amax(1)) target_q_values = ( rewards + gamma * next_q_values * (1 - dones))
loss = torch.nn.MSELoss()(target_q_values, q_values) optimizer.zero_grad() loss.backward() optimizer.step()
update_target_network( target_network, online_network, tau)

 

  • Q-değerleri online_network ile hesaplanır
  • Hedef Q-değerleri target_network ile hesaplanır
  • Hedef Q-değerleri için gradyan takibini kapatmak üzere torch.no_grad() kullanın
  • Kayıp için yine Ortalama Kare Bellman Hatası kullanılır
  • target_network’ü yavaşça güncellemek için update_target_network() kullanın
Python ile Deep Reinforcement Learning

Ayo berlatih!

Python ile Deep Reinforcement Learning

Preparing Video For Download...