مارا دنبال کنید : 

الگوریتم (SARSA)-بخش دوم
پیاده‌سازی الگوریتم SARSA (Implementing SARSA in Gymnasium’s Taxi-v3 Environment)

ما قصد داریم مراحل راه‌اندازی محیط، تعریف و پیاده‌سازی یک عامل یادگیری با الگوریتم SARSA، آموزش آن و تحلیل نتایج یادگیری‌اش را بررسی کنیم. هر یک از این مراحل کمک می‌کنند تا بهتر درک کنیم که SARSA، به عنوان یک الگوریتم درون‌سیاستی (on-policy)، چگونه سیاست خود را با توجه به اقداماتی که انجام می‌دهد و پاداش‌هایی که دریافت می‌کند، به‌روزرسانی می‌کند. این در حالی است که الگوریتم‌هایی مثل Q-learning که برون‌سیاستی (off-policy) هستند، تأثیر سیاست فعلی بر نتایج را در نظر نمی‌گیرند.

گام1: راه‌اندازی و مقداردهی (Setup and Initialization)

ابتدا، با وارد کردن کتابخانه‌های ضروری شروع می‌کنیم و یک تابع رسم (plotting function) تعریف می‌کنیم که بعداً برای تجسم عملکرد عامل در طول اپیزودهای آموزشی از آن استفاده خواهیم کرد.

				
					import gymnasium as gym
import numpy as np
from collections import defaultdict
import matplotlib.pyplot as plt

def plot_returns(returns):
    plt.plot(np.arange(len(returns)), returns)
    plt.title('Episode returns')
    plt.xlabel('Episode')
    plt.ylabel('Return')
    plt.show()
				
			

گام2: تعریف محیط (Define the SARSA Agent)

در مرحله بعد، کلاس SARSAAgent را تعریف می‌کنیم. این عامل با مجموعه‌ای از پارامترها اولیه‌سازی می‌شود که فرآیندهای یادگیری و تصمیم‌گیری آن را تعیین می‌کند. همچنین شامل متدهایی برای انتخاب اقدامات، به‌روزرسانی مقادیر Q و تنظیم نرخ کاوش (exploration rate) است.

				
					class SARSAAgent:
    def __init__(self, env, learning_rate, initial_epsilon, epsilon_decay, final_epsilon, discount_factor=0.95):
        self.env = env
        self.learning_rate = learning_rate
        self.discount_factor = discount_factor
        self.epsilon = initial_epsilon
        self.epsilon_decay = epsilon_decay
        self.final_epsilon = final_epsilon
        self.q_values = defaultdict(lambda: np.zeros(env.action_space.n))

    def get_action(self, obs) -> int:
        if np.random.rand() < self.epsilon:
            return self.env.action_space.sample()  # Explore
        else:
            return np.argmax(self.q_values[obs])  # Exploit

    def update(self, obs, action, reward, terminated, next_obs, next_action):
        if not terminated:
            td_target = reward + self.discount_factor * self.q_values[next_obs][next_action]
            td_error = td_target - self.q_values[obs][action]
            self.q_values[obs][action] += self.learning_rate * td_error

    def decay_epsilon(self):
        self.epsilon = max(self.final_epsilon, self.epsilon - self.epsilon_decay)
				
			

گام3: آموزش عامل (Training the Agent)

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

				
					def train_agent(agent, env, episodes, eval_interval=100):
    rewards = []
    for i in range(episodes):
        obs, _ = env.reset()
        terminated = truncated = False
        total_reward = 0

        while not terminated and not truncated:
            action = agent.get_action(obs)
            next_obs, reward, terminated, truncated, _ = env.step(action)
            next_action = agent.get_action(next_obs)
            agent.update(obs, action, reward, terminated, next_obs, next_action)
            obs = next_obs
            action = next_action
            total_reward += reward

        agent.decay_epsilon()
        rewards.append(total_reward)

        if i % eval_interval == 0 and i > 0:
            avg_return = np.mean(rewards[max(0, i - eval_interval):i])
            print(f"Episode {i} -> Average Return: {avg_return}")

    return rewards
				
			

گام4: پیشرفت تجسم (Visualization of Learning Progress)

پس از آموزش، تجسم پیشرفت یادگیری مفید است. ما از تابع plot_returns برای نمایش بازده‌ها در هر اپیزود استفاده می‌کنیم که بینش‌هایی در مورد اثربخشی رژیم آموزشی ما ارائه می‌دهد.

				
					env = gym.make('Taxi-v3', render_mode='ansi')
