machine learning

حل مسئله Frozen Lake

محیط Frozen Lake، یک دنیای شبکه‌ای به ظاهر ساده اما پر از حفره‌های خطرناک و هدفی دور و وسوسه‌برانگیز، به یک معیار کلاسیک در دنیای یادگیری تقویتی (RL) تبدیل شده است. سادگی فریبنده‌ی آن، همراه با تصادفی بودن حرکات عامل (Agent)، این محیط را به زمینی ایده‌آل برای درک و پیاده‌سازی الگوریتم‌های پایه‌ی RL بدل کرده است. استفاده از کتابخانه‌ی Gymnasium، که جانشین مدرن OpenAI Gym محسوب می‌شود، راهی ساده و شهودی برای تعامل با این محیط و توسعه‌ی عامل‌های هوشمندی است که قادر به عبور از خطرات یخی باشند.

این محتوا سفری جامع به دنیای Frozen Lake در قالب Gymnasium خواهد بود؛ محیط را کالبدشکافی کرده، دینامیک‌های آن را درک خواهیم کرد و سپس با استفاده از الگوریتم‌های محبوب RL، راهکارهای عملی ارائه خواهیم داد و نشان خواهیم داد چگونه Gymnasium فرایند آموزش و ارزیابی عامل‌ها را تسهیل می‌کند.

Gymnasium: دریچه‌ی ورود شما به Frozen Lake

Gymnasium یک رابط کاربری استاندارد و کاربرپسند برای تعامل با طیف گسترده‌ای از محیط‌های RL فراهم می‌کند و Frozen Lake یکی از محیط‌های آماده در این مجموعه است. این کتابخانه پیچیدگی‌های راه‌اندازی و مدیریت محیط را پنهان می‌کند و به توسعه‌دهندگان و پژوهشگران اجازه می‌دهد بر طراحی و پیاده‌سازی عامل‌های هوشمند تمرکز کنند.

آشنایی با محیط Frozen Lake در Gymnasium

هنگامی که محیط Frozen Lake را در Gymnasium بارگذاری می‌کنید، با یک دنیای گریدی گسسته روبرو می‌شوید. ویژگی‌های اصلی این محیط عبارتند از:

  • فضای وضعیت (State Space): محیط شامل تعداد مشخصی وضعیت گسسته است که هرکدام به یک سلول در گرید مربوط می‌شود. برای یک گرید n×nn \times nn×n، تعداد وضعیت‌ها برابر با n2n^2n2 خواهد بود. هر وضعیت معمولاً با یک عدد صحیح از ۰ تا n2−1n^2-1n2−1 نمایش داده می‌شود که به صورت دوبعدی صاف شده است.
  • فضای اقدام (Action Space): عامل می‌تواند یکی از چهار عمل گسسته را انجام دهد:
    ۰ (چپ)، ۱ (پایین)، ۲ (راست) و ۳ (بالا).
  • فضای مشاهده (Observation Space): مشاهده‌ای که محیط بازمی‌گرداند همان وضعیت فعلی عامل است (یک عدد صحیح که موقعیت در گرید را نشان می‌دهد).
  • انتقال‌ها (Transitions): نکته‌ی مهم در Frozen Lake تصادفی بودن انتقال‌هاست. هنگام تلاش عامل برای حرکت در یک جهت، تابع step() نتیجه را شبیه‌سازی می‌کند. معمولاً با احتمال 1/31/31/3، عامل طبق خواسته حرکت می‌کند و با احتمال 2/32/32/3 لغزیده و به یکی از جهت‌های مجاور دیگر حرکت می‌کند.
  • پاداش‌ها (Rewards):
    • قدم زدن روی کاشی یخ‌زده (‘F’) → پاداش ۰
    • رسیدن به هدف (‘G’) → پاداش +۱
    • افتادن در چاله (‘H’) → پاداش ۰ و پایان اپیزود.
  • پایان اپیزود: وقتی عامل به هدف برسد یا در چاله بیفتد، اپیزود خاتمه می‌یابد (done = True).

حل مسئله Frozen Lake با یادگیری Q-جدولی (Tabular Q-Learning)

یکی از الگوریتم‌های پایه برای حل چنین محیط‌هایی، یادگیری Q است. Gymnasium بستری عالی برای پیاده‌سازی و آزمایش این الگوریتم فراهم می‌کند.

مراحل پیاده‌سازی:

۱. وارد کردن کتابخانه‌ها:

import gymnasium as gym
import numpy as np
import random

۲. بارگذاری محیط:

env = gym.make("FrozenLake-v1", is_slippery=True) # Ensure stochasticity is enabled

۳. ایجاد Q-Table:

q_table = np.zeros([env.observation_space.n, env.action_space.n])

۴. تعریف ابرپارامترها:

learning_rate = 0.1
discount_factor = 0.99
epsilon = 1.0
epsilon_decay_rate = 0.001
min_epsilon = 0.01
num_episodes = 10000
max_steps_per_episode = 100

۵. پیاده‌سازی الگوریتم Q-Learning:

rewards_per_episode = []

