# রিইনফোর্সমেন্ট লার্নিং

রিইনফোর্সমেন্ট লার্নিং সম্পর্কে আমরা আগেই কিছুটা আলোচনা করেছি। রিইনফোর্সমেন্ট লার্নিং হচ্ছে ফিডব্যাক বেজড লার্নিং, এই পদ্ধতিতে ডেটাসেট ছাড়াই এজেন্টকে শেখানো হয়। রিইনফোর্সমেন্ট লার্নিং এ  এজেন্ট মূলত এনভারমেন্ট থেকে শিখে থাকে।&#x20;

লার্নিং এর এই ব্যতিক্রমী এই পদ্ধতিকে ' ট্রায়াল এন্ড এরর ' বেজড পদ্ধতিও বলা হয়। একটি উদাহরনের মাধ্যমে বিষয়টি বোঝানোর চেষ্টা করছি। ধরুন একটি বাড়িতে অনেকগুলো কক্ষ রয়েছে। এই কক্ষগুলোর ভেতরে একটি কক্ষে মাছ রাখা রয়েছে। ঐ বাড়িতে থাকা একটি বিড়াল প্রতিদিন মাছের সন্ধানে বের হয়। বিড়ালটি মাছ খুঁজে বের করার জন্য একটি কক্ষ থেকে আরেকটি কক্ষে যেতে থাকে। বিড়ালটি যদি সঠিক কক্ষের সন্ধান পায় তাহলে তাকে পুরস্কার হিসাবে ১০০ পয়েন্ট দেয়া হবে, অপরদিকে বিড়ালটি যদি ভুল কক্ষে যায় সেক্ষেত্রে ০ পয়েন্ট দেয়া হবে।&#x20;

স্বাভাবিক ভাবেই প্রথম দিকে বিড়ালটিকে মাছ খুঁজে পেতে বেশ বেগ পেতে হবে। প্রথমদিকে হয়তো সে বেশিরভাগ সময়েই ব্যর্থ হবে কারন এনভারমেন্ট তার কাছে অপরিচিত। বাড়ির বিভিন্ন কক্ষগুলো কোথায় অবস্থিত , কোন রাস্তায় গেলে একটি কক্ষ থেকে অন্য কক্ষে যাওয়া যাবে ইত্যাদি কোন তথ্যই তার কাছে থাকবে না। তবে বিড়ালটি যতবার মাছ খুজতে বের হবে প্রতিবারই সে এনভারমেন্ট সম্পর্কে নতুন তথ্য পেতে থাকবে , এভাবেই সে সময়ের সাথে সাথে দক্ষ হয়ে উঠবে।&#x20;

![ছবি - রিইনফোর্সমেন্ট লার্নিং (সম্পাদিত) ](/files/-M85RWLMzkB8vq63v6et)

**রিইনফোর্সমেন্ট লার্নিং পদ্ধতি এবং বিভিন্ন উপাদান**

রিইনফোর্সমেন্ট লার্নিং শেখার জন্য আমরা **কিউ লার্নিং** অ্যালগরিদম ব্যবহার করবো। কিউ লার্নিং সম্পর্কে জানার আগে  রিইনফোর্সমেন্ট লার্নিং কিছু উপাদান সম্পর্কে জেনে নেয়া যাক,

