Chapter 15 of 28
Keeping a CNN from memorizing its training images
একটি সাধারণ বা সীমিত ডেটাসেটের ওপর কোনো CNN-কে দীর্ঘ সময় ধরে ট্রেইন করুন, একটি অদ্ভুত বিষয় লক্ষ্য করবেন: ট্রেনিং অ্যাকুরেসি বাড়তে বাড়তে ৯৯.৯% এ উঠে যাবে, কিন্তু ভ্যালিডেশন অ্যাকুরেসি একটা জায়গায় এসে থমকে যাবে এবং এক পর্যায়ে নীরবে কমতে শুরু করবে। নেটওয়ার্কটি আসলে ছবিতে বিড়াল চিনতে শেখেনি — এটি শিখেছে আপনার ট্রেনিং ফোল্ডারে থাকা হুবহু ৪,০০০টি নির্দিষ্ট বিড়ালের ছবি চিনতে, যার মধ্যে তাদের ইমেজের কম্প্রেশন আর্টিফ্যাক্ট (compression artifacts) এবং আলোর বৈচিত্র্যও রয়েছে। একে যখন এমন কোনো বিড়ালের ছবি দেখানো হবে যা এটি মুখস্থ করেনি, মডেলটি সাথে সাথে থমকে যাবে।
এটিই হলো ওভারফিটিং (overfitting), এবং এটি লক্ষ লক্ষ প্যারামিটার ও সীমিত ডেটাসেট বিশিষ্ট যেকোনো মডেলের ডিফল্ট ব্যর্থতার রূপ। রেগুলারাইজেশন (Regularization) হলো এমন কিছু কৌশলের সমষ্টি যা এই ওভারফিটিংয়ের বিরুদ্ধে লড়াই করে — মডেলকে আরও বুদ্ধিমান বানিয়ে নয়, তবে ট্রেনিংয়ের পথকে ইচ্ছে করে আরও কঠিন করার মাধ্যমে, যা মুখস্থ করার প্রবণতাকে নিরূৎসাহিত করে এবং বাস্তব জেনারেলাইজ বা সাধারণ প্যাটার্ন সনাক্ত করতে মডেলকে বাধ্য করে।
ভাবুন তো, একজন ছাত্র বিগত বছরের পরীক্ষার প্রশ্ন ও তার উত্তর হুবহু মুখস্থ করে পরীক্ষা দিতে গেল, বনাম আরেকজন ছাত্র যে বিষয়ের মূল ধারণা বা কনসেপ্টগুলো ভালোভাবে পড়ে গেল। মুখস্থ করা প্রশ্নের মতো হুবহু কোনো প্রশ্ন প্র্যাকটিস টেস্টে আসলে দুজনেই হয়তো ভালো স্কোর করবে। কিন্তু শুধুমাত্র দ্বিতীয় ছাত্রটিই আসল পরীক্ষায় ভালো করবে, যেখানে সামান্য ঘুরিয়ে নতুন প্রশ্ন জিজ্ঞেস করা হবে।
এই চ্যাপ্টারের প্রতিটি রেগুলারাইজেশন কৌশলই মূলত ছাত্রটির "উত্তর মুখস্থ করার" ফাঁকিবাজি বন্ধ করার একেকটি বাস্তব উপায়:
যেখানে: হলো -তম নিউরনের অ্যাক্টিভেশন, হলো একটি র্যান্ডম বাইনারি মাস্ক ভ্যালু (০ বা ১) যা প্রতি ট্রেনিং ধাপে প্রতিটি নিউরনের জন্য স্বাধীনভাবে বেছে নেওয়া হয়, এবং হলো ড্রপআউট রেট — যা নির্দেশ করে একটি নির্দিষ্ট নিউরন এই ধাপে শূন্য হওয়ার সম্ভাবনা কতটুকু।
সহজ কথা: প্রতিটি ট্রেনিং ইটারেশনে নিউরনের একটি রানিং র্যান্ডম অংশকে নেটওয়ার্ক থেকে সাময়িকভাবে মুছে ফেলা বা গায়েব করে দেওয়া হয়। বাকি থাকা নিউরনগুলো তাদের কোনো নির্দিষ্ট প্রতিবেশী নিউরনের উপস্থিতির ওপর ভরসা করতে পারে না, ফলে তারা নিজে থেকেই দরকারী ফিচার তৈরি করতে বাধ্য হয়, শুধু নির্দিষ্ট পার্টনার নিউরনের ওপর নির্ভরশীল না থেকে। এটি নিউরনের মধ্যকার পারস্পরিক আঁতাত বা "co-adapted" গ্রুপ তৈরি হওয়া রুখে দেয় যা অন্যথায় ট্রেনিংয়ের খুঁটিনাটি মুখস্থ করার চেষ্টা করত। টেস্ট বা ইনফ্যারেন্সের সময় ড্রপআউট বন্ধ করে দেওয়া হয় — তখন সব নিউরন একসাথে অংশগ্রহণ করে, এবং ট্রেনিংয়ের সময় নেটওয়ার্কটি যে পাতলা বা থিনড-আউট (thinned-out) অবস্থায় কাজ করেছিল তা ব্যালেন্স করতে আউটপুটকে রিস্কেল করা হয়।
ট্রেনিংয়ের সময় একটি লেয়ারের প্রত্যাশিত আউটপুট হিসাব করা হয়েছিল গড়ে মাত্র (1-p) অংশ নিউরন সক্রিয় থাকা অবস্থায়। টেস্ট টাইমে যদি ড্রপআউট চালু রাখা হতো, তবে প্রেডিকশন নয়েজি ও অনিশ্চিত হয়ে যেত — যা প্রোডাকশনে কখনোই কাম্য নয়। এর বদলে, হয় টেস্ট টাইমে অ্যাক্টিভেশনকে (1-p) দিয়ে স্কেল করা হয়, অথবা (আধুনিক ডিফল্ট পদ্ধতি, "inverted dropout") ট্রেনিংয়ের সময়ই স্কেল আপ করে দেওয়া হয়, যাতে টেস্ট টাইমে আলাদা কোনো সমন্বয়ের প্রয়োজনই না পড়ে।
যেখানে: হলো সাধারণ লস (যেমন ক্রস-এন্ট্রপি), সমেশনের যোগফলটি নেটওয়ার্কের প্রতিটি ওয়েট এর ওপর রান করে, এবং হলো একটি হাইপারপ্যারামিটার যা ওজন কত কঠোরভাবে পেনাল্টি পাবে তা নিয়ন্ত্রণ করে।
সহজ কথা: এখন Gradient descent-এর সামনে দুটি পরস্পরবিরোধী লক্ষ্য থাকে: ডেটার সাথে মিলিয়ে ফিট করা, এবং ওজনকে ছোট রাখা। অত্যন্ত বড় ওজন বিশিষ্ট একটি নেটওয়ার্ক এমন তীক্ষ্ণ ও আঁকাবাঁকা ডিসিশন বাউন্ডারি তৈরি করতে পারে যা ট্রেনিং নয়েজের সাথে নিখুঁতভাবে মিলে যায় — L2 এই কাজটিকে ব্যয়বহুল করে তোলে, ফলে অপ্টিমাইজারকে এমন মসৃণ বাউন্ডারির দিকে ঠেলে দেয় যা সাধারণত ভালো জেনারেলাইজ করে। তবে এর মান খুব বেশি বাড়িয়ে দিলে নেটওয়ার্ক এত সীমাবদ্ধ হয়ে পড়ে যে এটি বাস্তব সিগন্যালও ঠিকভাবে ফিট করতে পারে না।
যেখানে: এবং হলো বর্তমান mini-batch-এর অ্যাক্টিভেশনগুলোর গড় ও ভ্যারিয়েন্স, হলো শূন্য দিয়ে ভাগ হওয়া আটকানোর একটি অতি ক্ষুদ্র ধ্রুবক, এবং হলো প্রতিটি চ্যানেলের জন্য লার্নেবল স্কেল ও শিফট প্যারামিটার।
সহজ কথা: নরমালাইজেশন ছাড়া, প্রতিটি লেয়ারে প্রবাহিত অ্যাক্টিভেশনের ডিস্ট্রিবিউশন ট্রেনিংয়ের সময় আগের লেয়ারগুলোর ওজন আপডেট হওয়ার সাথে সাথে ক্রমাগত বদলাতে থাকে — এই চলমান লক্ষ্যবস্তু অপ্টিমাইজেশনকে অস্থির করে তোলে (একে বলা হয় "internal covariate shift")। Batch norm প্রতিটি ফরওয়ার্ড পাসেই অ্যাক্টিভেশনকে একটি স্থিতিশীল ডিস্ট্রিবিউশনে পুনরায় কেন্দ্রীভূত ও স্কেল করে, যার ফলে আপনি বেশি লার্নিং রেট দিয়ে ট্রেন করতে পারেন এবং দ্রুত কনভার্জ করতে পারেন। এবং থাকার কারণ হলো, যদি কোনো নির্দিষ্ট চ্যানেলের কাঁচা, অ-নরমালাইজড সিগন্যালই আসলে বেশি উপযোগী হয়, তবে নেটওয়ার্ক সেই নরমালাইজেশনকে বাতিল করে দিতে পারে। রেগুলারাইজিং প্রভাবটি একটি বাড়তি সুবিধা মাত্র: যেহেতু এবং নির্ভর করে ঠিক কোন র্যান্ডম মিনি-ব্যাচটি নমুনা হিসেবে বাছাই হলো তার ওপর, তাই প্রতিটি লেয়ারের ইনপুটে ব্যাচ থেকে ব্যাচে সামান্য নয়েজ মিশে থাকে, যা — অনেকটা dropout-এর মতোই — কোনো একটি নির্দিষ্ট ব্যাচের সঠিক পরিসংখ্যানের ওপর ওভারফিট হওয়া থেকে নেটওয়ার্ককে বিরত রাখে।
মডেলের ওপর পরিবর্তন না করে, augmentation সরাসরি কাজ করে ডেটা বা ছবির ওপর: ট্রেনিংয়ের সময় যখনই কোনো ছবি লোড করা হয়, নেটওয়ার্কের কাছে পাঠানোর আগে সেটিকে র্যান্ডমলি ফ্লিপ, রোটেট, ক্রপ বা কালার-জিটার করা হয়। নেটওয়ার্কটি গাণিতিক অর্থে কখনো একই ছবি দুবার দেখে না, যা pixel-perfect মুখস্থ করা অসম্ভব করে তোলে — এটি এমন সব ফিচার শিখতে বাধ্য হয় যা ছবির বাস্তব পরিবর্তনের সাথে সাথেও (যেমন সামান্য বাঁকানো একটি বিড়ালও একটি বিড়ালই থাকে) অপরিবর্তিত থাকে।
ট্রেনিং জুড়ে ট্রেনিং লসের পাশাপাশি ভ্যালিডেশন লসও ট্র্যাক করুন। ট্রেনিং লস প্রায় চিরকাল ধরেই কমতে থাকবে যেহেতু নেটওয়ার্ক ক্রমাগত ট্রেনিং সেটের সাথে আরও নিখুঁতভাবে ফিট হতে থাকে — কিন্তু ভ্যালিডেশন লস সাধারণত একটি সর্বনিম্ন বিন্দুতে পৌঁছে তারপর আবার বাড়তে শুরু করে। সেই ঊর্ধ্বমুখী মোড়টিই হলো বাস্তব সময়ে ঘটতে থাকা ওভারফিটিং। Early stopping মানে হলো ঠিক সেই মোড় আসার আগের ইপকের ওজনগুলো সংরক্ষণ করা, এবং তারপর যা কিছু ট্রেন করা হয়েছে তা বাদ দিয়ে দেওয়া।

