Chapter 5 of 18
The two numbers every prediction is quietly built from
মেশিন লার্নিং মডেলের যেকোনো প্রেডিকশন শেষ পর্যন্ত সংখ্যার উপর কিছু হিসাব-নিকাশে গিয়ে ঠেকে — আর সেই হিসাবের সবচেয়ে গুরুত্বপূর্ণ সংখ্যাগুলোকেই বলা হয় weights (ওয়েট)।
সবচেয়ে সহজ মডেলটা কল্পনা করুন: এটা একটা মাত্র ইনপুট সংখ্যা দেখে একটা আউটপুট সংখ্যা (উচ্চারণ "y-hat", মানে প্রেডিক্ট করা মান) বের করে। এদের যুক্ত করার সবচেয়ে সহজ উপায় গুণ করা:
এখানে হলো weight। এটা একটা মাত্র সংখ্যা যা ঠিক করে আউটপুটের উপর কতটা প্রভাব ফেলবে, আর কোন দিকে। যদি হয়, দ্বিগুণ করলে -ও দ্বিগুণ হয়ে যায়। যদি হয়, ইনপুটের প্রভাব অর্ধেক হয়ে যায়। আর যদি নেগেটিভ হয়, তাহলে বাড়ালে আসলে কমে যায়।
একটা weight হলো নিছক একটা গুণক যেটা বলে দেয় একটা নির্দিষ্ট তথ্য কতটা জোরালোভাবে ধরা হবে।
বাস্তব মডেলগুলো খুব কম সময়ই শুধু একটা ইনপুট দেখে। বাসার দাম প্রেডিক্ট করা একটা মডেল হয়তো স্কয়ার ফুটেজ, বেডরুমের সংখ্যা, আর ডাউনটাউন থেকে দূরত্ব দেখে — তিনটা ইনপুট, আর প্রতিটার নিজস্ব weight থাকে:
প্রতিটা আলাদাভাবে একটা প্রশ্নের উত্তর দেয়: "এই নির্দিষ্ট ইনপুটটা প্রেডিকশনকে কতটা উপরে বা নিচে ঠেলবে?" স্কয়ার ফুটেজের উপর একটা বড় পজিটিভ weight মানে "বড় বাসা অনেক গুরুত্বপূর্ণ, আর দাম বাড়িয়ে দেয়।" বেডরুম সংখ্যার উপর ছোট weight মানে হতে পারে "বেডরুম গুরুত্বপূর্ণ, কিন্তু স্কয়ার ফুটেজের চেয়ে অনেক কম।" ডাউনটাউন থেকে দূরত্বের উপর নেগেটিভ weight মানে "ডাউনটাউন থেকে যত দূরে, দাম তত টেনে নিচে নামে।"
একটা weight হলো এমন একটা সংখ্যা যেটা একটা নির্দিষ্ট ইনপুট প্রেডিকশনে কতটা অবদান রাখবে তা স্কেল করে। যত বড় weight (ম্যাগনিটিউডে), তত বড় প্রভাব।
Weights কোনো মানুষ আন্দাজে বসিয়ে দেয় না। ট্রেনিং শুরুর আগে এগুলো ছোট ছোট র্যান্ডম সংখ্যা দিয়ে শুরু হয়, আর ট্রেনিং প্রসেস — মডেলকে উদাহরণ দেখানো, কতটা ভুল প্রেডিকশন হচ্ছে সেটা চেক করা, আর প্রতিটা weight-কে সামান্য করে সেই ভুল কমানোর দিকে সরানো — ধীরে ধীরে এগুলোকে এমন মানে নিয়ে যায় যা আসলেই ডেটার আসল প্যাটার্ন প্রতিফলিত করে। একটা আধুনিক নিউরাল নেটওয়ার্কে এমন লক্ষ লক্ষ, এমনকি কোটি কোটি weight থাকতে পারে — নিউরনগুলোর মধ্যকার প্রতিটা কানেকশনের জন্য একটা করে — আর প্রত্যেকটাই এই একই পদ্ধতিতে টিউন হয়।
একটা weight-কে একটা নির্দিষ্ট ইনপুটের ভলিউম নব হিসেবে ভাবুন। নব ঘোরালে বাড়িয়ে দিলে, সেই ইনপুট চূড়ান্ত সিদ্ধান্তে জোরে "কথা বলে"। নব শূন্যের দিকে ঘোরালে, মডেল কার্যত সেই ইনপুটটা উপেক্ষা করে। নব নেগেটিভে নিয়ে গেলে, ইনপুটের বার্তা উল্টে যায়।
ইনপুটগুলোকে weight দিয়ে গুণ করে যোগ করলেও একটা সমস্যা থেকে যায়: এই সূত্র সবসময় ঠিক আউটপুট দেয় যখনই প্রতিটা ইনপুট হয়। এটা একটা আসল সীমাবদ্ধতা — বাস্তবের অনেক সম্পর্কই এভাবে শূন্য দিয়ে পার হয় না।
ট্যাক্সি ভাড়ার কথা ভাবুন, যা দূরত্বের উপর ভিত্তি করে প্রেডিক্ট করা হচ্ছে। ট্যাক্সি এক ইঞ্চিও না নড়ার আগেই একটা বেস ফেয়ার থাকে — শুধু গাড়িতে ওঠার জন্যই একটা ফ্ল্যাট চার্জ। শুধু weight দিয়ে বানানো একটা মডেল, , কখনোই সেই ফ্ল্যাট শুরুর চার্জটা প্রতিনিধিত্ব করতে পারে না; এটা বাধ্য হয়ে -দূরত্বের রাইডের জন্য ww \cdot 00w$ যাই হোক না কেন।
সমাধান হলো আরেকটা সংখ্যা যোগ করা, weight-গুলো থেকে সম্পূর্ণ আলাদা:
হলো bias। এটা একটা ধ্রুবক (constant) যা ওয়েটেড সাম-এর উপরে যোগ হয়, আর এটা কোনো ইনপুটের উপরই নির্ভর করে না — যাই হোক, , , বা , এটা সবসময় থাকে। ট্যাক্সির উদাহরণে, হলো ঠিক সেই বেস ফেয়ার: দূরত্ব শূন্য হলেও মডেল যে পরিমাণ প্রেডিক্ট করে।
একটা bias হলো মডেলের ওয়েটেড সাম-এর সাথে যোগ হওয়া একটা ধ্রুবক, যা মডেলকে প্রতিটা ইনপুট শূন্য হলেও একটা অ-শূন্য আউটপুট দিতে দেয়।
Weight-এর মতোই, bias হাতে বসানো হয় না — এটাও ট্রেনিংয়ের সময় weight-গুলোর পাশাপাশি শেখা হয়, একটা শুরুর মান (প্রায়ই ) থেকে শুরু করে, আর মডেল যত বেশি উদাহরণ দেখে তত অ্যাডজাস্ট হতে থাকে।
Bias-কে মডেলের শুরুর পয়েন্ট হিসেবে ভাবুন, কোনো ইনপুট কিছু বলার আগেই। এটা এই প্রশ্নের উত্তর: "এই নির্দিষ্ট উদাহরণ সম্পর্কে যদি একদমই কিছু না জানতেন, তাহলে কী প্রেডিক্ট করতেন?"
কোনটা না থাকলে ঠিক কী ভেঙে পড়ে সেটা স্পষ্টভাবে বোঝা দরকার।
Weight ছাড়া, একটা মডেলের কাছে বিভিন্ন ইনপুটকে আলাদাভাবে গুরুত্ব দেওয়ার কোনো উপায় থাকে না। প্রতিটা ইনপুটকে সমান গুরুত্ব দিতে হবে, নাহলে মডেলের কাছে এটা ঠিক করার কোনো উপায়ই থাকবে না যে স্কয়ার ফুটেজ, ধরুন বাসার জিপ কোডের শেষ ডিজিটের চেয়ে বেশি গুরুত্বপূর্ণ। Weight-ই হলো সেই মেকানিজম যা মডেলকে শিখতে দেয় কোন ইনপুটগুলো গুরুত্বপূর্ণ, আর কতটা — এটাই সেই একমাত্র প্রক্রিয়া যা দিয়ে মডেল "গুরুত্বপূর্ণ" আর "অপ্রাসঙ্গিক" আলাদা করে।
Bias ছাড়া, একটা মডেল বাধ্য হয়ে origin (শূন্য বিন্দু) দিয়ে যেতে হয় — গাণিতিকভাবে, এটা শুধু এমন সম্পর্কই প্রতিনিধিত্ব করতে পারে যেখানে "সব ইনপুট শূন্য হলে আউটপুটও শূন্য হতে হবে।" বাস্তবের অনেক সম্পর্কই এভাবে কাজ করে না: বেস চার্জসহ ট্যাক্সি ভাড়া, কোনো সেন্সর কিছু না জানালেও শূন্য ডিগ্রি না হওয়া থার্মোস্ট্যাট প্রেডিকশন, একটা ক্রেডিট স্কোর মডেল যেখানে খালি আবেদনও একদম শূন্য স্কোর পায় না। Bias মডেলকে স্বাধীনতা দেয় তার বেসলাইন আউটপুটকে উপরে বা নিচে সরানোর, ইনপুট যাই বলুক না কেন।
Bias-কে "শুধু আরেকটা weight" ভাবা সহজ মনে হতে পারে। কিন্তু এটা তা না — একটা weight সবসময় একটা ইনপুটকে গুণ করে, তাই এর প্রভাব সেই ইনপুটের মানের সাথে স্কেল হয়। একটা bias কখনো কিছু গুণ করে না; এটা একটা ফ্ল্যাট, ধ্রুবক শিফট, ইনপুট যাই হোক না কেন সবসময় একই পরিমাণ। ঠিক এই কারণেই একটা মডেলের দুটোই দরকার: প্রাসঙ্গিক তথ্য স্কেল করার জন্য weight, আর পুরো প্রেডিকশনটাকে একটা যুক্তিসঙ্গত বেসলাইনে সরানোর জন্য bias।
একসাথে নিলে, weight আর bias এই দুটো উপাদানই একটা সরল-রেখার সূত্র, -কে যেকোনো সরল রেখা প্রতিনিধিত্ব করতে দেয় — যেকোনো ঢাল (weight দিয়ে) আর যেকোনো শুরুর বিন্দু (bias দিয়ে)। এরকম অনেক ওয়েটেড-সাম-প্লাস-বায়াস ইউনিট একসাথে স্তূপ করুন, নন-লিনিয়ার অ্যাক্টিভেশন ফাংশনে মুড়ে দিন — আর এই একই জোড়া উপাদান, weight আর bias, বিশাল স্কেলে বারবার ব্যবহার হয়ে — এটাই একটা সম্পূর্ণ নিউরাল নেটওয়ার্ক তৈরি করে।
Weight আর bias কীভাবে একটা প্রেডিকশন ধাপে ধাপে বদলায়, সেটা কনক্রিট সংখ্যা দিয়ে দেখলে বোঝা সহজ হয়।
একটা ছোট মডেল ভাবুন, যেটা পড়াশোনার ঘণ্টা থেকে পরীক্ষার নম্বর প্রেডিক্ট করে: , যেখানে আর । এর মানে: "৪০ নম্বরের একটা বেসলাইন থেকে শুরু করো, আর প্রতি ঘণ্টা পড়াশোনার জন্য ৫ নম্বর যোগ করো।"
এবার শুধু weight বদলান, , একই রেখে: -এ, , আগের ৬০-এর বদলে। একই ৪ ঘণ্টা এখন দ্বিগুণ গুরুত্ব পাচ্ছে — বড় weight মানে ইনপুটের ফলাফলের উপর বেশি প্রভাব। এই মডেলকে বর্ণনা করা রেখাটা খাড়া হয়ে যায়।
এবার শুধু bias বদলান, , একই রেখে: -এ, , আগের ৪০-এর বদলে; -এ, , আগের ৬০-এর বদলে। প্রতিটা প্রেডিকশন ঠিক ১৫ নম্বর করে উপরে সরে গেছে — সবখানেই একই পরিমাণে, পড়াশোনার ঘণ্টা যাই হোক না কেন। এই মডেলকে বর্ণনা করা রেখাটা সোজা উপরে সরেছে, একদমই খাড়া না হয়ে।
-কে একটা রেখা হিসেবে প্লট করলে: weight রেখার ঢাল (slope) নিয়ন্ত্রণ করে — এটা কতটা খাড়াভাবে উঠছে বা নামছে। Bias রেখার ইন্টারসেপ্ট নিয়ন্ত্রণ করে — এটা y-অক্ষকে কোথায় ছেদ করে, মানে হলে এর উচ্চতা কত। বদলালে রেখা কাত হয়ে যায়। বদলালে পুরো রেখাটা কাত না হয়েই উপরে বা নিচে সরে যায়।
এটাই পুরো মেকানিজম, বড় স্কেলে: একটা সম্পূর্ণ নিউরাল নেটওয়ার্কে, লক্ষ লক্ষ weight-এর প্রতিটাই কতটা জোরালোভাবে কোনো সিগন্যাল সামনে যাবে সেটা ঠিক করে, আর প্রতিটা bias কোনো নিউরনের বেসলাইন আউটপুট সরায় — আর ট্রেনিং হলো নিছক এদের সবাইকে বারবার অ্যাডজাস্ট করা, যতক্ষণ না প্রেডিকশন বাস্তবতার যতটা সম্ভব কাছাকাছি চলে আসে।
নিচের ইন্টারেক্টিভ ডেমোটা একটা সিঙ্গেল নিউরন, যেখানে দুইটা ইনপুট আর , দুইটা weight , আর একটা bias আছে। এটা একটা ডিসিশন বাউন্ডারি আঁকে — সেই রেখা যা নিউরন যেসব পয়েন্টকে হিসেবে ক্লাসিফাই করবে আর যেসবকে হিসেবে করবে, তাদের আলাদা করে — নির্দিষ্ট কয়েকটা স্যাম্পল পয়েন্টের উপর। স্লাইডারগুলো টেনে দেখুন রেখাটা কীভাবে নড়ে।
একটি সিঙ্গেল নিউরনের w1, w2, এবং বায়াস অ্যাডজাস্ট করুন এবং দেখুন কীভাবে নির্দিষ্ট কিছু স্যাম্পল পয়েন্টের ওপর দিয়ে এর ডিসিশন বাউন্ডারি নড়াচড়া করে।
z = 1.0·x + 1.0·y + 0.0
Points shift between the two colors the moment the boundary line crosses them — this is the entire "decision" a single neuron makes.
এক্সপেরিমেন্ট করার সময় কয়েকটা জিনিস খেয়াল করার মতো:
বাস্তবে "একটা নিউরন ট্রেন করা" মানে ঠিক এটাই: , , আর -এর সব সম্ভাব্য মানের মধ্য দিয়ে খুঁজে বের করা, যতক্ষণ না ফলাফল রেখাটা স্যাম্পল পয়েন্টগুলোকে যতটা সম্ভব সঠিকভাবে আলাদা করে।
নিউরাল নেটওয়ার্কের বাইরেও weight আর bias সবসময়ই দেখা যায়, একবার প্যাটার্নটা চিনতে পারলে।
ওয়েটেড পরীক্ষার নম্বর
একটা ফাইনাল গ্রেড 0.4×(মিডটার্ম) + 0.6×(ফাইনাল) + 5 (উপস্থিতি বোনাস) হলো একটা ওয়েটেড সাম প্লাস একটা bias — weight-গুলো বলে ফাইনাল পরীক্ষা মিডটার্মের চেয়ে বেশি গুরুত্বপূর্ণ, আর ফ্ল্যাট ৫ নম্বরের বোনাসটা একটা bias, যা সবাই তাদের স্কোর যাই হোক না কেন পায়।
লোন অ্যাপ্রুভাল স্কোর
একটা সাধারণ ক্রেডিট মডেল ইনকাম, ঋণ, আর পেমেন্ট হিস্ট্রিকে আলাদা আলাদা weight দিয়ে মেলাতে পারে, প্রতিটা ফ্যাক্টর কতটা গুরুত্বপূর্ণ তা প্রতিফলিত করার জন্য, সাথে একটা বেস bias স্কোর, যা কোনো ব্যক্তিগত তথ্য বিবেচনা করার আগেই বেসলাইন ঝুঁকি প্রতিফলিত করে।
একটা রেস্টুরেন্টের বিল
মোট বিল = (প্রতি ডিশের দাম × পরিমাণ) যোগ করে, প্লাস একটা ফ্ল্যাট ডেলিভারি ফি। প্রতি-ডিশের দামগুলো weight-এর মতো কাজ করে, প্রতিটা আইটেমের অবদান স্কেল করে; ফ্ল্যাট ডেলিভারি ফি হলো bias — কতটা খাবার অর্ডার করা হলো তা যাই হোক না কেন একই থাকে।
একটা থার্মোস্ট্যাটের বেসলাইন
একটা স্মার্ট থার্মোস্ট্যাটের প্রেডিক্ট করা আরামদায়ক তাপমাত্রা হয়তো বাইরের তাপমাত্রা আর আর্দ্রতার মতো ফ্যাক্টরকে weight দেয়, তারপর একটা bias যোগ করে যা একটা নির্দিষ্ট পরিবারের ব্যক্তিগত বেসলাইন পছন্দ প্রতিফলিত করে, যা সেই পরিবারের আগের অ্যাডজাস্টমেন্ট থেকে শেখা।
এই প্রতিটাতেই একই দুটো উপাদান দেখা যায়: এমন সংখ্যা যা প্রতিটা ফ্যাক্টর কতটা গুরুত্বপূর্ণ তা স্কেল করে (weight), আর একটা ফ্ল্যাট, ইনপুট-নির্ভরহীন অ্যাডজাস্টমেন্ট যা এর উপরে স্তূপ করা (bias)। নিউরাল নেটওয়ার্ক এই আইডিয়াটা আবিষ্কার করেনি — এরা শুধু weight আর bias স্বয়ংক্রিয়ভাবে শেখে, এমন স্কেলে যা কোনো মানুষ হাতে টিউন করতে পারবে না, একজন মানুষ হাতে সেট করার বদলে, যেভাবে একটা রেস্টুরেন্ট তার ডেলিভারি ফি ঠিক করে।