* **এজেন্ট**-  এজেন্ট হচ্ছে ক্রিয়ানক বা যা এনভারমেন্টে নির্দিষ্ট লক্ষ্য পূরনের জন্য পারফর্ম করে থাকে।&#x20;
* **এনভারমেন্ট** - এনভারমেন্ট হচ্ছে নির্দিষ্ট বৈশিষ্ট্য সংবলিত কোন ক্ষেত্র যেখানে এজেন্ট ক্রিয়া সম্পাদন করে থাকে। যেমন বিড়ালটি যে বাড়িতে মাছ অনুসন্ধান করে সেই বাড়িটি হচ্ছে এনভারমেন্ট।&#x20;
* **গোল**- এজেন্ট যা অর্জনের জন্য এনভারমেন্টে কাজ করে থাকে সেটাই হচ্ছে গোল বা লক্ষ্য। যেমন বিড়াল কাছে মাছের সন্ধান পাওয়া হচ্ছে গোল।&#x20;
* **একশন** -  এজেন্টের সম্ভাব্য পদক্ষেপই হচ্ছে একশন। যেমন বিড়ালটি তার বর্তমান অবস্থান থেকে সামনে, পেছনে, ডানে বা বামে যেতে পারে। এগুলোই হচ্ছে একশন।&#x20;
* **স্টেট** - স্টেট হচ্ছে এজেন্টের বর্তমান অবস্থান। উদাহরন হিসাবে বলা যেতে পারে বিড়ালটি বর্তমানে যেই কক্ষে অবস্থান করছে সেটিই হচ্ছে বিড়ালটির স্টেট।&#x20;
* **পলিসি**- পলিসি হচ্ছে কিছু কৌশল বা ইনফরমেশন যার উপর ভিত্তি করে এজেন্ট সিদ্ধান্ত নিতে পারে বর্তমান স্টেটের সাপেক্ষে পরবর্তী একশন কি হাওয়া উচিৎ।&#x20;
* **রিওয়ার্ড**- রিওয়ার্ড হচ্ছে এনভারমেন্ট থেকে পাওয়া ফিডব্যাক। রিওয়ার্ড পজেটিভ , নেগেটিভ বা শূন্য হতে পারে।&#x20;

**বেলম্যান ইকুয়েশন**

বেলম্যান ইকুয়েশনের মাধ্যমে রিইনফোর্সমেন্ট লার্নিং এজেন্ট এনভারমেন্টের প্রতিটি স্টেটের জন্য আলাদা আলাদা ফুটপ্রিন্ট ভ্যালু নির্ণয় করে থাকে। বেলম্যান ইকুয়েশনকে মেমরির সাথে তুলনা করা যেতে পারে। এজেন্ট বিভন্ন পথে লক্ষ্য অর্জনের চেষ্টার সাথে কেমন রিওয়ার্ড পেয়েছিল সেই তথ্যই এজেন্টের মেমরি।  মূলত এই ভ্যালুর উপর ভিত্তি করেই এজেন্ট  পলিসি নির্ধারণ করে থাকে। ইকুয়েশনটি দেখতে এরকম,&#x20;

![](/files/-M86C1-6p_FIVwW3GJrk)

বেলম্যান ইকুয়েশনের বিভিন্ন প্যারামিটার,&#x20;

* s = এজেন্টের স্টেট&#x20;
* a = এজেন্টের একশন
* s′ = পরবর্তী স্টেট&#x20;
* 𝜸 = ডিসকাউন্ট ফ্যাক্টর
* R(s, a) = রিওয়ার্ড ফাংশন
* V(s) = বেলম্যান ইকুয়েশনের মাধ্যমে নির্ণীত মান

> **ডিসকাউন্ট ফ্যাক্টর-** ডিসকাউন্ট ফ্যাক্টর হচ্ছে গামার মান। এই মান ম্যাক্সিমাম ১ পর্যন্ত হতে পারে। এই মান বেশী হওয়া মানে হচ্ছে এজেন্ট এজেন্ট এনভারমেন্ট থেকে বেশী ইনফরমেশন সংগ্রহে আগ্রহী থাকবে। এই মান কম হলে এজেন্ট এনভারমেন্ট থেকে কম ইনফরমেশন সংগ্রহ করবে এবং নতুন ইনফরমেশন সংগ্রহ করার পরিবর্তে তার কাছে ইতোমধ্যে যা তথ্য আছে সেটি ব্যবহার করে রিওয়ার্ড পাবার চেষ্টা করবে।&#x20;

![](/files/-M86FkbHJZXc3hSGMWLw)

প্রাথমিক ভাবে এজেন্টের কাছে সম্পূর্ণ এনভারমেন্ট সম্পর্কে একেবারে কোন তথ্যই থাকবে না, অর্থাৎ ভ্যালু ম্যাট্রিক্সটি শূন্য থাকবে। এজেন্টের এক্সপ্লোরেশনের সংখ্যা বাড়ার সাথে সাথে পর্যায়ক্রমে এনভারমেন্ট সম্পর্কে ইনফরমেশনও বাড়তে থাকবে। বাস্তবে দেখা যাবে এজেন্টের সামনে পরবর্তী একশন কি হবে তার জন্য একাধিক অপশন আসবে, এসকল ক্ষেত্রে এজেন্ট কোন অপশন বেছে নেবে তা **মার্কভ ডিসিশন প্রসেসে** এর মাধ্যমে বেছে নেয়া হয়,&#x20;