for episode in range(num_episodes):
    observation, info = env.reset()
    total_reward = 0
    terminated = False
    truncated = False

    for step in range(max_steps_per_episode):
        if random.uniform(0, 1) < epsilon:
            action = env.action_space.sample()  # کاوش
        else:
            action = np.argmax(q_table[observation, :])  # بهره‌برداری

        new_observation, reward, terminated, truncated, info = env.step(action)
        done = terminated or truncated

        q_table[observation, action] += learning_rate * (
            reward + discount_factor * np.max(q_table[new_observation, :]) - q_table[observation, action]
        )

        observation = new_observation
        total_reward += reward

        if done:
            break

    rewards_per_episode.append(total_reward)
    epsilon = max(min_epsilon, epsilon - epsilon_decay_rate)

print("Q-table پس از آموزش:")
print(q_table)

# ارزیابی
total_successful_episodes = np.sum(np.array(rewards_per_episode) > 0)
success_rate = total_successful_episodes / num_episodes
print(f"\nنرخ موفقیت در {num_episodes} اپیزود: {success_rate * 100:.2f}%")

env.close()

خروجی نمونه:

Q-table after training:
[[5.56174951e-01 5.07596215e-01 4.77189858e-01 4.78913792e-01]
 [3.01678928e-01 1.93881340e-01 2.04707848e-01 4.39464650e-01]
 [3.81715360e-01 2.76840392e-01 2.00890588e-01 2.47317217e-01]
 [7.86093674e-02 2.30495632e-02 7.75266053e-04 1.06975918e-02]
 [5.76516510e-01 3.41432347e-01 3.15924492e-01 3.99968975e-01]
 [0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]
 [3.39754282e-01 1.53033611e-01 1.50130076e-01 1.22354866e-01]
 [0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]
 [4.19293759e-01 4.23099378e-01 4.49971863e-01 6.17556914e-01]
 [3.01378810e-01 6.85451818e-01 5.59241386e-01 3.56536368e-01]
 [6.15888580e-01 3.58903913e-01 3.81469359e-01 3.01136663e-01]
 [0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]
 [0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]
 [5.67474443e-01 5.39862254e-01 8.09182860e-01 5.30187486e-01]
 [7.51359473e-01 9.14666108e-01 7.59381055e-01 6.71681860e-01]
 [0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]]

Success rate over 10000 episodes: 61.98%

حل Frozen Lake با شبکه‌های Q-عمیق (DQN)

برای نسخه‌های بزرگ‌تر یا پیچیده‌تر Frozen Lake یا نمایش مقیاس‌پذیری یادگیری عمیق در RL، می‌توان از شبکه‌های Q-عمیق (DQN) استفاده کرد. این روش شامل تخمین تابع Q توسط یک شبکه عصبی است.

مراحل مفهومی DQN:

  • وارد کردن کتابخانه‌ها: Gymnasium و فریمورک یادگیری عمیق (مانند TensorFlow یا PyTorch).
  • بارگذاری محیط.
  • تعریف شبکه عصبی: ورودی وضعیت و خروجی تعداد اعمال (Q-value برای هر عمل).
  • پیاده‌سازی حافظه تجربه (Experience Replay).
  • اجرای الگوریتم DQN:
    • تعامل با محیط با سیاست اپسیلون-حریص (epsilon-greedy).
    • ذخیره تجربه‌ها.
    • نمونه‌گیری مینی‌بچ‌ها از حافظه.
    • محاسبه Q-هدف با معادله Bellman.
    • به‌روزرسانی وزن‌های شبکه.
    • به‌روزرسانی دوره‌ای شبکه هدف.
  • آموزش و ارزیابی عامل DQN.

مزایای استفاده از Gymnasium برای Frozen Lake

  • تعامل ساده: API یکپارچه و شهودی (reset(), step(), render(), close()).
  • انعطاف‌پذیری الگوریتم: عدم وابستگی به الگوریتم خاص؛ قابلیت پیاده‌سازی الگوریتم‌های مختلف (Q-Learning، SARSA، Policy Gradient و غیره).
  • معیارسازی و مقایسه: محیط استاندارد برای مقایسه الگوریتم‌ها و تنظیمات ابرپارامتر.
  • ارزش آموزشی: مناسب برای یادگیری مفاهیم RL و مشاهده فرآیند یادگیری عامل‌ها.
  • قابلیت مقیاس‌پذیری: امکان استفاده از یادگیری عمیق برای نسخه‌های بزرگ‌تر یا پیچیده‌تر.

نتیجه‌گیری

کتابخانه‌ی Gymnasium منبعی ارزشمند برای حل مسئله‌ی Frozen Lake است. رابط کاربری ساده و دینامیک محیط تعریف‌شده‌ی آن، بستری عالی برای پیاده‌سازی و آزمایش الگوریتم‌های مختلف RL، از روش‌های جدولی پایه مانند Q-Learning تا روش‌های پیشرفته‌ی یادگیری عمیق مانند DQN فراهم می‌کند.
سفر در دنیای یخی Frozen Lake گامی کلیدی در درک چشم‌انداز گسترده‌ی یادگیری تقویتی و پتانسیل آن برای حل مسائل پیچیده‌ی تصمیم‌گیری ترتیبی در شرایط عدم قطعیت محسوب می‌شود.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *