32 KiB
রিইনফোর্সমেন্ট লার্নিং এবং কিউ-লার্নিং এর পরিচিতি
স্কেচনোট: Tomomi Imura
রিইনফোর্সমেন্ট লার্নিং তিনটি গুরুত্বপূর্ণ ধারণার উপর ভিত্তি করে: এজেন্ট, কিছু স্টেট এবং প্রতিটি স্টেটের জন্য একটি অ্যাকশনের সেট। নির্দিষ্ট স্টেটে একটি অ্যাকশন সম্পাদন করে এজেন্ট একটি পুরস্কার পায়। আবার সুপার মারিও কম্পিউটার গেমটি কল্পনা করুন। আপনি মারিও, আপনি একটি গেম লেভেলে আছেন, একটি ক্লিফের কিনারায় দাঁড়িয়ে। আপনার উপরে একটি কয়েন রয়েছে। আপনি মারিও, একটি গেম লেভেলে, একটি নির্দিষ্ট অবস্থানে ... এটি আপনার স্টেট। ডানদিকে এক ধাপ এগিয়ে যাওয়া (একটি অ্যাকশন) আপনাকে কিনারা থেকে ফেলে দেবে, এবং এটি আপনাকে একটি নিম্ন সংখ্যাসূচক স্কোর দেবে। তবে, জাম্প বাটন চাপলে আপনি একটি পয়েন্ট পাবেন এবং আপনি জীবিত থাকবেন। এটি একটি ইতিবাচক ফলাফল এবং এটি আপনাকে একটি ইতিবাচক সংখ্যাসূচক স্কোর প্রদান করবে।
রিইনফোর্সমেন্ট লার্নিং এবং একটি সিমুলেটর (গেম) ব্যবহার করে, আপনি গেমটি খেলার পদ্ধতি শিখতে পারেন যাতে আপনি জীবিত থাকতে পারেন এবং যত বেশি পয়েন্ট সম্ভব অর্জন করতে পারেন।
🎥 উপরের ছবিতে ক্লিক করে Dmitry এর রিইনফোর্সমেন্ট লার্নিং আলোচনা শুনুন
পূর্ব-লেকচার কুইজ
প্রয়োজনীয়তা এবং সেটআপ
এই পাঠে, আমরা পাইথনে কিছু কোড নিয়ে পরীক্ষা করব। আপনি এই পাঠের জুপিটার নোটবুক কোডটি আপনার কম্পিউটারে বা ক্লাউডে কোথাও চালাতে সক্ষম হওয়া উচিত।
আপনি পাঠের নোটবুক খুলতে পারেন এবং এই পাঠটি অনুসরণ করে তৈরি করতে পারেন।
Note: যদি আপনি ক্লাউড থেকে এই কোডটি খুলছেন, তবে আপনাকে
rlboard.py
ফাইলটিও আনতে হবে, যা নোটবুক কোডে ব্যবহৃত হয়। এটি নোটবুকের একই ডিরেক্টরিতে যোগ করুন।
পরিচিতি
এই পাঠে, আমরা Peter and the Wolf এর জগৎ অন্বেষণ করব, যা একজন রাশিয়ান সুরকার Sergei Prokofiev এর একটি সঙ্গীতময় রূপকথার দ্বারা অনুপ্রাণিত। আমরা রিইনফোর্সমেন্ট লার্নিং ব্যবহার করব যাতে পিটার তার পরিবেশ অন্বেষণ করতে পারে, সুস্বাদু আপেল সংগ্রহ করতে পারে এবং নেকড়ের সাথে দেখা এড়াতে পারে।
রিইনফোর্সমেন্ট লার্নিং (RL) একটি শেখার কৌশল যা আমাদের এজেন্ট এর পরিবেশ-এ একটি অপ্টিমাল আচরণ শেখার অনুমতি দেয় অনেক পরীক্ষা চালিয়ে। এই পরিবেশে একটি এজেন্টের কিছু লক্ষ্য থাকা উচিত, যা একটি পুরস্কার ফাংশন দ্বারা সংজ্ঞায়িত।
পরিবেশ
সরলতার জন্য, পিটারের জগৎকে width
x height
আকারের একটি বর্গাকার বোর্ড হিসাবে বিবেচনা করা যাক, যেমন:
এই বোর্ডের প্রতিটি সেল হতে পারে:
- মাটি, যেখানে পিটার এবং অন্যান্য প্রাণীরা হাঁটতে পারে।
- পানি, যেখানে হাঁটা সম্ভব নয়।
- একটি গাছ বা ঘাস, যেখানে আপনি বিশ্রাম নিতে পারেন।
- একটি আপেল, যা পিটার খুঁজে পেতে পছন্দ করবে নিজেকে খাওয়ানোর জন্য।
- একটি নেকড়ে, যা বিপজ্জনক এবং এড়ানো উচিত।
একটি পৃথক পাইথন মডিউল, rlboard.py
, এই পরিবেশের সাথে কাজ করার কোড ধারণ করে। যেহেতু এই কোডটি আমাদের ধারণাগুলি বোঝার জন্য গুরুত্বপূর্ণ নয়, আমরা মডিউলটি আমদানি করব এবং নমুনা বোর্ড তৈরি করতে এটি ব্যবহার করব (কোড ব্লক 1):
from rlboard import *
width, height = 8,8
m = Board(width,height)
m.randomize(seed=13)
m.plot()
এই কোডটি পরিবেশের একটি ছবি মুদ্রণ করবে যা উপরের ছবির মতো।
অ্যাকশন এবং পলিসি
আমাদের উদাহরণে, পিটারের লক্ষ্য হবে একটি আপেল খুঁজে পাওয়া, নেকড়ে এবং অন্যান্য বাধা এড়ানো। এটি করতে, সে মূলত হাঁটতে পারে যতক্ষণ না সে একটি আপেল খুঁজে পায়।
তাই, যেকোনো অবস্থানে, সে নিম্নলিখিত অ্যাকশনগুলির মধ্যে একটি বেছে নিতে পারে: উপরে, নিচে, বামে এবং ডানে।
আমরা এই অ্যাকশনগুলিকে একটি ডিকশনারি হিসাবে সংজ্ঞায়িত করব এবং সেগুলিকে সংশ্লিষ্ট কোঅর্ডিনেট পরিবর্তনের জোড়ার সাথে ম্যাপ করব। উদাহরণস্বরূপ, ডানে (R
) যাওয়া একটি জোড়া (1,0)
এর সাথে সম্পর্কিত হবে। (কোড ব্লক 2):
actions = { "U" : (0,-1), "D" : (0,1), "L" : (-1,0), "R" : (1,0) }
action_idx = { a : i for i,a in enumerate(actions.keys()) }
এই পরিস্থিতির কৌশল এবং লক্ষ্য সংক্ষেপে:
-
কৌশল, আমাদের এজেন্ট (পিটার) এর পলিসি দ্বারা সংজ্ঞায়িত। একটি পলিসি একটি ফাংশন যা যেকোনো প্রদত্ত স্টেটে অ্যাকশন প্রদান করে। আমাদের ক্ষেত্রে, সমস্যার স্টেট বোর্ড দ্বারা প্রতিনিধিত্ব করা হয়, যার মধ্যে প্লেয়ারের বর্তমান অবস্থান রয়েছে।
-
লক্ষ্য, রিইনফোর্সমেন্ট লার্নিং এর লক্ষ্য হল শেষ পর্যন্ত একটি ভালো পলিসি শেখা যা আমাদের সমস্যাটি দক্ষতার সাথে সমাধান করতে সাহায্য করবে। তবে, একটি বেসলাইন হিসাবে, আসুন সবচেয়ে সহজ পলিসি বিবেচনা করি, যাকে র্যান্ডম ওয়াক বলা হয়।
র্যান্ডম ওয়াক
প্রথমে আসুন আমাদের সমস্যাটি র্যান্ডম ওয়াক কৌশল বাস্তবায়ন করে সমাধান করি। র্যান্ডম ওয়াকের মাধ্যমে, আমরা অনুমোদিত অ্যাকশনগুলির মধ্যে থেকে পরবর্তী অ্যাকশনটি এলোমেলোভাবে বেছে নেব, যতক্ষণ না আমরা আপেলটি খুঁজে পাই (কোড ব্লক 3)।
-
নিচের কোড দিয়ে র্যান্ডম ওয়াক বাস্তবায়ন করুন:
def random_policy(m): return random.choice(list(actions)) def walk(m,policy,start_position=None): n = 0 # number of steps # set initial position if start_position: m.human = start_position else: m.random_start() while True: if m.at() == Board.Cell.apple: return n # success! if m.at() in [Board.Cell.wolf, Board.Cell.water]: return -1 # eaten by wolf or drowned while True: a = actions[policy(m)] new_pos = m.move_pos(m.human,a) if m.is_valid(new_pos) and m.at(new_pos)!=Board.Cell.water: m.move(a) # do the actual move break n+=1 walk(m,random_policy)
walk
এর কলটি সংশ্লিষ্ট পথের দৈর্ঘ্য ফেরত দেবে, যা এক রান থেকে অন্য রানে পরিবর্তিত হতে পারে। -
একাধিকবার (ধরা যাক, 100 বার) ওয়াক পরীক্ষা চালান এবং ফলাফল পরিসংখ্যান মুদ্রণ করুন (কোড ব্লক 4):
def print_statistics(policy): s,w,n = 0,0,0 for _ in range(100): z = walk(m,policy) if z<0: w+=1 else: s += z n += 1 print(f"Average path length = {s/n}, eaten by wolf: {w} times") print_statistics(random_policy)
লক্ষ্য করুন যে পথের গড় দৈর্ঘ্য প্রায় 30-40 ধাপ, যা বেশ দীর্ঘ, কারণ আপেলের নিকটতম দূরত্বের গড় প্রায় 5-6 ধাপ।
আপনি পিটারের র্যান্ডম ওয়াক চলাকালীন গতিবিধি দেখতে পারেন:
পুরস্কার ফাংশন
আমাদের পলিসিকে আরও বুদ্ধিমান করতে, আমাদের বুঝতে হবে কোন পদক্ষেপগুলি অন্যদের তুলনায় "ভালো"। এটি করতে, আমাদের লক্ষ্য সংজ্ঞায়িত করতে হবে।
লক্ষ্যটি একটি পুরস্কার ফাংশন এর মাধ্যমে সংজ্ঞায়িত করা যেতে পারে, যা প্রতিটি স্টেটের জন্য কিছু স্কোর মান ফেরত দেবে। সংখ্যাটি যত বেশি হবে, পুরস্কার ফাংশন তত ভালো। (কোড ব্লক 5)
move_reward = -0.1
goal_reward = 10
end_reward = -10
def reward(m,pos=None):
pos = pos or m.human
if not m.is_valid(pos):
return end_reward
x = m.at(pos)
if x==Board.Cell.water or x == Board.Cell.wolf:
return end_reward
if x==Board.Cell.apple:
return goal_reward
return move_reward
পুরস্কার ফাংশন সম্পর্কে একটি আকর্ষণীয় বিষয় হল যে বেশিরভাগ ক্ষেত্রে, আমরা শুধুমাত্র গেমের শেষে একটি উল্লেখযোগ্য পুরস্কার পাই। এর মানে হল যে আমাদের অ্যালগরিদমটি "ভালো" পদক্ষেপগুলি মনে রাখতে হবে যা শেষ পর্যন্ত একটি ইতিবাচক পুরস্কার দেয় এবং তাদের গুরুত্ব বাড়াতে হবে। একইভাবে, সমস্ত পদক্ষেপ যা খারাপ ফলাফলের দিকে নিয়ে যায় তা নিরুৎসাহিত করা উচিত।
কিউ-লার্নিং
আমরা এখানে যে অ্যালগরিদমটি আলোচনা করব তাকে কিউ-লার্নিং বলা হয়। এই অ্যালগরিদমে, পলিসি একটি ফাংশন (বা একটি ডেটা স্ট্রাকচার) দ্বারা সংজ্ঞায়িত করা হয়, যাকে কিউ-টেবিল বলা হয়। এটি একটি প্রদত্ত স্টেটে প্রতিটি অ্যাকশনের "ভালোত্ব" রেকর্ড করে।
এটি একটি কিউ-টেবিল বলা হয় কারণ এটি প্রায়শই একটি টেবিল বা মাল্টি-ডাইমেনশনাল অ্যারে হিসাবে উপস্থাপন করা সুবিধাজনক। যেহেতু আমাদের বোর্ডের মাত্রা width
x height
, আমরা কিউ-টেবিলকে একটি numpy অ্যারে ব্যবহার করে উপস্থাপন করতে পারি যার আকার width
x height
x len(actions)
: (কোড ব্লক 6)
Q = np.ones((width,height,len(actions)),dtype=np.float)*1.0/len(actions)
লক্ষ্য করুন যে আমরা কিউ-টেবিলের সমস্ত মান সমান মান দিয়ে আরম্ভ করি, আমাদের ক্ষেত্রে - 0.25। এটি "র্যান্ডম ওয়াক" পলিসির সাথে সম্পর্কিত, কারণ প্রতিটি স্টেটে সমস্ত পদক্ষেপ সমানভাবে ভালো। আমরা কিউ-টেবিলকে বোর্ডে চিত্রিত করতে plot
ফাংশনে পাস করতে পারি: m.plot(Q)
।
প্রতিটি সেলের কেন্দ্রে একটি "তীর" রয়েছে যা গতির পছন্দসই দিক নির্দেশ করে। যেহেতু সমস্ত দিক সমান, একটি বিন্দু প্রদর্শিত হয়।
এখন আমাদের সিমুলেশন চালাতে হবে, আমাদের পরিবেশ অন্বেষণ করতে হবে এবং কিউ-টেবিল মানগুলির একটি ভালো বন্টন শিখতে হবে, যা আমাদের আপেলটি খুঁজে পেতে অনেক দ্রুত সাহায্য করবে।
কিউ-লার্নিং এর মূল: বেলম্যান সমীকরণ
একবার আমরা চলতে শুরু করলে, প্রতিটি অ্যাকশনের একটি সংশ্লিষ্ট পুরস্কার থাকবে, অর্থাৎ আমরা তাত্ত্বিকভাবে সর্বোচ্চ তাৎক্ষণিক পুরস্কারের উপর ভিত্তি করে পরবর্তী অ্যাকশনটি নির্বাচন করতে পারি। তবে, বেশিরভাগ স্টেটে, পদক্ষেপটি আমাদের আপেল খুঁজে পাওয়ার লক্ষ্য অর্জন করবে না, এবং তাই আমরা তাৎক্ষণিকভাবে সিদ্ধান্ত নিতে পারি না কোন দিকটি ভালো।
মনে রাখবেন যে তাৎক্ষণিক ফলাফলটি গুরুত্বপূর্ণ নয়, বরং চূড়ান্ত ফলাফলটি গুরুত্বপূর্ণ, যা আমরা সিমুলেশনের শেষে অর্জন করব।
এই বিলম্বিত পুরস্কারটি বিবেচনা করার জন্য, আমাদের ডাইনামিক প্রোগ্রামিং এর নীতিগুলি ব্যবহার করতে হবে, যা আমাদের সমস্যাটি পুনরাবৃত্তিমূলকভাবে চিন্তা করতে দেয়।
ধরা যাক আমরা এখন স্টেট s এ আছি, এবং আমরা পরবর্তী স্টেট s' এ যেতে চাই। এটি করে, আমরা তাৎক্ষণিক পুরস্কার r(s,a) পাব, যা পুরস্কার ফাংশন দ্বারা সংজ্ঞায়িত, এবং কিছু ভবিষ্যৎ পুরস্কার। যদি আমরা ধরে নিই যে আমাদের কিউ-টেবিল প্রতিটি অ্যাকশনের "আকর্ষণীয়তা" সঠিকভাবে প্রতিফলিত করে, তাহলে স্টেট s' এ আমরা একটি অ্যাকশন a' বেছে নেব যা Q(s',a') এর সর্বাধিক মানের সাথে সম্পর্কিত। তাই, স্টেট s এ আমরা যে সর্বোত্তম সম্ভাব্য ভবিষ্যৎ পুরস্কার পেতে পারি তা হবে max
নীতিমালা পরীক্ষা করা
Q-Table-এ প্রতিটি অবস্থায় প্রতিটি ক্রিয়ার "আকর্ষণীয়তা" তালিকাভুক্ত করা থাকে, তাই আমাদের জগতে দক্ষ নেভিগেশনের জন্য এটি ব্যবহার করা বেশ সহজ। সহজতম ক্ষেত্রে, আমরা Q-Table-এর সর্বোচ্চ মানের সাথে সম্পর্কিত ক্রিয়াটি নির্বাচন করতে পারি: (কোড ব্লক 9)
def qpolicy_strict(m):
x,y = m.human
v = probs(Q[x,y])
a = list(actions)[np.argmax(v)]
return a
walk(m,qpolicy_strict)
উপরের কোডটি কয়েকবার চেষ্টা করলে, আপনি লক্ষ্য করতে পারেন যে এটি কখনও কখনও "হ্যাং" করে, এবং আপনাকে নোটবুকে STOP বোতাম চাপ দিয়ে এটি বন্ধ করতে হয়। এটি ঘটে কারণ এমন পরিস্থিতি হতে পারে যেখানে দুটি অবস্থান একে অপরকে সর্বোত্তম Q-Value-এর দিক থেকে নির্দেশ করে, যার ফলে এজেন্টটি সেই অবস্থানগুলির মধ্যে অনির্দিষ্টভাবে চলতে থাকে।
🚀চ্যালেঞ্জ
কাজ ১:
walk
ফাংশনটি সংশোধন করুন যাতে পথের সর্বাধিক দৈর্ঘ্য একটি নির্দিষ্ট সংখ্যক ধাপে (যেমন, ১০০) সীমাবদ্ধ থাকে এবং উপরের কোডটি মাঝে মাঝে এই মানটি ফেরত দেয়।
কাজ ২:
walk
ফাংশনটি সংশোধন করুন যাতে এটি পূর্বে যেখানে ছিল সেই জায়গাগুলিতে ফিরে না যায়। এটিwalk
-কে লুপিং থেকে রোধ করবে, তবে এজেন্টটি এখনও এমন একটি স্থানে "ফাঁদে" পড়তে পারে যেখান থেকে এটি পালাতে অক্ষম।
নেভিগেশন
একটি ভালো নেভিগেশন নীতিমালা হবে সেই নীতিমালা যা আমরা প্রশিক্ষণের সময় ব্যবহার করেছি, যা শোষণ এবং অনুসন্ধানের সংমিশ্রণ। এই নীতিমালায়, আমরা Q-Table-এ মানগুলির আনুপাতিক সম্ভাবনার ভিত্তিতে প্রতিটি ক্রিয়া নির্বাচন করব। এই কৌশলটি এখনও এজেন্টকে পূর্বে অন্বেষণ করা অবস্থানে ফিরে যেতে পারে, তবে, নিচের কোড থেকে আপনি দেখতে পারেন, এটি কাঙ্ক্ষিত অবস্থানে খুব ছোট গড় পথের দৈর্ঘ্য প্রদান করে (মনে রাখুন print_statistics
১০০ বার সিমুলেশন চালায়): (কোড ব্লক 10)
def qpolicy(m):
x,y = m.human
v = probs(Q[x,y])
a = random.choices(list(actions),weights=v)[0]
return a
print_statistics(qpolicy)
এই কোডটি চালানোর পরে, আপনি আগের তুলনায় অনেক ছোট গড় পথের দৈর্ঘ্য পাবেন, যা ৩-৬ এর মধ্যে থাকবে।
শেখার প্রক্রিয়া তদন্ত করা
যেমন আমরা উল্লেখ করেছি, শেখার প্রক্রিয়া হলো অনুসন্ধান এবং সমস্যার স্থান সম্পর্কে অর্জিত জ্ঞান অন্বেষণের মধ্যে একটি ভারসাম্য। আমরা দেখেছি যে শেখার ফলাফল (এজেন্টকে লক্ষ্য অর্জনের জন্য একটি ছোট পথ খুঁজে পেতে সাহায্য করার ক্ষমতা) উন্নত হয়েছে, তবে শেখার প্রক্রিয়ার সময় গড় পথের দৈর্ঘ্য কীভাবে আচরণ করে তা পর্যবেক্ষণ করাও আকর্ষণীয়:
শেখার সারসংক্ষেপ:
-
গড় পথের দৈর্ঘ্য বৃদ্ধি পায়। প্রথমে, গড় পথের দৈর্ঘ্য বৃদ্ধি পায়। এর কারণ হতে পারে যে পরিবেশ সম্পর্কে কিছুই না জানার কারণে আমরা খারাপ অবস্থায়, যেমন জল বা নেকড়ের ফাঁদে পড়ে যাই। যখন আমরা আরও শিখি এবং এই জ্ঞান ব্যবহার করতে শুরু করি, তখন আমরা পরিবেশটি দীর্ঘ সময় ধরে অন্বেষণ করতে পারি, তবে এখনও আপেলগুলির অবস্থান সম্পর্কে খুব ভালোভাবে জানি না।
-
পথের দৈর্ঘ্য কমে যায়, যত বেশি শিখি। একবার আমরা যথেষ্ট শিখে গেলে, এজেন্টের জন্য লক্ষ্য অর্জন করা সহজ হয়ে যায়, এবং পথের দৈর্ঘ্য কমতে শুরু করে। তবে, আমরা এখনও অনুসন্ধানের জন্য উন্মুক্ত থাকি, তাই আমরা প্রায়ই সেরা পথ থেকে সরে যাই এবং নতুন বিকল্পগুলি অন্বেষণ করি, যা পথকে আদর্শের চেয়ে দীর্ঘ করে তোলে।
-
দৈর্ঘ্য হঠাৎ বৃদ্ধি পায়। আমরা এই গ্রাফে যা লক্ষ্য করি তা হলো যে কোনো এক সময়ে দৈর্ঘ্য হঠাৎ বৃদ্ধি পায়। এটি প্রক্রিয়ার স্টোকাস্টিক প্রকৃতি নির্দেশ করে, এবং যে কোনো সময় আমরা Q-Table-এর গুণফলগুলি নতুন মান দিয়ে ওভাররাইট করে "বিগড়ে" দিতে পারি। এটি আদর্শভাবে শেখার হার কমিয়ে (যেমন, প্রশিক্ষণের শেষের দিকে, আমরা শুধুমাত্র Q-Table মানগুলি একটি ছোট মান দ্বারা সামঞ্জস্য করি) কমানো উচিত।
সামগ্রিকভাবে, এটি মনে রাখা গুরুত্বপূর্ণ যে শেখার প্রক্রিয়ার সাফল্য এবং গুণমান উল্লেখযোগ্যভাবে প্যারামিটারগুলির উপর নির্ভর করে, যেমন শেখার হার, শেখার হার হ্রাস, এবং ডিসকাউন্ট ফ্যাক্টর। এগুলিকে প্রায়ই হাইপারপ্যারামিটার বলা হয়, যাতে প্যারামিটার থেকে আলাদা করা যায়, যা আমরা প্রশিক্ষণের সময় অপ্টিমাইজ করি (যেমন, Q-Table গুণফল)। সেরা হাইপারপ্যারামিটার মানগুলি খুঁজে বের করার প্রক্রিয়াকে হাইপারপ্যারামিটার অপ্টিমাইজেশন বলা হয়, এবং এটি একটি আলাদা বিষয়ের যোগ্য।
পোস্ট-লেকচার কুইজ
অ্যাসাইনমেন্ট
অস্বীকৃতি:
এই নথিটি AI অনুবাদ পরিষেবা Co-op Translator ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসাধ্য সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।