episodes = 20000
learning_rate = 0.5
initial_epsilon = 1
final_epsilon = 0
epsilon_decay = (final_epsilon - initial_epsilon) / (episodes / 2)
agent = SARSAAgent(env, learning_rate, initial_epsilon, epsilon_decay, final_epsilon)

returns = train_agent(agent, env, episodes)
plot_returns(returns)
				
			

گام5: اجرای عامل آموزش دیده (Running the Trained Agent)

در نهایت، برای مشاهده عملکرد عامل آموزش‌دیده‌مان، می‌توانیم آن را در محیط اجرا کنیم. در این مرحله، نرخ کاوش (exploration rate) را کاهش می‌دهیم زیرا عامل باید سیاست تقریباً بهینه‌ای را یاد گرفته باشد.

				
					def run_agent(agent, env):
    agent.epsilon = 0  # No need to keep exploring
    obs, _ = env.reset()
    env.render()
    terminated = truncated = False

    while not terminated and not truncated:
        action = agent.get_action(obs)
        next_obs, _, terminated, truncated, _ = env.step(action)
        print(env.render())  
				
			

خروجی:

Code output_SARSA

توضیح خروجی:

خروجی کد شامل دو بخش اصلی است:

  1. نمودار پیشرفت آموزش و بازده‌های اپیزود (Training Progress and Episode Returns Plot):
  • در طول آموزش، عملکرد عامل SARSA به‌صورت دوره‌ای ارزیابی می‌شود و میانگین بازده در هر eval_interval اپیزود چاپ می‌شود.
  • پس از آموزش، نموداری از بازده‌های اپیزود در طول زمان نمایش داده می‌شود که نشان می‌دهد عملکرد عامل چگونه با یادگیری از اپیزودهای بیشتر تغییر می‌کند.
  1. نمایش رفتار عامل (Agent’s Behavior Demonstration):
  • پس از آموزش، تابع run_agent رفتار عامل را در محیط ” Taxi-v3″ نشان می‌دهد. وضعیت محیط در هر مرحله در کنسول چاپ می‌شود و تصمیمات و حرکات عامل را نمایش می‌دهد.

نمودار بازده در برابر اپیزود (Returns vs Episode Plot): در پایان آموزش، تابع plot_returns نموداری ایجاد می‌کند که بازده کل برای هر اپیزود را نشان می‌دهد. محور x شماره اپیزود و محور y بازده (پاداش کل) آن اپیزود را نمایش می‌دهد. این نمودار به تجسم منحنی یادگیری عامل کمک می‌کند و روندهایی مانند بهبود، ثبات یا نوسانات در عملکرد را نشان می‌دهد.

نمایش خروجی شبکه (Demonstration of the Output Grid:):

  • سری نمودارها نشان می‌دهد که چگونه عامل در شبکه حرکت می‌کند، به‌طوری‌که هر مرحله نمایانگر یک حرکت یا چرخش است.
  • مسیر عامل با تغییرات حرکتی و جهت‌گیری آن تعریف می‌شود و هدف آن رسیدن به یک نقطه هدف (G) یا نقاط مهم دیگر (R و B) در شبکه است.
  • جهت‌گیری‌های خاص (شمال، شرق و غیره) برای درک استراتژی یا الگوریتم عامل در حرکت در شبکه بسیار حائز اهمیت هستند.

نتیجه‌گیری (Conclusion)

پیاده‌سازی یک عامل SARSA در محیط Taxi-v3 از Gymnasium یک رویکرد عملی برای درک الگوریتم‌های یادگیری تقویتی درون‌سیاستی ارائه می‌دهد. با راه‌اندازی محیط، تعریف عامل، آموزش و تجزیه و تحلیل پیشرفت آن، بینش‌های ارزشمندی در مورد چگونگی به‌روزرسانی سیاست‌های SARSA بر اساس اقدامات فعلی و نتایج آن‌ها به‌دست می‌آوریم.


ترتیبی که هوشینو برای خواندن مطالب یادگیری تقویتی به شما پیشنهاد می‌کند:

1.یادگیری تقویتی بخش اول

2.یادگیری تقویتی بخش دوم

3.یادگیری تقویتی بخش سوم

4.زنجیره مارکوف بخش اول

5.زنجیره مارکوف بخش دوم

6.زنجیره مارکوف بخش سوم

7.زنجیره مارکوف بخش چهارم

8.الگوریتم Q-Learning بخش اول

9.الگوریتم Q-Learning بخش دوم

10.الگوریتم Q-Learning بخش سوم

11.الگوریتم SARSA-بخش اول

12.الگوریتم SARSA-بخش دوم

