Chapter 15 of 18
The two ways a model can learn the wrong lesson
এখন পর্যন্ত প্রতিটা চ্যাপ্টারই একটা মডেলকে তার ট্রেনিং ডেটার সাথে ভালোভাবে ফিট করানোর উপর ফোকাস করেছে — loss কমানো, gradient হিসাব করা, weight আপডেট করা। কিন্তু এর নিচে একটা বেশি সূক্ষ্ম লক্ষ্য লুকিয়ে আছে: একটা মডেল আসলে দরকারি না শুধু এটা যে ডেটার উপর ট্রেন হয়েছে সেটার সাথে ফিট হওয়ার জন্য। এটা দরকারি কারণ এটা নতুন ডেটায় ভালো প্রেডিকশন দেয় যা এটা আগে কখনো দেখেনি। এই চ্যাপ্টারটা সেই আসল লক্ষ্যের সাপেক্ষে ট্রেনিং দুইটা আলাদা উপায়ে ভুল যেতে পারে তা নিয়ে।
Underfitting ঘটে যখন একটা মডেল খুব সহজ, বা যথেষ্ট সময় ধরে ট্রেন হয়নি, ডেটার আসল প্যাটার্ন ধরার জন্য — এটা এমনকি যে ট্রেনিং ডেটা এটাকে সরাসরি দেখানো হয়েছে তাতেও খারাপ পারফর্ম করে।
কল্পনা করুন এমন ডেটার মধ্য দিয়ে একটা সরল রেখা ফিট করার চেষ্টা করা যা আসলে বাঁকে — ধরুন, সময়ের সাথে একটা গাছের উচ্চতা প্রেডিক্ট করা, যেখানে বৃদ্ধি শুরুতে দ্রুত আর পরে ধীর হয়ে যায়, একটা বাঁকা সম্পর্ক। একটা সরল রেখা কখনোই সেই কার্ভের সাথে মেলার জন্য বাঁকতে পারে না; এটা যতই ঘোরান বা সরান না কেন, এটা ট্রেনিং উদাহরণে আর একই বাঁকা প্যাটার্ন অনুসরণ করা যেকোনো নতুন উদাহরণে, দুই জায়গাতেই সিস্টেমেটিকভাবে ডেটার আসল আকৃতি মিস করবে।
Underfitting হলো যখন একটা মডেল ডেটার আসল গঠন ধরার জন্য খুব সহজ (বা খুব কম ট্রেন করা), যার ফলে এমনকি যে ডেটার উপর এটা ট্রেন হয়েছে তাতেও খারাপ পারফরম্যান্স হয়।
Underfitting শুধু একটা সরল রেখার মতো অতিরিক্ত সহজ মডেলের জন্যই না — এটা একটা সত্যিকারের সক্ষম মডেলের সাথেও ঘটতে পারে যাকে ন্যায্য সুযোগ দেওয়া হয়নি: খুব কম ট্রেনিং epoch (Batch, Mini-Batch, Iteration & Epoch চ্যাপ্টার থেকে), এত ছোট একটা learning rate যে weight প্রায় নড়েই না (Learning Rate চ্যাপ্টার থেকে), বা একটা মডেল আর্কিটেকচার যা মূলত প্যাটার্নটা প্রতিনিধিত্ব করার জন্যই খুব ছোট, যেমন একটা সিঙ্গেল perceptron এমন একটা প্রবলেম সমাধান করার চেষ্টা করছে যার জন্য Linear vs Non-Linear Separability চ্যাপ্টারে দেখানো হিডেন লেয়ার দরকার।
জিজ্ঞেস করুন: "মডেলটা কি এমনকি যে ডেটায় ট্রেন হয়েছে তাতেও খারাপ পারফর্ম করছে?" যদি training set-এর উপরই loss একগুঁয়েভাবে উচ্চ থেকে যায়, আর বেশি ট্রেনিং দিয়েও বেশি উন্নতি হয় না, এটাই underfitting-এর স্বাক্ষর — মডেলটা প্যাটার্নটাই ধরতে পারেনি, এমনকি যেটা সরাসরি সামনে আছে সেটাও না।
Overfitting ঘটে যখন একটা মডেল তার ট্রেনিং ডেটার নির্দিষ্ট অদ্ভুততার সাথে এতটাই টিউন হয়ে যায় — এর নয়েজ আর এর র্যান্ডম বৈশিষ্ট্যসহ — যে এটা সেই ট্রেনিং ডেটায় চমৎকার পারফর্ম করে কিন্তু নতুন, অদেখা ডেটায় খারাপ পারফর্ম করে।
Underfitting-এর বিপরীত চরমটা কল্পনা করুন: বাঁকা ডেটার মধ্য দিয়ে একটা সরল রেখার বদলে, একটা বন্যভাবে আঁকাবাঁকা কার্ভ কল্পনা করুন যা প্রতিটা ট্রেনিং বিন্দুর মধ্য দিয়ে ঠিক ঠিক যায়, প্রতিটাকে নিখুঁতভাবে স্পর্শ করতে উপরে-নিচে বুনে চলে। সেই কার্ভের ট্রেনিং loss মূলত শূন্য — প্রতিটা ট্রেনিং বিন্দু ঠিক ঠিক মিলে যায়। কিন্তু সেই আঁকাবাঁকা ভাবটা আসল অন্তর্নিহিত প্যাটার্ন ধরছে না; এটা ট্রেনিং ডেটার র্যান্ডম নয়েজ ধরছে, বিন্দুর পর বিন্দু। একটা একদম নতুন ডেটা বিন্দু দিলে যা আসল প্যাটার্ন অনুসরণ করে কিন্তু ট্রেনিংয়ের অংশ ছিল না, এই ওভারফিট কার্ভটা, নিজের মুখস্থ করা আঁকাবাঁকা ধাওয়া করে, প্রায়ই বন্যভাবে ভুল প্রেডিক্ট করবে।
Overfitting হলো যখন একটা মডেল ট্রেনিং ডেটার নয়েজ আর নির্দিষ্ট অদ্ভুততা শেখে আসল অন্তর্নিহিত প্যাটার্নের পাশাপাশি (বা তার বদলে), যার ফলে চমৎকার ট্রেনিং পারফরম্যান্স কিন্তু নতুন ডেটায় খারাপ পারফরম্যান্স হয়।
Overfitting-এর মূল সমস্যা হলো এটা অদৃশ্য যদি আপনি শুধু training loss দেখেন — একটা খারাপভাবে overfit হওয়া মডেল প্রায়-শূন্য একটা training loss দেখাতে পারে, একটা দুর্দান্ত সাফল্যের মতো দেখাতে পারে, যখন নীরবে বাস্তবে অকার্যকর। এই কারণেই আসল ট্রেনিংয়ের সবসময় এমন ডেটা দরকার যা মডেল দেখেনি, যা পরের সেকশনে আলোচনা করা হয়েছে, "আসলে প্যাটার্ন শিখেছে" আর "শুধু উদাহরণ মুখস্থ করেছে" এর মধ্যে পার্থক্য বলতে।
অন্তর্নিহিত প্যাটার্নের আসলে দরকারের চেয়ে অনেক বেশি প্যারামিটারসহ একটা মডেলের নয়েজ মুখস্থ করার জন্য যথেষ্টের চেয়ে বেশি ফ্লেক্সিবিলিটি থাকে, আর দরকারের চেয়ে অনেক বেশি epoch-এর জন্য ট্রেন করলে এটার ঠিক সেটাই করার আরও সুযোগ পায় — বড় মডেল ক্যাপাসিটি আর অতিরিক্ত ট্রেনিং সময় দুটোই overfitting-এর সাধারণ কারণ।
Underfitting আর overfitting হলো একটা গভীর, বেশি সুনির্দিষ্ট জোড়া কনসেপ্টের দৃশ্যমান লক্ষণ: bias আর variance (Weights & Biases চ্যাপ্টারের থেকে "bias" শব্দটার একটা ভিন্ন, অসম্পর্কিত ব্যবহার — এখানে এটা ভুল হওয়ার একটা সিস্টেমেটিক প্রবণতা বোঝায়, একটা ট্রেনযোগ্য প্যারামিটার না)।
Bias, এই অর্থে, মাপে একটা মডেলের প্রেডিকশন গড়ে সিস্টেমেটিকভাবে আসল প্যাটার্ন থেকে কতটা দূরে — একটা উচ্চ-bias মডেল ধারাবাহিক, স্ট্রাকচারাল ভুল করে, যতই ডেটা দেখুক না কেন, কারণ এটা আসল সম্পর্কটা প্রতিনিধিত্ব করার জন্য যথেষ্ট ফ্লেক্সিবল না। বাঁকা-ডেটার-মধ্য-দিয়ে-সরল-রেখার উদাহরণটা একটা উচ্চ-bias মডেল।
Variance মাপে একটা মডেলের প্রেডিকশন কতটা বদলাবে যদি এটা ট্রেনিং ডেটার একটা ভিন্ন স্যাম্পলে ট্রেন করা হতো — একটা উচ্চ-variance মডেল সেই নির্দিষ্ট ডেটা বিন্দুর প্রতি চরমভাবে সংবেদনশীল যা এটা দেখেছিল, এক ট্রেনিং রান থেকে আরেকটাতে বন্যভাবে ভিন্ন ফলাফল তৈরি করে। প্রতিটা ট্রেনিং বিন্দু ঠিক ঠিক ধাওয়া করা আঁকাবাঁকা কার্ভটা একটা উচ্চ-variance মডেল: একটু ভিন্ন একটা ট্রেনিং সেট দিলে, এর আঁকাবাঁকাগুলো সম্পূর্ণ ভিন্ন জায়গায় গিয়ে শেষ হবে।
| উচ্চ Bias (Underfitting) | উচ্চ Variance (Overfitting) | |
|---|---|---|
| Training পারফরম্যান্স | খারাপ — মডেল training data-তেই ভালোভাবে ফিট হয় না | চমৎকার — প্রায়ই training data-তে প্রায়-নিখুঁত |
| নতুন ডেটায় পারফরম্যান্স | খারাপ — সিস্টেমেটিক ভুল নতুন ডেটাতেও থেকে যায় | খারাপ — মুখস্থ করা নয়েজ সাধারণীকরণ হয় না |
| কোন training data ব্যবহার হয়েছে তার প্রতি সংবেদনশীলতা | কম — একটা সহজ মডেল যাই হোক না কেন একই রকম (খারাপ) ফলাফল দেয় | বেশি — training data-তে ছোট বদলে খুবই ভিন্ন মডেল তৈরি হয় |
| সাধারণ কারণ | আসল প্যাটার্নের জন্য একটা মডেল খুব সহজ, বা কম-ট্রেন করা | আসল প্যাটার্নের সাপেক্ষে একটা মডেল খুব ফ্লেক্সিবল, বা বেশি-ট্রেন করা |
Bias মাপে একটা মডেলের সিস্টেমেটিক ভুল খুব সহজ হওয়া থেকে; variance মাপে একটা মডেলের সংবেদনশীলতা নির্দিষ্ট training data-র প্রতি যা এটা দেখেছে। Underfitting উচ্চ bias প্রতিফলিত করে; overfitting উচ্চ variance প্রতিফলিত করে।
Bias কমানো (একটা মডেলকে বেশি ফ্লেক্সিবল বানিয়ে) variance বাড়ানোর প্রবণতা রাখে, আর variance কমানো (একটা মডেলকে বেশি সহজ বা বেশি সীমাবদ্ধ বানিয়ে) bias বাড়ানোর প্রবণতা রাখে — এই দুইটা ব্যর্থতার ধরন বিপরীত দিকে টানে। ট্রেনিংয়ের লক্ষ্য একটাকে সম্পূর্ণভাবে বাদ দেওয়া না; এটা একটা যুক্তিসঙ্গত ভারসাম্য বিন্দু খুঁজে বের করা যেখানে দুটোই একসাথে গ্রহণযোগ্যভাবে কম রাখা যায়।
Underfitting বা overfitting নির্ণয় করতে শুধু training loss দেখার চেয়ে বেশি কিছু দরকার — এর জন্য উপলব্ধ ডেটাকে আলাদা অংশে ভাগ করে সেগুলো জুড়ে পারফরম্যান্স তুলনা করা দরকার।
স্ট্যান্ডার্ড সেটআপ একটা training set ব্যবহার করে (যে ডেটা থেকে মডেল আসলে শেখে), আর একটা validation set (ডেটার একটা আলাদা অংশ যাতে মডেল কখনো ট্রেন হয় না, ডেভেলপমেন্টের সময় এটা কতটা ভালো সাধারণীকরণ করে তা নিখুঁতভাবে চেক করতে ব্যবহৃত)। ট্রেনিংয়ের একই বিন্দুতে এই দুইটা সেটে loss তুলনা করলে কোন ব্যর্থতার ধরন, যদি কোনোটা থাকে, ঘটছে তা প্রকাশ পায়:
Training আর validation loss দুটোই বেশি
মডেল এমনকি যে ডেটায় ট্রেন হয়েছে তাতেও ফিট হচ্ছে না, নতুন ডেটার কথা তো বাদই দিন — underfitting-এর একটা স্পষ্ট স্বাক্ষর।
Training loss কম, কিন্তু validation loss অনেক বেশি
মডেল তার training data-তে খুব ভালোভাবে ফিট হয় কিন্তু সাধারণীকরণ করতে ব্যর্থ হয় — overfitting-এর একটা স্পষ্ট স্বাক্ষর। Training আর validation loss-এর মধ্যকার এই ফাঁকটাই নিজে সবচেয়ে দরকারি overfitting সংকেত।
Training আর validation loss দুটোই কম আর কাছাকাছি
মডেল নয়েজ মুখস্থ না করে আসল প্যাটার্ন ধরেছে — ট্রেনিং যে লক্ষ্যের দিকে যাচ্ছে সেই টার্গেট পরিস্থিতি।
ট্রেনিংয়ের মাঝপথে validation loss বাড়তে শুরু করে
Training loss উন্নতি করতে থাকে, কিন্তু validation loss, শুরুতে এর সাথে উন্নতি হওয়ার পর, খারাপ হতে শুরু করে — একটা সাধারণ রিয়েল-টাইম স্বাক্ষর যে একটা ট্রেনিং রানের মাঝপথে overfitting শুরু হয়ে গেছে।
সবচেয়ে পরিষ্কার ডায়াগনস্টিক টুল হলো নিছক একই গ্রাফে epoch জুড়ে training loss আর validation loss প্লট করা। দুইটা কার্ভই কমতে থাকা আর কাছাকাছি থাকা স্বাস্থ্যকর। Training loss কমতে থাকা যখন validation loss সমতল হয়ে যায় বা বাড়ে সেটা overfitting শুরু হওয়ার দৃশ্যমান স্বাক্ষর — প্রায়ই ট্রেনিং তাড়াতাড়ি থামানোর সংকেত হিসেবে ব্যবহৃত হয়, একটা টেকনিক যাকে বলে early stopping।
সঠিক সমাধান সম্পূর্ণভাবে নির্ভর করে দুইটা সমস্যার মধ্যে কোনটা আসলে ঘটছে তার উপর — একটার জন্য একটা সমাধান ভুল পরিস্থিতিতে প্রয়োগ করলে অন্যটাকে খারাপ করে দিতে পারে।
| Underfitting-এর জন্য (উচ্চ bias) | Overfitting-এর জন্য (উচ্চ variance) |
|---|---|
| একটা বেশি ফ্লেক্সিবল/বড় মডেল ব্যবহার করুন (বেশি লেয়ার, বেশি নিউরন) | একটা সহজ/ছোট মডেল ব্যবহার করুন, বা অপ্রয়োজনীয় ক্যাপাসিটি কমান |
| বেশি epoch-এর জন্য ট্রেন করুন, যদি ট্রেনিং এখনও কনভার্জ না করে থাকে | আগে ট্রেনিং থামান, একবার validation loss উন্নতি করা বন্ধ হয়ে গেলে (early stopping) |
| Regularization কমান, যদি এটা বর্তমানে খুব আগ্রাসী হয় | Regularization যোগ করুন, যেমন weight decay (Optimizers চ্যাপ্টারের AdamW সেকশন থেকে) |
| আরও প্রাসঙ্গিক ইনপুট ফিচার যোগ করুন, যদি বর্তমানগুলো অপর্যাপ্ত হয় | আরও ট্রেনিং ডেটা সংগ্রহ করুন, যাতে আসল প্যাটার্নের সাপেক্ষে নয়েজ মুখস্থ করা কঠিন হয় |
| Learning rate বাড়ান, যদি ট্রেনিং কনভার্জ করতে খুব ধীরে এগোয় | Dropout বা অন্যান্য টেকনিক ব্যবহার করুন যা মডেলকে কোনো একটা সিঙ্গেল পথের উপর অতিরিক্ত নির্ভর করা থেকে আটকায় |
যেকোনো হতাশাজনক ফলাফলে মডেলকে বড় করা বা বেশি সময় ধরে ট্রেন করার প্রলোভন হয়। যদি আসল সমস্যা overfitting হয়, এটা জিনিসগুলোকে খারাপ করে, ভালো না — একটা বড় মডেল আরও বেশি সময় ধরে ট্রেন করলে নয়েজ মুখস্থ করার আরও বেশি ক্যাপাসিটি আর সুযোগ থাকে। একটা সমাধান বেছে নেওয়ার আগে সবসময় চেক করুন training-বনাম-validation ফাঁকটা underfitting নাকি overfitting নির্দেশ করছে।
প্রথমে training আর validation loss-এর মধ্যকার ফাঁকটা দেখুন। দুইটা loss-ই এখনও বেশি থাকা একটা ছোট ফাঁক underfitting নির্দেশ করে — বেশি ক্যাপাসিটি, বেশি ট্রেনিং, বা ভালো ফিচার চেষ্টা করুন। কম training loss-সহ একটা বড় ফাঁক overfitting নির্দেশ করে — regularization, বেশি ডেটা, বা আগে ট্রেনিং থামানো চেষ্টা করুন।
নিচের ইন্টারেক্টিভ ডেমোটা একই সেট নয়েজি ট্রেনিং পয়েন্টের (ভরাট বিন্দু) মধ্য দিয়ে বিভিন্ন মাত্রার মডেল কমপ্লেক্সিটিতে একটা কার্ভ ফিট করে, যখন একটা আলাদা সেট validation পয়েন্ট (ফাঁপা বিন্দু) ফিটিং প্রক্রিয়া থেকে অস্পৃষ্ট থাকে — ঠিক Detecting Problems সেকশনে বর্ণনা করা training/validation বিভাজন।
কমপ্লেক্সিটি স্লাইডারটা টেনে দেখুন কীভাবে ফিট করা কার্ভটা একটা শক্ত underfit রেখা, একটা মসৃণ good fit, আর প্রতিটা ট্রেনিং পয়েন্ট ধাওয়া করা একটা বন্যভাবে overfit কার্ভের মধ্যে দোলে — যখন training আর validation loss দুইটা ভিন্ন গল্প বলে।
Good fit
Train loss: 0.166
Val loss: 0.213
Filled dots are training points, hollow dots are validation points the curve never fits directly. Drag complexity up and watch the curve chase every training dot while validation loss climbs.
স্লাইডারটা টানার সময় কয়েকটা জিনিস খেয়াল করার মতো:
এটাই এই চ্যাপ্টারের আগের bias-variance tradeoff, বাস্তব করে তোলা: কম থেকে উচ্চ কমপ্লেক্সিটিতে স্লাইড করা মানে উচ্চ bias (এমন একটা কার্ভ যা সত্যের দিকে বাঁকার জন্য খুব শক্ত) থেকে উচ্চ variance-এ (এমন একটা কার্ভ যা এত ফ্লেক্সিবল যে প্রতিটা ট্রেনিং পয়েন্টের নিজস্ব নয়েজের দিকে বাঁকে তার বদলে) স্লাইড করা।