Advantage Actor Critic

Deep Reinforcement Learning ด้วย Python

Timothée Carayol

Principal Machine Learning Engineer, Komment

ทำไมต้องใช้ Actor Critic?

 

  • ข้อจำกัดของ REINFORCE:

    • ความแปรปรวนสูง
    • ประสิทธิภาพการใช้ตัวอย่างต่ำ
  • วิธี Actor Critic เพิ่ม critic network เพื่อรองรับการเรียนรู้แบบ Temporal Difference

สี่เหลี่ยมขนาดใหญ่ที่มีป้าย 'agent' และสี่เหลี่ยมขนาดเล็กสองอันอยู่ภายใน ป้ายว่า 'actor' และ 'critic' ตามลำดับ

Deep Reinforcement Learning ด้วย Python

แนวคิดเบื้องหลัง Actor Critic

นักเรียนกำลังพูดคุยรอบโต๊ะ มีหนังสือและปากกากระจายอยู่รอบๆ

 

  • Actor network:

    • ตัดสินใจเลือกการกระทำ
    • ไม่สามารถประเมินการตัดสินใจได้เอง
  • Critic network:

    • ให้ข้อมูลป้อนกลับแก่ actor ทุกขั้นตอน
Deep Reinforcement Learning ด้วย Python

Critic network

 

  • Critic ประมาณค่า state value function

ภาพแสดง critic network โดยมี state เป็น input และ Value function เป็น output จึงมีเพียง output node เดียว

  • ประเมินการกระทำ $a_t$ โดยอิงจาก advantage หรือ TD-error

 

class Critic(nn.Module):
    def __init__(self, state_size):
        super(Critic, self).__init__()
        self.fc1 = nn.Linear(state_size, 64)
        self.fc2 = nn.Linear(64, 1)

def forward(self, state): x = torch.relu(self.fc1(torch.tensor(state))) value = self.fc2(x) return value
critic_network = Critic(8)
Deep Reinforcement Learning ด้วย Python

การทำงานของ Actor Critic

 

  • ทุกขั้นตอน:
    • Actor เลือกการกระทำ (เหมือน policy network ใน REINFORCE)

ด้านบน: สี่เหลี่ยมขนาดใหญ่ป้าย 'agent' มีสี่เหลี่ยมเล็กสองอันข้างใน ป้าย 'actor' และ 'critic' ด้านล่าง: สี่เหลี่ยมแยกต่างหากป้าย 'environment'

Deep Reinforcement Learning ด้วย Python

การทำงานของ Actor Critic

 

  • ทุกขั้นตอน:
    • Actor เลือกการกระทำ (เหมือน policy network ใน REINFORCE)
    • Critic สังเกต reward และ state

ลูกศรสีแดงป้าย 'action' ชี้จาก actor ไปยัง environment

Deep Reinforcement Learning ด้วย Python

การทำงานของ Actor Critic

 

  • ทุกขั้นตอน:
    • Actor เลือกการกระทำ (เหมือน policy network ใน REINFORCE)
    • Critic สังเกต reward และ state
    • Critic คำนวณ TD Error
    • Actor และ Critic ใช้ TD Error อัปเดตน้ำหนัก

ลูกศรสีแดงสองอัน ป้าย 'State' และ 'Reward' ชี้จาก environment ไปยัง Critic

Deep Reinforcement Learning ด้วย Python

การทำงานของ Actor Critic

 

  • ทุกขั้นตอน:
    • Actor เลือกการกระทำ (เหมือน policy network ใน REINFORCE)
    • Critic สังเกต reward และ state
    • Critic คำนวณ TD Error
    • Actor และ Critic ใช้ TD Error อัปเดตน้ำหนัก
    • Actor ที่อัปเดตแล้วสังเกต state ใหม่

ลูกศรป้าย 'TD error' ชี้จาก Critic ไปยัง Actor

Deep Reinforcement Learning ด้วย Python

การทำงานของ Actor Critic

 

  • ทุกขั้นตอน:
    • Actor เลือกการกระทำ (เหมือน policy network ใน REINFORCE)
    • Critic สังเกต reward และ state
    • Critic คำนวณ TD Error
    • Actor และ Critic ใช้ TD Error อัปเดตน้ำหนัก
    • Actor ที่อัปเดตแล้วสังเกต state ใหม่
  • ... วนซ้ำ

ลูกศร State ชี้ไปยัง Actor ด้วยเช่นกัน

Deep Reinforcement Learning ด้วย Python

A2C losses

 

Critic

ฟังก์ชัน loss ของ critic ใช้ squared TD error: Lc(theta c) = ((r_t + gamma * V theta c (s t + 1)) - V theta c) squared

  • Critic loss: squared TD error

 

Actor

ฟังก์ชัน loss ของ actor: ในทุกขั้นตอน t ใช้ฟังก์ชัน loss ที่เท่ากับ log probability ของการกระทำคูณด้วย TD error หรือ advantage พร้อมเครื่องหมายลบ

  • TD error สะท้อนคะแนนจาก critic
  • เพิ่มความน่าจะเป็นของการกระทำที่มี TD error เป็นบวก
Deep Reinforcement Learning ด้วย Python

การคำนวณ loss

 

def calculate_losses(critic_network, action_log_prob, 
                     reward, state, next_state, done):

# Critic provides the state value estimates value = critic_network(state)
next_value = critic_network(next_state)
td_target = (reward + gamma * next_value * (1-done))
td_error = td_target - value
# Apply formulas for actor and critic losses actor_loss = -action_log_prob * td_error.detach()
critic_loss = td_error ** 2
return actor_loss, critic_loss

 

 

  • คำนวณ TD-Error
  • คำนวณ actor loss
    • ใช้ .detach() เพื่อหยุดการส่งต่อ gradient ไปยังน้ำหนักของ critic
  • คำนวณ critic loss
Deep Reinforcement Learning ด้วย Python

Training loop ของ Actor Critic

for episode in range(10):
  state, info = env.reset()
  done = False
  while not done:

# Select action action, action_log_prob = select_action(actor, state)
next_state, reward, terminated, truncated, _ = env.step(action) done = terminated or truncated
# Calculate losses actor_loss, critic_loss = calculate_losses(critic, action_log_prob, reward, state, next_state, done)
# Update actor actor_optimizer.zero_grad(); actor_loss.backward(); actor_optimizer.step()
# Update critic critic_optimizer.zero_grad(); critic_loss.backward(); critic_optimizer.step()
state = next_state
Deep Reinforcement Learning ด้วย Python

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

Deep Reinforcement Learning ด้วย Python

Preparing Video For Download...