13. تفاوت بین Q-Learning و SARSA

الگوریتم (SARSA)-بخش اول
مقدمه

الگوریتم (State-Action-Reward-State-Action) SARSA در یادگیری تقویتی بر اساس سیاست، به عامل (Agent) کمک می‌کند تا بهینه عمل کند. این الگوریتم مقادیر ارزش (Q-Values) را برای هر ترکیب حالت-عمل به‌روزرسانی می‌کند. SARSA بر اساس حالت فعلی، عمل فعلی، پاداش دریافتی، حالت بعدی و عمل بعدی که از سیاست فعلی انتخاب شده، عمل می‌کند و با این روش، سیاست خود را به‌روزرسانی می‌کند.

یادگیری SARSA 

الگوریتم SARSA نوعی روش یادگیری تفاوت زمانی (TD) است که ایده‌های برنامه‌ریزی پویا و روش‌های مونت‌کارلو را با هم ترکیب می‌کند. ویژگی اصلی SARSA این است که مقادیر Q را بر اساس اقدامات موجود در سیاست فعلی یاد می‌گیرد، یعنی عامل (agent) در هر مرحله هم از سیاست فعلی پیروی می‌کند و هم مقادیر Q را براساس آن به‌روزرسانی می‌کند.

مفاهیم کلیدی در SARSA 

1.وضعیت (State) (s): وضعیتی است که عامل (Agent) در آن قرار دارد.

2.اقدام (Action) (a): عملی است که عامل (Agent) در حالت فعلی خود انجام می‌دهد

3.پاداش (Reward) (r): پاداشی است که عامل بعد از انجام یک عمل در یک حالت خاص دریافت می‌کند.

4.وضعیت بعدی (Next State) (s’): وضعیت جدیدی که عامل (Agent) پس از انجام یک عمل به آن منتقل می‌شود.

5.اقدام بعدی (Next Action) (a’): عملی که عامل (Agent) در حالت بعدی بر اساس سیاست (Policy) خود انجام می‌دهد.

6.تابع ارزش (Q-Value): نشان‌دهنده ارزش یک جفت حالت-عمل است و به عامل کمک می‌کند تصمیم بگیرد کدام عمل در هر حالت سودمندتر است.

نحوه کارکرد الگوریتم SARSA

SARSA به صورت گام‌به‌گام به این صورت عمل می‌کند:

1.انتخاب عمل (Action): عامل یک حالت اولیه (s) را انتخاب می‌کند و بر اساس یک سیاست (معمولاً

ϵ-greedy) عمل (a) انجام می‌دهد.

2.گرفتن پاداش و انتقال به حالت جدید: عامل با انجام این عمل، به حالت جدید (s′) می‌رود و پاداش (r) دریافت می‌کند.

3.انتخاب عمل بعدی: عامل در حالت جدید (s′) بر اساس همان سیاست یک عمل جدید (a′) را انتخاب می‌کند.

4.به‌روزرسانی Q-Value: سپس عامل از معادله زیر برای به‌روزرسانی Q-Value استفاده می‌کند:

Q-value update equation

که درآن:

s: وضعیت فعلی عامل (Agent) است.

a: عملکرد فعلی که بر اساس یک سیاست خاص انتخاب شده است.

s’: حالت بعدی که عامل (Agent) به آن منتقل می‌شود.

a’: بهترین اقدام بعدی که باید با استفاده از تخمین فعلی مقدار Q انتخاب شود، به این معنی که اقدام با حداکثر مقدار Q در حالت بعدی انتخاب شود.

r: پاداش فعلی که از محیط به عنوان پاسخ به عمل کنونی مشاهده می‌شود.

α: نرخ یادگیری (Learning Rate) که مشخص می‌کند عامل تا چه حد تغییرات را در Q-Value لحاظ کند. و مقدار آن بین 0 و 1 قرار دارد.

γ: ضریب تنزیل (Discount Factor) که نشان می‌دهد اهمیت پاداش‌های آینده به چه اندازه است که معمولا بین 0 و 1 است.

Q(s,a): مقدار Q فعلی برای حالت s و عمل a.

Q(s′,a′): مقدار Q برای حالت بعدی s′ و عمل بعدی a′ است که توسط سیاست فعلی انتخاب می‌شود.

این فرمول مقدار Q را براساس پاداش دریافت‌شده و مقدار Q آینده به‌روزرسانی می‌کند.

در واقع، در  SARSA، سیاست جاری تصمیم می‌گیرد که در حالت بعدی کدام عمل a′  انجام شود و سپس مقدار Q(s,a)  بر این اساس به‌روزرسانی می‌شود. این وابستگی به سیاست جاری همان چیزی است که SARSA را به یک الگوریتم یادگیری روی سیاست (on-policy) تبدیل می‌کند.

