AI এসে গেছে (পর্ব ৬)

AI এসে গেছে (পর্ব ৬)

অভিজিৎ কর গুপ্ত
পদার্থ বিজ্ঞানের অধ্যাপক, পাঁশকুড়া বনমালী কলেজ (অটোনমাস)
Posted on ৭ জুন, ২০২৬

ট্রান্সফর্মার হলো নিউরাল নেটওয়ার্কের এক অনন্য আর্কিটেকচার। কেন তা AI-এর জগতে বৈপ্লবিক পরিবর্তন এনেছে তা আগেই বলেছি। এবার টেকনিক্যাল ব্যাপারটা আরেকটু বুঝে নেওয়া যাক।

মূলত: দুটো টাওয়ারের গল্প! একটা টাওয়ারের মধ্যে থাকে অনেকগুলো ব্লক। একেকটা ব্লকে থাকে অনেকগুলো লেয়ার বিশিষ্ট স্বয়ংসম্পূর্ণ নিউরাল নেটওয়ার্ক। সাধারণত: একটা ট্রান্সফর্মার-এর একটা টাওয়ার হলো এনকোডার, আর অন্যটা ডিকোডার। এনকোডার-কে আমরা ভাবতে পারি প্রচন্ড ক্ষমতাবান একজন অনুবাদক (translator) এবং সংক্ষেপক (summarizer)-এর মতো কিছু একটা। তার মানে, এর কাজ হলো ইনপুটে যা আসছে (টেক্সট-এর শব্দ বা শব্দের অংশ, সিম্বল বা অঙ্ক অথবা এরকম কিছু – এককথায় এদেরকে টোকেন বলে।) তাদেরকে দীর্ঘ একেকটা বহুমাত্রার গাণিতিক ভেক্টরে পরিণত করা। অঙ্কের দিক থেকে আমরা ভেবে নিতে পারি, বহুমাত্রার ভেক্টর স্পেসে এরা অবস্থান করছে। তাদের মধ্যে গাণিতিক সম্পর্ক আছে, তাদের মধ্যে যোগ-বিয়োগ করা যাবে, এলজেবরার সব নিয়ম খাটবে। ভেক্টরগুলোর মধ্যে সম্পর্ক কী হবে, টেক্সট থেকে বুঝে নিয়ে তারপর তাদের অবস্থান ঠিক করে ফেলাই হলো এনকোডারের কাজ। ভাবা যেতে পারে, যেন বিশাল এক বহু মাত্রার ম্যাপ তৈরি হচ্ছে যা থেকে বোঝা যাবে টোকেনগুলোর প্রতিনিধিত্বকারী ভেক্টরগুলোর মধ্যে সম্পর্কের এক বিশেষ জ্যামিতি! আরো সহজে বুঝতে গেলে, এনকোডার-এর কাজ যদি হয় সম্পর্ক বোঝা (understanding) তাহলে ডিকোডার তার উপর ভিত্তি করে নানান কিছু উদ্ভাবন করবে (generation), একের পর এক টোকেন তৈরি করতে থাকবে। এই যে এক বিশেষ ‘ম্যাপ’-এর কথা বলছি, সেটাই হলো ডিকোডার-এর গাইডলাইন। আরেকটু অন্যভাবে বুঝতে গেলে, এনকোডার পড়ছে আর ডিকোডার লিখছে।

 

এই যে সম্পর্ক বোঝার ব্যাপার, সেটাই হলো আসলে সেল্ফ এটেনশান (self attention) মেকানিজম। একটা ইংরেজি বাক্য দিয়ে বোঝা যাক। যদি বলি, “I ate a crisp, red apple for a snack.” – এখানে মডেল “ate”, “crisp”, ” snack”.. এই শব্দগুলোর দিকে মনযোগ (attention) দেবে। হিসাব কষে বার করবে যে, “apple” আসলে একটা খাদ্য। কাজেই ডিকোডারে পরবর্তী টোকেন জেনারেশানের ক্ষেত্রে “fruit”-এর সম্ভাব্যতা বেড়ে যাবে। আবার ধরা যাক, যদি বলি, “I bought a new apple for my home office.”, এখানে মডেল মনযোগ দেবে “bought”, ” office” এই শব্দগুলোর দিকে। অঙ্কের হিসাব কষে প্রসঙ্গটা বুঝবে যে এখানে “apple” হলো একটা computer বা brand, তাহলে এবার ডিকোডারে পরবর্তী টোকেন হিসাবে “laptop”, “tech” এইসব শব্দের সম্ভাব্যতা বাড়বে।

 