![](/files/-M86HPHBAp9W2LtoF_I8)

মার্কভ ডিসিশন প্রসেস মূলত বেলম্যান ইকুয়েশনের মাধ্যমেই তৈরি করা হয়, যার মূল উদ্দেশ্য থাকে রিওয়ার্ড ম্যাক্সিমাইজেশন করা।এই ইকুয়েশনে একাধিক সম্ভাব্য স্টেটের সাপেক্ষে কোন স্টেটে যাবার জন্য একশন গ্রহন করলে এজেন্টের রিওয়ার্ড ম্যাক্সিমাম হবে তা নির্ণয় করা হয়।  আলোচনা সংক্ষিপ্ত করার জন্য আমরা বিস্তারিত গানিতিক বর্ণনায় যাব না, পাইথনের মাধ্যমে আমরা এর ব্যবহার সহজেই দেখে নেব। শুধুমাত্র মৌলিক বিষয়বস্তুর সাথে পরিচিতি লাভের জন্য এগুলোর অবতারনা করা হয়েছে।&#x20;

> * **এক্সপ্লোরেশন**-  এক্সপ্লোরেশন হচ্ছে এনভারমেন্টকে আবিস্কার করা বা এনভারমেন্ট সম্পর্কে নতুন নতুন ইনফরমেশন সংগ্রহ করা। ডিসকাউন্ট ফ্যাক্টর বেশী হলে এজেন্ট অধিক হারে এনভারমেন্টকে আবিস্কার করবে অর্থাৎ মাছ খুঁজে পাবার জন্য নতুন নতুন পথ খুঁজে বের করবে।&#x20;
> * **এক্সপ্লোয়েটেশন** - এক্সপ্লোইয়েটেশন হচ্ছে ইতোমধ্যে যেসকল ইনফরমেশন পাওয়া গেছে সেগুলোর উপর ভিত্তি করে মেক্সিমাম রিওয়ার্ড পাবার চেষ্টা করা। ডিসকাউন্ট ফ্যাক্টর কম হলে এজেন্ট মাছ খুঁজে বের করার জন্য নতুন নতুন পথ আবিস্কারের ঝুকি নিবে না বরং এর পরিবর্তে ইতোমধ্যে তার কাছে থাকা পথের ইনফরমেশনের উপর ভিত্তিতেই রিওয়ার্ড ম্যাক্সিমাইজ করার চেষ্টা করবে।

**মাছ খুঁজে বের করা বিড়াল রোবট**&#x20;

আমাদের লক্ষ্য হচ্ছে আমরা এমন একটি সফট বিড়াল রোবট তৈরি করবো যেটি মাছ খুঁজে বের করার চেষ্টা করবে। এরপর রোবটটিকে আমরা একটি এনভারমেন্টে ছেড়ে দেব, অবশ্য এই এনভারমেন্টটিও আমরা আগেই তৈরি করে রাখবো। এনভারমেন্টের কোথায় মাছ পাওয়া যাবে সেটা নির্দিষ্ট করা থাকবে কিন্তু কোন পথে গেলে এই মাছ পাওয়া যাবে সেটা অবশ্য বিড়ালটিকে জানাবো না। এরপর বিড়ালটিকে মাছের খোঁজে এনভারমেন্টটে ছেড়ে দেয়া হবে। বিড়ালটি বিভিন্ন রাস্তায় মাছের খোঁজ করতে থাকবে, বিড়ালটি যদি মাছের সন্ধান পায় তবে ১০০ পয়েন্ট পাবে। এভাবে বিড়ালটি প্রতিনিয়ত মাছের সন্ধানের জন্য নিজ থেকেই শিখতে শুরু করবে এবং সময়ের সাথে সাথে একটি দক্ষ মাছ শিকারি বিড়ালে পরিনত হবে !&#x20;

**এনভারমেন্ট তৈরি করা**&#x20;

রিইনফোর্সমেন্ট লার্নিং এর জন্য প্রয়োজনীয় লাইব্রেরী  ইমপোর্ট করে নিচ্ছি। এখানে   `networkx` লাইব্রেরীটি নেটওয়ার্ক গ্রাফ তৈরি করার জন্য ব্যবহার করা হয়েছে&#x20;

