Chapter 9 of 18
How a model actually knows it's wrong
আগের চ্যাপ্টারে দেখা forward propagation একটা ইনপুটকে একটা প্রেডিকশনে পরিণত করে। কিন্তু শুধু একটা প্রেডিকশন মডেলকে কিছুই বলে না এটা ভালো কাজ করেছে কিনা। যদি একটা বাসার-দাম মডেল এমন একটা বাসার জন্য ৩,১২,৪৫০-এ বিক্রি হয়েছিল, এটা কি একটা ভালো প্রেডিকশন, নাকি খারাপ? কীসের তুলনায়?
একটা মডেল ট্রেন করা মানে বারবার এর weight আর bias অ্যাডজাস্ট করা যাতে সময়ের সাথে প্রেডিকশন ভালো হয় — কিন্তু "ভালো" মানে এমন একটা সংখ্যা হতে হবে যা আসলেই হিসাব করা, তুলনা করা, আর উন্নত করা যায়। এটাই ঠিক যা একটা loss function দেয়: একটা মাত্র সংখ্যা যা একটা প্রেডিকশন কতটা ভুল ছিল তা মাপে, মডেলের আউটপুটকে সত্যিকারের, সঠিক উত্তরের সাথে তুলনা করে হিসাব করা।
একটা loss function একটা মডেলের প্রেডিকশন আর সত্যিকারের উত্তর নেয়, আর একটা মাত্র সংখ্যা ফেরত দেয় — loss — যা বড় হয় প্রেডিকশন খারাপ হলে আর ছোট (আদর্শভাবে শূন্য) হয় প্রেডিকশন ভালো হলে।
Loss function ছাড়া, এই প্রশ্নের উত্তর দেওয়ার কোনো উপায় নেই "এই দুই সেট weight-এর মধ্যে কোনটা ভালো?" একটা থাকলে, উত্তরটা কনক্রিট হয়ে যায়: দুইটার জন্যই loss হিসাব করুন, আর যেটার loss ছোট সেটাই জেতে। একটা নিউরাল নেটওয়ার্ক ট্রেন করা, এর মূলে, নিছক এমন weight আর bias খোঁজা ছাড়া আর কিছুই না যা সব ট্রেনিং উদাহরণ জুড়ে loss-কে যতটা সম্ভব ছোট করে।
একটা loss function-কে একজন রেফারির স্কোরকার্ড হিসেবে ভাবুন। এটা খেলাটা খেলে না (এটা forward propagation-এর কাজ) আর এটা খেলোয়াড়দের কোচিং করায় না (এটা backpropagation-এর কাজ) — এটা শুধু প্রতিটা প্রেডিকশন দেখে আর একটা মাত্র সংখ্যা ফেরত দেয় যা বলে এটা কতটা দূরে ছিল। ট্রেনিংয়ের বাকি সবকিছু আছে সেই সংখ্যাটা কমানোর জন্য।
Error মাপার সবচেয়ে সহজ সম্ভাব্য উপায় হলো নিছক বিয়োগ: প্রেডিক্ট করা মান বিয়োগ সত্যিকারের মান। ৩,১০,০০০ প্রেডিকশন দিয়ে, error হলো — মডেল $২,৪৫০ কম বলেছিল।
কিন্তু এভাবে raw error-এর একটা সমস্যা আছে: এটা পজিটিভ বা নেগেটিভ হতে পারে। একগুচ্ছ error একসাথে গড় করলে, সমান পরিমাণ বেশি-বলা আর কম-বলা মিলে শূন্যের কাছাকাছি কিছুতে বাতিল হয়ে যেতে পারে — এমনকি প্রতিটা ইন্ডিভিজুয়াল প্রেডিকশন খারাপভাবে ভুল হলেও। একটা মডেল যেটা অর্ধেক সময় ১০,০০০ কম বলে, কাগজে-কলমে দেখতে লাগবে এর প্রায় কোনো গড় error-ই নেই, যদিও এটা আসলে কখনোই সঠিকের কাছাকাছি না।
সাইন ঠিক না করে error গড় করলে, বেশি-বলা আর কম-বলা একে অপরকে লুকিয়ে ফেলে। একটা মডেল যেটা সবসময় দুই দিকেই ব্যাপকভাবে ভুল, সেটাকে দেখাতে পারে প্রায়-শূন্য গড় error, যা একটা ট্রেনিং সিগন্যাল বলতে চায় তার একদম বিপরীত।
Loss function এটা ঠিক করে raw error-কে এমন কিছুতে রূপান্তরিত করে যা সবসময় নন-নেগেটিভ, যাতে ভুল সবসময়ই ভুল হিসেবে গণ্য হয়, যেদিকেই হোক না কেন। এটা করার দুইটা সাধারণ উপায়: error-কে বর্গ করা (যা বড় error-কে অসমানুপাতিকভাবে বেশি গুরুত্ব দেয়ও), বা এর অ্যাবসোলিউট ভ্যালু নেওয়া (যা error-এর প্রতিটা ইউনিটকে একইভাবে দেখে, সাইজ যাই হোক না কেন)। কোন রূপান্তরটা ব্যবহার হবে সেটাই ঠিক করে দেয় এই চ্যাপ্টারের বাকি অংশে দেখানো বিভিন্ন loss function-এর পার্থক্য।
Error measurement হলো প্রেডিকশন আর সত্যের মধ্যে raw পার্থক্যকে এমন একটা সংখ্যায় পরিণত করার প্রক্রিয়া যা নির্ভরযোগ্যভাবে "কতটা ভুল" সংকেত দেয়, পজিটিভ আর নেগেটিভ ভুল একে অপরকে বাতিল না করে।
Regression প্রবলেম একটা কন্টিনিউয়াস সংখ্যা প্রেডিক্ট করে — একটা দাম, একটা তাপমাত্রা, একটা সময়কাল — তাই এদের loss function মাপে প্রেডিক্ট করা সংখ্যাটা সত্যিকারের সংখ্যা থেকে কতটা দূরে আছে।
Mean Squared Error (MSE) সবচেয়ে সাধারণ regression loss। এটা গড় করার আগে প্রতিটা error-কে বর্গ করে:
এখানে হলো উদাহরণ -এর সত্যিকারের মান, হলো সেই একই উদাহরণের জন্য মডেলের প্রেডিকশন, আর হলো মোট উদাহরণ সংখ্যা। বর্গ করা একসাথে দুইটা জিনিস করে: এটা প্রতিটা error-কে নন-নেগেটিভ বানায় (একটা নেগেটিভ error বর্গ করলে পজিটিভ হয়ে যায়), আর এটা বড় error-কে ছোট error-এর চেয়ে অনেক বেশি গুরুত্ব দেয় — একটা ১০-এর error ১০০ অবদান রাখে সামে, কিন্তু একটা ১০০-এর error ১০,০০০ অবদান রাখে, একশো গুণ বেশি।
Mean Absolute Error (MAE) বর্গ করার বদলে অ্যাবসোলিউট ভ্যালু নেয়:
MAE error-এর প্রতিটা ইউনিটকে সমানভাবে দেখে — একটা ১০-এর error ঠিক ১০ অবদান রাখে, আর একটা ১০০-এর error ঠিক ১০০ অবদান রাখে, বেশি দূরে থাকার জন্য কোনো অতিরিক্ত শাস্তি ছাড়াই।
| MSE | MAE | |
|---|---|---|
| Error কীভাবে রূপান্তরিত হয় | বর্গ করে | অ্যাবসোলিউট ভ্যালু নেয় |
| বড় error-এর প্রতি সংবেদনশীলতা | বেশি — বড় ভুলকে ভারীভাবে শাস্তি দেওয়া হয় | সমানুপাতিক — সাইজের জন্য অতিরিক্ত শাস্তি নেই |
| Outlier-এর প্রতি সংবেদনশীলতা | খুবই সংবেদনশীল — কয়েকটা খারাপ outlier loss-কে দখল করে ফেলতে পারে | বেশি রোবাস্ট — outlier এখনও গোনা হয়, কিন্তু দখল করে না |
| সাধারণ ব্যবহারের ক্ষেত্র | যখন বড় error ভুল হওয়া বিশেষভাবে ব্যয়বহুল | যখন ডেটায় নয়েজি outlier আছে যেগুলোকে বেশি গুরুত্ব দিতে চান না |
নিজেকে জিজ্ঞেস করুন: "একটা খুব খারাপ প্রেডিকশনের কি বেশ কয়েকটা মাঝারি প্রেডিকশনের চেয়ে অনেক বেশি গুরুত্বপূর্ণ হওয়া উচিত?" যদি হ্যাঁ হয় — যেমন একটা স্ট্রাকচারাল সেফটি মার্জিন প্রেডিক্ট করা, যেখানে একটা বড় মিস বিপজ্জনক হতে পারে — MSE ব্যবহার করুন। যদি ডেটায় কিছু নয়েজি, অনির্ভরযোগ্য উদাহরণ থাকে যা ট্রেনিংকে দখল করতে দিতে চান না, MAE-এর error সাইজের প্রতি বেশি সমান আচরণ সাধারণত বেশি নিরাপদ পছন্দ।
Classification প্রবলেম একটা ক্যাটাগরি প্রেডিক্ট করে, আর বাস্তবে মডেলের raw আউটপুট সাধারণত একটা প্রোবাবিলিটি (sigmoid বা softmax অ্যাক্টিভেশন থেকে, যেমনটা Forward Propagation চ্যাপ্টারে দেখা হয়েছে), একটা সাধারণ সংখ্যা না — তাই classification loss বানানো হয় প্রেডিক্ট করা প্রোবাবিলিটিকে একটা সত্যিকারের ক্লাস লেবেলের সাথে তুলনা করার জন্য।
Binary Cross-Entropy (যাকে log loss-ও বলা হয়) হলো binary classification-এর স্ট্যান্ডার্ড loss, যেখানে সত্যিকারের লেবেল হয় নয়তো , আর প্রেডিকশন হলো আর -এর মধ্যে একটা প্রোবাবিলিটি:
একটা নির্দিষ্ট উদাহরণের জন্য দুইটা টার্মের একটাই সক্রিয় থাকে, কারণ হয় নয়তো । সত্যিকারের লেবেল যদি হয়, দ্বিতীয় টার্মটা অদৃশ্য হয়ে যায় () আর loss হয়ে যায় — এটা ছোট থাকে যখন -এর কাছাকাছি (একটা কনফিডেন্ট, সঠিক প্রেডিকশন) আর অনেক বড় হয়ে যায় যখন -এর কাছাকাছি (একটা কনফিডেন্ট, ভুল প্রেডিকশন)। সত্যিকারের লেবেল হলেও একই লজিক সমমাত্রিকভাবে প্রযোজ্য।
MSE-এর মতো না, cross-entropy-এর শাস্তি প্রান্তের কাছে নরম না — একটা কনফিডেন্ট ভুল প্রেডিকশন (ধরুন, প্রেডিক্ট করা যখন সত্যিকারের লেবেল ) একটা বিশাল loss মান তৈরি করে, শুধু মাঝারি বড় না। এটা ইচ্ছাকৃত: এটা মডেলকে জোরালোভাবে ঠেলে দেয় যাতে ভুল আর অতিরিক্ত-কনফিডেন্ট দুটোই একসাথে না হয়।
Categorical Cross-Entropy এই একই আইডিয়া multi-class classification-এ প্রসারিত করে, যেখানে softmax প্রতিটা ক্লাসের জন্য একটা প্রোবাবিলিটি তৈরি করে:
এখানে হলো ক্লাস সংখ্যা, হলো সঠিক ক্লাসের জন্য আর বাকি প্রতিটা ক্লাসের জন্য, আর হলো ক্লাস -এর জন্য মডেলের প্রেডিক্ট করা প্রোবাবিলিটি। যেহেতু প্রতিটা ভুল ক্লাসের জন্য , এই সামটা ভেঙে শুধু -এ পরিণত হয় — loss শুধু নির্ভর করে মডেল সঠিক উত্তরকে কতটা প্রোবাবিলিটি দিয়েছে তার উপর, আর সঠিক ক্লাসে কম কনফিডেন্সকে ঠিক binary cross-entropy-এর মতোই শাস্তি দেয়।
Classification loss মাপে একটা মডেলের প্রেডিক্ট করা প্রোবাবিলিটি ডিস্ট্রিবিউশন সত্যিকারের লেবেল থেকে কতটা দূরে আছে, কনফিডেন্ট ভুল উত্তরকে অনিশ্চিত উত্তরের চেয়ে অনেক বেশি শাস্তি দিয়ে।
একটা loss function বেছে নেওয়ার সবচেয়ে গুরুত্বপূর্ণ নিয়মটা হলো এটাকে কাজের সাথে মেলানো, ব্যক্তিগত পছন্দের সাথে না:
| কাজ | সাধারণ loss | কেন |
|---|---|---|
| Regression | MSE বা MAE | দুইটাই প্রেডিক্ট করা আর সত্যিকারের কন্টিনিউয়াস মানের মধ্যে সাংখ্যিক দূরত্ব মাপে |
| Binary Classification | Binary Cross-Entropy | সঠিকভাবে কনফিডেন্ট সঠিক প্রোবাবিলিটিকে পুরস্কৃত করে আর কনফিডেন্ট ভুলকে শাস্তি দেয় |
| Multi-class Classification | Categorical Cross-Entropy | একটা প্রোবাবিলিটি ডিস্ট্রিবিউশন ব্যবহার করে binary cross-entropy-কে অনেক ক্লাসে সাধারণীকরণ করে |
একটা classification প্রবলেমে MSE ব্যবহার করা, বা একটা regression প্রবলেমে cross-entropy ব্যবহার করা, শুধু খারাপভাবে কাজ করে না — এটা প্রায়ই গাণিতিকভাবে অর্থহীন। Cross-entropy ধরে নেয় এর ইনপুট আর -এর মধ্যে প্রোবাবিলিটি; এটাকে একটা অসীমাবদ্ধ regression আউটপুট দিলে (যেমন $৩,১০,০০০-এর একটা প্রেডিক্ট করা দাম) অর্থহীন, প্রায়ই আনডিফাইনড ফলাফল তৈরি হয়। সবসময় জিজ্ঞেস করে শুরু করুন মডেলের আউটপুট লেয়ার আসলে কী ধরনের সংখ্যা তৈরি করে, তারপর সেই ধরনের সংখ্যার জন্য বানানো একটা loss বেছে নিন।
মৌলিক কাজের ধরনের বাইরেও, দ্বিতীয় গুরুত্বের ফ্যাক্টরও গুরুত্বপূর্ণ: outlier-কে কম গুরুত্ব দেওয়া উচিত কিনা (MSE-এর চেয়ে MAE পছন্দ করা), ক্লাসগুলো ইমব্যালেন্সড কিনা (কখনো কখনো cross-entropy-এর একটা ওয়েটেড ভার্সন দরকার হয়), আর প্রবলেমে ডোমেইন-নির্দিষ্ট খরচ আছে কিনা — উদাহরণস্বরূপ, মেডিকেল ডায়াগনসিসে, একটা মিস করা পজিটিভ কেস একটা ফলস অ্যালার্মের চেয়ে অনেক বেশি ব্যয়বহুল হতে পারে, যা একটা কাস্টম loss-কে যুক্তিসঙ্গত করে তোলে যা এক ধরনের ভুলকে আরেকটার চেয়ে বেশি শাস্তি দেয়।
সন্দেহ হলে, কাজের জন্য স্ট্যান্ডার্ড পছন্দ দিয়ে শুরু করুন — regression-এর জন্য MSE, classification-এর জন্য cross-entropy — আর শুধু তখনই একটা স্পেশালাইজড loss-এ যান যখন স্ট্যান্ডার্ডটা নিয়ে একটা নির্দিষ্ট সমস্যা দেখেছেন, যেমন outlier ট্রেনিং দখল করে ফেলছে বা কোনো একটা ক্লাস সিস্টেমেটিকভাবে উপেক্ষিত হচ্ছে।
Loss function-কে আসল সিস্টেমের সাথে যুক্ত দেখলে বিমূর্ত সূত্রগুলো কনক্রিট হয়ে ওঠে।
বাসার দাম প্রেডিকশন
MSE দিয়ে ট্রেন করা একটা regression মডেল। $৩,১২,৪৫০-এর সত্যিকারের বিক্রয় দামের বিপরীতে $৩,১০,০০০-এর একটা প্রেডিকশন সেই একটা উদাহরণের জন্য loss-এ (২,৪৫০)² = ৬০,০২,৫০০ অবদান রাখে — হাজার হাজার বাসার গড়ের একটা ছোট অংশ, কিন্তু বড় ইন্ডিভিজুয়াল মিস স্পষ্টভাবে চোখে পড়ে।
স্প্যাম ইমেইল সনাক্তকরণ
Binary cross-entropy দিয়ে ট্রেন করা একটা binary classifier। একটা আসল স্প্যাম ইমেইলের জন্য ০.৯৮ স্প্যাম-প্রোবাবিলিটি প্রেডিক্ট করা খুব ছোট loss অবদান রাখে; একটা বৈধ ইমেইলের জন্য ০.৯৮ স্প্যাম-প্রোবাবিলিটি প্রেডিক্ট করা খুব বড় loss অবদান রাখে, মডেলকে জোরালোভাবে সেই নির্দিষ্ট ধরনের ভুল ঠিক করার দিকে ঠেলে দেয়।
হাতে-লেখা ডিজিট সনাক্তকরণ
Categorical cross-entropy দিয়ে ট্রেন করা একটা ১০-ক্লাস classifier (ডিজিট ০–৯)। যদি সত্যিকারের ডিজিট '৭' হয় আর মডেল এটাকে শুধু ০.১ প্রোবাবিলিটি দেয়, বাকিটা অন্য ডিজিটে ছড়িয়ে, loss বেশি — এমনকি যদি '৭' তখনও মডেলের সবচেয়ে বেশি-প্রোবাবিলিটির অনুমান হয়ে থাকে।
মেডিকেল ঝুঁকি স্কোরিং
একটা binary classifier যেখানে একজন সত্যিকারের উচ্চ-ঝুঁকির রোগীকে মিস করা একটা ফলস অ্যালার্মের চেয়ে অনেক বেশি ব্যয়বহুল। টিমগুলো প্রায়ই একটা ওয়েটেড cross-entropy ব্যবহার করে যা false negative-কে false positive-এর চেয়ে বড় শাস্তি দেয়, সেই বাস্তব-জগতের খরচের অসামঞ্জস্যতা সরাসরি loss-এর ভেতরেই এনকোড করে।
এই প্রতিটা উদাহরণে, loss function-ই সেই একমাত্র রাশি যাকে ছোট করার চেষ্টা ট্রেনিং আসলেই করে — বাকি সবকিছু, মডেল শেষে যে সঠিক weight আর bias পায় সেসহ, শুধু সেই কনফিগারেশন যা ট্রেনিং ডেটা জুড়ে সেই সংখ্যাটাকে যতটা সম্ভব ছোট করে।