আরেকটু বিশদে বলা যাক। সেল্ফ এটেনশান মেকানিজম প্রতিটা শব্দের জন্য Query, Key, Value – এই তিনটে ধাপে কাজ করে। Query – আমি কি খুঁজছি? (শব্দটা হয়ত একটা নাম বা noun, সে একটা বিশেষণ/ বিবরণ খুঁজছে।) Key – আমার ভূমিকা কি? (শব্দটা হয়ত একটা বিশেষণ, কাজেই কিছু বিবরণ দিতে পারে।) Value – আমার আসল মানে কি?

 

আমরা হয়ত মোটামুটিভাবে একটা ধারণা করতে পারছি যে আমাদের ইনপুট থেকে AI একটা সম্পর্ক-এর ম্যাপ বানিয়ে ফেলছে। আমরা একে অর্থের ম্যাপও বলতে পারি (map of meaning) । এবার একটু খতিয়ে দেখা যাক, chatGPT, Gemini ইত্যাদি AI কী করে আমাদের প্রম্পট (prompt) বোঝে এবং আমাদের-কে উত্তর দেয় (আসলে, একেক করে টোকেন জেনারেট করতে থাকে।)। প্রম্পট হিসাবে আমরা যা লিখি, AI তাকে এনকোডারের নিউরাল নেটওয়ার্কের লেয়ারগুলোর মধ্যে দিয়ে পাঠায়। প্রম্পট-এর শব্দগুলোর ভেক্টর প্রতিটা লেয়ারের মধ্যে দিয়ে যাওয়ার সময় একটু একটু করে পরিবর্তিত হতে থাকে। যতক্ষণে শেষ লেয়ারে পৌঁছায়, ততক্ষণে মডেল এই প্রম্পটের আবহ আর মূল বিষয়টা বুঝতে পারে। সবই অবশ্য হয় অঙ্কের সাহায্যে।

 

ভেক্টর স্পেসে ভেক্টরগুলোর মধ্যে গাণিতিক সম্পর্ক-এর ক্যালকুলেশান চলতে থাকে, মেট্রিক্স-এর গুন চলতে থাকে। (ভেক্টর যেমন অনেক সংখ্যার একটা লিস্ট, তেমনি মেট্রিক্স হলো অনেক সংখ্যাকে টেবিল আকারে সাজালে যে রো আর কলাম ওয়ালা অঙ্কের একটা স্ট্রাকচার পাওয়া যাবে সেইটা।) নিউরাল নেটওয়ার্কের একেবারে শেষ লেয়ারে অঙ্কের বিশেষ একটা অপারেশন করা হয়, সফটম্যাক্স (softmax) ফাংশান দিয়ে। এই সফটম্যাক্স ফাংশানের কাজ হলো প্রতিটা ভেক্টরের জন্য তৈরি হওয়া লজিট (logit) সংখ্যাগুলোকে সম্ভাব্যতা (probability)-তে পরিণত করা (0 থেকে 1-এর মধ্যে সংখ্যা)। এই লজিট (logit = logistic unit) সংখ্যাগুলো আসছে কোথা থেকে? একটু স্মরণ করা যাক, নিউরাল নেটওয়ার্কের প্রতিটা নিউরন-এ যা ইনপুট ঢোকে, সেখানে প্রতিটা ইনপুটকে এক একটা সংখ্যা দিয়ে গুন করে তাদের যোগ করা হয়, তারপর তার সাথে আরেকটা সংখ্যা যোগ করা হয় (বায়াস টার্ম)। এইসব সংখ্যাগুলো বা প্যারামিটারগুলোকে একসাথে weight factors বলা হয়। একটা লেয়ারের পরষ্পর যুক্ত সব নিউরনগুলোর এই ওয়েট ফ্যাক্টারগুলোকে একসাথে একটা টেবিল আকারে সাজিয়ে লিখলে তাকে আমরা বলব ওয়েট ম্যাট্রিক্স (weight matrix)। এইবার ভাবা যাক, ভিতরে যত অঙ্কের কর্মকান্ড চলতে থাকে তার মধ্যে একটা প্রধান ব্যপার হলো এই ম্যাট্রিক্সগুলোর সাথে ভেক্টরগুলোর গুন করা। আসলে, এসবই হলো অঙ্কের একটা গুরুত্বপূর্ণ শাখা লিনিয়ার এলজেবরা (Linear Algebra)-এর বিষয়।

 