```
import numpy as np 
import pylab as pl 
import networkx as nx 
```

আমরা এমন একটি এনভারমেন্ট তৈরি করতে চাই যেখানে ৫ টি নোড থাকবে, এই নোডগুলো বিভিন্ন ভাবে কানেক্ট হয়ে পথ তৈরি করবে। আমাদের এজেন্ট (বিড়াল) এই পথগুলোতে অনুসন্ধান করে কোথায় মাছ রাখা আছে সেটি খুঁজে বের করবে। পথগুলোর কানেকশন কেমন হবে সেটা `edges`এ আমরা ডিফাইন করে দেব। এখানেই আমরা গোল সেট করে দেব অর্থাৎ কোন নোডে গেলে বিড়ালটি মাছের সন্ধান পাবে সেটাই হচ্ছে গোল।&#x20;

```
edges = [(2,3), (0, 4), (4, 3), (1, 3), (1, 5),(1,4)] 
  
goal = 5
G = nx.Graph() 
G.add_edges_from(edges) 
pos = nx.spring_layout(G) 
nx.draw_networkx_nodes(G, pos) 
nx.draw_networkx_edges(G, pos) 
nx.draw_networkx_labels(G, pos) 
pl.show() 
```

![ছবি - এনভারমেন্ট এর পথ (বিড়াল এবং মাছের ছবিটি  আলাদা ভাবে যুক্ত করা হয়েছে ))](/files/-M85b29pCCEf5FvbpAAy)

উপরের ছবিটিই আমাদের এনভারমেন্ট। এখানে বেশ কিছু রাস্তা রয়েছে। প্রাথমিক ভাবে বিড়ালটি 0 নোডে অবস্থান করে। বিড়ালটির কাজ হবে কোথায় মাছ রাখা আছে সেটি খুঁজে বের করা।&#x20;

**রিওয়ার্ড ম্যাট্রিক্স**&#x20;

এবার আমরা রিওয়ার্ড ম্যাট্রিক্স তৈরি করবো। বিড়ালটি যদি লক্ষ্যে পৌছাতে পারে সেক্ষেত্রে সে ১০০ পয়েন্ট পাবে। অন্যথায় ০ পয়েন্ট পাবে।&#x20;

```
MATRIX_SIZE = 6
M = np.matrix(np.ones(shape =(MATRIX_SIZE, MATRIX_SIZE))) 
M *= -1
  
for point in edges: 
    print(point) 
    if point[1] == goal: 
        M[point] = 100
    else: 
        M[point] = 0
  
    if point[0] == goal: 
        M[point[::-1]] = 100
    else: 
        M[point[::-1]]= 0
        # reverse of point 
  
M[goal, goal]= 100
print(M) 
```

![](/files/-M85cNhOpVXK03LMw9vW)

আমাদের রিওয়ার্ড ম্যাট্রিক্স  অনেকগুলো -1 দেয়া রয়েছে। এগুলোর অর্থ হচ্ছে এই নোড গুলোর মাঝে সরাসরি কোন কানেকশন নেই। আর সরাসরি কানেশন থাকলে 0  দেয়া রয়েছে। উদাহরন হিসেবে বলা যায় 0 নোডের সাথে কেবল মাত্র 4 এর সরাসরি কানেকশন রয়েছে এজন্য ক্ষেত্রে  এই মান \[-1. -1. -1. -1. 0. -1.]  দেয়া রয়েছে , অর্থাৎ&#x20;

* (0,0) = -1
* (0,1) = -1
* (0,2) = -1
* (0,3) = -1
* (0,4) = 0
* (0,5) = -1

**কিউ ম্যাট্রিক্স**&#x20;

এই ধাপে বিড়াল এজেন্ট কিভাবে তার বর্তমান অবস্থায় তার জন্য সম্ভাব্য পরবর্তী পদক্ষেপ কি কি হতে পারে সেটা জানার জন্য ফাংশন তৈরি করবো। আমাদের ফাংশন তার জন্য কোন পলিসি বেস্ট হবে সেটারও খোঁজ করবে। এভাবে প্রতিনিয়ত পলিসি আপডেট হতে থাকবে এবং এই ভ্যালু গুলো দ্বারা কিউ ম্যাট্রিক্স গঠিত হবে। বিড়ালটি যত বেশিবার মাছ খুজতে যাবে কিউ ম্যাট্রিক্স-এ এনভারমেন্ট সম্পর্কে ইনফরমেশন তত বাড়তে থাকবে, অর্থাৎ বিড়ালটি সময়ের সাথে ততো বেশী পারদর্শী হয়ে উঠতে থাকবে।&#x20;

