এই পর্বে যা শিখবেন
- একটি সমস্যায় নিয়ম, search, নিজের ML না pretrained model, তা কারণসহ বাছা
- Search, logic আর সম্ভাবনার প্রশ্নে trade-off আর সংখ্যা দিয়ে উত্তর দেওয়া
- Bias–variance, leakage, imbalance, calibration আর cross-validation নিয়ে প্রমাণসহ যুক্তি দেওয়া
- খারাপ হয়ে যাওয়া model-এর কারণ ধাপে ধাপে খোঁজা, আর একটি ছোট AI ব্যবস্থার নকশা ও নজরদারি বলা
- নিজের প্রকল্পের সত্যি ঘটনা STAR কাঠামোয়, সীমাবদ্ধতাসহ বলা
এই পাতা সম্পর্কে: প্রশ্নগুলো কোনো নির্দিষ্ট প্রতিষ্ঠান, পরীক্ষা বা নিয়োগ থেকে নেওয়া নয়। AI, ML বা ডেটা-সংক্রান্ত ইন্টারভিউর ধারণার অংশে এ ধরনের প্রশ্ন প্রায়ই আসে, তবে আপনার ইন্টারভিউ ভিন্ন হতে পারে। “বাজারঘর” কাল্পনিক দোকান; সব ডেটা seed দেওয়া কোডে বানানো। চালানো যায় এমন ব্লকগুলোর আউটপুট সত্যিই চালিয়ে নেওয়া (ব্রাউজারের Python; numpy 2.4.6, scikit-learn 1.8.0); প্রথমবার scikit-learn নামতে প্রায় ১০ সেকেন্ড লাগে। NumPy, pandas আর live coding-এর প্রশ্ন আছে পর্ব ৭৮ · Python আর ডেটার ইন্টারভিউ-তে; হাতে হিসাবের অনুশীলন পর্ব ৭৫-এ, লিখিত ও মৌখিক প্রশ্ন পর্ব ৭৭-এ।
ডাক্তার নিয়োগের সময় শুধু জিজ্ঞেস করা হয় না, “জ্বর কাকে বলে?” জিজ্ঞেস করা হয়, “রোগী জ্বর নিয়ে এলেন, পরীক্ষার ফল একটু অদ্ভুত। কী ভাববেন, কোন পরীক্ষা আগে দেবেন, আর কখন বলবেন যে নিশ্চিত নন?” AI-এর ইন্টারভিউও তেমন। সংজ্ঞা জানা শুরু মাত্র; দেখা হয় আপনি সমস্যাকে ঠিক পথে ফেলতে পারেন কি না, একটি সংখ্যা দেখে সন্দেহ করতে পারেন কি না, আর না-জানা জায়গায় সৎ থাকেন কি না।
প্রশ্নের কঠিনতার চিহ্ন: (সহজ), (মাঝারি), (কঠিন). প্রতিটি উত্তরের শেষে “রিভিশন” লেখা পর্বে সেই বিষয়ের পূর্ণ ব্যাখ্যা আর আসল run আছে।
১ · AI ইন্টারভিউর গড়ন, আর সঠিক পথ বাছাই
রিভিশন: পর্ব ০১, পর্ব ০৩ · AI-এর তিন পথ, পর্ব ০৫, পর্ব ০৬, পর্ব ৭৪ · AI প্রকল্পের জীবনচক্র
ধাপের নাম আর সংখ্যা প্রতিষ্ঠানভেদে আলাদা। সাধারণত থাকে একটি প্রাথমিক আলাপ, ধারণার প্রশ্ন (এই পাতার অংশ ১–৭), Python আর ডেটার কাজ (পর্ব ৭৮), একটি ছোট নকশার আলাপ (অংশ ৮) আর আচরণগত আলাপ (অংশ ৯)। Junior data analyst-এর ইন্টারভিউতে metric আর ডেটা বেশি, ML intern-এর ইন্টারভিউতে leakage আর মূল্যায়ন বেশি। Job description পড়ে ঠিক করুন কোন অংশে বেশি সময় দেবেন।
প্রায় প্রতিটি AI ইন্টারভিউ একটি প্রশ্ন দিয়ে আপনার বিচারবুদ্ধি মাপে: এই সমস্যায় আদৌ ML লাগবে? নিচের ছবিটি সেই চিন্তার একটি মোটা দাগের ক্রম।
কোন পথ: নিয়ম, search, নিজের ML না pretrained model
A rough decision order; real projects often mix approaches
প্র ০“নিজের সম্পর্কে বলুন।” AI-এর ভূমিকার জন্য প্রথম এক মিনিটে কী বলবেন? (সহজ)
দুর্বল উত্তর: “আমি AI নিয়ে খুব passionate, ChatGPT প্রতিদিন ব্যবহার করি।” কেন দুর্বল: আগ্রহ সবাই বলেন; যাচাই করার মতো কোনো কাজ নেই।
শক্ত উত্তর: এক মিনিটে তিন অংশ। বর্তমান: “Python, pandas আর scikit-learn দিয়ে ডেটা থেকে model বানানো আর মাপা শিখছি।” প্রমাণ: “একটি বাংলা আর Banglish রিভিউয়ের প্রকল্প শেষ করেছি: নকল বাদ, সময় ধরে তালাবন্ধ test, pipeline, bootstrap CI আর model card. Test-এ ডেলিভারি-সমস্যার recall প্রত্যাশার চেয়ে কম এসেছিল, সেটি রিপোর্টে লিখেছি।” দিক: “এমন দলে কাজ করতে চাই যেখানে মূল্যায়ন আর ডেটার মান গুরুত্ব পায়।” শেষ বাক্যের পর থামুন। দুর্বলতার কথা নিজে থেকে বলা ঝুঁকি মনে হতে পারে, কিন্তু এটি দেখায় আপনি সংখ্যা পড়তে জানেন। রিভিশন: পর্ব ৭৩.
প্র ১এক মিনিটে বলুন, AI কী, আর ML ও deep learning তার কোথায়। (সহজ)
দুর্বল উত্তর: “AI মানে মানুষের মতো চিন্তা করা যন্ত্র।” কেন দুর্বল: “চিন্তা” মাপা যায় না, আর এটি একটি দাবি, সংজ্ঞা নয়।
শক্ত উত্তর: সর্বসম্মত একক সংজ্ঞা নেই; কাজের সংজ্ঞা হলো rational agent: যে পরিবেশ দেখে এমন কাজ বাছে, যাতে একটি ঠিক করা মাপে প্রত্যাশিত ফল সবচেয়ে ভালো হয়। সমস্যাটি PEAS দিয়ে লেখা যায়: মাপ, পরিবেশ, কাজ, সেন্সর। AI-এর ভেতরে নিয়ম আর search-এর মতো পথও আছে; ML তার একটি অংশ, যেখানে নিয়মের সংখ্যা ডেটা থেকে আসে; deep learning ML-এর ভেতরে অনেক স্তরের neural network; generative AI তার ভেতরে, যা নতুন লেখা বা ছবি তৈরি করে। একটি সতর্কতা যোগ করুন: model “বোঝে” কি না, তা খোলা প্রশ্ন; আমরা আচরণ মাপি। রিভিশন: পর্ব ০১, পর্ব ০৪.
প্র ২বাজারঘর চায় “AI দিয়ে ডেলিভারি চার্জ ঠিক করা হোক।” চার্জের নিয়ম জেলা আর ওজনের একটি টেবিল। কী বলবেন? (সহজ)
দুর্বল উত্তর: “পুরোনো অর্ডার দিয়ে একটি regression model train করব।” কেন দুর্বল: যে নিয়ম হুবহু জানা, ML তাকে শুধু আনুমানিকভাবে নকল করবে, আর মাঝে মাঝে ভুল চার্জ দেবে।
শক্ত উত্তর: “নিয়ম জানা, স্থির আর ব্যাখ্যা করা দরকার, তাই একটি lookup টেবিল বা সূত্রই ঠিক। এতে test লেখা যায়, আর গ্রাহককে কারণ দেখানো যায়। ML-এর জায়গা আছে পাশের প্রশ্নে: ডেলিভারিতে কত দিন লাগবে, কারণ সেখানে নিয়ম অজানা আর ডেটা আছে।” এভাবে বলা দেখায় আপনি ML বিক্রি করছেন না, সমস্যা সমাধান করছেন। রিভিশন: পর্ব ০৫, পর্ব ৭৪.
প্র ৩বাংলা আর Banglish রিভিউ থেকে অভিযোগ আলাদা করতে হবে। নিয়ম, নিজের ML না pretrained model? (মাঝারি)
দুর্বল উত্তর: “সবচেয়ে বড় pretrained model নেব, সেটাই সবচেয়ে ভালো হবে।” কেন দুর্বল: বড় মানেই এই ডেটায় ভালো নয়, আর licence, খরচ আর বাংলার সমর্থন যাচাই হয়নি।
শক্ত উত্তর: চারটি প্রশ্ন: label-সহ কত ডেটা, ব্যাখ্যা কতটা দরকার, ভুলের দাম, আর ভাষা কত দ্রুত বদলায়। তারপর একই তালাবন্ধ test-এ তিনটিকে মাপা: keyword নিয়ম (baseline), TF-IDF আর একটি linear model, আর licence যাচাই করা একটি pretrained model. এই কোর্সেই এমন তুলনায় সরল পথ জিতেছে: পর্ব ৭১-এ ২০টি নতুন রিভিউয়ে pretrained model-এর macro F1 ০.৬৪২, TF-IDF classifier-এর ০.৭০০, আর দুটিই “খারাপ না” আর ব্যঙ্গে ভুল করেছে। ২০টিতে প্রমাণ দুর্বল, তাই সিদ্ধান্ত বড় test-এ। বাস্তবে প্রায়ই মিশ্র: শেখা model, তার চারপাশে নিয়মের guardrail. রিভিশন: পর্ব ০৩, পর্ব ৬৭, পর্ব ৭১.
প্র ৪রাইডারদের প্রতিদিনের ডেলিভারি ক্রম বানাতে কি ML লাগবে? (মাঝারি)
দুর্বল উত্তর: “Reinforcement learning দিয়ে রাইডারকে শেখাব।” কেন দুর্বল: লক্ষ্য (সব পার্সেল, কম দূরত্ব) আর কাজের ফল (কোন রাস্তায় কত কিমি) জানা থাকলে শেখার দরকার নেই; খোঁজার দরকার।
শক্ত উত্তর: “এটি optimisation. ছোট হলে search বা নির্ভুল পদ্ধতি; বড় হলে local search, যেমন 2-opt বা simulated annealing, বা একটি constraint solver, যেখানে সময়ের জানালা আর গাড়ির ধারণক্ষমতা নিয়ম হিসেবে যায়। ML ঢুকতে পারে input-এ: রাস্তায় কত মিনিট লাগবে তার অনুমান।” কোর্সের run-এ ২০টি কাল্পনিক পয়েন্টে nearest neighbour ৪১.০১ কিমি, annealing-এর গড় ৩৮.৬, নির্ভুল সেরা ৩৮.৫০; অর্থাৎ সরল local search সেরার খুব কাছে যায়। রিভিশন: পর্ব ৩৯, পর্ব ৪৩, পর্ব ৪৪.
২ · Search, খেলা, logic আর জ্ঞানের প্রশ্ন
রিভিশন: পর্ব ৪০, পর্ব ৪১, পর্ব ৪২, পর্ব ৪৩, পর্ব ৪৫, পর্ব ৪৭, পর্ব ৪৮, পর্ব ৪৯
প্র ৫BFS, DFS আর uniform-cost search: কোনটি কখন? (মাঝারি)
দুর্বল উত্তর: “BFS সবসময় ভালো, কারণ সবচেয়ে ছোট পথ দেয়।” কেন দুর্বল: “ছোট” মানে ধাপে ছোট, খরচে নয়; আর memory-র দাম বলা হয়নি।
শক্ত উত্তর: পার্থক্য শুধু frontier-এ। BFS (queue) সবচেয়ে কম ধাপের পথ দেয়, কিন্তু time আর space দুটিই O(bd); b হলো branching factor, d লক্ষ্যের গভীরতা। DFS (stack) memory-তে সস্তা, O(bm), কিন্তু optimal নয়। ধাপের খরচ আলাদা হলে UCS, মোট খরচ ধরে priority queue, যা Dijkstra-র এক রূপ। কোর্সের ঢাকার মানচিত্রে BFS ২ hop কিন্তু ২২ km, UCS ৩ hop কিন্তু ১৬ km. Memory কম অথচ BFS-এর গুণ চাইলে iterative deepening. রিভিশন: পর্ব ৪০.
প্র ৬A*-এর heuristic কেমন হলে সেরা পথের নিশ্চয়তা থাকে, আর ভালো heuristic কোথা থেকে আসে? (মাঝারি)
দুর্বল উত্তর: “যেকোনো ভালো অনুমান দিলেই হলো।” কেন দুর্বল: বেশি বলা অনুমান A*-কে ভুল পথে থামাতে পারে।
শক্ত উত্তর: A* বাছে f = g + h. h যদি কখনো আসল বাকি খরচের বেশি না বলে (admissible), tree search-এ সেরা পথ নিশ্চিত; ত্রিভুজ-অসমতা মানলে (consistent) graph search-এও কোনো node আবার খুলতে হয় না। ভালো h আসে শিথিল সমস্যা থেকে: নিয়ম কিছুটা তুলে দিলে যে খরচ, যেমন রাস্তা না মেনে সরলরেখার দূরত্ব, বা planning-এ delete list ভুলে যাওয়া। লাভ বিশাল: 8-puzzle-এ গভীরতা ২০-তে গড়ে UCS ৪৪,১০২টি node খোলে, Manhattan heuristic দিয়ে A* মাত্র ৪৪৭টি। আর দ্রুত চাইলে weighted A*, দাম একটু লম্বা পথ। রিভিশন: পর্ব ৪১, পর্ব ৪৯.
প্র ৭Alpha-beta pruning কী বাঁচায়, আর বড় খেলায় minimax কেন যথেষ্ট নয়? (মাঝারি)
দুর্বল উত্তর: “Alpha-beta একটু আনুমানিক উত্তর দেয়, কিন্তু দ্রুত।” কেন দুর্বল: ভুল; alpha-beta হুবহু minimax-এর উত্তর দেয়।
শক্ত উত্তর: Alpha-beta সেই শাখা বাদ দেয়, যা সিদ্ধান্ত বদলাতে পারে না (α ≥ β). উত্তর একই, কাজ কম, আর কতটা কম তা চালের ক্রমের ওপর নির্ভর করে: tic-tac-toe-তে ৫,৪৯,৯৪৬টি node থেকে ভালো ক্রমে ৭,২৭৫, খারাপ ক্রমে ৪২,০৯৪. নিখুঁত ক্রমে মোটামুটি O(bm/2). বড় খেলায় পুরো গাছ অসম্ভব, তাই গভীরতায় থেমে একটি evaluation function; তার ফাঁদ horizon effect. আরেক পথ Monte Carlo tree search, আর AlphaGo (২০১৬) MCTS-এর সাথে শেখা network জুড়েছিল। রিভিশন: পর্ব ৪২.
প্র ৮৩০ জন স্টাফের সাপ্তাহিক রুটিন বানাতে হবে, কিছু নিয়ম কড়া, কিছু পছন্দ। কোন পথে যাবেন? (মাঝারি)
দুর্বল উত্তর: “সব সম্ভাব্য রুটিন পরখ করে সেরাটি নেব।” কেন দুর্বল: মিশ্রণের সংখ্যা সূচকের হারে বাড়ে; ৪৯টি খালি ঘরের Sudoku-তেই 949.
শক্ত উত্তর: এটি একটি CSP: variable (কে কোন shift), domain, আর constraint. ছোট হলে backtracking, সাথে MRV, LCV আর forward checking; কোর্সের কঠিন Sudoku-তে সাধারণ backtracking ১৬ লাখের বেশি backtrack, MRV আর forward checking দিয়ে ২০টি। বাস্তবে একটি constraint solver, যেখানে কড়া নিয়ম আর নরম পছন্দ আলাদা দেওয়া যায়। আর solver-এর উত্তর নিজের যাচাই-কোডে আবার মিলিয়ে নিই। শুধু “ভালো যথেষ্ট” দরকার আর সমস্যা বিশাল হলে local search. রিভিশন: পর্ব ৪৩, পর্ব ৪৪.
প্র ৯কখন একটি শেখা model-এর বদলে নিয়ম বা logic-ভিত্তিক ব্যবস্থা বেছে নেবেন? (মাঝারি)
দুর্বল উত্তর: “নিয়মভিত্তিক AI পুরোনো, এখন সব ML.” কেন দুর্বল: ফেরত-নীতি, compliance আর form যাচাই আজও নিয়মে চলে, যুক্তিসংগত কারণে।
শক্ত উত্তর: যখন নিয়ম লেখা যায়, সিদ্ধান্তের কারণ দেখানো বাধ্যতামূলক (গ্রাহক, নিরীক্ষক বা আইনের কাছে), আর ভুলের দাম বেশি। Rule-based system নিজেই বলতে পারে “কোন নিয়মে এই সিদ্ধান্ত” (explainability). দুর্বলতাও বলুন: নিয়ম লেখা ধীর, অনিশ্চয়তা সামলানো কঠিন, নিয়ম বাড়লে রক্ষণাবেক্ষণ ভারী (MYCIN আর XCON-এর যুগের শিক্ষা)। আর একটি সূক্ষ্ম ফাঁদ: কোর্সের ফেরত-নীতিতে একই ক্রেতার একই তথ্যে শুধু নিয়মের ক্রম বদলালে উত্তর “ফেরত বাতিল” থেকে “পুরো টাকা ফেরত” হয়; তাই conflict resolution নীতিরই অংশ, আর তার test লাগে। রিভিশন: পর্ব ৪৫, পর্ব ৪৭.
প্র ১০Knowledge graph কী, আর LLM-এর পাশে তা কী কাজে আসে? (কঠিন)
দুর্বল উত্তর: “Knowledge graph দিলে LLM আর hallucinate করে না।” কেন দুর্বল: অতিরঞ্জন; ঝুঁকি কমে, শেষ হয় না।
শক্ত উত্তর: Knowledge graph তথ্যকে (subject, predicate, object) triple হিসেবে রাখে; প্রশ্ন মানে ছাঁচ মেলানো, তাই “সিলেটের কোন গ্রাহক charger-ও বানায় এমন ব্র্যান্ডের পণ্য কিনেছেন” ধরনের বহু-ধাপের প্রশ্নে উত্তরের পথ দেখানো যায়। LLM-এর পাশে এটি উত্তরকে যাচাইযোগ্য উৎসে বাঁধে। দাম দুটি: ডেটার মান (একই পণ্য তিন বানানে থাকলে উত্তর ভুল, তাই entity resolution) আর schema-র ভুল (একটি ভুল is-a রেখা সব charger-কে ফোন বানিয়ে দেয়)। রিভিশন: পর্ব ৪৮, পর্ব ৪৬.
৩ · সম্ভাবনা, Bayes আর Naive Bayes
রিভিশন: পর্ব ৩৫, পর্ব ৫০, পর্ব ৫১, পর্ব ৫২, পর্ব ৫৪
প্র ১১একটি জালিয়াতি-সতর্কতা ভুয়া অর্ডারের ৯৫% ধরে, সৎ অর্ডারের ৫%-এ ভুল করে বাজে। ভুয়া অর্ডার ১%. সতর্কতা বাজলে অর্ডারটি ভুয়া হওয়ার সম্ভাবনা কত? (মাঝারি)
দুর্বল উত্তর: “৯৫%.” কেন দুর্বল: ৯৫% হলো P(সতর্কতা | ভুয়া); প্রশ্ন উল্টোটা, P(ভুয়া | সতর্কতা). দুটি গুলিয়ে ফেলাকে base rate উপেক্ষা বলে।
শক্ত উত্তর: Bayes: P(ভুয়া | সতর্কতা) = ০.৯৫ × ০.০১ ÷ (০.৯৫ × ০.০১ + ০.০৫ × ০.৯৯) = ০.০০৯৫ ÷ ০.০৫৯০ ≈ ০.১৬১. মুখে বলার সহজ পথ গোনা: ১০,০০০টি অর্ডারে ১০০টি ভুয়া, ধরা পড়ে ৯৫টি; ৯,৯০০টি সৎ, ভুল সতর্কতা ৪৯৫টি; তাই ৫৯০টি সতর্কতার মাত্র ৯৫টি ভুয়া। নিচের stepper আর ব্লক হিসাবটি দেখায়। এরপর যোগ করুন: “এই কারণেই বিরল ঘটনার model-এ precision কম আসে, আর সতর্কতা মানুষ দিয়ে যাচাইয়ের ব্যবস্থা লাগে।” রিভিশন: পর্ব ৫০.
| মোট অর্ডার | |
| ভুয়া (১%) | |
| সৎ | |
| সতর্কতা, ভুয়ায় (TP) | |
| সতর্কতা, সৎ-এ (FP) | |
| P(ভুয়া ∣ সতর্কতা) |
- শুরু। ১০,০০০টি কাল্পনিক অর্ডার। সতর্কতা ভুয়ার ৯৫% ধরে, সৎ অর্ডারের ৫%-এ ভুল করে বাজে। এখনো base rate বসানো হয়নি।
- Base rate. ১% ভুয়া, অর্থাৎ ১০০টি; বাকি ৯,৯০০টি সৎ। পুরো হিসাবটি এই ভাগের ওপর দাঁড়িয়ে।
- ধরা পড়া ভুয়া। ১০০টির ৯৫% = ৯৫টি true positive.
- ভুল সতর্কতা। ৯,৯০০টির ৫% = ৪৯৫টি false positive, ধরা পড়া ভুয়ার পাঁচ গুণের বেশি। ছোট হার, কিন্তু বিশাল দলের ওপর।
- উত্তর। মোট ৫৯০টি সতর্কতার ৯৫টি ভুয়া: ৯৫ ÷ ৫৯০ ≈ ০.১৬১. এটিই সতর্কতার precision.
- দ্বিতীয় সংকেত। আরেকটি সতর্কতা, শ্রেণি জানা থাকলে প্রথমটি থেকে স্বাধীন ধরে নিলে odds আবার ১৯ গুণ: ০.৭৮৫. দুটি সংকেত একই তথ্য থেকে এলে এই গুণ ভুল, একই প্রমাণ দুবার গোনা।
# Fictional fraud alarm: it catches 95% of fraud and wrongly flags 5% of honest orders
sens, fpr = 0.95, 0.05
for prior in [0.01, 0.10, 0.50]:
p_alert = sens * prior + fpr * (1 - prior) # P(alarm), total probability
post = sens * prior / p_alert # Bayes: P(fraud | alarm)
print(f"base rate {prior:.2f}: P(alarm) = {p_alert:.4f} P(fraud | alarm) = {post:.3f}")
# The same thing as counts: 10,000 orders, 1% fraud
n = 10_000
fraud = int(n * 0.01); honest = n - fraud
tp = round(fraud * sens); fp = round(honest * fpr)
print(f"\n10,000 orders: fraud {fraud}, alarms {tp + fp} (TP {tp}, FP {fp})")
print(f"precision of the alarm = {tp}/{tp + fp} = {tp / (tp + fp):.3f}")
# Two alarms in a row, assuming they are independent given the class
odds = 0.01 / 0.99
lr = sens / fpr # likelihood ratio = 19
for k in (1, 2):
o = odds * lr ** k
print(f"{k} alarm(s): posterior = {o / (1 + o):.3f}")আসল আউটপুট (ব্রাউজারের Python):
base rate 0.01: P(alarm) = 0.0590 P(fraud | alarm) = 0.161
base rate 0.10: P(alarm) = 0.1400 P(fraud | alarm) = 0.679
base rate 0.50: P(alarm) = 0.5000 P(fraud | alarm) = 0.950
10,000 orders: fraud 100, alarms 590 (TP 95, FP 495)
precision of the alarm = 95/590 = 0.161
1 alarm(s): posterior = 0.161
2 alarm(s): posterior = 0.785
একই সতর্কতা, তিনটি ভিন্ন উত্তর: base rate ০.০১-এ ০.১৬১, ০.১০-এ ০.৬৭৯, ০.৫০-এ ০.৯৫০. অর্থাৎ “model কতটা ভালো” প্রশ্নের উত্তর নির্ভর করে কোথায় চালানো হচ্ছে তার ওপর; একটি হাসপাতালে মাপা পরীক্ষা অন্য জনগোষ্ঠীতে ভিন্ন precision দেয়। গোনার রূপ (95/590 = 0.161) আর সূত্রের রূপ হুবহু মেলে। Odds রূপে প্রতিটি স্বাধীন প্রমাণ শুধু likelihood ratio (এখানে ১৯) দিয়ে গুণ: একটিতে ০.১৬১, দুটিতে ০.৭৮৫.
প্র ১২Naive Bayes-এ “naive” কেন? অনুমানটি ভুল জেনেও এটি কেন কাজ করে, আর কোথায় ঠকায়? (মাঝারি)
দুর্বল উত্তর: “কারণ এটি সরল model.” কেন দুর্বল: কোন অনুমানটি সরল করা হলো, তা বলা হয়নি।
শক্ত উত্তর: শ্রেণি জানা থাকলে প্রতিটি feature-কে অন্যগুলো থেকে স্বাধীন ধরা হয় (conditional independence): P(শ্রেণি | শব্দ) ∝ P(শ্রেণি) × ∏ P(শব্দ | শ্রেণি). লেখায় এটি প্রায় সবসময় ভুল (“ক্যাশ” আর “অন”-এর মতো শব্দ একসাথে আসে), তবু শ্রেণির ক্রম প্রায়ই ঠিক থাকে, তাই classification ভালো হয়; training মানে শুধু গোনা, তাই অল্প ডেটায় দ্রুত। যেখানে ঠকায়: সম্ভাবনার মান। একই প্রমাণ বারবার গোনা হয়, তাই উত্তর ০ বা ১-এর দিকে ঠেলে যায়, অর্থাৎ calibration নষ্ট। অংশ ৪-এর একটি ব্লক এটি মাপে: AUC একই থাকে, অথচ সম্ভাবনা অতি-আত্মবিশ্বাসী হয়। রিভিশন: পর্ব ৫১.
প্র ১৩Naive Bayes লিখতে গিয়ে লম্বা বার্তায় দুই শ্রেণিরই score 0.0 আসছে। কেন, আর সমাধান? (সহজ)
দুর্বল উত্তর: “float64-এর বদলে আরও বড় type নেব।” কেন দুর্বল: সমস্যা সূচকের হারে ছোট হওয়া; বড় type শুধু কিছুটা পিছিয়ে দেয়।
শক্ত উত্তর: শত শত ০.০০১-এর মতো সম্ভাবনা গুণ করলে ফল float-এর সবচেয়ে ছোট মানের নিচে নেমে 0.0 হয় (underflow). Log নিলে গুণ যোগ হয়ে যায়: কোর্সের ৩০৯-token বার্তায় সরাসরি গুণে দুটিই 0.0, log-এ −১৬৬৫.১ বনাম −১৮৭৯.৭, সিদ্ধান্ত পরিষ্কার। সাথে দ্বিতীয় ফাঁদ বলুন: না-দেখা শব্দের সম্ভাবনা ০ হলে পুরো গুণফল ০, তাই Laplace smoothing. সম্ভাবনায় ফিরতে হলে log-sum-exp. রিভিশন: পর্ব ৫১.
প্র ১৪Model সম্ভাবনা দেয়। কোন সীমায় “ঝুঁকিপূর্ণ” বলবেন, তা কীভাবে ঠিক করবেন? (মাঝারি)
দুর্বল উত্তর: “০.৫, কারণ সেটাই default.” কেন দুর্বল: ০.৫ শুধু তখন ঠিক, যখন দুই রকম ভুলের দাম সমান।
শক্ত উত্তর: সিদ্ধান্ত হলো expected utility-র প্রশ্ন। সম্ভাবনা p হলে “আটকাব” তখনই, যখন p × CFN > (১ − p) × CFP; অর্থাৎ threshold t* = CFP ÷ (CFP + CFN). এখানে CFN মানে একটি ভুয়া ছেড়ে দেওয়ার দাম, CFP একটি সৎ অর্ডার আটকানোর দাম। কোর্সের কাল্পনিক ফেরতের উদাহরণে ৳৪০০ আর ৳৫০ থেকে t* = ০.১১১, আর ২০০টি অর্ডারে খরচ ০.৫-এর ৳৯৬০০ থেকে ০.১৫-এ ৳৫৫০০-এ নামে। শর্ত দুটি বলুন: সম্ভাবনা calibrated হতে হবে, আর review দলের ক্ষমতার সীমা থাকলে প্রশ্নটি “শীর্ষ k-টি” বাছাইয়ে বদলায়। রিভিশন: পর্ব ৫৪, পর্ব ৫৯, পর্ব ৬০.
৪ · ML-এর মূল প্রশ্ন — bias, leakage, metric, calibration আর cross-validation
রিভিশন: পর্ব ৫৫, পর্ব ৫৬, পর্ব ৬০, পর্ব ৬১, পর্ব ৬৩, পর্ব ৬৪, পর্ব ৬৬
এই অংশের প্রশ্নেই সবচেয়ে বেশি প্রার্থী আটকান, কারণ সংজ্ঞা মুখস্থ থাকে কিন্তু প্রমাণ থাকে না। নিচের চারটি ব্লক চারটি দাবি সংখ্যা দিয়ে দেখায়। ইন্টারভিউতে কোড চালানো না গেলেও “একটি ছোট পরীক্ষায় এটি দেখা যায়” বলে ফলটি বলতে পারলে উত্তর শক্ত হয়।
প্র ১৫Training error ২%, validation error ১৮%. কী বুঝবেন, আর পরের তিনটি কাজ কী? (মাঝারি)
দুর্বল উত্তর: “Overfitting, তাই আরও জটিল model নেব।” কেন দুর্বল: দিক উল্টো; জটিলতা বাড়ালে ফাঁক আরও বাড়ার কথা।
শক্ত উত্তর: বড় ফাঁক মানে variance বেশি, overfitting. নতুন ডেটার গড় বর্গ-ভুল = bias² + variance + noise (bias–variance). তিনটি কাজ: learning curve এঁকে দেখা আরও ডেটায় ফাঁক কমে কি না; regularization বা সরল model; আর আগে নিশ্চিত হওয়া যে validation-এর ভাগ সৎ (একই গ্রাহক দুই দিকে নেই)। উল্টো ছবি, দুটিই উঁচুতে মিলে গেলে, bias: তখন আরও ডেটায় লাভ নেই, ভালো feature বা নমনীয় model লাগে। কোর্সের ২০টি ডেলিভারিতে degree ১-এর validation MSE ৩৯.৬, degree ৩-এর ১৮.৪, degree ১৫-এর চার কোটির বেশি। রিভিশন: পর্ব ৬১.
প্র ১৬Data leakage-এর একটি গল্প বলুন: কীভাবে ঢোকে, কীভাবে ধরবেন। (মাঝারি)
দুর্বল উত্তর: “Test ডেটা train-এ চলে গেলে leakage হয়।” কেন দুর্বল: ঠিক, কিন্তু সবচেয়ে চোখে পড়ার রূপটিই শুধু; বাস্তবের বেশিরভাগ leakage এর চেয়ে সূক্ষ্ম।
শক্ত উত্তর: “ফেরতের model-এ refund_processed কলাম ছিল। ফেরত হলেই কলামটি ভরে, অর্থাৎ ফল জানার পরের তথ্য (target leakage); AUC ০.৬৫৬ থেকে লাফিয়ে ০.৯৮২. প্রশ্ন করি: সিদ্ধান্তের মুহূর্তে এই কলাম কি জানা থাকে? না।” আরও রূপ: একই গ্রাহক train ও test দুই দিকে, সময়ের ডেটায় এলোমেলো ভাগ, নকল সারি, আর ভাগের আগে পুরো ডেটায় scaler বা feature বাছাই (preprocessing leakage). ধরার উপায়: অবিশ্বাস্য ভালো score-কে সন্দেহ, একক feature-এর AUC, permutation importance-এ একটি কলামের আধিপত্য, আর সব শেখা ধাপ pipeline-এ। নিচের ব্লক শেষ রূপটি দেখায়। রিভিশন: পর্ব ৫৬, পর্ব ৬৪.
import numpy as np
from sklearn.feature_selection import SelectKBest, f_classif
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import make_pipeline
from sklearn.model_selection import StratifiedKFold, cross_val_score
rng = np.random.default_rng(42)
X = rng.normal(size=(80, 2000)) # 80 rows, 2000 random columns
y = rng.integers(0, 2, size=80) # random labels: nothing to learn
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
clf = LogisticRegression(max_iter=1000)
X_top = SelectKBest(f_classif, k=20).fit_transform(X, y) # WRONG: looks at all 80 labels
wrong = cross_val_score(clf, X_top, y, cv=cv)
pipe = make_pipeline(SelectKBest(f_classif, k=20), clf) # RIGHT: selection inside each fold
right = cross_val_score(pipe, X, y, cv=cv)
print(f"select first, then CV : {wrong.mean():.3f} folds {np.round(wrong, 2)}")
print(f"select inside pipeline: {right.mean():.3f} folds {np.round(right, 2)}")
print("majority-class baseline:", round(max(y.mean(), 1 - y.mean()), 3))আসল আউটপুট (ব্রাউজারের Python, scikit-learn 1.8.0):
select first, then CV : 0.912 folds [0.94 0.94 0.94 0.94 0.81]
select inside pipeline: 0.487 folds [0.44 0.56 0.25 0.56 0.62]
majority-class baseline: 0.538
ডেটায় কোনো সংকেত নেই, label এলোমেলো। তবু ভুল ক্রমে cross-validation ০.৯১২ দেখায়, কারণ ২,০০০টি কলাম থেকে সেই ২০টি বাছা হয়েছে যারা সব ৮০টি সারির label-এর সাথে কাকতালীয়ভাবে মেলে, পরে test হওয়া সারিসহ। বাছাই pipeline-এর ভেতরে নিলে প্রতিটি fold শুধু নিজের train অংশ দেখে, আর ফল নামে ০.৪৮৭-এ, majority baseline-এর (০.৫৩৮) নিচে, যা এলোমেলো ডেটায় প্রত্যাশিত। কলাম বেশি, সারি কম, এমন ডেটায় (জিন, লেখা) এই ভুল সবচেয়ে বিপজ্জনক।
প্র ১৭২% ভুয়া অর্ডারের ডেটায় কোন metric দেখবেন? একটি ভুয়া ছাড়ার দাম ৳১৫০০, একটি সৎ অর্ডার আটকানোর ৳১০০. (মাঝারি)
দুর্বল উত্তর: “Accuracy, আর তা ৯৫%-এর বেশি হলেই ভালো।” কেন দুর্বল: Class imbalance-এ “সবাই সৎ” বললেই ৯৮%.
শক্ত উত্তর: আগে DummyClassifier-এর baseline. তারপর threshold ছাড়া ranking-এর মাপ average precision (PR curve-এর নিচের ক্ষেত্র; বিরল শ্রেণিতে ROC AUC-এর চেয়ে বেশি বলে), আর নির্দিষ্ট threshold-এ precision, recall, F1 ও balanced accuracy. কিন্তু দাম জানা থাকলে চূড়ান্ত মাপ টাকা: threshold বসান t* = ১০০ ÷ (১০০ + ১৫০০) = ০.০৬২৫ আর মোট খরচ মাপুন। নিচের ব্লক দেখায় accuracy কেন ভুল পথে নেয়। রিভিশন: পর্ব ৬০.
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.dummy import DummyClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import (accuracy_score, precision_score, recall_score,
f1_score, balanced_accuracy_score, average_precision_score)
rng = np.random.default_rng(42)
X = rng.normal(size=(8000, 4)) # 4 fictional order signals
logit = -5.5 + 1.6 * X[:, 0] + 1.1 * X[:, 1] + 0.7 * X[:, 2]
y = (rng.random(8000) < 1 / (1 + np.exp(-logit))).astype(int) # about 2% fraud
Xtr, Xte, ytr, yte = train_test_split(X, y, test_size=0.3, stratify=y, random_state=42)
print("test:", len(yte), "orders,", int(yte.sum()), "fraud")
models = {"dummy": DummyClassifier(strategy="most_frequent"),
"logreg": LogisticRegression(max_iter=1000)}
for name, m in models.items():
s = m.fit(Xtr, ytr).predict_proba(Xte)[:, 1]
for t in ([0.5] if name == "dummy" else [0.5, 0.0625]):
p = (s >= t).astype(int)
cost = 1500 * ((p == 0) & (yte == 1)).sum() + 100 * ((p == 1) & (yte == 0)).sum()
print(f"{name:6s} t={t:<6} acc={accuracy_score(yte, p):.3f} "
f"P={precision_score(yte, p, zero_division=0):.2f} R={recall_score(yte, p):.2f} "
f"F1={f1_score(yte, p):.2f} bal={balanced_accuracy_score(yte, p):.2f} cost={cost}")
print(f"{'':6s} average precision (no threshold) = {average_precision_score(yte, s):.3f}")আসল আউটপুট (ব্রাউজারের Python, scikit-learn 1.8.0):
test: 2400 orders, 62 fraud
dummy t=0.5 acc=0.974 P=0.00 R=0.00 F1=0.00 bal=0.50 cost=93000
average precision (no threshold) = 0.026
logreg t=0.5 acc=0.973 P=0.36 R=0.06 F1=0.11 bal=0.53 cost=87700
logreg t=0.0625 acc=0.917 P=0.21 R=0.79 F1=0.33 bal=0.86 cost=38000
average precision (no threshold) = 0.316
Accuracy দেখলে Dummy (০.৯৭৪) জেতে, আসল model ০.৫-এ (০.৯৭৩) সামান্য পিছিয়ে। অথচ Dummy একটিও ভুয়া ধরে না (R = ০.০০), আর model ০.৫-এ ধরে মাত্র ৬%. Threshold-ছাড়া মাপে পার্থক্য পরিষ্কার: average precision ০.০২৬ (Dummy, অর্থাৎ শুধু ভুয়ার হার) বনাম ০.৩১৬. একই model খরচের সূত্রের threshold ০.০৬২৫-এ recall ০.৭৯, F1 ০.৩৩, আর খরচ ৳৮৭,৭০০ থেকে ৳৩৮,০০০-এ নামে, যদিও accuracy কমে ০.৯১৭ হয়। শিক্ষা: model আর threshold দুটি আলাদা সিদ্ধান্ত, আর metric বাছে ব্যবসার দাম।
প্র ১৮Calibration কী? কখন এটি accuracy বা AUC-এর চেয়ে জরুরি, আর কীভাবে মাপবেন ও ঠিক করবেন? (কঠিন)
দুর্বল উত্তর: “AUC ভালো হলে সম্ভাবনাও ঠিক।” কেন দুর্বল: AUC শুধু ক্রম মাপে; সব score বর্গ করলেও AUC একই থাকে, অথচ সম্ভাবনা বদলে যায়।
শক্ত উত্তর: Calibrated মানে model যেসব ক্ষেত্রে ০.৩ বলে, তাদের প্রায় ৩০%-এ ঘটনাটি সত্যিই ঘটে। জরুরি তখন, যখন সংখ্যাটি নিজেই ব্যবহার হয়: খরচের threshold (প্র ১৪), প্রত্যাশিত ফেরতের হিসাব, বা মানুষকে “কতটা নিশ্চিত” দেখানো। মাপ: reliability diagram (calibration_curve) আর Brier score. ঠিক করার পথ: আলাদা ডেটায় Platt-এর sigmoid (১৯৯৯) বা isotonic, scikit-learn-এ CalibratedClassifierCV; ক্যাপস্টোনে LinearSVC-কে এভাবেই সম্ভাবনা দেওয়া হয়েছিল। সতর্কতা: calibration গড়ের দাবি, একটি সারির নয়, আর দলভেদে আলাদা হতে পারে। নিচের ব্লক Naive Bayes-এর ঘটনাটি মাপে। রিভিশন: পর্ব ৫৯, পর্ব ৬০, পর্ব ৭৩.
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.linear_model import LogisticRegression
from sklearn.calibration import calibration_curve
from sklearn.metrics import roc_auc_score, brier_score_loss
rng = np.random.default_rng(42)
y = rng.integers(0, 2, size=4000)
X = rng.normal(size=(4000, 4)) + 0.35 * y[:, None] # 4 independent signals: NB's assumption holds
X5 = np.hstack([X] * 5) # each column copied 5 times: same evidence counted 5 times
Xtr, Xte, ytr, yte = train_test_split(X5, y, test_size=0.5, random_state=42)
models = {"NB, 4 columns": (GaussianNB(), slice(0, 4)),
"NB, 20 copies": (GaussianNB(), slice(None)),
"LogReg, 20 ": (LogisticRegression(max_iter=1000), slice(None))}
for name, (m, cols) in models.items():
p = m.fit(Xtr[:, cols], ytr).predict_proba(Xte[:, cols])[:, 1]
obs, pred = calibration_curve(yte, p, n_bins=5, strategy="quantile")
print(f"{name} AUC={roc_auc_score(yte, p):.3f} Brier={brier_score_loss(yte, p):.3f}")
print(" predicted:", np.round(pred, 2), "\n observed :", np.round(obs, 2))আসল আউটপুট (ব্রাউজারের Python, scikit-learn 1.8.0):
NB, 4 columns AUC=0.680 Brier=0.227
predicted: [0.24 0.37 0.47 0.58 0.74]
observed : [0.3 0.4 0.53 0.6 0.76]
NB, 20 copies AUC=0.680 Brier=0.294
predicted: [0.01 0.1 0.43 0.85 0.99]
observed : [0.3 0.4 0.53 0.6 0.76]
LogReg, 20 AUC=0.682 Brier=0.226
predicted: [0.24 0.37 0.47 0.58 0.73]
observed : [0.3 0.4 0.54 0.6 0.76]
চারটি স্বাধীন কলামে Naive Bayes-এর অনুমান সত্য, তাই অনুমিত আর দেখা হার কাছাকাছি (০.২৪ বনাম ০.৩, … ০.৭৪ বনাম ০.৭৬). প্রতিটি কলাম পাঁচবার কপি করলে নতুন কোনো তথ্য আসে না, তাই AUC হুবহু একই (০.৬৮০). কিন্তু NB একই প্রমাণ পাঁচবার গোনে: সম্ভাবনা ০.০১ আর ০.৯৯-এ ঠেলে যায়, অথচ সেই দলে আসল হার ০.৩ আর ০.৭৬; Brier ০.২২৭ থেকে ০.২৯৪-এ খারাপ হয়। Logistic regression কপিগুলোর মধ্যে ওজন ভাগ করে নেয়, তাই calibrated থাকে। ইন্টারভিউর বাক্য: “ক্রম ঠিক মানেই সম্ভাবনা ঠিক নয়।”
প্র ১৯Cross-validation কেন, কোন রূপ কখন, আর nested CV কী সমস্যা মেটায়? (কঠিন)
দুর্বল উত্তর: “সবসময় ৫-fold, আর GridSearchCV-র best_score_ রিপোর্ট করি।” কেন দুর্বল: ভাগের একক আর সময় ভাবা হয়নি, আর best_score_ আশাবাদী।
শক্ত উত্তর: একটি ভাগ নড়বড়ে (কোর্সে শুধু seed বদলে accuracy ০.৯০৯ থেকে ০.৯৮৬), তাই cross-validation গড় আর ছড়ানো দুটোই দেয়। রূপ: বিরল শ্রেণিতে stratified; একই গ্রাহক বা রোগীর অনেক সারি হলে group ধরে ভাগ (GroupKFold); সময়ের ডেটায় অতীতে train, ভবিষ্যতে validate. আর মূল কথা: যে নম্বর দেখে সেটিং বাছা হলো, সেই নম্বরই মূল্যায়ন হলে তা আশাবাদী। Nested CV দুটি কাজ আলাদা করে: ভেতরের loop বাছে, বাইরের loop মাপে, আর বাইরের প্রতিটি fold পুরো খোঁজটি নতুন করে চালায়। নিচের ব্লক বিশুদ্ধ noise-এ দুটির পার্থক্য দেখায়। রিভিশন: পর্ব ৫৬, পর্ব ৬৬.
import numpy as np
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV, StratifiedKFold, cross_val_score
grid = {"svc__C": [0.1, 1, 10, 100], "svc__gamma": [0.001, 0.01, 0.1, 1]} # 16 settings
best, outer_scores = [], []
for seed in range(8): # 8 pure-noise datasets
rng = np.random.default_rng(seed)
X = rng.normal(size=(60, 20)); y = rng.integers(0, 2, size=60)
inner = StratifiedKFold(3, shuffle=True, random_state=seed)
outer = StratifiedKFold(5, shuffle=True, random_state=seed + 100)
search = GridSearchCV(make_pipeline(StandardScaler(), SVC()), grid, cv=inner)
best.append(search.fit(X, y).best_score_) # score of the winner, on the same folds
outer_scores.append(cross_val_score(search, X, y, cv=outer).mean()) # nested
print("best inner score :", np.round(best, 3), "mean", round(float(np.mean(best)), 3))
print("nested CV score :", np.round(outer_scores, 3), "mean", round(float(np.mean(outer_scores)), 3))আসল আউটপুট (ব্রাউজারের Python, scikit-learn 1.8.0; কয়েক সেকেন্ড লাগে):
best inner score : [0.567 0.7 0.633 0.6 0.567 0.533 0.567 0.55 ] mean 0.59
nested CV score : [0.467 0.7 0.633 0.5 0.55 0.467 0.483 0.517] mean 0.54
আটটি ডেটাসেটের কোনোটিতে শেখার কিছু নেই, তবু ১৬টি সেটিংয়ের সেরাটির ভেতরের score-এর গড় ০.৫৯, কারণ ১৬টি এলোমেলো ফলের সর্বোচ্চটি গড়ের ওপরে থাকেই। Nested CV-র গড় ০.৫৪, ০.৫-এর কাছে। ৬০টি সারিতে প্রতিটি সংখ্যা খুব নড়বড়ে (একটি ডেটাসেটে দুটিই ০.৭০), তাই একক run নয়, গড় দেখুন। কোর্সের ২০টি ডেটাসেটের run-এ ফাঁক ছিল ০.৫৩৯ বনাম ০.৪৯৩. সেটিং যত বেশি খোঁজা হয়, এই আশাবাদ তত বাড়ে।
প্র ২০Feature engineering-এর তিনটি ফাঁদ বলুন, যা validation-এ ধরা না-ও পড়তে পারে। (মাঝারি)
দুর্বল উত্তর: “যত বেশি feature, তত ভালো।” কেন দুর্বল: প্রতিটি feature-এর দাম আছে: leakage, noise আর production-এ তা পাওয়া যাবে কি না।
শক্ত উত্তর: এক, target encoding train-এর নিজের label দিয়ে: সংকেতহীন পণ্য-ID-র naive গড় train-এ AUC ০.৯৫৮, test-এ ০.৬৫১; সমাধান cross-fitting (TargetEncoder). দুই, পুরো ডেটায় scaler বা imputer fit, আর outlier-এ ভুল scaler: ৩% সারিতে ওজন গ্রামে থাকায় StandardScaler বাকিদের চেপে দেয়, RobustScaler ভালো। তিন, এমন feature যা সিদ্ধান্তের সময় পাওয়া যায় না বা ভিন্নভাবে হিসাব হয় (“গত ৩০ দিনের ফেরত”, যা training-এ ভবিষ্যৎসহ হিসাব হয়েছিল); একে training-serving skew বলে। নিয়ম: যা কিছু ডেটা থেকে শেখে, তা শুধু train-এ fit, pipeline-এর ভেতরে। রিভিশন: পর্ব ৬৩, পর্ব ৬৪.
প্র ২১একটি gradient boosting model logistic regression-এর চেয়ে validation AUC-তে ০.০০৪ বেশি। কোনটি নেবেন? (মাঝারি)
দুর্বল উত্তর: “যার score বেশি।” কেন দুর্বল: ০.০০৪ সম্ভবত fold-এর ওঠানামার ভেতরে।
শক্ত উত্তর: আগে প্রশ্ন, পার্থক্যটি কি আসল? একই fold-এ জোড়া ধরে তুলনা, ছড়ানোসহ। কোর্সে random forest ০.৭৭৩ ± ০.০৪১ আর logistic ০.৭৫২ ± ০.০১২; ২৫টি জোড়া ভাগে forest বনাম interaction-সহ logistic-এর পার্থক্য মাত্র +০.০০২, জিত ১২/২৫, অর্থাৎ সমান। সমান হলে সরলটি: দ্রুত, ব্যাখ্যা সহজ, drift-এ কম ভঙ্গুর। আর সবসময় একটি সরল baseline পাশে রাখুন: পর্ব ৭৪-এ সরল নিয়ম ০.৭০৫, logistic ০.৭৮২, গভীর decision tree ০.৬৯৮, জটিলটি নিয়মের কাছেও হেরেছে। রিভিশন: পর্ব ৬৬.
৫ · Model debugging round — তিনটি পরিচিত বিপদ
রিভিশন: পর্ব ০৬, পর্ব ৫৬, পর্ব ৬০, পর্ব ৬২, পর্ব ৭৪
Debugging প্রশ্নে ইন্টারভিউয়ার একটি উপসর্গ দেন, কারণ নয়। দুর্বল উত্তর সরাসরি সমাধানে লাফায় (“আরও ডেটা দেব”, “deep learning নেব”). শক্ত উত্তর একটি ক্রম মানে: উপসর্গ নিশ্চিত করা, দুই পাশের মাপ একই কি না দেখা, ভাগ আর leakage, ডেটার বণ্টন, অংশভিত্তিক ভুল, তারপর সমাধান আর একটি পাহারা। ডাক্তার যেমন ওষুধের আগে পরীক্ষা দেন।
বাগ ১ · “Validation-এ দারুণ, production-এ খারাপ”
উপসর্গ: ফেরতের model validation-এ accuracy ০.৮৭, চালুর পরে নতুন গ্রাহকদের ওপর প্রায় এলোমেলো। প্রমাণ খোঁজার ক্রম:
- মাপ কি একই? একই metric, একই threshold, একই সংজ্ঞার label? Production-এর label হয়তো এখনো পাকেনি (বাগ ৩).
- ভাগ কি বাস্তবের মতো? Production-এ আসে নতুন গ্রাহক আর ভবিষ্যৎ সময়; validation-এ কি পুরোনো গ্রাহক আর এলোমেলো সময় ছিল?
- Input কি একই? Training আর production-এ feature একই কোডে হিসাব হয় কি না (training-serving skew), আর বণ্টন সরেছে কি না (data drift).
- কোন অংশে ভুল? নতুন বনাম পুরোনো গ্রাহক, জেলা, লিপি, মাস ধরে ভুল ভাগ করে দেখা।
নিচের ব্লকে দ্বিতীয় কারণটি ছোট আকারে: প্রতিটি গ্রাহকের অর্ডার তাঁর নিজের “ধরন” বহন করে, আর label গ্রাহকভিত্তিক কিন্তু এলোমেলো। অর্থাৎ নতুন গ্রাহকের জন্য শেখার কিছু নেই।
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import KFold, GroupKFold, cross_val_score
rng = np.random.default_rng(42)
n_cust, per = 120, 5 # 120 customers, 5 orders each
habit = rng.normal(size=(n_cust, 6)) # each customer's own "style"
label = rng.integers(0, 2, size=n_cust) # returns: random per customer
cust = np.repeat(np.arange(n_cust), per)
X = habit[cust] + rng.normal(scale=0.3, size=(n_cust * per, 6)) # orders look like their owner
y = label[cust]
knn = KNeighborsClassifier(n_neighbors=3, algorithm="kd_tree")
rand = cross_val_score(knn, X, y, cv=KFold(5, shuffle=True, random_state=42))
grp = cross_val_score(knn, X, y, cv=GroupKFold(5), groups=cust)
print(f"random KFold : {rand.mean():.3f} (same customer on both sides)")
print(f"GroupKFold : {grp.mean():.3f} (new customers only)")
print(f"baseline : {max(y.mean(), 1 - y.mean()):.3f}")আসল আউটপুট (ব্রাউজারের Python, scikit-learn 1.8.0; algorithm="kd_tree" দেওয়া হয়েছে, কারণ ব্রাউজারের Python-এ default পথটি একটি অপ্রাসঙ্গিক সতর্কবার্তা ছাপে):
random KFold : 0.875 (same customer on both sides)
GroupKFold : 0.438 (new customers only)
baseline : 0.525
এলোমেলো ভাগে ০.৮৭৫: test-এর প্রতিটি অর্ডারের পাশে train-এ সেই গ্রাহকেরই আরও চারটি অর্ডার, তাই k-NN আসলে গ্রাহক চিনছে, ফেরতের কারণ নয়। গ্রাহক ধরে ভাগ (GroupKFold) production-এর মতো প্রশ্ন করে, “নতুন গ্রাহকে কেমন?”, আর উত্তর ০.৪৩৮, baseline-এর (০.৫২৫) নিচে। পর্ব ৫৬-এর বাজারঘরের ডেটায় একই ঘটনা: ০.৭৬১ বনাম ০.৫২২. সমাধান: ভাগের একক production-এর একক অনুযায়ী (গ্রাহক, দোকান, রোগী, সময়), আর সংখ্যা রিপোর্টে সেই ভাগের নাম।
বাগ ২ · “Fraud-এ accuracy ৯৯%, তবু ক্ষতি কমেনি”
এটি প্রায়ই একটি আলাপ হিসেবে আসে। নিচে একটি কাল্পনিক আলাপ, প্রতিটি ধাপে থেমে নিজের উত্তর আগে ভাবুন।
| বক্তা | |
| যা দেখা হচ্ছে |
- প্রশ্ন। ইচ্ছা করেই অসম্পূর্ণ। ৯৯% সংখ্যাটি একটি ফাঁদ; আগে জানতে হবে ডেটার গড়ন।
- তথ্য চাওয়া। দুটি প্রশ্নই উত্তর বদলায়: হার জানলে baseline, দাম জানলে threshold.
- তথ্য। ১%-এর কম ভুয়া মানে accuracy প্রায় অর্থহীন। দামের অনুপাত ১৫ : ১.
- Baseline. প্রথম কাজ প্রমাণ দেখা, সমাধান নয়। পর্ব ৬০-এ Dummy ৯৮.১%, model ৯৮.৩%, অথচ Dummy একটিও ভুয়া ধরে না।
- Threshold আর metric. শর্তটি (“calibrated হলে”) বলা হলো, এটিই শক্ত উত্তরের চিহ্ন। Model বদলানোর আগে সিদ্ধান্তের নিয়ম বদলানো।
- চাপ। বাস্তবের সীমা প্রায় সবসময় আসে: মানুষের সময়, খরচ বা latency.
- Capacity আর সময়। সীমা থাকলে প্রশ্নটি ranking-এর: শীর্ষ k-তে কতটি সত্যিই ভুয়া। আর সময় ধরে validation, কারণ প্রতিপক্ষ বদলায়।
বাগ ৩ · “Retrain-এর পরে model খারাপ হয়ে গেল”
উপসর্গ: প্রতি মাসে নতুন ডেটা জুড়ে retrain হয়। এবারের version-এ ফেরতের ঝুঁকি কম দেখাচ্ছে, আর পরে দেখা গেল অনেক ফেরত ধরা পড়েনি। সম্ভাব্য কারণ অনেক: নতুন ডেটার একটি কলাম ভাঙা, label-এর সংজ্ঞা বদল, ভিন্ন seed বা version, আসল concept drift. একটি প্রায়ই উপেক্ষিত কারণ অপরিপক্ব label: শেষ মাসের অনেক ফেরত তখনো খাতায় ওঠেনি (label delay), তাই সেগুলো “ফেরত নয়” হয়ে training-এ ঢুকেছে।
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import recall_score
rng = np.random.default_rng(42)
def orders(n): # fictional orders: 3 features, ~15% returned
X = rng.normal(size=(n, 3))
p = 1 / (1 + np.exp(-(-2.0 + 1.2 * X[:, 0] + 0.8 * X[:, 1])))
return X, (rng.random(n) < p).astype(int)
X_old, y_old = orders(3000) # months 1-5: labels are final
X_new, y_new = orders(1000) # month 6: returns still arriving
seen = y_new.copy()
seen[rng.random(1000) < 0.6] = 0 # 60% of returns not recorded yet
X_test, y_test = orders(2000) # month 7, judged after labels mature
v1 = LogisticRegression().fit(X_old, y_old)
v2 = LogisticRegression().fit(np.vstack([X_old, X_new]), np.r_[y_old, seen])
print("true return rate in test :", round(y_test.mean(), 3))
for name, m in [("v1 (mature labels only)", v1), ("v2 (+ immature month) ", v2)]:
p = m.predict_proba(X_test)[:, 1]
print(f"{name}: mean predicted {p.mean():.3f} recall@0.2 {recall_score(y_test, p >= 0.2):.3f}")আসল আউটপুট (ব্রাউজারের Python, scikit-learn 1.8.0):
true return rate in test : 0.213
v1 (mature labels only): mean predicted 0.188 recall@0.2 0.697
v2 (+ immature month) : mean predicted 0.161 recall@0.2 0.622
জগৎ বদলায়নি, তিনটি সময়ের অর্ডার একই নিয়মে বানানো। তবু v2 ফেরতের গড় সম্ভাবনা ০.১৬১ বলে, আসল হার ০.২১৩; আর একই threshold-এ recall ০.৬৯৭ থেকে ০.৬২২-এ নামে। কারণ শুধু খাতা: শেষ মাসের ৬০% ফেরত তখনো “ফেরত নয়” লেখা ছিল। সমাধান: label পাকার সময়সীমা ঠিক করা (যেমন ৩০ দিনের কম পুরোনো অর্ডার training-এ নয়), নতুন version-কে পুরোনোর সাথে একই পাকা holdout-এ তুলনা, আর পাস না করলে deploy নয়, rollback প্রস্তুত। পর্ব ৭৪-এর retrain নিয়মগুলো এই কারণেই লেখা।
প্র ২২“আমাদের model হঠাৎ খারাপ করছে” শুনে প্রথম ৩০ মিনিটে কী কী দেখবেন? (মাঝারি)
দুর্বল উত্তর: “নতুন ডেটায় retrain করে দেব।” কেন দুর্বল: কারণ না জেনে retrain ভাঙা ডেটাকেও শিখিয়ে ফেলতে পারে।
শক্ত উত্তর: সস্তা থেকে দামি: (১) ব্যবস্থা: job চলেছে কি, কোন model version চলছে, কোনো dependency বদলেছে কি; (২) ডেটা: কোনো কলাম হঠাৎ ফাঁকা বা এককে বদল (টাকা থেকে পয়সা), missing-এর হার; (৩) অনুমানের বণ্টন: ঝুঁকিপূর্ণ বলা অর্ডারের ভাগ হঠাৎ বদলেছে কি (prediction drift); (৪) input-এর drift, PSI বা KS দিয়ে; (৫) label এলে অংশভিত্তিক মান। কোন সময় থেকে শুরু, তা খুঁজে সেই সময়ের deploy বা ডেটার পরিবর্তনের সাথে মেলান। তারপর সিদ্ধান্ত: আগের version-এ rollback, ডেটা ঠিক করা, না retrain. রিভিশন: পর্ব ৭৪.
৬ · আধুনিক AI — embedding, token, attention, RAG আর pretrained model
রিভিশন: পর্ব ৩৩, পর্ব ৬৮, পর্ব ৬৯, পর্ব ৭০, পর্ব ৭১
প্র ২৩Embedding কী, আর vector search কীভাবে কাজ করে? লক্ষ লক্ষ নথিতে কী বদলায়? (মাঝারি)
দুর্বল উত্তর: “Embedding শব্দের অর্থ বোঝে, তাই ঠিক উত্তর খুঁজে দেয়।” কেন দুর্বল: “বোঝে” একটি দাবি; আর কতটা ঠিক, তা মাপা হয়নি।
শক্ত উত্তর: Embedding একটি লেখাকে কয়েকশো ঘরের dense vector-এ আনে, এমনভাবে শেখানো যে একই প্রসঙ্গের লেখা কাছাকাছি থাকে। খোঁজা মানে প্রশ্নের vector-এর সাথে সব vector-এর cosine similarity; সারি normalise করলে cosine মানে শুধু dot product, তাই একটি matrix গুণ। লক্ষ নথিতে brute force-এর memory আর সময় বাড়ে (১০ লাখ × ৩৮৪ float32 = ১.৫৩৬ GB), তখন ANN index, যেমন HNSW বা IVF: অনেক দ্রুত, কিন্তু সবসময় সঠিক কাছেরটি দেয় না। কোর্সে গুচ্ছবদ্ধ ডেটায় HNSW-এর recall@10 ০.৯৮২, গুচ্ছহীন এলোমেলো vector-এ একই সেটিংয়ে ০.১৪৪. তাই নিজের ডেটায় recall@k মাপুন; ক্যাপস্টোনে e5-small (০.৫৬৭) char TF-IDF-কে (০.৫৩৩) সামান্যই ছাড়িয়েছিল। রিভিশন: পর্ব ৬৯.
import numpy as np
rng = np.random.default_rng(42)
E = rng.normal(size=(10_000, 64)).astype(np.float32) # stand-in for 10,000 review embeddings
E /= np.linalg.norm(E, axis=1, keepdims=True) # unit length: cosine = dot product
q = E[1234] + 0.1 * rng.normal(size=64).astype(np.float32) # a query close to review 1234
q /= np.linalg.norm(q)
scores = E @ q # 10,000 dot products in one step
k = 5
top = np.argpartition(-scores, k)[:k] # the 5 best, unsorted, no full sort
top = top[np.argsort(-scores[top])] # sort only those 5
full = np.argsort(-scores)[:k] # check against a full sort
print("top-5 ids :", top.tolist())
print("cosine :", [round(float(v), 3) for v in scores[top]])
print("same as full sort:", bool((top == full).all()))
print(f"memory, 1M x 384 float32: {1_000_000 * 384 * 4 / 1e9:.3f} GB")আসল আউটপুট (ব্রাউজারের Python, numpy 2.4.6):
top-5 ids : [1234, 3002, 2552, 7547, 2262]
cosine : [0.76, 0.47, 0.437, 0.402, 0.398]
same as full sort: True
memory, 1M x 384 float32: 1.536 GB
এখানে vector-গুলো এলোমেলো, শুধু যন্ত্রটি দেখাতে; আসল embedding আসে একটি model থেকে। প্রশ্নটি ১২৩৪ নম্বরের কাছে বানানো, তাই সেটিই প্রথম (cosine ০.৭৬), বাকিরা অনেক দূরে। argpartition পুরো ১০,০০০টি না সাজিয়ে শুধু সেরা ৫টি আলাদা করে, আর ফল পুরো সাজানোর সাথে হুবহু মেলে (True). শেষ লাইন brute force-এর memory-র হিসাব, যেখান থেকে ANN-এর প্রশ্ন আসে।
প্র ২৪Token কী, আর বাংলায় একই কথা লিখলে খরচ বা সীমা কেন বদলাতে পারে? (সহজ)
দুর্বল উত্তর: “Token মানে শব্দ।” কেন দুর্বল: প্রায়ই শব্দের টুকরো, আর টুকরোর মাপ ভাষাভেদে খুব আলাদা।
শক্ত উত্তর: Token হলো tokenizer-এর ভাঙা একক: শব্দ, শব্দাংশ বা byte. Model পড়ে, লেখে আর দাম ধরে token-এ, আর context window-ও token-এ মাপা। Tokenizer যে ভাষার লেখায় বেশি শেখানো, সেখানে টুকরো বড়, অন্য ভাষায় ছোট। কোর্সে একই অর্থের একটি বাক্যে ইংরেজিতে ১৪টি token, বাংলায় একটি tokenizer-এ ৬১টি, আরেকটিতে ১৮টি। ফল: বাংলায় একই কাজে বেশি খরচ, কম লেখা context-এ ধরে, আর হয়তো ধীর। তাই model বাছার সময় নিজের লেখায় token গুনে দেখুন। রিভিশন: পর্ব ৭০.
প্র ২৫Attention ধারণা হিসেবে কী করে? (মাঝারি)
দুর্বল উত্তর: “Model গুরুত্বপূর্ণ শব্দে মনোযোগ দেয়, মানুষের মতো।” কেন দুর্বল: রূপক মাত্র; কী হিসাব হয়, তা নেই।
শক্ত উত্তর: প্রতিটি token থেকে তিনটি vector: query (কী খুঁজছি), key (আমার কাছে কী আছে), value (যা দেব)। একটি token-এর query সব key-এর সাথে dot product, √dk দিয়ে ভাগ (dk হলো key-এর মাত্রা; ভাগ না করলে বড় মাত্রায় softmax খুব খাড়া হয়), তারপর softmax দিয়ে ওজন, আর value-গুলোর ওজনসহ যোগ। ফলে প্রতিটি token-এর নতুন রূপ প্রসঙ্গ মেশানো। লেখা তৈরির model-এ causal mask ভবিষ্যতের token দেখা বন্ধ রাখে। ধারণাটি Vaswani ও সহকর্মীদের ২০১৭ সালের Transformer প্রবন্ধে কেন্দ্রীয়। নিচের ব্লক তিনটি token-এ পুরো হিসাবটি দেখায়। রিভিশন: পর্ব ৭০.
import numpy as np
np.set_printoptions(precision=3, suppress=True)
# 3 tokens, d_k = 2 (tiny hand-made vectors, only to see the mechanics)
Q = np.array([[1.0, 0.0], [0.0, 1.0], [1.0, 1.0]])
K = np.array([[1.0, 0.0], [0.0, 1.0], [1.0, 1.0]])
V = np.array([[10.0, 0.0], [0.0, 10.0], [5.0, 5.0]])
S = Q @ K.T / np.sqrt(K.shape[1]) # similarity of every query with every key
mask = np.triu(np.ones((3, 3), dtype=bool), k=1) # causal: a token may not see later tokens
S[mask] = -np.inf
W = np.exp(S - S.max(axis=1, keepdims=True))
W /= W.sum(axis=1, keepdims=True) # softmax, row by row
print("scores (masked):\n", S)
print("weights (each row sums to 1):\n", W)
print("output = weights @ V:\n", W @ V)আসল আউটপুট (ব্রাউজারের Python, numpy 2.4.6):
scores (masked):
[[0.707 -inf -inf]
[0. 0.707 -inf]
[0.707 0.707 1.414]]
weights (each row sums to 1):
[[1. 0. 0. ]
[0.33 0.67 0. ]
[0.248 0.248 0.503]]
output = weights @ V:
[[10. 0. ]
[ 3.302 6.698]
[ 5. 5. ]]
প্রথম token শুধু নিজেকে দেখতে পারে, তাই ওজন [1, 0, 0] আর ফল তার নিজের value. দ্বিতীয়টির query নিজের key-এর সাথে বেশি মেলে (০.৭০৭ বনাম ০), তাই ওজন ০.৩৩ আর ০.৬৭. তৃতীয়টি তিনটিই দেখে; নিজের key-এর সাথে মিল সবচেয়ে বেশি (১.৪১৪), তাই প্রায় অর্ধেক ওজন নিজের। -inf-এর exp শূন্য, তাই mask করা ঘর ওজন পায় না। আসল model-এ Q, K, V শেখা matrix দিয়ে বানানো, আর এমন অনেক “head” পাশাপাশি চলে।
প্র ২৬LLM কেন hallucinate করে? RAG কী সারায়, কী সারায় না? (মাঝারি)
দুর্বল উত্তর: “RAG দিলে hallucination শেষ।” কেন দুর্বল: খোঁজা ভুল হলে, বা model খুঁজে আনা লেখা না মানলে, ভুল থেকেই যায়।
শক্ত উত্তর: প্রশিক্ষণের লক্ষ্য সম্ভাব্য পরের token, সত্য লেখা নয়; তাই সাবলীল কিন্তু ভুল লেখা আসতে পারে: hallucination. RAG প্রাসঙ্গিক নথি খুঁজে prompt-এ দেয়, ফলে উত্তর হালনাগাদ তথ্যে বাঁধা যায় আর উৎস দেখানো যায়। যা সারায় না: খোঁজার ভুল (প্র ২৩-এর recall), নথির নিজের ভুল, নথি থাকা সত্ত্বেও ভুল সারাংশ, আর খুঁজে আনা লেখায় লুকোনো নির্দেশ, অর্থাৎ prompt injection. তাই মাপুন দুই স্তরে: খোঁজা (recall@k) আর উত্তর (উৎসের সাথে মেলে কি না), নথিকে ডেটা হিসেবে আলাদা রাখুন, আর উত্তর না পেলে “জানি না” বলার নিয়ম। রিভিশন: পর্ব ৭০, পর্ব ৪৮.
প্র ২৭একটি কাজের জন্য pretrained model কীভাবে বাছবেন আর মূল্যায়ন করবেন? (কঠিন)
দুর্বল উত্তর: “Hub-এ যেটার download সবচেয়ে বেশি, সেটা।” কেন দুর্বল: জনপ্রিয়তা আপনার ভাষা, ডেটা বা licence-এর প্রমাণ নয়।
শক্ত উত্তর: ধাপে: (১) model card পড়া: কোন ডেটায় শেখা, বাংলা আছে কি, কী মাপা হয়েছে, জানা সীমা; (২) licence আর ওজনের ফরম্যাট (প্র ২৮); (৩) আকার, CPU-তে গতি আর খরচ; (৪) নিজের তালাবন্ধ test-এ, একই metric-এ, একটি সরল baseline-এর পাশে মাপা; (৫) কঠিন অংশে আলাদা মাপ: Banglish, “খারাপ না”, ব্যঙ্গ; (৬) revision (commit hash) pin করা, যাতে ফল পুনরুৎপাদনযোগ্য হয়। সৎ ফলটি মনে রাখুন: পর্ব ৭১-এ pretrained ০.৬৪২, TF-IDF ০.৭০০, আর ভেতরের vector-এর ওপর logistic regression ০.৭৪৯, তবে ২০টি রিভিউয়ে এ পার্থক্য দুর্বল প্রমাণ। পথ তিনটি: যেমন আছে, vector-কে feature বানিয়ে, বা fine-tune. রিভিশন: পর্ব ৭১.
প্র ২৮একটি model-এর licence cc-by-nc-4.0, ওজন .bin ফাইলে। দোকানের পণ্যে ব্যবহার করবেন? (মাঝারি)
দুর্বল উত্তর: “Hub-এ খোলা আছে, তাই free.” কেন দুর্বল: নামানো যায় মানেই যেকোনো কাজে ব্যবহারের অনুমতি নয়।
শক্ত উত্তর: দুটি আলাদা ঝুঁকি। Licence: “nc” মানে non-commercial; একটি দোকানের পণ্যে তা সাধারণত চলে না (non-commercial licence). MIT বা Apache-2.0-এর মতো permissive licence-এও শর্ত আছে, যেমন notice রাখা; আর কিছু model-এর নিজস্ব licence-এ ব্যবহারের সীমা থাকে। নামের বদলে শর্ত পড়ুন, আর সন্দেহ হলে আইনি পরামর্শ নিন। নিরাপত্তা: .bin সাধারণত pickle-ভিত্তিক, খোলার সময় কোড চলতে পারে; safetensors-এ শুধু header আর সংখ্যা। উত্তর: “এই model নয়; একই মাপে licence-মেলানো বিকল্প খুঁজব, safetensors-এ, revision pin করে।” রিভিশন: পর্ব ৭১, পর্ব ৬৪.
৭ · দায়িত্বশীল AI — fairness-এর দ্বন্দ্ব, proxy, গোপনীয়তা আর নথি
রিভিশন: পর্ব ০৬, পর্ব ৭২ · দায়িত্বশীল AI-এর অভ্যাস
প্র ২৯একটি score দুই দলেই calibrated, অথচ এক দলের false positive rate অনেক বেশি। এটা কীভাবে সম্ভব, আর কী করবেন? (কঠিন)
দুর্বল উত্তর: “তাহলে model-এ bug আছে, ঠিক করলেই সব মাপ মিলবে।” কেন দুর্বল: দুই দলের base rate আলাদা হলে, নিখুঁত নয় এমন model-এ সব মাপ একসাথে মেলানো গাণিতিকভাবে সম্ভব নয়।
শক্ত উত্তর: Kleinberg ও সহকর্মী (২০১৬) আর Chouldechova-র কাজ দেখায়: base rate আলাদা হলে দলের ভেতরে calibration আর সমান false positive ও false negative rate (equalised odds) একসাথে সাধারণত পাওয়া যায় না। তাই এটি মূল্যবোধের সিদ্ধান্ত: কোন ভুল কার ওপর বেশি ক্ষতি করে? ঋণ বা “পরে টাকা দিন”-এ সময়মতো দেওয়া মানুষকে ফিরিয়ে দেওয়াই বড় ক্ষতি হলে equal opportunity (TPR সমান) বেছে নেওয়া, সিদ্ধান্তটি লিখে রাখা, আর দাম মাপা। আর base rate-এর পার্থক্যটি নিজেই কি খাতার পক্ষপাত, তা জিজ্ঞেস করুন: পর্ব ৭২-এ নদীচরের “দেরি” আসলে courier-এর দেরি ছিল। নিচের ব্লক দ্বন্দ্বটি দেখায়। রিভিশন: পর্ব ৭২.
import numpy as np
rng = np.random.default_rng(42)
# Two fictional groups with different base rates; the score is calibrated in both by construction
groups = {"A": rng.beta(2, 5, 20_000), "B": rng.beta(4, 3, 20_000)}
print("group base calib(0.3-0.4) sel.rate FPR FNR")
for g, s in groups.items():
y = (rng.random(s.size) < s).astype(int) # outcome happens with probability = score
pred = s >= 0.5 # one shared threshold
band = (s >= 0.3) & (s < 0.4)
fpr = (pred & (y == 0)).sum() / (y == 0).sum()
fnr = (~pred & (y == 1)).sum() / (y == 1).sum()
print(f" {g} {y.mean():.3f} {y[band].mean():.3f} {pred.mean():.3f} "
f"{fpr:.3f} {fnr:.3f}")আসল আউটপুট (ব্রাউজারের Python, numpy 2.4.6):
group base calib(0.3-0.4) sel.rate FPR FNR
A 0.288 0.361 0.108 0.063 0.780
B 0.575 0.375 0.648 0.498 0.240
দুই দলেই score সৎ: ০.৩–০.৪ score-এর মানুষের মধ্যে ঘটনাটি ঘটেছে ০.৩৬১ (A) আর ০.৩৭৫ (B) হারে, অর্থাৎ দুই দলেই calibrated. কিন্তু base rate ০.২৮৮ বনাম ০.৫৭৫, তাই একই threshold-এ B দলের FPR ০.৪৯৮, A-র ০.০৬৩, আর A দলের FNR ০.৭৮০, B-র ০.২৪০. দলভেদে threshold বদলে FPR মেলানো যায়, তবে তখন একই score-এর দুজন মানুষ ভিন্ন সিদ্ধান্ত পান, যা নিজেই একটি নৈতিক ও আইনি প্রশ্ন। ইন্টারভিউতে এই trade-off-টি নাম ধরে বলাই প্রত্যাশিত, “সমাধান” নয়।
প্র ৩০“আমরা জেলা আর লিঙ্গের কলাম মুছে দিয়েছি, তাই model ন্যায্য।” কী বলবেন? (মাঝারি)
দুর্বল উত্তর: “ঠিক আছে, model আর দল দেখতে পায় না।” কেন দুর্বল: অন্য কলাম দলের তথ্য বহন করতে পারে।
শক্ত উত্তর: এটি “fairness through unawareness”, আর proxy থাকলে কাজ করে না: এলাকা-কোড, পণ্যের ধরন বা ফোনের মডেল দলের তথ্য বহন করে। পর্ব ৭২-এ জেলার কলাম মুছলে অনুমোদনের অনুপাত ০.৪০৫ থেকে মাত্র ০.৪৯০ হয়েছিল, কারণ দুটি area-তে নদীচরের ৯০% গ্রাহক। তাই দলের তথ্য মূল্যায়নের জন্য আলাদা করে রাখা (model-এর input নয়), দলভিত্তিক selection rate, TPR আর FPR মাপা, আর প্রতিকার যাচাই: re-weighting-এ TPR ফাঁক ০.৩৪৭ থেকে ০.০৯৩. রিভিশন: পর্ব ৭২.
প্র ৩১নাম আর ফোন নম্বর মুছে দিলে কি ডেটা anonymous হয়? Training ডেটায় গোপনীয়তা কীভাবে রক্ষা করবেন? (মাঝারি)
দুর্বল উত্তর: “হ্যাঁ, সরাসরি পরিচয় না থাকলেই anonymous.” কেন দুর্বল: কয়েকটি সাধারণ কলাম মিলেই মানুষকে চেনা যায়।
শক্ত উত্তর: জন্মসাল, এলাকা আর লিঙ্গের মতো quasi-identifier জুড়ে চেনা যায়; পর্ব ৭২-এর টেবিলে নাম মোছার পরেও ৪ জনের ৩ জনকে চেনা গেছে (k = ১). পথগুলো: data minimisation (যা লাগে না তা না নেওয়া), উদ্দেশ্যের সীমা আর সম্মতি, pseudonymisation, দলে মিলিয়ে k-anonymity, আর প্রকাশিত পরিসংখ্যানে differential privacy, যেখানে ε ছোট মানে বেশি গোপনীয়তা কিন্তু বেশি শব্দ (Laplace পদ্ধতিতে গড় ভুল ১/ε). আর চর্চার কথা: আসল গ্রাহকের ডেটা কখনো বাইরের AI tool-এ পেস্ট নয়, প্রবেশাধিকার সীমিত, মোছার নিয়ম। আইনের প্রশ্নে দেশের আইন আর আইনজ্ঞের পরামর্শ। রিভিশন: পর্ব ৭২.
প্র ৩২একটি model card-এ কী কী থাকবে, আর কে পড়বেন? (সহজ)
দুর্বল উত্তর: “Model-এর নাম আর accuracy.” কেন দুর্বল: কোথায় ব্যবহার চলবে না, কাদের ওপর খারাপ করে, তা না থাকলে card প্রায় অকেজো।
শক্ত উত্তর: Mitchell ও সহকর্মীদের (২০১৯) model card ধারণা মেনে: উদ্দেশ্য আর যেখানে ব্যবহার উচিত নয়; ডেটার উৎস আর সময় (সাথে Gebru ও সহকর্মীদের ধাঁচে datasheet); মূল্যায়নের ভাগ আর metric, অনিশ্চয়তাসহ; দলভিত্তিক ফল; জানা সীমা; version, তারিখ আর যোগাযোগ। দলভিত্তিক ফলের উদাহরণ ক্যাপস্টোনের test থেকে: বাংলা হরফের রিভিউয়ে ডেলিভারি-recall ০.৬৩৬ (n = ২২), রোমান হরফে ১.০০০ (n = ১৪). পাঠক: দলের engineer, পণ্যের দায়িত্বে থাকা মানুষ, নিরীক্ষক, আর ভবিষ্যতের আপনি। রিভিশন: পর্ব ৭২, পর্ব ৭৩.
৮ · ছোট design review — বাজারঘরের রিভিউ-triage আর তার নজরদারি
রিভিশন: পর্ব ৭৩ · ক্যাপস্টোন, পর্ব ৭৪ · AI প্রকল্পের জীবনচক্র, পর্ব ৬৭, পর্ব ৬৯, বড় পরিসরের নকশা: System Design · ধারণার প্রশ্ন
প্রশ্ন: “বাজারঘরে প্রতিদিন নতুন রিভিউ আসে। এমন একটি ব্যবস্থা নকশা করুন, যা ডেলিভারি আর মানের অভিযোগ ঠিক দলের কাছে পাঠায়।” এখানে বড় distributed system নয়, ML ব্যবস্থার শুরু থেকে শেষ চাওয়া হচ্ছে। ৩০ মিনিটের একটি কাঠামো:
ধাপ ১ · চাহিদা আর ভুলের দাম (৫ মিনিট)
প্রশ্ন করুন: দিনে কত রিভিউ? কত দ্রুত দলের কাছে পৌঁছাতে হবে (সেকেন্ডে না ঘণ্টায়)? কোন ভুল বেশি দামি? ধরা যাক উত্তর: দিনে কয়েকশো, এক ঘণ্টার মধ্যে হলেই চলে, আর ডেলিভারির অভিযোগ হারানো (false negative) একটি ভুল জায়গায় পাঠানোর চেয়ে খারাপ। তাহলে মূল মাপ ডেলিভারি-শ্রেণির recall, পাশে macro F1; আর ঘণ্টায় একবার batch চালালেই চলে, সেকেন্ডের API দরকার নেই।
ধাপ ২ · ডেটা, label আর ভাগ (৫ মিনিট)
আগে নকল বাদ, তারপর সময় দিয়ে ভাগ, কারণ ব্যবস্থাটি ভবিষ্যতের রিভিউয়ে চলবে। ক্যাপস্টোনে ৩০৭টি থেকে ২৮৩টি, আর চারটি প্রায়-নকলের দল জুলাইয়ের দুই পাশে ছিল, যা এলোমেলো ভাগে leakage হতো। Label-এর নির্দেশিকা লেখা, আর সন্দেহজনক label মানুষ দিয়ে আবার পড়া।
ধাপ ৩ · Baseline, model আর একটি রিভিউয়ের যাত্রা (১০ মিনিট)
Baseline: keyword নিয়ম আর Dummy. Model: word আর char TF-IDF সাথে কয়েকটি সংখ্যা, একটি pipeline-এ, আর linear model; সম্ভাবনার জন্য calibration. বড় pretrained model পরে, যদি তালাবন্ধ test-এ সত্যিই লাভ দেখায়। নিচের stepper একটি রিভিউয়ের পথ দেখায়; মানগুলো নকশার উদাহরণ, কোনো run-এর ফল নয়।
| ধাপ | |
| কী হয় | |
| এই রিভিউয়ে |
- গ্রহণ। রিভিউ একটি টেবিলে জমা হয়; ঘণ্টায় একবার batch job নতুনগুলো তোলে। Batch সরল, সস্তা, আর ব্যর্থ হলে আবার চালানো যায়।
- পরিষ্কার। Training-এর হুবহু একই function. আলাদা কোড হলে training-serving skew হয়, যা validation-এ ধরা পড়ে না।
- Feature. Training-এ fit করা pipeline, version আর package pin করা অবস্থায় load; নতুন করে কিছু শেখে না।
- দুটি model. একটি রিভিউ positive হয়েও ডেলিভারির অভিযোগ হতে পারে (“পণ্য দারুণ, শুধু দেরি”), তাই দুটি আলাদা প্রশ্ন।
- পাঠানোর নিয়ম। শেখা model-এর চারপাশে নিয়ম: আস্থা কম হলে মানুষ দেখেন। দুর্বল অংশে (বাংলা হরফে ডেলিভারি) সীমা নিচু রাখা, যাতে অভিযোগ না হারায়।
- কাছের রিভিউ। দলকে প্রসঙ্গ দেয়: একই সমস্যা আগে কবে এসেছিল। এর মান recall@3 দিয়ে মাপা।
- Log আর নজরদারি। প্রতিটি সিদ্ধান্তের হিসাব থাকে; দল যখন label ঠিক করেন, সেটি পরের মূল্যায়নের ডেটা হয়।
ধাপ ৪ · মূল্যায়ন আর চালুর পরিকল্পনা (৫ মিনিট)
তালাবন্ধ test একবার, bootstrap CI-সহ, আর লিপি ধরে আলাদা ফল। ক্যাপস্টোনের সৎ ফল উদাহরণ হিসেবে বলুন: sentiment ০.৯৩৬ [০.৮৭৭, ০.৯৮৬], issue ০.৮৮৪ [০.৮১৬, ০.৯৪৫], কিন্তু ডেলিভারি-recall CV-র ০.৯১ থেকে test-এ ০.৭৭৮, বাংলা হরফে ০.৬৩৬ (n = ২২). তাই চালু হবে shadow-এ: কয়েক সপ্তাহ model চলে, কিন্তু সিদ্ধান্ত মানুষই নেন; তুলনা মিললে ধীরে চালু।
ধাপ ৫ · Trade-off (৫ মিনিট)
| সিদ্ধান্ত | কেন | দাম বা ঝুঁকি |
|---|---|---|
| ঘণ্টায় batch, API নয় | চাহিদা এক ঘণ্টা; সরল আর সস্তা | জরুরি অভিযোগ এক ঘণ্টা দেরি |
| TF-IDF + linear model | দ্রুত, ব্যাখ্যা সহজ, CPU-তে চলে | ব্যঙ্গ আর জটিল না-বোধক ধরে না |
| অনিশ্চিত হলে মানুষ | দুর্বল অংশে অভিযোগ হারায় না | মানুষের সময়; queue-এর সীমা |
| সময় ধরে ভাগ | ভবিষ্যতের ওপর সৎ মাপ | ছোট test, চওড়া CI |
প্র ৩৩এই triage ব্যবস্থার নজরদারির পরিকল্পনা দিন। কী মাপবেন, কত ঘন ঘন, আর কখন কী করবেন? (কঠিন)
দুর্বল উত্তর: “প্রতি মাসে accuracy দেখব, কমলে retrain.” কেন দুর্বল: label দেরিতে আসে, তাই এক মাস অন্ধ; আর “কমলে” মানে কত, কে দেখবে, কিছুই নেই।
শক্ত উত্তর: চার স্তর, সস্তা থেকে দামি। ব্যবস্থা (প্রতি run): job চলেছে কি, কত রিভিউ, কত সময়। ডেটা (প্রতিদিন): ফাঁকা লেখা, লিপির ভাগ (হঠাৎ Banglish বাড়লে সতর্ক, কারণ সেখানে model দুর্বল), দৈর্ঘ্যের বণ্টন, PSI বা KS দিয়ে drift. অনুমান (প্রতিদিন): ডেলিভারি বলা রিভিউয়ের ভাগ আর আস্থার বণ্টন; হঠাৎ দ্বিগুণ হলে প্রায়ই কোনো input-এর ভুল। ফল (সাপ্তাহিক): দল যে রিভিউ হাতে ঠিক করেন, তা থেকে ডেলিভারি-recall, লিপি ধরে আলাদা; সাথে প্রতি সপ্তাহে কিছু এলোমেলো রিভিউ মানুষ দিয়ে label, যাতে শুধু ভুলগুলোই না দেখা হয়। প্রতিটি সতর্কতার একজন মালিক আর লেখা নিয়ম: যেমন দুই সপ্তাহ পরপর recall একটি সীমার নিচে হলে কারণ খোঁজা, তারপর পাকা label-এ retrain, পুরোনো version-এর সাথে একই holdout-এ তুলনা, আর rollback প্রস্তুত। ঈদের মতো প্রত্যাশিত বদলের পাশে “প্রত্যাশিত” লেখা থাকবে। রিভিশন: পর্ব ৭৪.
প্র ৩৪“সব বাদ দিয়ে একটি LLM-কে prompt দিলেই তো হয়।” কী বলবেন? (মাঝারি)
দুর্বল উত্তর: “হ্যাঁ, LLM সব পারে,” অথবা “না, LLM অবিশ্বস্ত।” কেন দুর্বল: দুটিই মাপ ছাড়া রায়।
শক্ত উত্তর: “একটি বিকল্প হিসেবে একই তালাবন্ধ test-এ মাপব: ডেলিভারি-recall, লিপি ধরে, আর একই রিভিউয়ে বারবার একই উত্তর আসে কি না। পাশে খরচ (বাংলায় token বেশি), latency, গ্রাহকের লেখা বাইরের সেবায় পাঠানোর গোপনীয়তা, আর রিভিউয়ের ভেতরের লেখা দিয়ে prompt injection-এর ঝুঁকি। যদি লাভ স্পষ্ট হয়, হয়তো শুধু অনিশ্চিত রিভিউগুলো LLM-এ পাঠানো যায়।” এভাবে বললে দেখায় আপনি প্রযুক্তি নয়, প্রমাণ বাছেন। রিভিশন: পর্ব ৭০, পর্ব ৭১.
৯ · আচরণগত প্রশ্ন, STAR আর নিজের প্রকল্প নিয়ে কথা
রিভিশন: পর্ব ৭৩ · ক্যাপস্টোন, পর্ব ৭৪, পাশের ট্র্যাক: Software engineering ইন্টারভিউ
আচরণগত প্রশ্নে STAR কাঠামো কাজে দেয়: Situation (পরিস্থিতি), Task (আপনার দায়িত্ব), Action (আপনি নিজে কী করলেন), Result (ফল, সম্ভব হলে সংখ্যায়)। শেষে একটি শিক্ষা। দুই মিনিটের মধ্যে রাখুন। চাকরির অভিজ্ঞতা না থাকলে নিজের প্রকল্পই আপনার ঘটনা, আর তা সম্পূর্ণ বৈধ। ML-এর গল্পে একটি বাড়তি গুণ খোঁজা হয়: খারাপ সংখ্যা লুকাননি তো?
সততার নিয়ম: নিচের উত্তরগুলো এই কোর্সের ক্যাপস্টোন (পর্ব ৭৩) আর পর্ব ৭৪-এর reference প্রকল্পে সত্যিই যা ঘটেছে, তার সংখ্যা দিয়ে লেখা, শুধু কাঠামো দেখাতে। আপনি নিজে প্রকল্পটি করে থাকলে নিজের run-এর সংখ্যা বলুন; নিজে যা করেননি, তা বলবেন না। কোনো ব্যবসায়িক ফল (“বিক্রি ২০% বাড়িয়েছি”) কাল্পনিক ডেটার প্রকল্পে দাবি করা যায় না। অন্যের, internet-এর বা AI-এর বানানো গল্প ফলো-আপের দ্বিতীয় প্রশ্নেই ভাঙে।
প্র ৩৫“এমন একটি সময়ের কথা বলুন, যখন আপনার model প্রত্যাশার চেয়ে খারাপ করেছে।” (মাঝারি)
দুর্বল উত্তর: “আমার model সবসময় ভালো করেছে,” অথবা খারাপ ফল নিয়ে চুপ থেকে শুধু সেরা সংখ্যা বলা।
শক্ত উত্তর: S: “বাংলা আর Banglish রিভিউয়ের একটি প্রকল্পে ডেলিভারির অভিযোগ ধরা ছিল মূল কাজ।” T: “Test একবারই খোলার নিয়ম ছিল; ফল যা আসে, তা সৎভাবে রিপোর্ট করা আমার দায়িত্ব।” A: “Cross-validation-এ ডেলিভারি-recall ছিল ০.৯১. সময় ধরে রাখা ৯০টি রিভিউয়ের test-এ তা এল ০.৭৭৮. লিপি ধরে ভাগ করে দেখলাম বাংলা হরফের রিভিউয়ে ০.৬৩৬, যদিও সেখানে মাত্র ২২টি ডেলিভারি রিভিউ। Test দেখে model বদলাইনি, কারণ তাহলে test আর সৎ থাকত না।” R: “Model card-এ সংখ্যাটি CI আর n-সহ লিখেছি, পরের ধাপ লিখেছি: বেশি বাংলা হরফের ডেলিভারি রিভিউ, আর নতুন মাসের test.” শিক্ষা: “গড় সংখ্যা দুর্বল অংশ লুকায়, তাই এখন আগে থেকেই অংশভিত্তিক মাপ ঠিক করি।” রিভিশন: পর্ব ৭৩.
প্র ৩৬“ডেটার মানের একটি সমস্যার কথা বলুন।” (মাঝারি)
দুর্বল উত্তর: “ডেটা পরিষ্কার করেছিলাম, null বাদ দিয়েছিলাম।” কেন দুর্বল: কী সমস্যা, কেন জরুরি, কী বদলাল, কিছুই নেই।
শক্ত উত্তর: S: “রিভিউয়ের ডেটায় কিছু লেখা প্রায় হুবহু দুবার ছিল।” T: “ভাগের আগে নকল খোঁজা আমার কাজ, কারণ নকল দুই দিকে পড়লে model মুখস্থ জিনিসে নম্বর পায়।” A: “লেখা পরিষ্কার করে হুবহু আর প্রায়-নকল খুঁজলাম; ৩০৭টি থেকে ২৮৩টি থাকল। চারটি নকলের দল সময়ের ভাগের দুই পাশে ছিল। তারপর যে model সারিটি দেখেনি, সে নিজের label-কে কম সম্ভাবনা দিলে সেই সারি হাতে পড়লাম, আর কয়েকটি ভুল label ঠিক করলাম, প্রতিটি কারণসহ খাতায়।” R: “Leakage ঢোকার আগেই বন্ধ হলো, আর cleaning log-এ প্রতিটি সিদ্ধান্ত আছে।” শিক্ষা: “ভাগের আগে নকল, আর মানুষের label-ও ভুল হয়।” রিভিশন: পর্ব ৭৩, পর্ব ৬২.
প্র ৩৭“একটি ধারণা, যা কাজ করেনি।” (সহজ)
দুর্বল উত্তর: “সব ধারণাই কাজ করেছে।”
শক্ত উত্তর: S: “না-বোধক রিভিউ (‘ভালো না’) model ভুল করছিল।” T: “Bigram যোগ করলে লাভ হবে কি না, তা প্রমাণসহ ঠিক করা।” A: “একই fold-এ unigram আর bigram তুলনা করলাম, জোড়া ধরে। Sentiment-এ পার্থক্য −০.০০৫, issue-এ −০.০০৩; উন্নতির চেয়ে অবনতি বেশি fold-এ।” R: “Bigram বাদ দিলাম, আর কারণটি খাতায় লিখলাম: ‘প্রমাণ নেই।’ যে ধারণা আমার কাছে যুক্তিসংগত মনে হয়েছিল, ডেটা তা সমর্থন করেনি।” শিক্ষা: “বিশ্বাস নয়, একই fold-এ জোড়া তুলনা।” রিভিশন: পর্ব ৭৩, পর্ব ৬৬.
প্র ৩৮“কখনো জটিল সমাধানের বদলে সরলটি বেছেছেন?” (মাঝারি)
দুর্বল উত্তর: “সবসময় সবচেয়ে আধুনিক model নিই।”
শক্ত উত্তর: S: “ফেরত-ঝুঁকির একটি অনুশীলনী প্রকল্পে তিনটি পথ পাশাপাশি মেপেছিলাম।” T: “কোনটি চালু হওয়ার যোগ্য, তা ঠিক করা।” A: “একই validation-এ: সরল নিয়ম AUC ০.৭০৫, logistic regression ০.৭৮২, গভীর decision tree ০.৬৯৮. প্রতিটি run-এর seed, config আর ডেটার version খাতায় রাখলাম।” R: “Logistic regression বেছেছি: সবচেয়ে ভালো, ব্যাখ্যা সহজ, আর জটিল tree নিয়মের কাছেও হেরেছিল।” আরেকটি উদাহরণ চাইলে: pretrained sentiment model-এর macro F1 ০.৬৪২, TF-IDF classifier-এর ০.৭০০, তাই সেখানেও সরলটি; আর একটি model-এর licence non-commercial হওয়ায় দোকানে বাদ। রিভিশন: পর্ব ৭৪, পর্ব ৭১.
প্রকল্প নিয়ে কীভাবে কথা বলবেন
“আপনার প্রকল্পটি দেখান” শুনলে feature-এর তালিকা নয়, তিন মিনিটের একটি গল্প, এই ক্রমে:
- সমস্যা আর সিদ্ধান্ত, এক বাক্যে: “নতুন রিভিউ থেকে ডেলিভারির অভিযোগ ঠিক দলের কাছে পাঠানো।”
- ডেটা আর ভাগ: কোথা থেকে, কত সারি, নকল আর ভুল label কী করলেন, কেন সময় ধরে ভাগ। কাল্পনিক ডেটা হলে তা প্রথমেই বলুন।
- Baseline আর দুটি সিদ্ধান্ত: কী চেষ্টা করলেন, কী বাদ দিলেন, প্রমাণসহ।
- সৎ ফল: তালাবন্ধ test-এর সংখ্যা, CI আর অংশভিত্তিক ফল, দুর্বল অংশসহ।
- সীমা আর পরের ধাপ: model card-এর “জানা সীমা”, আর কীভাবে উন্নত করবেন।
যেকোনো লাইন দেখিয়ে “এটা কেন?” জিজ্ঞেস করা হতে পারে; ব্যাখ্যা করতে পারলে তবেই সেটি আপনার কাজ। Repo-তে কোনো secret, token বা আসল মানুষের ডেটা রাখবেন না, আর README-তে চালানোর ধাপ আর version দিন, যাতে নতুন clone-এ একই সংখ্যা আসে।
ইন্টারভিউয়ারকে আপনার প্রশ্ন
- একটি model idea থেকে চালু হওয়া পর্যন্ত পথে কোন কোন review আর যাচাই হয়?
- চালু model-এর মান কীভাবে মাপা হয়, আর label কত দেরিতে আসে?
- Label কারা দেন, আর তাঁদের নির্দেশিকা কেমন?
- শেষ যে model খারাপ করেছিল, তা কীভাবে ধরা পড়ল আর পরে কী বদলাল?
- Fairness আর গোপনীয়তার যাচাই কার দায়িত্বে, আর কোন পর্যায়ে হয়?
- নতুন কেউ এলে প্রথম তিন মাসে ভালো কাজ কেমন দেখায়?
১০ · শেষ সপ্তাহের পরিকল্পনা, অভিনন্দন আর পরের পথ
পুরো কোর্সের মানচিত্র: কোর্স হোম
ইন্টারভিউর আগের সাত দিন
| দিন | কাজ | কোথায় |
|---|---|---|
| ১ | Job description পড়ে অংশ বাছা; অংশ ১–২-এর প্রশ্ন জোরে বলা | পর্ব ০১–০৬, ৩৯–৪৯ |
| ২ | Bayes আর metric: base rate, threshold, PR বনাম ROC হাতে হিসাব | পর্ব ৫০, ৬০, ৭৫ |
| ৩ | Leakage, CV, calibration: এই পাতার চারটি ব্লক আবার চালিয়ে ফল নিজের ভাষায় বলা | পর্ব ৫৬, ৬১, ৬৬ |
| ৪ | Python আর pandas-এর live coding, ঘড়ি ধরে | পর্ব ৭৮ |
| ৫ | আধুনিক AI আর দায়িত্বশীল AI; একটি model card পড়ে সমালোচনা | পর্ব ৬৯–৭২ |
| ৬ | একটি design review ৩০ মিনিটে, আর নজরদারির পরিকল্পনা জোরে বলা | পর্ব ৭৩, ৭৪ |
| ৭ | দুটি STAR গল্প, প্রকল্পের ৩ মিনিটের গল্প; internet আর ক্যামেরা পরীক্ষা; নতুন কিছু নয় | অংশ ৯ |
আপনি ৭৯টি পর্ব পেরিয়ে এসেছেন। AI-এর মানচিত্র থেকে শুরু করে Python-এর কাজের পরিবেশ, NumPy আর pandas, chart, গণিত, search আর logic, সম্ভাবনা, ডেটা থেকে শেখা, scikit-learn-এর কাজের ধারা, আধুনিক AI, আর শেষে একটি পূর্ণ প্রকল্প আর তার জীবনচক্র। সবচেয়ে বড় অর্জন কোনো library-র নাম নয়, একটি অভ্যাস: একটি ভালো সংখ্যা দেখলেই জিজ্ঞেস করা, “কার সাথে তুলনা? কোন ভাগে মাপা? কোন অংশে খারাপ? আর চালুর পরে আমরা কীভাবে জানব?” ডাক্তার যেমন একটি রিপোর্টে থামেন না, আপনিও একটি metric-এ থামবেন না।
এরপর কী করবেন
- ক্যাপস্টোন শেষ করুন বা নিজের একটি প্রকল্প বানান, নিজের প্রশ্নে, প্রকাশ্য ডেটা বা নিজের তৈরি ডেটায়; একই শৃঙ্খলা: baseline, তালাবন্ধ test, model card (পর্ব ৭৩)।
- মডিউল ১৪-এর বাকি পাতা: পর্ব ৭৫-এর numerical, পর্ব ৭৬-এর MCQ, পর্ব ৭৭-এর লিখিত ও মৌখিক প্রশ্ন, আর পর্ব ৭৮-এর Python ও ডেটার ইন্টারভিউ, পাশাপাশি।
- ABCL TECH-এর পরের AI কোর্স (প্রস্তুত হচ্ছে): machine learning, deep learning, NLP, generative AI, MLOps আর AI ethics. এই কোর্সের প্রতিটি মডিউল সেগুলোর ভিত্তি।
- পাশের সম্পূর্ণ কোর্স: Python প্রোগ্রামিং, DSA, DBMS আর SQL, System Design, Software Engineering আর Git.
- Primary source পড়ার অভ্যাস: নিজের version-এর official docs, model card, আর প্রকাশিত প্রবন্ধ; কোনো দাবি শুনলে মূল উৎস খোঁজা।
এই কোর্স বা এই পাতা কোনো চাকরির নিশ্চয়তা দেয় না; নিয়োগ নির্ভর করে অনেক কিছুর ওপর, যার অনেকটাই আপনার হাতে নেই। যা আপনার হাতে আছে, তা হলো যাচাই করা যায় এমন কাজ, আর সেটি সৎভাবে, সীমাসহ বলতে পারা। সেটুকু এখন আপনার কাছে আছে।
AI-এর যুগে AI ইন্টারভিউর প্রস্তুতি
AI assistant একজন ধৈর্যশীল নকল ইন্টারভিউয়ার হতে পারে, কিন্তু এই বিষয়ে তার ভুলগুলো পরিচিত। সে প্রায়ই পুরোনো API দেয় (pandas-এর append, NumPy-র np.float), না-থাকা function বা parameter বানায়, ভাগের আগে scaler বা feature বাছাই fit করে test-এর তথ্য ফাঁস করে, training set-এ metric রিপোর্ট করে, warning চেপে রাখে, আর বিশ্বাসযোগ্য কিন্তু ভুল পরিসংখ্যান বা ইতিহাস বলে। মডেলের ক্ষমতা নিয়ে অতিরঞ্জনও করে। তাই তাকে উত্তর লিখতে না বলে, আপনাকে চেপে ধরতে বলুন।
আসল প্রতিষ্ঠানের ডেটা, কোড বা কোনো মানুষের তথ্য কখনো দেবেন না।
নিজেকে যাচাই করুন
ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।
ক্রম“Validation-এ ভালো, production-এ খারাপ” model-এর কারণ খোঁজার ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)
- দুই জায়গায় metric, threshold আর label-এর সংজ্ঞা একই কি না নিশ্চিত করা
- Validation-এর ভাগ production-এর মতো কি না দেখা: গ্রাহক, সময়, নকল
- Training আর production-এর input একই কোডে আর একই বণ্টনে কি না মাপা
- অংশ ধরে ভুল ভাগ করে দেখা: নতুন গ্রাহক, এলাকা, লিপি, মাস
- সমাধান করে নতুন সময়ের holdout-এ মাপা, আর নজরদারিতে একটি পাহারা যোগ করা
(মাঝারি) একটি রোগ-পরীক্ষা রোগীর ৯০% ক্ষেত্রে positive দেখায়, আর সুস্থ মানুষের ১০% ক্ষেত্রে ভুল করে positive দেখায়। জনগোষ্ঠীর ২% মানুষের রোগটি আছে। একজনের ফল positive এলে তাঁর রোগ থাকার সম্ভাবনা প্রায় কত?
- ০.৯০
- প্রায় ০.১৫৫
- ০.৫০
- ০.০১৮
(মাঝারি) ৮০টি সারি আর ২,০০০টি এলোমেলো কলামের ডেটায় label-ও এলোমেলো। কেউ আগে পুরো ডেটায় সেরা ২০টি কলাম বেছে তারপর ৫-fold cross-validation করে accuracy ০.৯১ পেলেন। কোনটি ঠিক?
- ২০টি কলামে আসল সংকেত আছে, তাই score ঠিক
- ১০-fold করলে সমস্যা মিটবে
- এটি leakage; বাছাই প্রতিটি fold-এর ভেতরে, pipeline-এ করতে হবে
- Logistic regression-এর বদলে random forest নিলে ঠিক হবে
(সহজ) একটি অনলাইন দোকানের অর্ডারের ১% ভুয়া। একটি model test-এ ৯৯.১% accuracy পেয়েছে। পরের সবচেয়ে কাজের পদক্ষেপ কোনটি?
- Accuracy ৯৯.৫% করতে আরও জটিল model নেওয়া
- ফলটি ভালো, তাই চালু করে দেওয়া
- শুধু ROC AUC দেখা
- DummyClassifier-এর সাথে তুলনা করে confusion matrix, recall আর average precision দেখা
(মাঝারি) একটি calibrated model ফেরতের সম্ভাবনা দেয়। একটি ফেরত ধরতে না পারার দাম ৳৪০০, অকারণ সতর্কতার দাম ৳৫০. কোন threshold-এর ওপরে সতর্ক করা উচিত?
- ০.৫
- প্রায় ০.১১১
- প্রায় ০.৮৮৯
- ০.১২৫
(কঠিন) GridSearchCV ১৬টি সেটিং খুঁজে best_score_ ০.৮২ দিল। একই ডেটায় এই পুরো খোঁজের সৎ মূল্যায়ন কীভাবে পাবেন?
- Nested cross-validation: বাইরের loop-এ cross_val_score(GridSearchCV, …)
- best_score_ ০.৮২-ই সৎ মূল্যায়ন
- সেরা model-এর training set-এর score দেখা
- প্রতিটি সেটিং test set-এ মেপে সেরাটি রিপোর্ট করা
(কঠিন) একটি ঝুঁকি-score দুটি দলেই calibrated. দল A-র base rate ০.২৯, দল B-র ০.৫৮. দুই দলে একই threshold ০.৫ ব্যবহার করলে সাধারণত কী দেখা যাবে?
- দুই দলের false positive rate সমান
- দুই দলেই calibration নষ্ট হবে
- B দলে false positive rate বেশি, A দলে false negative rate বেশি
- দুই দলে selection rate সমান
(মাঝারি) একটি LLM-ভিত্তিক সহায়কে RAG যোগ করা হলো: প্রশ্ন এলে দোকানের নীতির নথি খুঁজে prompt-এ দেওয়া হয়। কোন দাবিটি সঠিক?
- এখন আর কোনো hallucination হবে না
- উত্তর নথিতে বাঁধা আর উৎস দেখানো সহজ হয়, কিন্তু খোঁজার recall আর উত্তরের সঠিকতা আলাদা মাপতে হয়
- খুঁজে আনা নথি নিরাপদ, তাই prompt injection-এর ঝুঁকি কমে শূন্য
- RAG model-কে নতুন করে train করে
(সহজ) একজন প্রার্থীর প্রকল্পে cross-validation-এ একটি শ্রেণির recall ছিল ০.৯১, তালাবন্ধ test-এ এল ০.৭৮. “আপনার প্রকল্পের ফল বলুন” প্রশ্নে কোনটি সবচেয়ে ভালো?
- শুধু ০.৯১ বলা, কারণ সেটি ভালো দেখায়
- Test দেখে model বদলে আবার test চালিয়ে ভালো সংখ্যাটি বলা
- “Model ভালো হয়নি” বলে প্রসঙ্গ বদলানো
- দুটি সংখ্যাই বলা, কোন অংশে কমেছে আর n কত, আর পরের ধাপ কী
শব্দকোষ
লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন — অর্থ দেখাবে। এই পর্বের সব শব্দ এখানে একসাথে:
মনে রাখুন
- আগে প্রশ্ন, আদৌ ML লাগবে কি না: নিয়ম, search, নিজের ML, pretrained, এই ক্রমে ভাবুন।
- প্রতিটি সংখ্যার পাশে baseline, ভাগের নাম আর অনিশ্চয়তা; base rate ছাড়া precision বোঝা যায় না।
- যা কিছু ডেটা থেকে শেখে, তা শুধু train-এ, pipeline-এর ভেতরে; ভাগের একক production-এর একক।
- ক্রম ঠিক মানেই সম্ভাবনা ঠিক নয়: calibration আলাদা মাপুন, threshold আসে ভুলের দাম থেকে।
- Debugging-এ প্রমাণ আগে, সমাধান পরে; retrain-এর আগে label পেকেছে কি না দেখুন।
- আচরণগত প্রশ্নে শুধু নিজের সত্যি ঘটনা, খারাপ সংখ্যাসহ, STAR কাঠামোয়।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- AI-এর ভিত্তি আর Python for AI · কোর্স হোম৭৯টি পর্বপুরো রোডম্যাপ। যে মডিউলে দুর্বল মনে হলো, সেখানে ফিরে যান।
- পর্ব ৭৩ · ক্যাপস্টোনআবার করুনএই পাতার প্রায় প্রতিটি উত্তর এখানে একটি পূর্ণ প্রকল্পে জোড়া; আপনার STAR গল্পের উৎসও।
- পর্ব ৭৪ · AI প্রকল্পের জীবনচক্রনকশাসমস্যা বাছাই, deploy, drift আর retrain-এর নিয়ম, অংশ ৮-এর ভিত্তি।
- Python · কোডিং ইন্টারভিউপাশের ট্র্যাকPython-এ সমস্যা থেকে সমাধান, ধাপে ধাপে।
- DSA · কোডিং ইন্টারভিউপাশের ট্র্যাকপ্যাটার্ন ধরে algorithm-এর প্রশ্ন।
- System Design · ধারণার প্রশ্নপাশের ট্র্যাকবড় ব্যবস্থার নকশার আলাপে হাত ঝালাই।