একটা ছবি চেনার AI মডেল (image classification)-এর কথা ভাবা যাক। মনে করা যাক, ইনপুটে দেওয়া ছবির পিক্সেলগুলো থেকে তৈরি একটা ভেক্টর, x = [1.0 2.0 0.5 0.0], এখানে একটা রো-তে লেখা হয়েছে। এটাকে উপরনীচ করে লিখলে তাকে একটা কলাম ভেক্টর বলব। ধরা যাক একটা ওয়েট ম্যাট্রিক্স w, এরকমই কিছু ভগ্নাংশ সংখ্যা দিয়ে তৈরি। ম্যাট্রিক্সের মধ্যে তিনটে রো আর প্রতি রো-তে চারটে কলাম ভাবা যাক। একটা এলেবেলে কাল্পনিক উদাহরণ। তিনটে রো দিয়ে আসলে আমরা তিনরকম জিনিসের ছবি, ধরা যাক cat, dog, bird বুঝতে চাইছি। এই w-কে লিনিয়ার এলজেবরার নিয়ম মেনে x দিয়ে গুন করে তিনটে সংখ্যা পাবো, এরপর এদের সাথে বায়াস যোগ হবে। সবমিলিয়ে এরাই তিনরকম ছবির জন্য লজিট সংখ্যা, ধরা যাক 2.0, 1.0, 0.1, এদেরকে ভেক্টর হিসাবে লিখে ফেললে একটা লজিট ভেক্টর পাবো। এবার সফটম্যাক্স ফাংশানের মধ্যে দিয়ে পাঠালে লজিট ভেক্টরের সংখ্যাগুলো হয়ে যাবে একেকটা সম্ভাব্যতা। মনে করা যাক, তিনরকম সম্ভাবনার মধ্যে আমরা এখন পেলাম, Cat = 65.9%, dog = 24.2%, bird = 9.9%, সব মিলিয়ে 100% হবে। তাহলে দেখা যাচ্ছে, বিভিন্ন ক্যাটাগরি অনুযায়ী আমরা সম্ভাব্যতার একটা বিস্তার (probability distribution) পেলাম।

 

লার্জ ল্যাঙ্গোয়েজ মডেল (LLM)-এর ক্ষেত্রে এটার একটা বিশাল আকারের রূপ ভাবতে পারা যায়। মনে করা যাক, একটা বিশাল স্টেডিয়াম-এর গ্যালারি ডিক্সেনারির যাবতীয় শব্দ দিয়ে ভর্তি (50,000 বা 100,000 বা এরকম কিছু)। আমাদের প্রম্পট পড়ে মডেল কন্টেক্সটা বুঝে প্রতিটা শব্দের জন্য একটা লজিট স্কোর তৈরি করে, তারপর তা থেকে সম্ভাব্যতা। উত্তর দেওয়ার সময় পরপর কী টোকেন আসবে সেটা তাদের সম্বাব্যতা অনুযায়ী ঠিক হয়।

 

ধরা যাক আমাদের প্রম্পট – “The capital of France is —”

এবার হয়ত দেখা যাবে, “Paris” = 99.8%, “Apple” = 0.00001%, “The” = 0.1% ইত্যাদি। বোঝা যাচ্ছে যে, AI এর পক্ষে চয়েস করাটা খুব সোজাসুজি ব্যাপার – যার সম্ভাব্যতা সবচেয়ে বেশি, সেটাই সে তুলে নিয়ে আসবে। তবে, সবকিছু এত সহজসরল অবশ্যই নয়। আমাদের জটিল সব ভাবনা, আমাদের টেক্সট, আমাদের নানান সৃষ্টি, সেসবের ডাটা দিয়ে যখন ট্রেনিং করা হয়, তখন AI মডেল লক্ষ-কোটিবার ধরে নানান উদাহরণ থেকে ইনফরমেশন-কে বুঝতে থাকে।

 

