Chapter 13 of 18
The four words every training log throws at you, untangled
Gradient & Gradient Descent চ্যাপ্টার batch, mini-batch, আর stochastic gradient descent-কে পরিচয় করিয়ে দিয়েছিল তিনটা উপায় হিসেবে যে প্রতিটা আপডেট ধাপে কতগুলো উদাহরণ তথ্য দেবে সেটা বেছে নেওয়ার। এই চ্যাপ্টারটা শব্দভাণ্ডারের উপর জুম করে — batch, mini-batch, iteration, আর epoch এই চারটা শব্দ প্রতিটা ট্রেনিং লগ আর প্রতিটা ফ্রেমওয়ার্কের ডকুমেন্টেশনে দেখা যায়, আর এদের গুলিয়ে ফেলা deep learning শুরু করা যেকারো জন্য সবচেয়ে সাধারণ বিভ্রান্তির উৎসগুলোর একটা।
একটা batch হলো একগুচ্ছ ট্রেনিং উদাহরণ যা একসাথে প্রসেস করা হয় মডেলের weight একবার আপডেট হওয়ার আগে। শব্দটার দুইটা সম্পর্কিত কিন্তু আলাদা ব্যবহার আছে যা স্পষ্টভাবে আলাদা করার মতো।
সবচেয়ে সংকীর্ণ অর্থে, "batch" মানে পুরো ট্রেনিং ডেটাসেট একসাথে ব্যবহার করা — এটাই "batch gradient descent" মানে, Gradient & Gradient Descent চ্যাপ্টার থেকে: প্রতিটা ট্রেনিং উদাহরণ জুড়ে loss আর gradient হিসাব করা, তারপর একটা আপডেট পদক্ষেপ নেওয়া। এই ব্যবহারে, ডেটার মধ্য দিয়ে একটা পুরো পাসে ঠিক একটা batch থাকে।
আধুনিক deep learning-এ এর বেশি সাধারণ, অনেক বেশি ব্যবহৃত অর্থে, "batch" মানে যেকোনো উদাহরণের গ্রুপ যা একটা মাত্র আপডেট পদক্ষেপের জন্য ব্যবহৃত হয় — যা, বাস্তবে, প্রায় সবসময়ই পুরো ডেটাসেটের একটা ছোট সাবসেট, পুরোটা না। এটাই সেই ব্যবহার যখন একটা ফ্রেমওয়ার্ক "batch size" জিজ্ঞেস করে: একটা forward pass, একটা loss হিসাব, আর একটা weight আপডেটের জন্য একসাথে গ্রুপ করা উদাহরণ সংখ্যা।
একটা batch হলো একগুচ্ছ ট্রেনিং উদাহরণ যা একসাথে ব্যবহৃত হয় একটা gradient হিসাব করতে আর একটা weight আপডেট পদক্ষেপ নিতে।
যেহেতু "batch" শব্দটা "পুরো ডেটাসেট" (যেমন "batch gradient descent"-এ) আর "ডেটাসেটের একটা টুকরা" (যেমন "batch size"-এ) দুটোর জন্যই ব্যবহৃত হয়, একই শব্দ প্রসঙ্গের উপর নির্ভর করে প্রায় বিপরীত কিছু বোঝাতে পারে। সন্দেহ হলে, চেক করুন আশেপাশের টেক্সট এটাকে mini-batch বা stochastic পদ্ধতির বিপরীতে দাঁড় করাচ্ছে কিনা (তাহলে সম্ভবত মানে "পুরো ডেটাসেট") নাকি ৩২ বা ৬৪-এর মতো একটা সাইজ নির্দিষ্ট করছে (তাহলে মানে "একটা টুকরা")।
একটা mini-batch হলো ট্রেনিং ডেটার একটা ছোট, ফিক্সড-সাইজের সাবসেট — সাধারণত ১৬, ৩২, ৬৪, বা ২৫৬ উদাহরণ — যা একটা মাত্র আপডেট পদক্ষেপের জন্য ব্যবহৃত হয়, যেমনটা Gradient & Gradient Descent চ্যাপ্টারের mini-batch gradient descent সেকশনে দেখা হয়েছে। সাধারণ প্র্যাকটিসে, মানুষ যখন "batch size" বলে, তারা প্রায় সবসময়ই mini-batch সাইজ বোঝায়, কারণ mini-batch gradient descent হলো স্ট্যান্ডার্ড ডিফল্ট পদ্ধতি।
ট্রেনিং শুরুর আগে (বা প্রতিটা epoch-এর শুরুতে, যা শীঘ্রই দেখানো হবে), পুরো ট্রেনিং ডেটাসেট শাফল করা হয় আর তারপর ধারাবাহিক mini-batch-এ কাটা হয়। প্রতিটা mini-batch ঠিক একটা আপডেট পদক্ষেপের জন্য ব্যবহৃত হয়, একটার পর একটা, যতক্ষণ না ডেটাসেটের প্রতিটা উদাহরণ ঠিক একবার ব্যবহৃত হয়।
সিলিং চিহ্নগুলোর মানে "উপরে রাউন্ড করো" — যদি ডেটাসেট mini-batch সাইজ দিয়ে সমানভাবে ভাগ না হয়, শেষ mini-batch-এ বাকিদের চেয়ে কম উদাহরণ থাকে। উদাহরণস্বরূপ, ১,০০০ ট্রেনিং উদাহরণ আর ৩২ mini-batch সাইজ দিয়ে, সেটা , উপরে রাউন্ড করে ৩২ mini-batch — ৩২ উদাহরণের ৩১টা পূর্ণ mini-batch, প্লাস শুধু ৮টা উদাহরণসহ একটা শেষ mini-batch।
একটা mini-batch হলো ট্রেনিং ডেটার একটা ছোট, ফিক্সড-সাইজের টুকরা যা একটা আপডেট পদক্ষেপের জন্য ব্যবহৃত হয় — একবারে পুরো ডেটাসেট ব্যবহার করা আর একবারে শুধু একটা উদাহরণ ব্যবহার করার মধ্যে ব্যবহারিক মধ্যম বিন্দু।
একটা iteration হলো একটা মাত্র আপডেট পদক্ষেপ — একটা batch (বা mini-batch) থেকে একটা gradient হিসাব করার আর সেটা ব্যবহার করে ঠিক একবার প্রতিটা weight আর bias অ্যাডজাস্ট করার একটা পাস। প্রতিবার মডেলের weight বদলায়, সেটাই একটা iteration।
পুরো ডেটাসেটের মধ্য দিয়ে একবার যেতে কতগুলো iteration দরকার সেটা সরাসরি mini-batch সাইজের উপর নির্ভর করে: ছোট mini-batch মানে একই পরিমাণ ডেটা কভার করতে বেশি iteration দরকার, আর বড় mini-batch মানে কম iteration সেটা কভার করে।
এটা mini-batch সংখ্যার ঠিক একই সূত্র, কারণ প্রতিটা mini-batch ঠিক একটা iteration তৈরি করে — দুইটা কনসেপ্ট শক্তভাবে সম্পর্কিত, কিন্তু এরা ভিন্ন জিনিস বর্ণনা করে: একটা mini-batch হলো ডেটার একটা গ্রুপ, যখন একটা iteration হলো সেই গ্রুপ ব্যবহার করে করা আপডেট পদক্ষেপ।
একটা iteration হলো একটা মাত্র weight-আপডেট পদক্ষেপ, একটা batch বা mini-batch ডেটা থেকে হিসাব করা gradient দ্বারা চালিত।
জিজ্ঞেস করুন: "weight-গুলো কি এইমাত্র বদলেছে?" যদি হ্যাঁ হয়, সেই মুহূর্তটা একটা iteration ছিল। সেই নির্দিষ্ট বদলের কারণ যেই উদাহরণের গ্রুপটা ছিল সেটাই সেই batch (বা mini-batch) যা এর জন্য দায়ী।
একটা epoch হলো পুরো ট্রেনিং ডেটাসেটের মধ্য দিয়ে একটা সম্পূর্ণ পাস — প্রতিটা ট্রেনিং উদাহরণ ঠিক একবার ব্যবহৃত হয়েছে, তার জন্য যতগুলো iteration লেগেছে তা জুড়ে।
যদি mini-batch gradient descent ব্যবহার হয় পুরো ডেটাসেটের চেয়ে ছোট একটা mini-batch সাইজ দিয়ে, একটা epoch অনেকগুলো iteration নিয়ে গঠিত, প্রতিটা mini-batch-এ একটা করে, যতক্ষণ না পুরো ডেটাসেট কভার হয়ে যায়। যদি এর বদলে batch gradient descent ব্যবহার হয়, একটা epoch ঠিক একটা iteration, কারণ পুরো ডেটাসেটই একটা সিঙ্গেল batch হিসেবে গণ্য হয়।
ট্রেনিং প্রায় সবসময়ই অনেক epoch চলে, শুধু একটা না — মডেলকে একই ডেটা একাধিকবার দেখতে হয়, প্রতিটা পাসে সামান্য বেশি করে তার weight অ্যাডজাস্ট করে, এর প্রেডিকশন নির্ভরযোগ্যভাবে ভালো হওয়ার আগে। Epoch সংখ্যা নিজেই একটা hyperparameter (Parameters vs Hyperparameters চ্যাপ্টারে দেখা হয়েছে): খুব কম হলে, মডেল ভালোভাবে শিখতে যথেষ্ট বার ডেটা দেখেনি; খুব বেশি হলে, মডেল সাধারণীকরণ করে এমন প্যাটার্ন শেখার বদলে ট্রেনিং ডেটা মুখস্থ করার ঝুঁকি নেয় — একটা সমস্যা যাকে বলে overfitting।
একটা epoch হলো পুরো ট্রেনিং ডেটাসেটের মধ্য দিয়ে একটা সম্পূর্ণ পাস, যতগুলো iteration লাগে প্রতিটা ট্রেনিং উদাহরণ ঠিক একবার ব্যবহার করতে ততগুলো নিয়ে গঠিত।
এই চারটা শব্দ একটা কঠোর হায়ারার্কিতে একে অপরের ভেতরে বাসা বাঁধে, ছোট থেকে বড়:
Mini-Batch
উদাহরণের একটা ছোট গ্রুপ, যেমন একটা বড় ডেটাসেটের মধ্যে থেকে ৩২টা উদাহরণ।
Iteration
একটা weight আপডেট, একটা mini-batch থেকে হিসাব করা gradient দ্বারা চালিত।
Epoch
অনেকগুলো iteration, প্রতিটা mini-batch-এ একটা করে, যতক্ষণ না পুরো ডেটাসেট ঠিক একবার ব্যবহৃত হয়।
পুরো ট্রেনিং রান
অনেকগুলো epoch, পুরো ডেটাসেট একাধিকবার পুনরাবৃত্তি করে, যতক্ষণ না ট্রেনিং থামানো হয়।
| শব্দ | এটা কী বোঝায় | একটা ট্রেনিং রানে কতগুলো থাকে |
|---|---|---|
| Batch (mini-batch size হিসেবে) | একটা আপডেট পদক্ষেপের জন্য ব্যবহৃত উদাহরণের একটা গ্রুপ | ডেটাসেট সাইজ ÷ batch সাইজ, প্রতি epoch-এ |
| Mini-Batch | একটা batch-এর সাধারণ ব্যবহারিক রূপ — একটা ছোট, ফিক্সড-সাইজের সাবসেট | উপরের batch সংখ্যার মতোই |
| Iteration | একটা মাত্র weight-আপডেট পদক্ষেপ | প্রতি mini-batch-এ একটা, তাই প্রতি epoch-এ mini-batch-এর সমান সংখ্যা |
| Epoch | পুরো ডেটাসেটের মধ্য দিয়ে একটা সম্পূর্ণ পাস | একটা বেছে নেওয়া hyperparameter — ট্রেনিং রান যতগুলো ব্যবহার করতে সেট করা |
"বেশি iteration মানে সবসময় বেশি epoch" বা এর উল্টো ধরে নেওয়া সহজ — কিন্তু এই দুটো স্বাধীনভাবে স্কেল করে। একটা বড় mini-batch সাইজ মানে প্রতি epoch-এ কম iteration (কারণ প্রতিটা mini-batch একসাথে বেশি ডেটা কভার করে), আর একটা ছোট mini-batch সাইজ মানে প্রতি epoch-এ বেশি iteration। Mini-batch সাইজ বদলালে প্রতি epoch-এ কতগুলো iteration হয় সেটা বদলায়, কতগুলো epoch চলে সেটা বদলায় না।
এই চারটা শব্দকে একটা কনক্রিট ডেটাসেটের সাথে যুক্ত দেখলে সম্পর্কগুলো মনে গেঁথে যায়।
একটা ছোট ডেটাসেট, ছোট mini-batch
১০,০০০ ট্রেনিং ইমেজ, mini-batch সাইজ ১০০। সেটা ১০,০০০ ÷ ১০০ = ১০০ iteration প্রতি epoch-এ। ২০ epoch-এর জন্য ট্রেন করলে ১০০ × ২০ = ২,০০০ মোট iteration হয়, মডেল ট্রেনিংয়ের সময়কাল জুড়ে প্রতিটা ইমেজ ঠিক ২০ বার দেখে।
একই ডেটাসেট, বড় mini-batch
একই ১০,০০০ ইমেজ, কিন্তু এর বদলে mini-batch সাইজ ৫০০। এখন এটা শুধু ১০,০০০ ÷ ৫০০ = ২০ iteration প্রতি epoch-এ — প্রতি epoch-এ অনেক কম weight আপডেট, যদিও প্রতিটা বেশি উদাহরণ জুড়ে গড় করা একটা gradient-এর উপর ভিত্তি করে।
একটা ডেটাসেট যা সমানভাবে ভাগ হয় না
৭,৫০০ ট্রেনিং উদাহরণ, mini-batch সাইজ ১,০০০। সেটা ৭,৫০০ ÷ ১,০০০ = ৭.৫, উপরে রাউন্ড করে ৮ iteration প্রতি epoch-এ — ১,০০০-এর ৭টা পূর্ণ mini-batch, প্লাস শুধু ৫০০ উদাহরণের একটা শেষ mini-batch।
তুলনার জন্য Full-Batch Gradient Descent
একই ৭,৫০০ উদাহরণ, কিন্তু পুরো ডেটাসেটকে একটা সিঙ্গেল batch হিসেবে ব্যবহার করে (batch gradient descent)। সেটা প্রতি epoch-এ ঠিক ১টা iteration — weight প্রতি পুরো পাসে শুধু একবারই আপডেট হয়, যতই epoch চলুক না কেন।
অনেক ট্রেনিং লগ এরকম কিছু প্রিন্ট করে "Epoch 3/20, Iteration 145/300, Loss: 0.42।" এর মানে: মডেলটা পুরো ডেটাসেটের মধ্য দিয়ে তার ৩য় পাসে আছে (মোট পরিকল্পিত ২০ epoch-এর মধ্যে), আর এই epoch-এর ভেতরে, এটা এই ডেটাসেট আর mini-batch সাইজের জন্য একটা পুরো epoch গঠন করা ৩০০টা mini-batch (iteration)-এর মধ্যে ১৪৫টা সম্পূর্ণ করেছে।