```
available_action = available_actions(initial_state) 
  
# Chooses one of the available actions at random 
def sample_next_action(available_actions_range): 
    next_action = int(np.random.choice(available_action, 1)) 
    return next_action 
  
  
action = sample_next_action(available_action) 
  
def update(current_state, action, gamma): 
  
  max_index = np.where(Q[action, ] == np.max(Q[action, ]))[1] 
  if max_index.shape[0] > 1: 
      max_index = int(np.random.choice(max_index, size = 1)) 
  else: 
      max_index = int(max_index) 
  max_value = Q[action, max_index] 
  Q[current_state, action] = M[current_state, action] + gamma * max_value 
  if (np.max(Q) > 0): 
    return(np.sum(Q / np.max(Q)*100)) 
  else: 
    return (0) 
# Updates the Q-Matrix according to the path chosen 
  
update(initial_state, action, gamma) 
```

**সময়ের সাথে লার্ন করা**&#x20;

এবার চূড়ান্ত ধাপ। এই ধাপে আমরা আমাদের রিইনফোর্সমেন্ট লার্নিং এজেন্টকে আমাদের সৃষ্ট এনভারমেন্টে ১০০০ বার মাছের খোজে পাঠাবো। প্রতিবার বিড়ালটি ০ নোড থেকে বিভিন্ন পথে মাছের জন্য অনুসন্ধান করবে। প্রতিবার অনুসন্ধান শেষে বিড়ালটি এনভারমেন্ট সম্পর্কে যে ইনফরমেশন পায় সেটি দ্বারা কিউ ম্যাট্রিক্স প্রতিনিয়ত আপডেট হতে থাকে, এভাবে সময়ের সাথে সাথে বিড়ালটি আরও বেশী দক্ষ হয়ে উঠতে থাকে।&#x20;

```
scores = [] 
for i in range(1000): 
    current_state = np.random.randint(0, int(Q.shape[0])) 
    available_action = available_actions(current_state) 
    action = sample_next_action(available_action) 
    score = update(current_state, action, gamma) 
    scores.append(score) 
  
# print("Trained Q matrix:") 
# print(Q / np.max(Q)*100) 
# You can uncomment the above two lines to view the trained Q matrix 
  
# Testing 
current_state = 0
steps = [current_state] 
  
while current_state != 5: 
  
    next_step_index = np.where(Q[current_state, ] == np.max(Q[current_state, ]))[1] 
    if next_step_index.shape[0] > 1: 
        next_step_index = int(np.random.choice(next_step_index, size = 1)) 
    else: 
        next_step_index = int(next_step_index) 
    steps.append(next_step_index) 
    current_state = next_step_index 
  
print("Most efficient path:") 
print(steps) 
  
pl.plot(scores) 
pl.xlabel('No of iterations') 
pl.ylabel('Reward gained') 
pl.show() 
```

![](/files/-M85qQfvDS-EXQMo0XKQ)

উপরের ছবি থেকে আমরা দেখতে পাচ্ছি মাছের সন্ধান পাবার জন্য সবথেকে ভালো পথটি হচ্ছে ০,৪,১,৫ । বিড়ালটির পারফরম্যান্স সময়ের সাথে বৃদ্ধি পেয়েছে এবং প্রায় ২০০ বার ইটারেশন বা মাছ খোজার পরে বিড়ালটি চুড়ান্ত দক্ষতা অর্জন করতে পেরেছে।

এটাই হচ্ছে রিইনফোর্সমেন্ট লার্নিং এর সারকথা, এজেন্ট পরিবেশ থেকে শেখে। শেখার সময় ভুল বা সঠিক যাই ফিডব্যাক লাভ করুক সেই ফিডব্যাক থেকেও শেখে , এভাবেই সময়ের সাথে সাথে এজেন্টের দক্ষতা বৃদ্ধি পেতে থাকে।&#x20;

![](/files/-M9bOe7aYfBLJGrZDJQl)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://datasinsightsbd.gitbook.io/dsbook/reinforcement.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