একেকটা ক্ষেত্রে বিভিন্ন টোকেনের সম্ভাব্যতা খুব কাছাকাছি হতে পারে। আবার দেখা যাবে, কোন ক্ষেত্রে সোজাসুজি সর্বোচ্চ সম্ভাব্যতার টোকেন তৈরি করলে উত্তরটা খুব সাদামাটা, বোরিং হয়ে যায়, একটা রোবটের উত্তরের মতো হতে পারে। হয়ত একটু অন্যভাবে উত্তর দিলে, বা অন্যান্য সম্ভাব্যতার কথা ভাবলে উত্তরটা কাব্যিক হতে পারে, দার্শনিক হতে পারে, মজার হতে পারে অথবা ভাবনা উদ্রেককারী কিছু হতে পারে। মানুষ তো এসবে অভ্যস্ত। AI-এর ক্ষেত্রে এধরণের একটা ক্রিয়েটিভিটি বা সৃষ্টিশীলতার মডেল দরকার যেখানে সর্বোচ্চ সম্ভাবনার টোকেন-কে সরিয়ে রেখে কাছাকাছি অন্য টোকেনগুলোকে নিয়ে দেখা যেতে পারে। এই ক্রিয়েটিভিটির জন্য একটা প্যারামিটার ঠিক করা হয়। একে তাপমাত্রা (T) বলতে পারি। তাপগতিবিদ্যা বা পরিসংখ্যানগত পদার্থবিদ্যা (Statistical Physics)-তে আমরা দেখি গ্যাসের অনুগুলোর শক্তির ক্ষেত্রে তাদের শক্তির সম্ভাব্যতার (ঘনত্বের) বিস্তার তাপমাত্রার উপর নির্ভর করে। বোলৎজম্যান ডিস্ট্রিবিউশন-এর কথা ভাবা যাক। তাপমাত্রা বাড়াতে থাকলে বিস্তার বাড়তে থাকে। এই ভাবনার অনুসারী হয়ে বলা যায়, এখানে টোকেনগুলোকে গ্যাসের অনু ভেবে নিয়ে তাপমাত্রার মত একটা প্যারামিটার-কে বাড়ানো কমানো করতে থাকলে তাদেরও সম্ভাব্যতার বিস্তারের পরিবর্তন হবে। দেখা যাবে, নিম্ন তাপমাত্রায় (ধরা যাক, T = 0.1) AI মডেলের উত্তর হবে খুবই সাধারণ মানের, আবার উচ্চ তাপমাত্রায় (ধরা যাক, T = 0.8) মডেল সৃষ্টিশীল বা ক্রিয়েটিভ হয়ে উঠছে। নিম্ন তাপমাত্রায় সর্বোচ্চ সম্ভাব্যতার টোকেনকে অন্যদের থেকে আলাদা করে ফেলা যাচ্ছে আর উত্তরটাও তাই স্বাভাবিক, সাধারণ হচ্ছে। অন্যদিকে উচ্চ তাপমাত্রায় মডেল কাছাকাছি সম্ভাব্যতার টোকেনগুলোর থেকে চয়েস করছে। আমরা ভাবছি মডেল কী সুন্দর স্বাধীনভাবে কায়দা করে লিখছে! আসলে, এসবই হলো ইঞ্জিনিয়ারদের পরীক্ষা-নিরীক্ষার ব্যাপার, ব্যাপক ট্রেনিং-এর অংশ। অবশ্য খেয়াল রাখতে হবে, তাপমাত্রা বাড়ালে মডেল ক্রিয়েটিভ হতে গিয়ে আবার একেবারে আজেবাজে বা বেমানান কিছু লিখে না দেয়। তখন আমরা দেখব মডেলের মতিভ্রম হয়েছে, হ্যালুসিনেট করছে।

 