5.تکرار مراحل: این فرآیند تا زمانی که عامل به حالت پایانی برسد، تکرار می‌شود.

در SARSA، برخلاف برخی الگوریتم‌های دیگر مانند Q-Learning که بر اساس بهترین عمل ممکن عمل می‌کند، به خاطر استفاده از همان سیاست (ϵ-greedy) که عامل عمل‌ها را انتخاب می‌کند، الگوریتم ارزش حالت و عمل آینده‌ای که احتمالاً عامل برمی‌گزیند را لحاظ می‌کند.

 

در تصویر زیر، شخصیتی به نام “عامل” (Agent) در دنباله‌ای از حالات (S و S’) اقداماتی (A و A’) انجام می‌دهد و پاداش‌هایی (R) دریافت می‌کند. فلش‌ها انتقال بین حالت‌ها، اقدامات و پاداش‌ها را نشان می‌دهند و مفهوم به‌روزرسانی مقادیر Q (Q-values) در هر مرحله را به تصویر می‌کشند.

Performance of the SARSA algorithm
تصویر1-نحوه کارکردالگوریتم SARSA
مزایا SARSA

1.طبیعت الگوریتم‌های On-Policy:

SARSA یک الگوریتم on-policy است، به این معنی که بر اساس سیاستی که خود در حال دنبال کردن آن است، ارزیابی می‌کند. این ویژگی باعث می‌شود SARSA به سیاست فعلی حساس باشد و در محیط‌هایی که نیاز به کاهش ریسک دارند، عملکرد بهتری داشته باشد.

2.ایمنی بیشتر در محیط‌های تصادفی:

از آن‌جایی که SARSA به‌روزرسانی‌های خود را بر اساس اقداماتی که واقعاً انجام می‌دهد و جوایز واقعی که دریافت می‌کند، انجام می‌دهد، معمولاً در مقایسه با الگوریتم‌های off-policy مانند Q-learning محتاط‌تر عمل می‌کند. در محیط‌هایی که رفتارها تصادفی و غیرقابل پیش‌بینی هستند، این احتیاط باعث می‌شود که SARSA گزینه بهتری باشد.

3.فرآیند یادگیری ساده‌تر و روان‌تر:

از آن‌جایی که SARSA به‌طور میانگین بر اساس اقداماتی که طبق سیاست فعلی انجام می‌دهد به‌روزرسانی می‌کند، فرآیند یادگیری معمولاً روان‌تر پیش می‌رود. این ویژگی به‌ویژه در محیط‌هایی که جوایز نوسانات زیادی دارند، مفید است.

4.تعادل میان کاوش و بهره‌برداری:

چون SARSA از اقداماتی که واقعاً انجام می‌دهد (که ممکن است شامل اقدامات کاوشی نیز باشد) استفاده می‌کند، به‌طور ذاتی بین کاوش (exploration) و بهره‌برداری (exploitation) تعادل برقرار می‌سازد. این ویژگی باعث می‌شود که SARSA برای محیط‌هایی که نیاز به آزمایش استراتژی‌های مختلف دارند، بسیار مناسب باشد.

معایب SARSA

1.همگرایی کندتر در محیط‌های قطعی:

از آن‌جایی که SARSA به‌روزرسانی‌های خود را بر اساس سیاست فعلی (که ممکن است شامل اقدامات کاوشی باشد) انجام می‌دهد، معمولاً در محیط‌های قطعی که نیاز به همگرایی سریع به سیاست بهینه دارند، نسبت به الگوریتم‌های off-policy مانند Q-learning کندتر عمل می‌کند.

2.حساسیت به سیاست کاوش:

عملکرد SARSA به شدت به استراتژی کاوش (مانند ε-greedy) وابسته است. اگر نرخ کاوش به‌درستی انتخاب نشود، ممکن است سیاست بهینه پیدا نشود و برای رسیدن به عملکرد مطلوب نیاز به تنظیمات بیشتری باشد.

3.محدودیت‌ الگوریتم‌های On-Policy:

به‌عنوان یک الگوریتم on-policy، SARSA تنها از اقداماتی که واقعاً انجام می‌دهد یاد می‌گیرد. اگر سیاستی که دنبال می‌کند بهینه نباشد، یادگیری SARSA نیز بهینه نخواهد بود. این ویژگی اجازه نمی‌دهد که SARSA از استراتژی‌های off-policy بهره‌برداری کند، استراتژی‌هایی که می‌توانند بر اساس بهترین اقدام ممکن به‌روزرسانی شوند.

