تطبيق التعلم العميق باستخدام DQN لتدريب وكيل CartPole
تعلم كيفية بناء وكيل للتعلم المعزز باستخدام DQN مع RLax وJAX لحل بيئة CartPole.
في هذا المقال، نقدم دليلاً لتطوير وكيل للتعلم المعزز باستخدام مكتبة RLax، وهي مكتبة موجهة للأبحاث طورتها Google DeepMind لبناء خوارزميات التعلم المعزز باستخدام JAX. ندمج RLax مع JAX وHaiku وOptax لإنشاء وكيل Deep Q-Learning (DQN) يتعلم حل بيئة CartPole.
فهم الأساسيات
بدلاً من استخدام إطار عمل للتعلم المعزز جاهز بالكامل، نقوم بتجميع خط أنابيب التدريب بأنفسنا لنتمكن من فهم كيفية تفاعل المكونات الأساسية للتعلم المعزز. نقوم بتعريف الشبكة العصبية، وبناء مخزن إعادة التشغيل، وحساب أخطاء الفرق الزمني باستخدام RLax، وتدريب الوكيل باستخدام تحسين قائم على التدرجات.
تثبيت المكتبات الضرورية
أولاً، نحتاج إلى تثبيت المكتبات المطلوبة واستيراد جميع الوحدات اللازمة لخط أنابيب التعلم المعزز. هذا يتضمن:
jaxdm-haikuoptaxgymnasiummatplotlibnumpy
يمكن تثبيت هذه المكتبات باستخدام الأمر التالي:
!pip -q install "jax[cpu]" dm-haiku optax rlax gymnasium matplotlib numpy
إنشاء الشبكة العصبية
نقوم بتهيئة البيئة وتعريف هيكل الشبكة العصبية باستخدام Haiku:
def q_network(x):
mlp = hk.Sequential([
hk.Linear(128),
jax.nn.relu,
hk.Linear(128),
jax.nn.relu,
hk.Linear(num_actions),
])
return mlp(x)
نقوم بعد ذلك بتهيئة معلمات الشبكة ومعلمات الشبكة المستهدفة، بالإضافة إلى المحسن الذي سيتم استخدامه خلال التدريب.
تنفيذ مخزن إعادة التشغيل
نقوم بإنشاء هيكل الانتقال وتنفيذ مخزن إعادة التشغيل لتخزين التجارب السابقة من البيئة:
class ReplayBuffer:
def __init__(self, capacity):
self.buffer = deque(maxlen=capacity)
def add(self, *args):
self.buffer.append(Transition(*args))
def sample(self, batch_size):
batch = random.sample(self.buffer, batch_size)
# ...
استراتيجيات الاستكشاف
لتعزيز استكشاف البيئة، نقوم بتطبيق استراتيجية الاستكشاف epsilon-greedy. حيث نحدد احتمال اتخاذ إجراء عشوائي استنادًا إلى عدد الإطارات:
def epsilon_by_frame(frame_idx, eps_start=1.0, eps_end=0.05, decay_frames=20000):
mix = min(frame_idx / decay_frames, 1.0)
return eps_start + mix * (eps_end - eps_start)
تدريب الوكيل
نقوم بتعريف الوظائف الأساسية المستخدمة خلال التدريب، مثل حساب أخطاء الفرق الزمني واستخدامها لتحديث معلمات الشبكة:
@jax.jit
def train_step(params, target_params, opt_state, batch):
def loss_fn(p):
td_errors = batch_td_errors(p, target_params, batch)
loss = jnp.mean(rlax.huber_loss(td_errors, delta=1.0))
return loss, metrics
# ...
من خلال هذه الوظائف، نقوم بحساب الخسارة، وتطبيق تحديثات المحسن، وإرجاع مقاييس التدريب.
تقييم أداء الوكيل
لقياس أداء الوكيل، نقوم بتعريف وظيفة تقييم تقوم بتشغيل الوكيل عبر عدد من الحلقات:
def evaluate_agent(params, episodes=5):
returns = []
# ...
نقوم بتكوين معلمات التدريب، بما في ذلك عدد الإطارات وحجم الدفعة، ونبدأ التدريب.
الخاتمة
من خلال هذا الدليل، تعلمنا كيفية بناء وكيل للتعلم المعزز باستخدام DQN من الصفر باستخدام مكتبات RLax وJAX وHaiku وOptax. توفر هذه الأدوات بنية مرنة وقابلة للتخصيص لبناء خوارزميات التعلم المعزز، مما يسمح للباحثين والمطورين بفهم النموذج بشكل أفضل وتعديل الخوارزميات حسب الحاجة.
المصدر: MarkTechPost