AI কিভাবে একের পর এক টোকেন জেনারেট করে উত্তর লিখতে থাকে সেই ব্যাপারে একটা গুরুত্বপূর্ণ বিষয় “autoregression” নিয়ে একটা ধারণা দেওয়া যাক। পুরোনো একটা প্রম্পটে ফিরে যাই। দেখা যাবে, আমি যদি লিখি, “The capital of France is —“, তাহলে উত্তরে একটা টোকেন আসবে, “Paris”, আর আমি যদি লিখি, ” What is the capital of France?” আর উত্তরে AI যদি লেখে, “The capital of France is Paris.”, তাহলে, এখানে পর পর টোকেনগুলো আসবে নেটওয়ার্কের বিভিন্ন লেয়ারের মধ্যে দিয়ে বারবার যেতে যেতে। সম্ভাব্যতা অনুযায়ী প্রথমে “The” সিকেক্টেড হয়ে গেলে পরের সবচেয়ে বেশি সম্ভাব্য টোকেন “capital”,.. তারপর আবার নেটওয়ার্ক-এর লেয়ারগুলোর মধ্যে দিয়ে গিয়ে কাছাকাছি থাকা সম্ভাব্য টোকেনগুলোর মধ্যে থেকে “of”… এইরকম চলতে থাকে। একসময় End of Text এই বিশেষ এক টোকেন দিয়ে শেষ করা হয়।

 

এখন কথা হলো, টোকেনগুলো তো বিশাল মাত্রার এক ভেক্টর স্পেসে থাকা একেকটা ভেক্টর। এদের মধ্যে সম্পর্ক খোঁজা চলে। সম্পর্ক থাকলেই তো তাদেরকে জুড়ে জুড়ে অর্থবহ কোন টেক্সট বা উত্তর তৈরি হবে। সম্পর্ক কী দিয়ে বোঝা যাবে? অঙ্কের হিসাবে সম্পর্ক হলো দূরত্ব। যেমন fruit, tree, seed এরা কাছাকাছি থাকবে আবার chair, table, office এরা কাছাকাছি থাকবে, fruit আর chair এর মধ্যে সাধারণত দূরত্ব থাকবে। আবার সম্পর্ক তো স্থির কিছু ব্যাপার নয়। কন্টেক্সট অনুযায়ী ভেক্টরগুলোর মধ্যে সম্পর্ক পাল্টাবে। Apple একটা fruit কিংবা Apple একটা iphone – এরকম তো হতেই থাকবে। তারমানে ভেক্টরগুলোর মধ্যে দূরত্বের বাড়া কমা চলতে থাকবে। তার মানে, পুরো ভেক্টর স্পেসটা একটা পরিবর্তনশীল, ডাইনামিক ব্যাপার!

 

