Chapter 5 of 16
Learning rates, batch sizes, and the art of tuning neural networks
একটা দুই-লেয়ারের MLP আর কয়েকশ কোটি parameter-এর একটা Transformer — দেখতে সম্পূর্ণ ভিন্ন দুইটা জিনিস মনে হয়। কিন্তু ভেতরে ভেতরে দুটোই আসলে একই রকম কিছু hyperparameter শেয়ার করে — learning rate, batch size, optimizer, initialization, activation function, regularization, আর learning rate schedule। মজার ব্যাপার হলো, architecture নিয়ে যত মাথা ঘামানো হয়, তার চেয়ে এই common core-টা ঠিকমতো tune করাই আসলে বেশি গুরুত্বপূর্ণ। এই chapter-এ প্রথমে এই universal hyperparameter-গুলো নিয়ে কথা বলবো, তারপর MLP, CNN, RNN/LSTM আর Transformer-এর নিজস্ব কিছু hyperparameter দেখবো।
Deep learning-এ যদি একটা মাত্র hyperparameter-কে "সবচেয়ে গুরুত্বপূর্ণ" বলতে হয়, সেটা হবে learning rate । কারণ neural network-এর loss landscape অনেক জটিল, non-convex — আর learning rate ভুল হলে বাকি সব hyperparameter যতই ঠিকঠাক থাকুক না কেন, training কোনো অর্থবহ progress করবে না।
Learning rate সবসময় log-uniform scale-এ search করা উচিত, যেমন থেকে । পুরো search শুরু করার আগে একটা ছোট্ট diagnostic কাজে লাগে — learning rate range test: কয়েকশ step ধরে learning rate ছোট মান থেকে ধীরে ধীরে exponentially বাড়াতে বাড়াতে loss-এর ওপর প্রভাব প্লট করা। যেখানে loss সবচেয়ে দ্রুত কমে, সেটাই ভালো শুরুর বিন্দু; যেখানে loss হঠাৎ বিস্ফোরিত (diverge) হয়ে যায়, সেটাই এড়িয়ে চলার মতো ঊর্ধ্বসীমা।
একবারে কতগুলো training example দেখে model তার parameter একবার আপডেট করবে — সেটাই batch size।
| ছোট batch (৮–৩২) | বড় batch (৫১২–৮১৯২) | |
|---|---|---|
| Gradient estimate | নয়েজি (প্রতি step-এ variance বেশি) | Smooth, পুরো dataset-এর সত্যিকার gradient-এর কাছাকাছি |
| Generalization | প্রায়ই ভালো; নয়েজটাই একধরনের implicit regularization হিসেবে কাজ করে | সাবধানে LR আর schedule না বদলালে generalization খারাপ হতে পারে |
| Hardware utilization | কম (প্রতি step-এ parallelism কম) | বেশি (GPU/TPU ভালোভাবে ব্যবহার হয়) |
| প্রতি epoch-এ step সংখ্যা | বেশি | কম |
| Memory ব্যবহার | কম | বেশি |
স্পিডের জন্য batch size বাড়িয়ে learning rate একই রেখে দেওয়া একটা খুব common ভুল। বড় batch মানে কম-variance gradient estimate, তাই ছোট batch-এ যে learning rate কাজ করেছিল সেটা বড় batch-এ প্রায়ই খুব conservative হয়ে যায়। ব্যাপকভাবে ব্যবহৃত একটা heuristic (linear scaling rule) হলো learning rate-কে batch size-এর অনুপাতে বাড়ানো, সাথে একটা ছোট warmup period রাখা।
পুরো training set একবার সম্পূর্ণভাবে দেখা হলে সেটা এক epoch। কতগুলো epoch লাগবে সেটা সাধারণত সরাসরি search করা হয় না — বরং একটা বড়সড় maximum ঠিক করে দিয়ে early stopping ব্যবহার করা হয়, মানে validation performance improve করা বন্ধ হয়ে গেলেই training থামিয়ে দেওয়া। যেমন Keras-এ EarlyStopping callback দিয়ে monitor="val_loss", patience=10 সেট করে ৫০০-epoch পর্যন্ত একটা generous maximum দিয়ে দেওয়া হয় — validation loss ১০ epoch ধরে না কমলেই training থেমে যায়। এভাবে effective epoch সংখ্যা নিজে থেকেই ঠিক হয়ে যায়।
এই setting ছাড়া early stopping শেষ epoch-এর model ফেরত দেয় (যেটা দেখা সেরা epoch-এর চেয়ে সামান্য খারাপ হতে পারে), training-এ দেখা সেরা model নয়। তাই restore_best_weights=True রাখা প্রায় সবসময় জরুরি।
| Optimizer | মূল ধারণা আর hyperparameter |
|---|---|
| SGD | Momentum-সহ plain gradient descent। Hyperparameter: learning rate, momentum (সাধারণত 0.9)। ভালো tune করলে চমৎকার কাজ করে, কিন্তু tuning-এর জন্য বেশি effort লাগে। |
| RMSProp | Squared gradient-এর running average-এর ভিত্তিতে প্রতিটা parameter-এর জন্য আলাদাভাবে learning rate adapt করে। Parameter-গুলোর gradient magnitude খুব ভিন্ন হলে কাজে লাগে। |
| Adam | Momentum-এর সাথে per-parameter adaptive learning rate একসাথে ব্যবহার করে। Hyperparameter: lr, β₁=0.9, β₂=0.999, ε=1e-8। বেশিরভাগ নতুন প্রজেক্টের জন্য default choice। |
| AdamW | Adam-এর একটা variant, যেখানে weight decay decoupled — regularization gradient-এ না মিশিয়ে সরাসরি weight-এর ওপর apply হয়। Transformer training-এ standard। |
Adam বা AdamW-এর β₁, β₂, ε-এর default value ধরে রেখে শুধু learning rate tune করুন প্রথমে। এই default-গুলো এত বিস্তৃত range-এর সমস্যার জন্য কাজ করার মতো করেই বাছা হয়েছে — optimizer-এর internals ঘাঁটার আগে learning rate, batch size, আর architecture-specific hyperparameter-এ বাজেট খরচ করুন।
সব weight যদি একই মান দিয়ে শুরু হয়, একটা layer-এর প্রতিটা neuron ঠিক একই output দেবে, একই gradient পাবে — কেউ কারো থেকে আলাদা হতে পারবে না, একে বলে symmetry problem। Random initialization এই symmetry ভাঙে, কিন্তু randomness-এর মাত্রা খুব গুরুত্বপূর্ণ — বেশি হলে layer থেকে layer-এ signal control হারিয়ে বেড়ে যায়, কম হলে signal শূন্যের দিকে হারিয়ে যায়।
| Initialization scheme | সবচেয়ে উপযুক্ত | মূল ধারণা |
|---|---|---|
| Glorot (Xavier) uniform/normal | sigmoid, tanh activation | (fan_in + fan_out)-এর ব্যস্তানুপাতে variance স্কেল করে, নেটওয়ার্ক জুড়ে signal-এর মাত্রা স্থিতিশীল রাখে। |
| He (Kaiming) uniform/normal | ReLU, Leaky ReLU activation | 2/fan_in দিয়ে variance স্কেল করে — ReLU অর্ধেক neuron শূন্য করে দেয় সেটা হিসেবে নিয়ে। |
| LeCun normal | SELU activation | 1/fan_in দিয়ে variance স্কেল করে, SELU-এর self-normalizing বৈশিষ্ট্যের সাথে মানানসই। |
| Orthogonal | RNN, LSTM | Weight matrix-কে random orthogonal matrix হিসেবে initialize করে; সময়ের সাথে gradient norm সংরক্ষণে সাহায্য করে। |
প্রায় সবসময় — ReLU network-এ He, sigmoid/tanh network-এ Glorot ব্যবহার করুন, আর framework-এর default-কে বিশ্বাস করুন (যেটা এই logic-ই implement করে)। Initialization tune করার সময়টা learning rate বা architecture-এ খরচ করলে প্রায় সবসময় বেশি লাভ হয়।
পুরো training জুড়ে একই learning rate রাখা সাধারণত optimal নয়। ভালো strategy হলো মাঝারি (বা warmup-এর সময় একটু বেশি) learning rate দিয়ে শুরু করে, training এগোনোর সাথে সাথে সেটা কমিয়ে আনা।
| Schedule | আচরণ | সবচেয়ে উপযুক্ত |
|---|---|---|
| Constant | পুরো training জুড়ে learning rate স্থির থাকে | Baseline আর experiment; বাস্তবে প্রায় কখনোই optimal নয় |
| Step decay | নির্দিষ্ট epoch interval-এ LR-কে একটা factor দিয়ে গুণ করা (যেমন প্রতি ৩০ epoch-এ ×0.1) | Fixed epoch সংখ্যায় train করা vision model |
| Cosine annealing | LR শুরুর মান থেকে training budget জুড়ে cosine curve মেনে প্রায় শূন্যে নেমে আসে | এখনকার সবচেয়ে জনপ্রিয় choice; বিভিন্ন architecture-এ ভালো কাজ করে |
| Linear warmup + cosine decay | প্রথম কয়েকশ step-এ LR linearly বাড়ে, তারপর cosine-decay হয় | Transformer training-এ standard; শুরুর LR-এর প্রতি sensitivity কমায় |
| ReduceLROnPlateau | Validation loss N epoch ধরে plateau করলেই LR অর্ধেক করে দেওয়া | Training কতদিন লাগবে আগে থেকে না জানা থাকলে |
| পদ্ধতি | যা করে | মূল hyperparameter |
|---|---|---|
| L2 weight decay | Weight-এর বর্গের যোগফলের সমানুপাতিক একটা penalty loss-এ যোগ করে। Weight-এর ওপর একটা Gaussian prior-এর সমতুল্য। | λ (decay coefficient): log-uniform 1e-5 থেকে 1e-2-এ search করুন |
| Dropout | Training-এর সময় activation-এর একটা অংশ randomly শূন্য করে দেয়, network-কে redundant representation শিখতে বাধ্য করে। | p (dropout rate): সাধারণত 0.1–0.5; wider layer-এ বেশি |
| Batch normalization | প্রতিটা batch-এর মধ্যে layer input-কে zero mean, unit variance-এ normalize করে, তারপর learnable scale আর shift apply করে। | momentum (running stats-এর জন্য), epsilon (numerical stability-র জন্য): সাধারণত default-এই রাখা হয় |
| Data augmentation | Training example-এ random transformation apply করে (flip, crop, image-এ color jitter) dataset-কে synthetically বড় করে তোলে। | Augmentation policy: task-specific; vision task-এ এখানে search বাজেট খরচ করার মতো |
| Hyperparameter | সাধারণ range | প্রভাব |
|---|---|---|
| Hidden layer সংখ্যা | বেশিরভাগ task-এ ১–৫ | Depth। গভীর network বেশি জটিল function represent করতে পারে, কিন্তু train করা কঠিন আর ছোট dataset-এ overfit করার ঝুঁকি বেশি। |
| প্রতি layer-এ hidden unit | ৬৪–২০৪৮ | Width। চওড়া layer বেশি বৈচিত্র্যময় feature ধরতে পারে, কিন্তু compute বেশি লাগে আর overfit করতে পারে। |
| Activation function | ReLU (default), Leaky ReLU, GELU, Swish | Non-linearity। ReLU নিরাপদ default; transformer আর language task-এ GELU/Swish প্রায়ই সামান্য ভালো। |
| Dropout rate | 0.1–0.5 | প্রতিটা hidden layer-এর পরে apply হয়। Validation loss training loss-কে ছাড়িয়ে গেলে সেই অনুযায়ী adjust করুন। |
| Hyperparameter | সাধারণ range | প্রভাব |
|---|---|---|
| Filter size | ৩×৩ (default), ৫×৫, ৭×৭ | প্রতি filter-এর receptive field। ৩×৩ স্ট্যাক standard; বড় filter বেশি context ধরে কিন্তু খরচ বেশি। |
| Filter সংখ্যা | ৩২–৫১২ (depth বাড়ার সাথে বাড়ে) | প্রতিটা layer কতগুলো feature চিনতে পারবে। সাধারণত প্রতি pooling-এর পর দ্বিগুণ করা হয়। |
| Pooling type | MaxPool, AvgPool, GlobalAvgPool | Spatial downsampling। MaxPool সবচেয়ে বেশি ব্যবহৃত; আধুনিক architecture-এ GlobalAvgPool fully connected layer-এর জায়গা নেয়। |
| Depth (conv block সংখ্যা) | ২–৫০+ (গভীর network-এ ResNet skip connection ব্যবহার করে) | প্রধান capacity control। বেশি block মানে বেশি জটিল feature, residual connection ছাড়া overfitting-এর ঝুঁকি বেশি। |
| Stride | 1 (default), 2 | Downsampling factor। কিছু আধুনিক architecture-এ stride=2 pooling-এর জায়গা নেয়। |
| Hyperparameter | সাধারণ range | প্রভাব |
|---|---|---|
| Hidden size (h) | ৬৪–১০২৪ | Hidden state vector-এর আকার। প্রধান capacity control। বড় মানে বেশি expressive, বেশি memory লাগে। |
| Layer সংখ্যা (stacked RNN) | ১–৪ | Depth। ২–৩টা layer stack করা common; আরো গভীর stack-এ gradient সাবধানে সামলাতে হয়। |
| Bidirectional | True/False | Sequence দুই দিক থেকেই process করা হবে কিনা। Classification/NLP-তে প্রায় সবসময় ভালো; autoregressive generation-এ প্রযোজ্য নয়। |
| Dropout (layer-এর মাঝে) | 0.0–0.5 | Stacked RNN layer-এর মাঝে apply হয়। Recurrent dropout (একটা step-এর ভেতরেই) প্রায়ই বেশি কার্যকর কিন্তু কম সমর্থিত। |
| Sequence length / truncated BPTT | Task-নির্ভর | সময়ের মধ্য দিয়ে gradient কতদূর ফিরে যাবে। খুব তাড়াতাড়ি truncate করলে long-range dependency ক্ষতিগ্রস্ত হয়। |
| Hyperparameter | সাধারণ মান (BERT-base) | প্রভাব |
|---|---|---|
| d_model (model dimension) | ৭৬৮ | Model-এর width — সব embedding vector আর attention output-এর dimension। এটা স্কেল করলে পুরো model-ই স্কেল হয়। |
| num_heads | ১২ | Attention head সংখ্যা। d_model-কে সমানভাবে ভাগ করতে হয়। বেশি head মানে বেশি বৈচিত্র্যময় attention pattern, কিন্তু প্রতিটা head-এর dimension ছোট হয়ে যায়। |
| num_layers | ১২ | Transformer stack-এর depth। বেশি layer মানে বেশি abstract representation, কিন্তু compute আর ছোট dataset-এ overfitting-এর ঝুঁকিও বেশি। |
| d_ff (feedforward dimension) | ৩০৭২ | Position-wise feedforward layer-এর dimension, সাধারণত d_model-এর ৪ গুণ। |
| dropout | 0.1 | Attention weight আর feedforward layer-এ apply হয়। বড় model-এ সাধারণত 0.1-এই রাখা হয়; ছোট dataset-এ বাড়ানো যায়। |
| max_seq_len | ৫১২ | সর্বোচ্চ sequence length। Attention-এর cost , তাই এটা compute-এর ওপর বড় প্রভাব ফেলে। |