ساخت هوش مصنوعی برای بازیهای تکعاملی اکنون در بسیاری از حوزهها از شطرنج تا گو حل شده است. با این حال، ایجاد هوش مصنوعی که در بازیهای استراتژیک پیچیده و همکاریجویانه عالی عمل کند، چالش بسیار بزرگتری است. در این محیطها، عاملها باید نه تنها سیاستهای بهینه خود را یاد بگیرند، بلکه باید پیشبینی، ارتباط برقرار و همگامسازی با سایر عاملها را برای دستیابی به پاداش جهانی مشترک انجام دهند. این پست وبلاگ به بررسی ظرافتهای معماری پیادهسازی یادگیری تقویتی چندعاملی (MARL) برای سناریوهای همکاریجویانه میپردازد و شکاف بین مفاهیم نظری و کد عملی را پر میکند.
چالش اصلی: غیرایستایی
مانع بنیادین در MARL، نقض فرضیه فرآیند تصمیمگیری مارکوف (MDP) است. در یادگیری تقویتی تکعاملی، محیط نسبت به بهروزرسانیهای سیاست عامل ثابت است. در سیستمهای چندعاملی، هر عامل همزمان در حال یادگیری و تغییر رفتار خود است. این بدان معناست که محیط از دیدگاه هر عامل تک، به طور مؤثر غیرایستا است. استراتژیای که لحظاتی پیش بهینه بود، ممکن است به دلیل تکامل همتیمیها، غیربهینه شود. برای حل این مشکل، توسعهدهندگان اغلب از تکنیکهایی مانند آموزش متمرکز با اجرای غیرمتمرکز (CTDE) استفاده میکنند، جایی که عاملها با دسترسی به اطلاعات وضعیت جهانی آموزش میبینند اما سیاستها را فقط بر اساس مشاهدات محلی اجرا میکنند.
راهاندازی محیط
قبل از غوطهور شدن در الگوریتمهای آموزش، به یک محیط مقاوم نیاز داریم. کتابخانه PettingZoo استاندارد صنعتی برای یادگیری تقویتی چندعاملی است و یک رابط یکپارچه برای محیطهای مختلف، از جمله سناریوهای محبوب "simple_spread" یا "multi_jockey" ارائه میدهد. این کتابخانه همگامسازی محیطهای موازی را مدیریت کرده و فضاهای مشاهده/اقدام را برای چندین عامل به صورت بینقص مدیریت میکند.
بیایید نگاهی بیندازیم که چگونه یک محیط همکاریجویانه ساده را راهاندازی کنیم و مشاهدات را برای یک شبکه عصبی پردازش کنیم.
import gymnasium as gym
import pettingzoo
# Initialize a simple cooperative environment
env = pettingzoo.mpe.simple_spread_v3.env()
env.reset(seed=42)
# Example of extracting observation for an agent
agent_name = env.agents[0]
observation, info = env.observe(agent_name)
# Observation typically contains:
# 1. Agent's own position and velocity
# 2. Positions of other agents (relative to self)
# 3. Positions of objects to cover (relative to self)
print(f"Observation shape for {agent_name}: {observation.shape}")
print(f"Available actions: {env.action_space(agent_name)}")
طراحی معماری: بازیگر-منتقد با وزنهای مشترک
برای وظایف همکاریجویانه، اشتراکگذاری وزنها بین عاملها اغلب مفید است. این موضوع تقارن را ترویج میدهد که در بازیهای متقارن رایج است و پیچیدگی نمونه مورد نیاز برای همگرایی را به شدت کاهش میدهد. میتوانیم از یک شبکه بازیگر-منتقد مشترک استفاده کنیم که ورودی آن مشاهده concatenated عامل و موقعیت نسبی او نسبت به همتیمیها است.
در زیر یک پیادهسازی سادهشده با PyTorch از یک شبکه MLP مشترک برای سرهای بازیگر و منتقد آورده شده است.
import torch
import torch.nn as nn
import torch.nn.functional as F
class MultiAgentNetwork(nn.Module):
def __init__(self, obs_dim, act_dim, hidden_dim=64):
super(MultiAgentNetwork, self).__init__()
# Shared feature extractor
self.shared_layers = nn.Sequential(
nn.Linear(obs_dim, hidden_dim),
nn.ReLU(),
nn.Linear(hidden_dim, hidden_dim),
nn.ReLU()
)
# Actor head (policy)
self.actor_head = nn.Linear(hidden_dim, act_dim)
# Critic head (value function)
self.critic_head = nn.Linear(hidden_dim, 1)
def forward(self, obs):
features = self.shared_layers(obs)
log_probs = self.actor_head(features)
values = self.critic_head(features)
return log_probs, values
پویاییهای آموزش: برآورد مزیت
در بازیهای همکاریجویانه، پاداش معمولاً پراکنده و مشترک است. محاسبه تابع مزیت برای آموزش پایدار حیاتی است. ما از برآورد مزیت تعمیمیافته (GAE) برای تعادل بین تورش و واریانس استفاده میکنیم. قطعه کد زیر نحوه محاسبه GAE برای یک دسته از مسیرها را نشان میدهد، اطمینان حاصل میکند که عاملها نه تنها پاداشی که دریافت کردهاند، بلکه میزان بهتر بودن آن اقدام را نسبت به انتظارات پایه یاد میگیرند.
def compute_gae(rewards, values, next_values, dones, gamma=0.99, lam=0.95):
advantages = torch.zeros_like(rewards)
lastgaelam = 0
for t in reversed(range(len(rewards))):
if t == len(rewards) - 1:
nextnonterminal = 1.0 - dones[t]
nextvalues = next_values[t]
else:
nextnonterminal = 1.0 - dones[t]
nextvalues = values[t + 1]
delta = rewards[t] + gamma * nextvalues * nextnonterminal - values[t]
advantages[t] = lastgaelam = delta + gamma * lam * nextnonterminal * lastgaelam
returns = advantages + values
return returns, advantages
نتیجهگیری
پیادهسازی یادگیری تقویتی چندعاملی برای بازیهای استراتژیک همکاریجویانه نیازمند درک عمیقی از هر دو معماری شبکه عصبی و پویاییهای محیط است. با بهرهگیری از سیاستهای مشترک، کتابخانههای محیط مقاوم مانند PettingZoo و تکنیکهای پیشرفته برآورد مزیت، توسعهدهندگان میتوانند عاملهای هوش مصنوعی را ایجاد کنند که رفتار همکاریجویانه ظهوریافته از خود نشان میدهند. با پیشرفت این حوزه، احتمالاً کانالهای ارتباطی پیچیدهتر و ساختارهای سلسلهمراتبی بیشتری را خواهیم دید که به عاملها اجازه میدهد چالشهای استراتژیک حتی پیچیدهتری را حل کنند. کوچک شروع کنید، مسیرهای عاملهای خود را به طور مکرر تجسم کنید و بر شکلدهی پاداش خود تکرار کنید تا هوش مصنوعی خود را به سمت همکاری واقعی هدایت کنید.