এবার ভাবা যাক, দূরত্ব কী দিয়ে মাপা হবে? এখানে দূরত্ব অর্থাৎ বহুমাত্রার স্পেসে ভেক্টরগুলো কে কার কত কাছে সেটা মাপার সবচেয়ে কার্যকরী উপায় হলো তাদের মধ্যে ডট প্রোডাক্ট বা কোসাইন সিমিলারিটি দেখা। ডট প্রোডাক্ট হলো এদের দুটো ভেক্টরের পারষ্পরিক সংখ্যাগুলো গুন করে যোগ করা। দুই বা তিনমাত্রার ভেক্টর হলে একটা ভেক্টরকে আমরা একটা লাইন বা তির চিহ্ণ দিয়ে এঁকে বোঝাতে পারি। সেক্ষেত্রে তাদের মধ্যে কোসাইন সিমিলারিটি হলো দুটো তির বা লাইনের মধ্যে যে কোণ উৎপন্ন হবে তাদের ত্রিকোণমিতির একটা মাপ। দুই মাত্রার ভেক্টর ভাবা যাক। ধরা যাক, একটা ভেক্টর x-অক্ষ বরাবর আছে, তাকে আমরা লিখলাম [3, 0], আবার একটা ভেক্টর y-অক্ষ বরাবর আছে, তাকে [0, 4] দিয়ে লিখলাম। তাহলে এখানে, ডট প্রোডাক্ট = 3 × 0 + 0 × 4 = 0 হবে। এই ভেক্টরগুলো একে অপরের উপর লম্ব, এবং এদের মধ্যে সম্পর্ক ভালো নয়, “দূরত্ব” বেশি। যদি আমরা অন্য আরো দুটো ভেক্টর (ধরা যাক তারা xy তলে আছে এবং এদের মধ্যে সূক্ষ্ণকোণ তৈরি হয়েছে, এই ধরে এগোই।), [3, 0] এবং [2, 4] এদের মধ্যে ডট প্রোডাক্ট করি, তাহলে একইভাবে হিসাব করলে উত্তর 6 হবে, তার মানে কিছু একটা সংখ্যা পাওয়া যাচ্ছে, শূন্য নয়। তার মানে, এদের মধ্যে সম্পর্ক আছে, “দূরত্ব” কম। এইরকম ভাবনাকে আমরা অতি উচ্চ মাত্রার ভেক্টরের ক্ষেত্রেও প্রয়োগ করতে পারি। আর, এভাবেই আসলে ভেক্টরস্পেসের ভেক্টরগুলো বা টোকেনগুলোর মধ্যে সম্পর্ক মাপা হয়। অতি উচ্চ মাত্রার এই ভেক্টর স্পেস-কে পৃথিবীর ম্যাপ বা একটা গ্লোবের মতো কল্পনা করা যাক। ভেক্টরগুলোর দৈর্ঘ্য সবার এক নয়, তবুও তাদেরকে নর্মালাইজ বা একীকরণ করে একটা কাল্পনিক গ্লোবের উপরে একেকটা বিন্দু দিয়ে ভাবা যেতে পারে। এর কেউ কেউ কাছাকাছি আছে আগে থেকেই। আবার দেখা যাবে, একেকটা কন্টেক্সটে নেটওয়ার্কের লেয়ারগুলোর মধ্যে দিয়ে বারবার (মিলিয়ন ট্রিলিয়ন) যাওয়ার পর ভেক্টরগুলোর ভিতরের সংখ্যাগুলো (লিস্টের সংখ্যাগুলো) একটু একটু করে পরিবর্তন হতে থাকছে। অর্থাৎ ম্যাপের উপর বিন্দুগুলো এদিক ওদিক চলে ফিরে বেড়াচ্ছে। তার মানে, কোন কোন ভেক্টরের মধ্যে দূরত্ব কমছে, সম্পর্কের উন্নতি হচ্ছে আর আমরা AI-এর উত্তর দেখে বুঝতে পারছি যে আসলে কোন টোকেন কোন টোকেনের কাছে আসছে এবং একসাথে জুড়ছে।

 

একইসাথে নেটওয়ার্কের প্যারামিটার আর ভেক্টরের এলিমেন্টগুলোর এই যে একটু একটু করে পরিবর্তন হয়ে একটা নির্দিষ্ট দিকে এগোচ্ছে তার পিছনে যে দুর্দান্ত কম্পিউটার এলগোরিদম আছে তা হলো Stochastic Gradient Descent আর Back propagation এর আইডিয়া। এসব নিয়ে পরের কোন পর্বে আলোচনা করা যাবে। আরেকটা ব্যাপার আছে। নেটওয়ার্ক-এর ট্রেনিং যে পদ্ধতিতে হয়, যেভাবে একটা ডীপ নিউরাল নেটওয়ার্ক দুনিয়ার তাবড় লেখাপত্র (ইন্টারনেট, লাইব্রেরি, উইকিপিডিয়া, ব্লগ…) বা ইনফরমেশান থেকে নিজে নিজে সব শিখে ফ্যালে তাকে বলে Self Supervised Learning Algorithm! টেক্সট আছে, অঙ্ক আছে, টেক্সটের মধ্যে উত্তর লুকিয়ে আছে, অঙ্কের বইতে স্টেপ বুঝে নিয়ে উত্তরে যাওয়া যাচ্ছে, কিন্তু, যদি এমন এলগোরিদম থাকে যে উত্তর আগেই দেখব না, নিজে আগে ভেবে দেখি, করে দেখি উত্তর মিলছে কিনা, উত্তর সঠিক আসছে কিনা, তবে নিজেকে নিজেই কী সুন্দর ট্রেনিং করে ফেল যায়। মেশিন এটাই করছে আর আমরা দেখছি কী দারুণ ম্যাজিক হয়ে চলেছে!

 

(চলবে)

Leave a Reply

Your email address will not be published. Required fields are marked *

1 × four =