อัลกอริทึม DQN แบบสมบูรณ์

Deep Reinforcement Learning ด้วย Python

Timothée Carayol

Principal Machine Learning Engineer, Komment

อัลกอริทึม DQN

 

 

  • ศึกษา DQN พร้อม Experience Replay แล้ว
  • ใกล้เคียงกับ DQN ที่เผยแพร่ครั้งแรก (2015)
  • ยังขาดอีกสองส่วน:
    • Epsilon-greediness -> สำรวจมากขึ้น
    • Fixed Q-targets -> การเรียนรู้มีเสถียรภาพมากขึ้น

นักสำรวจหญิงยืนอยู่ข้างอักษรกรีก epsilon

ตัวอักษร Q ขนาดใหญ่ถูกแช่แข็งอยู่ในก้อนน้ำแข็ง

Deep Reinforcement Learning ด้วย Python

Epsilon-greediness ในอัลกอริทึม DQN

  • นำ Decayed Epsilon-greediness ไปใช้ใน select_action()
def select_action(q_values, step, start, end, decay):

# Calculate the threshold value for this step epsilon = ( end + (start-end) * math.exp(-step / decay))
# Draw a random number between 0 and 1 sample = random.random()
if sample < epsilon: # Return a random action index return random.choice(range(len(q_values)))
# Return the action index with highest Q-value return torch.argmax(q_values).item()
  • $\varepsilon = end + (start-end) \cdot e^{-\frac{step}{decay}}$
  • เลือก action แบบสุ่มด้วยความน่าจะเป็น $\varepsilon$
  • เลือก action ที่มีค่าสูงสุดด้วยความน่าจะเป็น $1 - \varepsilon$

กราฟแสดงตารางการลด epsilon สำหรับค่า decay parameter ต่างๆ

Deep Reinforcement Learning ด้วย Python

Fixed Q-targets

 

  • ใน Bellman Error:
    • Q-Network ถูกใช้ทั้งในการคำนวณ Q-Value และ TD-Target
    • เป้าหมายที่เปลี่ยนแปลงทำให้เกิดความไม่เสถียร

 

  • นำ target network มาใช้เพื่อทำให้เป้าหมายมีเสถียรภาพ

 

Bellman Error: (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)

Deep Reinforcement Learning ด้วย Python

การนำ Fixed Q-targets ไปใช้งาน

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
  • ในตอนแรก Online Network = Target Network
  • state dict ของเครือข่ายเก็บน้ำหนักทั้งหมด: ตัวอย่าง state dictionary ของเครือข่าย มีรายการ fc1.weight, fc1.bias และ fc2.weight โดยแต่ละรายการมีค่าเป็น tensor
  • ในแต่ละ step น้ำหนักทุกตัวของ Target Network จะเข้าใกล้ Online Network มากขึ้นเล็กน้อย
Deep Reinforcement Learning ด้วย Python

การคำนวณ loss ด้วย Fixed Q-targets

# In the inner loop, after action selection
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-values ใช้ online_network
  • Target Q-values ใช้ target_network
  • ใช้ torch.no_grad() เพื่อปิด gradient tracking สำหรับ target Q-values
  • ยังคงใช้ Mean Squared Bellman Error ในการคำนวณ loss
  • ใช้ update_target_network() เพื่ออัปเดต target_network อย่างช้าๆ
Deep Reinforcement Learning ด้วย Python

มาฝึกกันเถอะ!

Deep Reinforcement Learning ด้วย Python

Preparing Video For Download...