| কৌশল (Technique) | কিসের বিরুদ্ধে লড়াই করে | প্রধান সুবিধা (Main Benefit) |
|---|---|---|
| Dropout | অতিরিক্ত বিশেষায়িত বা co-adapted নিউরন | শক্তিশালী ও রিডানড্যান্ট ফিচার রিপ্রেজেন্টেশন তৈরি করে |
| L2 Regularization | অতিরিক্ত বড় ও তীক্ষ্ণ সীমানা বিশিষ্ট ওজন | সহজ ও মসৃণ ডিসিশন বাউন্ডারি দেয় |
| Batch Normalization | লেয়ার ইনপুটের অস্থিতিশীল ডিস্ট্রিবিউশন | দ্রুত ও স্থিতিশীল ট্রেনিং + হালকা রেগুলারাইজেশন |
| Data Augmentation | হুবহু পিক্সেল বিন্যাস মুখস্থ করা | অদেখা নতুন ছবির ক্ষেত্রে ভালো জেনারেলাইজেশন দেয় |
| Early Stopping | সীমার বাইরে অতিরিক্ত বেশি ট্রেনিং করা | ভ্যালিডেশনের সেরা পয়েন্টের মডেলটিকে ধরে রাখে |
"Doctor Bade" (ডক্টর বাদে) ওভারফিটিংয়ের চমৎকার দাওয়াই দেন: Dropout, L2 Regularization, Batch Norm, Data Augmentation, Early Stopping — DR-BADE।
টেস্ট বা ডিপ্লয় করার আগে মডেলকে evaluation mode-এ পরিবর্তন করতে ভুলে গেলে ইনফ্যারেন্সের সময়ও dropout র্যান্ডমলি নিউরন শূন্য করতে থাকে, যার ফলে নয়েজি ও অপুনরাবৃত্তযোগ্য (non-reproducible) প্রেডিকশন তৈরি হয়। PyTorch-এর মতো ফ্রেমওয়ার্কে এটি বন্ধ করতে স্পষ্টভাবে model.eval() কল করা আবশ্যক।
ভ্যালিডেশন লস সামান্য বাড়ার সাথে সাথেই ট্রেনিং বন্ধ করে দেওয়া আরেকটি বড় ভুল, কারণ ব্যাচ-ভিত্তিক নয়েজের কারণে ভ্যালিডেশন কার্ভ সামান্য ওঠানামা করতে পারে। এই কারণে পেশাদাররা "patience" প্যারামিটার ব্যবহার করেন (অর্থাৎ টানা কয়েকটি ইপক ধরে পারফরম্যান্স ভালো না হলে তবেই থামবেন)।
কার্যত প্রতিটি প্রোডাকশন CNN-ই একসাথে এই কৌশলগুলোর বেশ কয়েকটি ব্যবহার করে: বেশিরভাগ কনভোলিউশনাল লেয়ারের পরে batch norm, চূড়ান্ত ক্লাসিফায়ার লেয়ারের আগে dropout, অপ্টিমাইজারের মধ্যে গেঁথে দেওয়া L2 weight decay, আক্রমণাত্মক data augmentation পাইপলাইন, এবং early stopping-এর জন্য নিবিড়ভাবে পর্যবেক্ষণ করা একটি ভ্যালিডেশন সেট। এদের একটিও একা কোনো জাদুকরী সমাধান নয় — training-pipeline অধ্যায়ে আরও বিস্তারিত আলোচিত আসল দক্ষতাটি হলো, একটি নির্দিষ্ট ডেটাসেটের আকার ও মডেল ক্ষমতার জন্য এই প্রতিটি কৌশল কতটুকু পরিমাণে দরকার তা সঠিকভাবে টিউন করা।