
ঢিল ছুঁড়ে আম পাড়ার দিনগুলো বেশ আনন্দের ছিলো। একরকম টার্গেট প্র্যাকটিসও হয়ে যেত। উপরের ডালের কোনো আমের দিকে তাক করে হয়ত ঢিল ছুঁড়েছি। ফসকে গেলো! উপর দিয়ে বেরিয়ে গেলো। ঢিল ছোঁড়ার ডাইরেকশান বা এঙ্গেল একটু বদলে আবার একবার চেষ্টা করা হলো। দেখা গেলো, এবার নীচ দিয়ে বেরিয়ে গিয়ে ওপাশের রাস্তায় পড়ল। এরকম বার কয়েক উপর-নীচ টিপ করে ফেল করার পর একসময় ঠিক আমের গায়েই ঢিলটা গিয়ে লাগলো। অবশেষে সাকসেস!
এই যে চেষ্টা করে করে একসময় সাফল্যতে পৌঁছানো, এ তো জীবনেরই এক অমোঘ দর্শন! এভাবেই শেষে সঠিক পথ বা ট্রাজেক্টরি অনুসরণ করে টার্গেটে হিট করা সম্ভব । বলা যেতে পারে, ট্রায়াল এন্ড এরার মেথড – চেষ্টা ও ভুল সংশোধন! অনেক সমস্যার সমাধানের ক্ষেত্রেই এরকমটা করা হয়ে থাকে। একটা অজানা অবস্থান থেকে নির্দিষ্ট কোনো সমাধানে পৌঁছানোর এই প্রচেষ্টা একটা প্রণালীবদ্ধ পদ্ধতি। অঙ্কে এরকম একটা পদ্ধতি প্রায় ই ব্যবহার করা হয়, যখন আর কোনো উপায় থাকে না।
মনে করা যাক, তুমি যেখানে দাঁড়িয়ে ঢিল-টা ছুঁড়ছো সেই অবস্থান বা পজিশন-টা নির্দিষ্ট। অন্যদিকে যেখানে আম-টা গাছের ডালে ঝুলছে তারও পজিশন নির্দিষ্ট। তাহলে বুঝে নিতে হবে, দুই প্রান্তের অর্থাৎ এদিকে আর ওদিকের দুটো বাউন্ডারি-তে পজিশন জানা আছে। শুধু, কোন পথ দিয়ে ঢিলটা গিয়ে আমের গায়ে লাগবে, সেটাই বার করতে হবে। এটা একটা গেম হতে পারে। কত জোরে ছুঁড়তে হবে আর কোন এঙ্গেলে, শুরুতে এসব কিছুই জানা নেই। একে একটা অঙ্কের প্রবলেম হিসাবে ভাবা যেতে পারে। কাগজ কলম নিয়ে বসে ছবি এঁকে দেখতে পারো, স্ট্রাটেজি তৈরি করতে পারো, কিভাবে একটা নির্দিষ্ট গতিতে ঢিল-টা কোন পথ দিয়ে পৌঁছাবে। তারপর তো অঙ্কের হিসাবনিকাশ করা যেতেই পারে।
তবে, এখন সাধারণভাবে, ফিজিক্সের একটা প্রবলেম অথবা ক্যালকুলাসের একটা অঙ্ক নিয়ে ভাবা যাক। একটা সেকেন্ড অর্ডার ডিফারেন্সিয়াল ইক্যুয়েশন-এর সমাধান করতে হবে। এইরকম একটা ইক্যুয়েশান বা সমীকরণে থাকতে পারে সময়ের সাপেক্ষে বস্তু বা ঢিল-টার অবস্থান আর তার অবস্থানের পরিবর্তন-এর হার অর্থাৎ গতিবেগ। আর থাকবে গতিবেগের পরিবর্তন-এর হার, মানে ত্বরণ। সমীকরণ হলো এদের মধ্যে একটা সম্পর্ক স্থাপন করা।
অবশ্য আমরা এসব অঙ্ক এখন করব না। তবে, এইরকম একটা ডিফারেন্সিয়াল ইক্যুয়েশন বা সমীকরণের সমাধান করতে গেলে অর্থাৎ ওই ঢিল-টা কোন পথ অনুসরণ করে টার্গেটে পৌঁছাবে তা বার করতে গেলে শুরুতে আরো দুটো বিষয় আমাদের জানা দরকার। এক, সেটা কোথা থেকে যাত্রা শুরু করব, দুই, সেটা কোন দিকে এগোবে। ঢিলটার শুরুর অবস্থান আমরা জানি (ঢিল আমার হাতে)। আবার অন্যপ্রান্তে কোথায় গিয়ে পৌঁছবে সেই পজিশনও জানা আছে। তবে, শুরুতে কোন দিকে এগোবে তা জানি না। তার মানে, ঢিল-টা কত গতিবেগ নিয়ে যাত্রা শুরু করবে (কত জোরে এবং কোন দিকে সেটাকে ছুঁড়ছি) তা জানতে হবে। [গতিবেগ-কে একটা ভেক্টর ধরলে তার মান অর্থাৎ কত জোরে ছোঁড়া হচ্ছে এবং তার দিক অর্থাৎ কোন এঙ্গেলে ছোঁড়া হচ্ছে তা জানতে হবে।]
তাহলে, আম পাড়ার ব্যাপারটার মতোই শুরুর এঙ্গেল (ঢিল-টা কোন দিকে এগোবে) অথবা প্রাথমিক গতিবেগ, একটা কিছু অনুমান করে নিয়ে এগোতে হবে। এরপর চলবে ট্রায়াল এন্ড এরার। হিসাব রাখতে হবে প্রতি স্টেপে কতটা ভুল হলো, আর সেটা কিভাবে কমিয়ে আনা যায়। তবে এক্ষেত্রে, ভুলের হিসাব আর তা থেকে একটু একটু করে উন্নতি করার ব্যাপারটা কিছু অঙ্কের স্টেপ ছাড়া আর কিছুই নয়। ক্যালকুলাসের সমীকরণের ক্ষেত্রে এধরণের প্রবলেমকে বলে বাউন্ডারি ভ্যালু প্রবলেম, কেননা দুপাশের বাউন্ডারিতে ভ্যালু জানা আছে। দুই বাউন্ডারি-ভ্যালু-র মধ্যে সংযোগকারী রেখা বা ঢিল-এর ট্রাজেক্টরি জানার জন্য সমাধান করতে হবে।
ক্যালকুলাসের সমীকরণের ক্ষেত্রে ট্রায়াল এন্ড এরারের এই যে পদ্ধতিটা এখানে কাজে লাগানো হবে, একে বলা হয় শ্যুটিং মেথড! আসলে, শ্যুটাররা শ্যুটিং প্রাকটিস এই নীতিতেই করে, ক্রমাগত আন্দাজ বাড়িয়ে বাড়িয়ে!
ট্রায়াল এন্ড এরার মেথডে যেকোন বীজগাণিতিক সমীকরণেরও সমাধান করে ফেলা যায়, যা অন্যভাবে হয়ত করা যাবে না। তোমাদের অঙ্কের বই থেকে এরকম কিছু সমীকরণের সমাধান করেছো তোমরা, সম্ভাব্য মান বসিয়ে বসিয়ে। যেমন ধরো, x^3 + x^2 – 5x + 1 = 0, এইরকম একটা ত্রিঘাত সমীকরণ। ফ্যাক্টার করে বা অন্যভাবে সমাধান করতে পারছো না। তাহলে, x-এর একটা মান বসিয়ে দ্যাখো, কী হয়। এখানে বাঁদিকের রাশিমালাতে x = 1 বসিয়ে দ্যাখো রাশিমালার মান পাবে -2, কিন্তু সমাধান পেতে গেলে তা 0 হওয়া উচিৎ। তাহলে, এবার উল্টোদিকে যাও। x = -1 বসিয়ে দ্যাখো। দেখবে, 6 পাবে, এবার 0 পেরিয়ে পজিটিভ একটা সংখ্যা। এখন আন্দাজ করতে পারো, তোমার সমীকরণের সমাধান এই -1 এবং +1 এর মধ্যেই আছে। এবার এই রেঞ্জের মধ্যে এদিক ওদিক করে একটু একটু এগোও, দেখবে, একসময় মান টা 0-এর খুব কাছে চলে এসেছে। এভাবেই ট্রায়াল এন্ড এরার পদ্ধতিতে সমাধান খুঁজে বার করতে পারো। এই কাজটা কম্পিউটারে দুই তিন লাইনের কোড লিখে এক নিমেষেই করে ফেলা যায়। কিন্তু, কোড লেখার আগে তার এলগোরিদম হবে এই ট্রায়াল এন্ড এরার-এর নির্দিষ্ট মেথড!
প্রথমে আনাড়ি একটা ভাবনা, তারপর একটু একটু করে আন্দাজ থেকে সঠিক সমাধানে পৌঁছানো। এরার (error) বা ভুল-কে কমিয়ে আনা। এই পদ্ধতি অতি সাধারণ কিন্তু কী অনবদ্য কার্যকরী!
এবার উপরের থেকে একটু আলাদা একটা উদাহরণ নিয়ে ভাবা যাক। একটাই রাশি বা তার জন্য একটাই সমীকরণ, ব্যাপারটা এরকম নয়।অনেকগুলো রাশি বা অজানা বস্তুকে নিয়ে একটা কিছু জটিল সমস্যার সমাধান করতে হবে। ধরা যাক, রাশিগুলোর মধ্যে নানারকম সম্পর্ক জানা আছে। একটা সম্পর্ক-তে কিছু পরিবর্তন হলে, অন্য সম্পর্কগুলোতেও স্বভাবতই তার প্রভাব পডবে। তার মানে তারা পরস্পরের সঙ্গে সংযোজিত (coupled)। একটা রাশির মান পরিবর্তন হতে থাকলে সম্পর্ক টিঁকিয়ে রাখার জন্য অন্যদেরও মানের পরিবর্তন হতে হবে, আবার তাদের জন্য ফের এই রাশিরও মান পাল্টাবে। এরকম পারস্পরিক সম্পর্কগুলো থেকে রাশিগুলোর মান ক্রমাগত পরিবর্তন হতে হতে শেষে তারা একেকটা নির্দিষ্ট মানের দিকেই এগোবে এবং সেটাই হবে সমাধান! হিসাব করে এরার বা ত্রুটির পরিমাপ করলে দেখা যাবে, এই পারস্পরিক প্রক্রিয়ায় তার মান ক্রমাগত কমতে কমতে অবধারিতভাবে শূন্যের দিকে এগোবে। এ যেন একটা নেটওয়ার্ক, যেখানে কেউ স্বতন্ত্র নয়! একজন আরেকজনকে পরিবর্তন করে দিচ্ছে আবার সে নিজেও পরিবর্তিত হয়ে চলেছে! একটু চিন্তা করলেই বোঝা যাবে, বিচিত্র এই ব্যাপারটা আসলে খুবই সাধারণ! খুব পরিচিত একটা অঙ্ক দিয়ে আরেকটু ভালোভাবে বুঝে নেওয়া যাক।
ক্লাসে অঙ্কের বইতে x, y, z দিয়ে সমীকরণ লিখে সমাধান করেছো তোমরা। এখানে এরা হলো তিনটে অজানা রাশি বা বস্তু, আর সমীকরণগুলো হলো এদের মধ্যে কিছু সম্পর্ক। মনে করা যাক, x-এর দ্বিগুণ -এর সাথে y-এবং z যোগ করলে 7 হয়। তাহলে, তুমি 2x + y + z = 7 লিখবে। তবে, তিনটে অজানা বস্তুর সঠিক বা নির্দিষ্ট মান বার করার জন্য এরকম তিনটে সম্পর্ক বা সমীকরণ দরকার হবে। যেমন ধরো,
2x + y + z = 7
2x – y + 2z = 6
x – 2y + z = 0
এরকম এক সেট রৈখিক সমীকরণ নিয়ে এদিক ওদিক করে x, y, z-এর মান বার করেছো আগে। তবে ব্যাপারটা হলো, মনে করা যাক, এরকম অজানা রাশির সংখ্যা অনেক বেশি। ধরো, তোমাকে 100-টা রাশির জন্য এইরকম 100-টা সমীকরণ নিয়ে কাজ করতে হবে। তখন অবশ্যই হাতে করা যাবে না। কম্পিউটারে কোড লিখে সমাধান করতে হবে। কিন্তু, তার জন্য একটা নির্দিষ্ট এলগোরিদম দরকার। অর্থাৎ স্টেপ বাই স্টেপ ইকনস্ট্রাকশান! নির্দিষ্ট এলগোরিদম বা মেথড জানা থাকলে তা দিয়ে অল্প সংখ্যক সমীকরণের জন্য তোমরা নিজেরা হাতেও ক্যালকুলেশান করে ফেলতে পারো নিশ্চিতভাবেই।
বিখ্যাত গণিতজ্ঞ কার্ল ফ্রেডরিক গাউস-এর নাম তোমরা শুনে থাকবে। কম্পিউটারে কোড লিখে এইরকম সমীকরণের সমাধান করার জন্য অতি পরিচিত কিছু পদ্ধতি আছে। যেমন গাউস এলিমিনেশন পদ্ধতি। গাউস-জর্ডন পদ্ধতি। এসব নিয়ে পরে হয়ত তোমরা কখনো পড়বে। তবে, এক্ষেত্রে ট্রায়াল এন্ড এরারের টেকনিক কাজে লাগিয়ে সমাধানে পৌঁছানোর রাস্তা আছে কিনা দেখে নিই।
বস্তুত, গাউস-সীইডেল (Gauss-Seidel) পদ্ধতি হলো এরকম একটা ব্যাপার। শুরুতে x, y, z… এই অজানা বস্তুগুলোর যা খুশি কিছু মান ধরে নাও। তারপর এদের সমীকরণগুলোতে ওই মানগুলো বসিয়ে সমীকরণের সম্পর্কগুলো থেকে নতুন কী মান পাওয়া যাচ্ছে তা দ্যাখো। এবার সেসব মান থেকে আবার আরেক সেট নতুন মান পাবে…এভাবে পুরোনো আর নতুন মানের মেশামেশি চলতে থাকবে। যেমন ধরো, উপরের x, y, z-এর সমীকরণগুলোর ক্ষেত্রে, প্রথমে ধরে নিলাম, x = 2, y = 1, z = 3, তাহলে প্রথম সমীকরণে y এবং z-এর মান বসিয়ে পাওয়া যাবে, x = (7 – y – z)/2, x = (7 – 1 – 3)/2 = 1.5, এভাবে আগের মানের পরিবর্তে x-এর একটা নতুন মান পেলাম। এখন, x-এর এই নতুন মান আর z-এর আগের মান বসিয়ে পরের সমীকরণ থেকে আবার y-এর নতুন একটা মান পাওয়া যাবে। এভাবে একটা প্রাথমিক অনুমান থেকে শুরু করে সমস্ত সমীকরণগুলোর সাহায্যে একে একে x, y, z-এর মানগুলো পরিবর্তিত হতে থাকবে। প্রত্যেকটিই একেকটি নির্দিষ্ট কিছু মানের দিকে এগিয়ে যাবে। বার বার এরকম প্রক্রিয়া বা ট্রায়াল চালিয়ে যেতে হবে।
ট্রায়াল তো হলো। এরার ঠিক দিকে এগোচ্ছে কিনা কী করে বুঝব? বোঝা খুব সোজা। একটা ধাপের x, y, z,… এর মানগুলোর সাথে পরের ধাপের মানগুলোর পারস্পরিক তফাৎ হিসাব করে তাদের বর্গ করে নাও (কেননা, তফাৎগুলো পজিটিভ, নেগেটিভ বা কমবেশি হতে পারে।)। তারপর তাদের যোগফল দেখতে হবে। এটা এরার বা ভুল-এর হিসাবের একটা পরিমাপ। দেখা যাবে, পরপর ধাপগুলোর সাথে বা ইটারেশান বাড়ালে এই এরার-এর মান কমতে কমতে শূন্য-র দিকে যাচ্ছে। অর্থাৎ সিস্টেম-এর সলিউশান যেন নির্দিষ্ট মানের দিকে একটা শিথিলতার সাথে এগোচ্ছে, বলা যেতে পারে একটা দিকে রিল্যাক্স করছে। স্বভাবতই এইরকম একটা পদ্ধতিকে বলা হয় রিলাক্সেশান পদ্ধতি (Relaxation method), এক্ষেত্রে এটাই Gauss-Seidel relaxation method!
আগেই বলেছি, এ যেন এক নেটওয়ার্ক-এর মতো ব্যাপার! একজনের পরিবর্তন আরেকজনের ঘাড়ে গিয়ে পড়ছে! আর, তাদের বিভিন্ন সম্পর্কের প্রেক্ষিতে শেষপর্যন্ত সবাই তাদের মান পরিবর্তন করতে করতে নির্দিষ্ট একেকটা মানের দিকে এগোচ্ছে! বেশ মজার একটা ব্যাপার!
এবার একটা সত্যিকারের নেটওয়ার্কের কথা ভাবা যাক। মনে করা যাক, তারজালির মতো একটা গ্রিড বা একটা স্ক্যোয়ার ল্যাটিস অথবা গ্রাফ পেপারের মতো দেখতে একটা নেটওয়ার্ক। এখানে প্রতিটা জাংশান পয়েন্টে চারদিক থেকে চারটে তার এসে মিলছে – ডান-বাম-উপর-নীচ। এই তারগুলোকে এক একটা রোধক বা রেজিস্টর ভেবে নাও। তার মানে একটা বর্গাকৃতি রেজিস্টর নেটওয়ার্ক। এবার মনে করা যাক, এই নেটওয়ার্ক বা তারজালির দুটো বিপরীত প্রান্তে দুটো ইলেকট্রোড দিয়ে নির্দিষ্ট বিভব পার্থক্য তৈরি করা হয়েছে। দুই প্রান্তের বিভব প্রভেদের জন্য এই নেটওয়ার্ক-এর ভিতর দিয়ে তড়িৎপ্রবাহ হবে। তার মানে, প্রতিটা জাংশান পয়েন্ট বা নোডে একেকরকম বিভব থাকবে, বিভবের পার্থক্য থাকবে যাতে তড়িৎ প্রবাহ চলতে পারে। তবে, কোথায় কোন নোডে কত বিভব থাকবে তা জানতে চাওয়া হলে বড় একটা নেটওয়ার্ক-এর ক্ষেত্রে হিসাব করে বার করা বেশ কঠিন কাজ।
সমাধান করার আগে, একটা বিষয় আমরা জানি। যদি ধরে নিই, প্রতিটা নোডে চারদিকের চারটে সংযোগকারী তার দিয়ে কারেন্ট ঢুকছে বা বেরোচ্ছে, তাহলে সব মিলিয়ে একটা নোডে মোট কারেন্ট বা তড়িৎপ্রবাহ শূন্য (কেননা, যা ঢুকবে, তা বেরোতে হবে।)। এটাই হলো একটা নেটওয়ার্কের জন্য বিখ্যাত রাশিয়ান বিজ্ঞানী কিরখফ-এর তড়িৎপ্রবাহের সূত্র – একটা নোড বা জাংশানে মোট কারেন্ট শূন্য।
এখন অঙ্ক করা ঠিক হবে না। তবে, তোমরা একটু খাতা কলম নিয়ে বসে ছবি এঁকে বা লিখে দেখে নিতে পারো, প্রতিটা নোডের বিভব-এর সাথে তার চারপাশের আর চারটে নোডের বিভবের সম্পর্ক কিরকম হতে পারে। এখানে অতি পরিচিত ওহম-এর সূত্র ছাড়া আর কিছু লাগবে না। মনে করা যাক, প্রতিটা সংযোগকারী তারের রোধ R, তাহলে দুটো পাশাপাশি নোডের বিভব প্রভেদ-এর পার্থক্য, V1 – V2 = R × i হবে, i হলো কারেন্ট। হিসাবের সুবিধার জন্য সব R-গুলোকে এক ইউনিট ধরে নিলে, একটা নোডের চারপাশের চারটে নোডের বিভবের মানগুলো থেকে মাঝখানের নোডের বিভব হিসাব করলে হবে, V = (V1 + V2 + V3 + V4)/4, তার মানে, প্রতিটা নোডের বিভব-এর মান হবে তার চারপাশের নোডগুলোর বিভবের গড় মান। হিসাবটা খুব সোজা। খাতা কলম নিয়ে বসে গেলেই তোমরা করে ফেলতে পারবে।
তাহলে, নেটওয়ার্ক-এ একশোটা নোড থাকলে তার জন্য এরকম একশোটা গড় বার করতে হবে, তার মানে একশোটা সম্পর্ক! যথারীতি, কেউ স্বাধীন নয়। একজন পরিবর্তন হলে অন্যদের ঘাড়ে গিয়ে তা পড়বে।
সমাধান কি সম্ভব? সম্ভব তো বটেই। যথারীতি, শুরুতে প্রতিটা নোডের বিভবের মান যা খুশি ধরে নাও। তারপর একটা একটা করে নোডের জন্য তার বিভব তার চারপাশের চারটে নোডের বিভব-এর গড় ধরে হিসাব করে নাও। এভাবে একটা নোডের বিভব-এর পুরোনো মান নতুন করে হিসাব করা গড় মান দিয়ে পরিবর্তন করো। এবার এই নোডের বিভবের নতুন মান আবার এর পাশের নোডের গড় বিভব হিসাব করার সময় ব্যবহার করো। এভাবে, অবশ্যই অনেকবার করতে হবে। সবচেয়ে ভালো হয়, এই কাজটা করার জন্য কম্পিউটারে পাইথন বা অন্য কিছু দিয়ে একটা কোড লিখে নাও। দেখবে, খুব তাড়াতাড়ি, কয়েকটা স্টেপের পরেই সব নোডের বিভব একেকটা নির্দিষ্ট মানের দিকে এগোচ্ছে। শুধু উপরের আর নীচের ইলেকট্রোড দুটোর বিভব একই থাকবে। কারণটা তো বুঝতেই পারছো। এরার বা ভুল কতটা হলো তার হিসাব করতে গেলে আগের মতই, একটা স্টেপ বা একটা সাইকেল-এ প্রতিটা নোডের বিভব থেকে তার আগের স্টেপের সেই সেই নোডের বিভবের পার্থক্য নিয়ে তাদের বর্গ করে তারপর যোগ করে একটা হিসাব করো। দেখবে, যত স্টেপ এগোবে, এই এরার-এর মান কেমন শূন্যের দিকে এগিয়ে চলেছে! আসলে, এও হলো ওই একই গাউস-সীইডেল রিলাক্সেশান মেথড!
এই রিলাক্সেশান বা শিথিলতা এতটাই কার্যকরী যে এরকম আইডিয়া স্বভাবতই কাজে লাগানো হচ্ছে AI তে কৃত্রিম নিউরাল নেটওয়ার্ক-এর উপর। এই নেটওয়ার্কে কৃত্রিম নিউরনগুলো একে অপরের সাথে সংযোজিত। ইনপুট লেয়ার, তারপর মাঝখানে কিছু ‘হিডেন’ লেয়ার আর শেষে আউটপুট লেয়ার। ইনপুট বাদ দিয়ে পরের লেয়ারগুলো পাশের লেয়ারের থেকে যা ইনফরমেশান পায়, তা কিছু ওয়েট ফ্যাক্টার দিয়ে পরিবর্তন করে নেয়। তবে, এখানে ব্যাপারটা হলো, ইনপুট-এর উপর নির্ভর করে নেটওয়ার্ক-এর ট্রেনিং চলে, অর্থাৎ ওই ওয়েট ফ্যাক্টার (weight factor) গুলো ক্রমাগত পরিবর্তিত হতে থাকে। একটা নিউরন নোড পাশের নিউরন নোডগুলো-কে প্রভাবিত করে। এখানেও এরার বা লস ফ্যাক্টারের হিসাব চলে। শেষে, একেকটা ট্রেনিং এর পর ওয়েট ফ্যাক্টারগুলো নির্দিষ্ট কিছু মান-এ এসে দাঁড়ায়। তবে, এখানে অবশ্য আরো অনেক কিছু আছে, সেসব মডেল নির্ভর। কিন্তু, বিষয়টা হলো, একটা অজানা অবস্থা থেকে ধীরে ধীরে কিভাবে একটা নির্দিষ্ট অবস্থার দিকে একটা সিস্টেম এগোতে থাকে, কিভাবে সম্পর্ক ব নেটওয়ার্ক এই ব্যাপারে সাহায্য করে তা বোঝা বেশ সহজ অথচ কঠিন। এ যেন এক আনাড়ির সমাধান!