Chapter 13 of 28
The dials that decide whether training succeeds or stalls
এখন পর্যন্ত আমরা যা কিছু আলোচনা করেছি — কনভোলিউশন, পুলিং, অ্যাক্টিভেশন, লস ফাংশন ও অপ্টিমাইজার — তা কেবল নির্দেশ করে একটি CNN কী হিসাব করতে পারে। তবে এর কোনোটিই আমাদের বলে দেয় না যে কার্নেলটি ঠিক কতটা বড় হওয়া উচিত, প্রতি লেয়ারে কতগুলো ফিল্টার থাকা প্রয়োজন, অপ্টিমাইজারটি প্রতি ধাপে কত দ্রুত অগ্রসর হবে, অথবা ট্রেনিং কতক্ষণ ধরে চলবে। এই সিদ্ধান্তগুলো ওজনের প্রথম মানটি শেখার আগেই নেওয়া হয় এবং গ্রেডিয়েন্ট ডিসেন্ট নিজে এগুলো খুঁজে বের করতে পারে না — এগুলো আপনাকে অর্থাৎ ট্রেনিং পরিচালনাকারী ব্যক্তিকেই বেছে নিতে হয়। এই সিদ্ধান্তগুলোতে ভুল হলে, তাত্ত্বিকভাবে দুর্দান্ত কোনো আর্কিটেকচারও ট্রেইন হতে ব্যর্থ হবে, প্রথম ধাপেই ওভারফিট হবে, অথবা প্রয়োজনের চেয়ে ১০ গুণ বেশি সময় নেবে।
এই চ্যাপ্টারটি মূলত সেই সব গুরুত্বপূর্ণ নড়াচড়া করার ডায়াল বা হাইপারপ্যারামিটারগুলোর একটি গাইডবুক, যা জানাবে এগুলোকে ডানে-বামে ঘোরালে মডেলের কী কী পরিবর্তন ঘটে এবং সময়ের অভাব থাকলে কোন ডায়ালগুলোকে আগে গুরুত্ব দেওয়া উচিত।
হাইপারপ্যারামিটারগুলোকে ভাবুন কেক বানানোর সময় ওভেনের প্রি-সেটিং বা তাপমাত্রার মতো, যা উপকরণ বা উপাদানের চেয়ে আলাদা। উপাদানগুলো (ওয়েট) বেকিং প্রক্রিয়ার মাধ্যমে পরিবর্তিত হয়; আর ওভেনের তাপমাত্রা, ওভেনের তাকের পজিশন এবং টাইমার (হাইপারপ্যারামিটার) আগে থেকেই ঠিক করা থাকে এবং বেকিং চলাকালীন এরা কখনো নিজেদের পরিবর্তন করে না। ওভেন যদি খুব বেশি গরম করেন, তবে ভেতরের অংশ সেদ্ধ হওয়ার আগেই বাইরের অংশ পুড়ে ছাই হয়ে যাবে — যা মূলত অতিরিক্ত লার্নিং রেটের কারণে লসের ডাইভার্জ বা বাউন্ডিং হওয়ার মতো ঘটনা। আবার তাপমাত্রা খুব কম রাখলে নির্দিষ্ট সময়ে কিছুই হবে না — যা মূলত লার্নিং রেট খুব কম রাখা বা খুব কম সংখ্যক ইপক (epochs) দেওয়ার মতো। রান্নার রেসিপিতে এই সেটিংগুলো খুব স্পষ্ট করে লেখা থাকে কারণ ভালো উপাদানের সমান গুরুত্ব এই সেটিংগুলোরও রয়েছে।
প্যারামিটার (Parameters) (, ): ব্যাকপ্রোপাগেশন ও অপ্টিমাইজারের মাধ্যমে লস কমিয়ে স্বয়ংক্রিয়ভাবে শেখা হয়। এরা ট্রেইন হওয়া মডেলের ভেতরে অবস্থান করে।
হাইপারপ্যারামিটার (Hyperparameters) (learning rate, batch size, kernel size, filter সংখ্যা, ...): ট্রেনিংয়ের পূর্বে বা ট্রেনিং শুরুর সময় নিজে হাতে অথবা কোনো সার্চ মেকানিজম দিয়ে সেট করা হয়। এরা কনফিগার করে মডেলটি কীভাবে তৈরি হবে এবং কীভাবে শিখবে — এরা সরাসরি গ্রেডিয়েন্ট দ্বারা কখনো আপডেট হয় না।
সহজ কথা: আপনি যদি কোনো ট্রেইনড মডেলের প্যারামিটারগুলোকে র্যান্ডম নয়েজ দিয়ে বদলে দেন, তবে এর আর্কিটেকচার ও ট্রেনিং সেটআপ (যা এর হাইপারপ্যারামিটার) সম্পূর্ণ অপরিবর্তিত থাকবে — এরা একটি প্রজেক্টের দুটি সম্পূর্ণ ভিন্ন স্তর। এই দুটির মধ্যে গুলিয়ে ফেলা নতুনদের অত্যন্ত সাধারণ একটি বিভ্রান্তি।
| হাইপারপ্যারামিটার | উদ্দেশ্য (Purpose) | সাধারণ মান (Typical Values) | ট্রেনিংয়ের ওপর প্রভাব |
|---|---|---|---|
| Learning Rate (η) | ওজন আপডেটের পদক্ষেপের আকার নিয়ন্ত্রণ করে | 1e-2 থেকে 1e-5 | খুব বেশি হলে: ডাইভার্জ বা অস্থির হয়। খুব কম হলে: অত্যন্ত ধীরগতির কনভার্জেন্স। |
| Epochs | ট্রেনিং ডেটার ওপর সম্পূর্ণ পাসের সংখ্যা | ১০-২০০+ | খুব কম হলে: আন্ডারফিটিং। খুব বেশি হলে: রেগুলারাইজেশন ছাড়া ওভারফিটিং হয়। |
| Batch Size | প্রতি গ্রেডিয়েন্ট আপডেটে নমুনার সংখ্যা | ১৬, ৩২, ৬৪, ১২৮ | বড় হলে: স্থিতিশীল গ্রেডিয়েন্ট ও বেশি মেমরি। ছোট হলে: অস্থির আপডেট, ভালো জেনারেলাইজ করতে পারে, কম মেমরি। |
| Kernel Size | কনভোলিউশন ফিল্টারের আকার বা সাইজ | 3x3, 5x5 | বড় হলে: প্রতি লেয়ারে বেশি রিসেপ্টিভ ফিল্ড ও বেশি প্যারামিটার। ছোট স্তুপীকৃত হলে: বেশি নন-লিনিয়ারিটি ও কম প্যারামিটার। |
| Stride | স্লাইডিং ফিল্টারের পদক্ষেপের দৈর্ঘ্য | ১ বা ২ | বড় হলে: দ্রুত স্থানিক ডাউন-স্যাম্পলিং, কম বিবরণ ধরে রাখে। |
| Padding | সীমানা বা বর্ডার সামলানো | 'valid' বা 'same' | 'Same' preservation বা স্থানিক আকার বজায় রাখে; 'valid' আউটপুট ছোট করে দেয়। |
| Number of Filters | আউটপুট ফিচার ম্যাপের গভীরতা | ৩২, ৬৪, ১২৮, ২৫৬... | বেশি ফিল্টার: সমৃদ্ধ ফিচার রিপ্রেজেন্টেশন ও বেশি প্যারামিটার/কম্পিউটেশন। |
| Activation Function | ব্যবহৃত নন-লিনিয়ারিটি | ReLU (ডিফল্ট) | গ্রেডিয়েন্ট প্রবাহ, ট্রেনিংয়ের গতি এবং dying-neuron ঝুঁকিকে প্রভাবিত করে। |
| Optimizer | ওজন আপডেটের অ্যালগরিদম | Adam, SGD+Momentum | কনভার্জেন্সের গতি ও স্থিতিশীলতাকে প্রভাবিত করে। |
| Dropout Rate | ট্রেনিংয়ের সময় র্যান্ডম নিষ্ক্রিয় নিউরনের হার | 0.2-0.5 | বেশি হলে: শক্তিশালী রেগুলারাইজেশন, তবে অতিরিক্ত বেশি হলে আন্ডারফিটিংয়ের ঝুঁকি। |
| Weight Initialization | ওজনের প্রাথমিক মানের সেটআপ | He (ReLU), Xavier (Tanh/Sigmoid) | ভুল ইনিশিয়ালাইজেশন প্রথম পদক্ষেপেই vanishing/exploding গ্রেডিয়েন্ট তৈরি করতে পারে। |
আপনার কাছে যদি মাত্র ৩টি ডায়াল ঘোরানোর সুযোগ থাকে, তবে Learning Rate, Batch Size এবং মডেলের ক্যাপাসিটি (ফিল্টার/লেয়ারের সংখ্যা) টিউন করুন। ট্রেনিংয়ের স্থিতিশীলতা এবং চূড়ান্ত অ্যাকুরেসির ওপর এই তিনটির প্রভাব সবচেয়ে বেশি — তালিকার বাকিগুলোও গুরুত্বপূর্ণ ঠিকই, তবে মূলত এই তিনটিই ফলাফলের ভাগ্য নির্ধারণ করে।
ধরুন, আপনি একটি CNN মডেল ট্রেইন করছেন এবং প্রথম ১০টি ইপকের ট্রেনিং লস দেখতে এমন হলো: । লস কমছে তো নাই-ই, বরং উল্টো বাড়ছে এবং এক পর্যায়ে পুরোপুরি NaN হয়ে বিস্ফোরিত হচ্ছে।
এই ত্রুটির পেছনের সবচেয়ে সন্দেহভাজন হাইপারপ্যারামিটারটি খোঁজার চেষ্টা করুন: খুব সম্ভবত লার্নিং রেট অতিরিক্ত বেশি ছিল — যার কারণে প্রতি আপডেটের পদক্ষেপটি কাঙ্ক্ষিত মিনিমাম বিন্দু পার হয়ে আরও দূরে চলে যাচ্ছে, এবং ওজনের মান অনবরত বাড়তে বাড়তে এক পর্যায়ে গাণিতিক সীমার বাইরে গিয়ে NaN হয়ে গেছে। এই সমস্যার তাৎক্ষণিক সমাধান হলো লার্নিং রেট কয়েক গুণ কমানো ( debugging এর জন্য সাধারণ নিয়ম: ট্রাই করে প্রথম কয়েক ইপকের আচরণ তুলনা করা), আর্কিটেকচার বা অপ্টিমাইজার পরিবর্তন করার আগেই এটি পরীক্ষা করা উচিত।
এবার আরেকটি লক্ষণের কথা ভাবুন: ট্রেনিং লস কমতে কমতে প্রায় শূন্যের কোঠায় চলে যাচ্ছে, কিন্তু ১৫ নম্বর ইপকের পর ভ্যালিডেশন লস কমার বদলে উল্টো বাড়তে শুরু করেছে যেখানে ট্রেনিং লস কিন্তু কমেই চলেছে। এটি হলো মূলত ওভারফিটিংয়ের (overfitting) ক্লাসিক উদাহরণ, এবং এখানে আপনাকে সম্পূর্ণ ভিন্ন হাইপারপ্যারামিটারগুলো নিয়ে ভাবতে হবে — যেমন কম ইপক দেওয়া (early stopping), ড্রপআউট রেট বাড়ানো, অথবা মডেলের ফিল্টার কমিয়ে ক্যাপাসিটি হ্রাস করা, লার্নিং রেট নয়।
import numpy as np
def train_with_config(config, num_steps=200):
"""
ভুল লার্নিং রেট হাইপারপ্যারামিটার কীভাবে লসকে প্রভাবিত করে
তা দেখানোর জন্য একটি খেলনা কোয়াড্রাটিক লস ট্রেনিং লুপ।
"""
w = 10.0
lr = config["learning_rate"]
history = []
for step in range(num_steps):
grad = 2 * (w - 3.0) # L = (w - 3)^2 এর গ্রেডিয়েন্ট, আসল মিনিমাম w=3
w -= lr * grad
loss = (w - 3.0) ** 2
history.append(loss)
if not np.isfinite(loss) or loss > 1e6:
return history, "diverged"
return history, "converged"
configs = [
{"learning_rate": 0.01}, # যৌক্তিক
{"learning_rate": 0.5}, # বেশি আক্রমণাত্মক
{"learning_rate": 1.05}, # অস্থিতিশীল — প্রতি ধাপে মিনিমাম পার হয়ে যাবে
]
for cfg in configs:
history, outcome = train_with_config(cfg)
print(f"lr={cfg['learning_rate']:.2f}: {outcome}, চূড়ান্ত লস={history[-1]:.4f}")কোডটির কয়েকটি বিশেষ দিক লক্ষ্য করুন:
NaN লসের একটি ছোট ও সচল রূপ।
হাইপারপ্যারামিটার খুঁজতে তিনটি বহুল পরিচিত পদ্ধতি হলো: Grid Search (একটি নির্দিষ্ট গ্রিডের প্রতিটি কম্বিনেশন যাচাই করা), Random Search (র্যান্ডমলি কম্বিনেশন বেছে নেওয়া, যা উচ্চ মাত্রার ক্ষেত্রে গ্রিড সার্চের চেয়ে বেশি কার্যকর), এবং Bayesian Optimization (আগের ফলাফলের অভিজ্ঞতা কাজে লাগিয়ে পরবর্তী সম্ভাব্য সেরা কম্বিনেশনটি বুদ্ধিমত্তার সাথে নির্বাচন করা)। ইন্টারভিউ বোর্ডে হাইপারপ্যারামিটার আলোচনার পর এই নামগুলো জিজ্ঞেস করা খুব কমন।
প্যারামিটার (weights ও biases, যা স্বয়ংক্রিয়ভাবে শেখা হয়) এবং হাইপারপ্যারামিটার (learning rate, batch size ও এই জাতীয় সেটিংস, যা হাতে বা সার্চের মাধ্যমে বেছে নেওয়া হয়) — এই দুটোকে গুলিয়ে ফেলা অত্যন্ত সাধারণ একটি ভুল। প্যারামিটার ট্রেইন করা মডেলটির ভেতরে থাকে; হাইপারপ্যারামিটার নির্ধারণ করে মডেলটি কীভাবে তৈরি হবে এবং কীভাবে ট্রেইন হবে।
হাইপারপ্যারামিটারগুলো একে অপরের সাথে ইন্টারঅ্যাক্ট করে — ব্যাচ সাইজ বদলালে প্রায়ই লার্নিং রেটও বদলানো প্রয়োজন হয়। বাকি সবকিছু কোনো একটি নির্বিচার ডিফল্ট মানে রেখে প্রতিটি হাইপারপ্যারামিটার আলাদাভাবে টিউন করলে একসাথে ভালো কাজ করা কম্বিনেশনগুলো নজর এড়িয়ে যেতে পারে, এবং কোন মানগুলো "সেরা" তা নিয়ে অকালে ভুল সিদ্ধান্তে পৌঁছানোর ঝুঁকি থাকে।
প্রতিটি বাস্তব CNN প্রজেক্টে হাইপারপ্যারামিটার টিউনিংয়ের পেছনে যথেষ্ট সময় ব্যয় হয় — অনেক সময় আর্কিটেকচার ডিজাইন করার চেয়েও বেশি ওয়াল-ক্লক সময়। Optuna, Keras Tuner এবং Ray Tune-এর মতো স্বয়ংক্রিয় টুলগুলো ডিফল্টভাবেই Grid Search, Random Search এবং Bayesian Optimization ইমপ্লিমেন্ট করে রাখে, যাতে টিমগুলোকে ট্রায়াল-অ্যান্ড-এরর করে উপরের টেবিলটি হাতে টিউন করতে না হয় — তবে প্রতিটি হাইপারপ্যারামিটার আসলে কী নিয়ন্ত্রণ করে তা বোঝাই আপনাকে একটি টিউনিং রানের ফলাফল ব্যাখ্যা করার ক্ষমতা দেয়, নাহলে যা ফলাফল আসবে সেটাই বিনাবাক্যে মেনে নিতে হবে।