4.سیاست‌های محتاطانه‌تر:

روش محتاطانه SARSA در به‌روزرسانی سیاست‌ها (با استفاده از اقدامات واقعی به جای اقدامات بهینه) می‌تواند منجر به سیاست‌هایی شود که محتاطانه‌تر عمل می‌کنند و در بلندمدت نتایج بهینه‌ای به همراه نداشته باشند.

5.حساسیت بالا به تنظیمات در محیط‌های پیچیده:

اگرچه SARSA نسبتاً ساده است و نیاز به تنظیمات کمتری دارد، در محیط‌های پیچیده و پرچالش، تنظیمات پارامترهای یادگیری، نرخ تنزیل و پارامترهای کاوش نیاز به دقت بیشتری دارند تا از ناپایداری یا یادگیری کند جلوگیری شود.

کاربردهای SARSA

SARSA به‌ویژه در سناریوهایی که نیاز به اتخاذ تصمیمات محتاطانه و پرهیز از ریسک‌های زیاد وجود دارد، مفید است. برخی از کاربردهای رایج SARSA عبارتند از:

1.یافتن مسیر و ناوبری در محیط‌های پیچیده:

SARSA در وظایف ناوبری، مانند یافتن مسیر در یک محیط پیچیده یا متغیر، جایی که ممکن است موانع داینامیک وجود داشته باشد، کاربرد دارد. در این‌گونه محیط‌ها، روش محتاطانه SARSA کمک می‌کند تا تصمیمات امن‌تری اتخاذ شود و از اشتباهات پرهزینه جلوگیری گردد.

Robot control management in SARSA
تصویر1-مدیریت کنترل ربات‌ها

2.مدیریت کنترل ربات‌ها:

در کنترل ربات‌ها، به‌ویژه در محیط‌هایی که با خطرات واقعی مواجه هستند، روش محتاطانه SARSA بسیار ارزشمند است. ربات‌ها ممکن است در محیط‌های دنیای واقعی که ریسک بالاست، نیاز به استفاده از مسیرها و اقدامات امن‌تری داشته باشند.

 

 

 

finance in sarsa
تصویر2-کاربردهای مالی

3.کاربردهای مالی:

SARSA در زمینه‌های مالی، مانند معاملات، می‌تواند برای کاهش ریسک استفاده شود. در این محیط‌ها، هدف این است که در عین جستجوی سود، از ریسک‌های غیرضروری اجتناب گردد.

 

 

4.بازی‌های با المان‌های تصادفی و غیرقابل پیش‌بینی

SARSA معمولاً در بازی‌هایی که نتایج تصادفی دارند (مانند بازی‌هایی که در آن‌ها تاس انداخته می‌شود یا رویدادهای تصادفی در جریان هستند) استفاده می‌شود. در این‌گونه محیط‌ها، حساسیت SARSA به سیاست کاوش می‌تواند آن را نسبت به دیگر روش‌ها، مانند Q-learning، بهتر کند.

5.سیستم‌های مدیریت انرژی:

در سیستم‌های مدیریت انرژی، مانند شبکه‌های هوشمند یا سیستم‌های ذخیره‌سازی باتری، SARSA می‌تواند به مدیریت توزیع انرژی کمک کرده و از مصرف منابع اضافی یا ناکافی جلوگیری کند.

6.برنامه‌ریزی درمانی در حوزه مراقبت‌های بهداشتی:

در حوزه مراقبت‌های بهداشتی، به‌ویژه در برنامه‌ریزی درمانی که نیاز به تعادل بین اثربخشی و عوارض جانبی داروها دارد، SARSA می‌تواند به ایجاد استراتژی‌هایی کمک کند که از اقدامات افراطی جلوگیری نمایند.


ترتیبی که هوشینو برای خواندن مطالب یادگیری تقویتی به شما پیشنهاد می‌کند:

 

1.یادگیری تقویتی بخش اول

2.یادگیری تقویتی بخش دوم

3.یادگیری تقویتی بخش سوم

4.زنجیره مارکوف بخش اول

5.زنجیره مارکوف بخش دوم

6.زنجیره مارکوف بخش سوم

7.زنجیره مارکوف بخش چهارم

8.الگوریتم Q-Learning بخش اول

9.الگوریتم Q-Learning بخش دوم

10.الگوریتم Q-Learning بخش سوم

11.الگوریتم SARSA-بخش اول

12.الگوریتم SARSA-بخش دوم

13. تفاوت بین Q-Learning و SARSA