Chapter 13 of 16
What goes wrong, and exactly how to fix it
ভালোভাবে ডিজাইন করা HPO pipeline-ও predictable কিছু উপায়ে ব্যর্থ হয়। এই chapter সবচেয়ে সাধারণ failure mode-গুলো তালিকাবদ্ধ করে, কেন সেগুলো হয় তা ব্যাখ্যা করে, আর নির্দিষ্ট সমাধান দেয়। একে ভাবতে পারেন একটা debugging গাইড হিসেবে — search যখন প্রত্যাশামতো কাজ করছে না, তখন এখান থেকেই শুরু করুন।
১০টা hyperparameter, প্রতিটায় ৫টা করে candidate value — grid search-এ লাগবে লাখ evaluation। ১০০০ trial-এর random search-ও এই বিশাল space-এর সামান্য একটা অংশই কভার করে। ফলাফল নয়েজি, আর সেরা configuration default-এর চেয়ে সামান্যই ভালো। এর কারণ — search space compute budget-এর তুলনায় অনেক বড়।
সমাধান হলো effective dimensionality কমানো:
ধাপ ১: গুরুত্বহীন hyperparameter fix করুন
Hyperparameter importance analysis (বা domain knowledge) দিয়ে বুঝুন কোনগুলোর প্রভাব কম। সেগুলোকে reasonable default-এ fix করে দিন।
ধাপ ২: গুরুত্বপূর্ণগুলোর range সংকীর্ণ করুন
Learning rate যদি [1e-6, 1e0]-এর মতো ১০ order-of-magnitude জুড়ে থাকে, আর literature বলছে এই model type-এর জন্য 1e-4 থেকে 1e-2-ই যথেষ্ট, তাহলে সেটাই ব্যবহার করুন।
ধাপ ৩: Sequential search ব্যবহার করুন
সবচেয়ে গুরুত্বপূর্ণ hyperparameter আগে (1D search) tune করুন, সেটা fix করে দ্বিতীয়টা যোগ করুন, এভাবে ধাপে ধাপে এগিয়ে যান।
Optuna-তে এটা করা যায় দুই phase-এ — প্রথম phase-এ শুধু সবচেয়ে গুরুত্বপূর্ণ hyperparameter (যেমন learning rate) search করে বাকি সব known-good default-এ fix রাখা হয়; সেই phase-এর সেরা মান পাওয়ার পর দ্বিতীয় phase-এ সেটা fix রেখে capacity hyperparameter (max_depth, n_estimators) search করা হয়।
Search-এ পাওয়া সেরা configuration validation score-এ ভালো, কিন্তু test set-এ evaluate করলে performance অনেকটা কমে যায়। কারণ যথেষ্ট trial চালালে যেকোনো finite validation set-ই overfit করা সম্ভব — search এমন একটা configuration খুঁজে পায় যেটা আপনার নির্দিষ্ট validation split-এর noise pattern-এর সাথে ভাগ্যক্রমে মিলে যায়, প্রকৃত generalization নয়। ৫০০ example-এর একটা validation set-এ ২০০টা configuration search করলে, সেরা validation score স্বাধীন test set-এর চেয়ে মোটামুটি ১-৩ AUC পয়েন্ট বেশি দেখানোর কথা। সমাধান — selection procedure-এর unbiased estimate পেতে nested cross-validation ব্যবহার করুন, যথেষ্ট বড় validation set রাখুন (অন্তত ১০০০ example), trial সংখ্যা সীমিত রাখুন, আর কখনোই search-এ পাওয়া সেরা CV score-কে চূড়ান্ত performance হিসেবে রিপোর্ট করবেন না — সবসময় আলাদা test set ব্যবহার করুন।
কিছু trial NaN বা -inf objective value দেয়, আর HPO algorithm বিভ্রান্ত হয়ে ভবিষ্যতের trial-গুলো এই invalid configuration-এর কাছাকাছি কেন্দ্রীভূত করতে থাকে। সাধারণ কারণ — learning rate খুব বেশি (neural network-এ gradient explosion), regularization strength ঠিক শূন্য হয়ে numerical সমস্যা তৈরি করা, integer hyperparameter-এ float value যাওয়া, বা degenerate configuration-এ training crash করা। সমাধান হলো objective function-এর ভেতরে একটা defensive guard রাখা — try/except ব্লকে training চালান, ফলাফল NaN বা infinite হলে একটা স্পষ্টত খারাপ মান ফেরত দিন, exception ধরা পড়লেও একইভাবে। Neural network-এ সবসময় gradient clipping রাখুন আর learning rate range-এ explosion ঘটাতে পারে এমন মান বাদ দিন।
সেরা configuration-এর কোনো একটা hyperparameter ঠিক search range-এর সীমানায় বসে আছে — যেমন সেরা learning rate ঠিক আপনার নির্ধারিত সর্বনিম্ন মান, বা সেরা tree সংখ্যা ঠিক সর্বোচ্চ মান। এর মানে প্রকৃত optimum আপনার range-এর বাইরে — range-এর মধ্যে সেরাটা পাওয়া গেছে, কিন্তু আসল সেরাটা হয়তো আরো দূরে। সমাধান সহজ — সেই সীমানার দিকে range বাড়িয়ে আবার search চালান, আর expand করার পরও নতুন সীমানায় সেরা মান আছে কিনা আবার যাচাই করুন।
একই HPO search দুইবার ভিন্ন random seed দিয়ে চালালে সম্পূর্ণ ভিন্ন "সেরা" configuration আর ভিন্ন performance estimate পাওয়া যায়। কারণ validation estimate নয়েজি — validation set খুব ছোট, বা hold-out validation (একবার split) ব্যবহার হচ্ছে, k-fold cross-validation নয়। সমাধান — objective function-এর ভেতরে hold-out validation-এর বদলে 5-fold stratified cross-validation ব্যবহার করুন, hold-out বাধ্যতামূলক হলে বড় validation set রাখুন (অন্তত ২০%), আর reproducibility-র জন্য সব relevant random seed ঠিক করে রাখুন।
২০টা trial-এর পর সেরা validation score কার্যত সমতল — পরের trial-গুলো আগেরগুলোকে ছাড়িয়ে যাচ্ছে না। এর কয়েকটা সম্ভাব্য কারণ থাকতে পারে — সমস্যাটা সত্যিই hyperparameter-এর প্রতি insensitive (range-এর যেকোনো configuration একই রকম কাজ করে), search space ঠিকভাবে সংজ্ঞায়িত হয়নি (গুরুত্বপূর্ণ hyperparameter range-এর মধ্যে নেই, অথবা আগে থেকেই optimal মানে fix করা আছে), অথবা search algorithm আটকে গেছে। Diagnostic হিসেবে hyperparameter importance আর optimization history plot দেখুন — সব importance শূন্যের কাছাকাছি হলে সমস্যাটা সত্যিই সহজ; কোনো একটার importance বেশি কিন্তু range সংকীর্ণ হলে সেটা বাড়ান।
BERT-এর মতো একটা pretrained model fine-tune করার সময়, কিছু configuration model-কে pretraining-এ শেখা জিনিস "ভুলিয়ে" দিয়ে একটা দুর্বল generalist-এ পরিণত করে ফেলে। এটাকেই বলে catastrophic forgetting। কারণ learning rate খুব বেশি, বা fine-tuning epoch খুব বেশি — pretrained weight ছোট fine-tuning dataset-এর noise দিয়ে মুছে যায়। সমাধান — fine-tuning learning rate নিরাপদ range-এ রাখুন ( থেকে , from-scratch training-এর চেয়ে অনেক কম), epoch সংখ্যা কম রাখুন (২-৫, ৫০+ নয়), training-এর প্রথম ১০%-এ linear warmup ব্যবহার করুন।