3.4.11 · HinglishConvolutional Neural Networks

Transfer learning and fine-tuning

3,314 words15 min readRead in English

3.4.11 · AI-ML › Convolutional Neural Networks

Transfer learning neural networks ke liye exactly yahi karta hai: hum ek model lete hain jo ek massive dataset par train kiya gaya hai (jaise ImageNet ke 14M images) aur uske seekhe hue features ko apne chhote task ke liye repurpose karte hain (jaise 1000 medical scans classify karna). Early layers ne pehle se hi universal patterns seekh liye hain—edges, textures, shapes—toh hum unhe scratch se dobara seekhne mein waqt barbaad nahi karte.

Why Transfer Learning Works

Key insight yeh hai: Deep CNs hierarchical features seekhte hain:

  • Early layers (input ke paas): Generic low-level features (edges, colors, simple textures)
  • Middle layers: Mid-level patterns (object parts, textures combinations)
  • Late layers (output ke paas): Task-specific high-level concepts (specific object classes)

Early layers remarkably transferable hote hain kyunki edges aur textures almost har visual task mein appear karte hain. Ek network jo cats aur dogs mein distinguish karna seekha hai usne pehle hi "vertical edge kya hota hai" aur "fur texture kya hota hai" seekh liya hai—yeh knowledge medical imaging, satellite analysis, ya kisi bhi aur vision task ke liye useful hai.

Standard training dataset par loss minimize karta hai:

Limited data ke saath ( millions), yeh optimization severely underconstrained hoti hai—kai parameter configurations chhote training set ko fit karti hain lekin poorly generalize karti hain (high variance).

Transfer learning model ko decompose karta hai:

jahaan:

  • = feature extractor (large source dataset par pretrained)
  • = task-specific head (chhote target dataset par train kiya gaya)

Yeh sample complexity kyun reduce karta hai:

  1. ek aise point par initialize hota hai jo pehle se ek achhe local minimum ke paas hai ( se seekha gaya)
  2. Hum sirf parameters ka ek fraction optimize karte hain ( typically total ka 0.1-10%)
  3. Effective model capacity frozen base se constrained hoti hai, jo strong regularization ka kaam karta hai

Zyaadatar parameters ko freeze karke, hum is ratio ki left side ko drastically reduce karte hain.

The Three Transfer Learning Strategies

Strategy 1: Feature Extraction (Frozen Base)

Kab use karna hai:

  • Bahut chhota target dataset (< 1000 samples)
  • Target task source task se similar ho
  • Limited compute budget ho

Yeh kaise kaam karta hai:

# Pseudo-code
base_model = load_pretrained_model("ResNet50", weights="imagenet")
base_model.trainable = False  # Freeze all base layers
 
# Add custom head
model = Sequential([
    base_model,
    GlobalAveragePooling2D(),
    Dense(256, activation='relu'),
    Dropout(0.5),
    Dense(num_classes, activation='softmax')
])
 
# Only head parameters update
model.compile(optimizer=Adam(lr=1e-3))

Derivation ki yeh kyun kaam karta hai:

Pretrained features ek representation space form karte hain. Hum is space se target labels tak ek linear (ya shallow nonlinear) mapping seekh rahe hain:

Yeh raw pixels se poori mapping seekhne se kaafi aasaan hai, kyunki pehle se hi relevant structure capture kar chuka hai. Optimization convex hoti hai (agar sirf linear head use kar rahe hain) ya low-dimensional (agar ek hidden layer add kar rahe hain).

Strategy 2: Fine-tuning (Partial Unfreezing)

Kab use karna hai:

  • Medium dataset (1k-100k samples)
  • Target task source se moderately different ho
  • Tumhare paas full training ke liye compute ho

Step-by-step yeh kaise kaam karta hai:

Step 1: Head ko frozen base ke saath train karo (jaise feature extraction mein) kuch epochs ke liye. Isse randomly-initialized head ek reasonable state mein aa jaata hai.

Step 2: Last few convolutional blocks unfreeze karo:

# Unfreeze last 2 blocks (out of 5) ResNet50
for layer in base_model.layers[-30:]:  # ~2 blocks
    layer.trainable = True

Step 3: Bahut chhoti learning rate ke saath training jaari rakho:

Chhoti learning rate kyun? Gradient update perspective se derive karte hain:

Pretrained weights pehle se source task ke liye ek achhe local minimum par hain. Badi learning rate ke saath, gradient update:

is achhe initialization se door ja sakta hai aur useful features destroy kar sakta hai (catastrophic forgetting).

Chhoti ensure karti hai:

Hum pretrained solution ke aas-paas basin of attraction mein rehte hain, sirf target task ke liye chhote adjustments karte hain.

Differential learning rates (layer-wise):

\theta_{\text{early}}^{t+1} &= \theta_{\text{early}}^{t} - \eta_1 \nabla \mathcal{L} \quad &\text{(sabse chhoti lr)} \\ \theta_{\text{middle}}^{t+1} &= \theta_{\text{middle}}^{t} - \eta_2 \nabla \mathcal{L} \quad &\eta_2 = 3\eta_1 \\ \theta_{\text{head}}^{t+1} &= \theta_{\text{head}}^{t} - \eta_3 \nabla \mathcal{L} \quad &\eta_3 = 10\eta_1 \text{ (sabse badi lr)} \end{align}$$ **Kyun?** Earlier layers zyaada general features capture karte hain (edges), later layers zyaada task-specific hoti hain. Hum early mein minimal changes chahte hain, late mein bada adaptation. ### Strategy 3: Full Fine-tuning > [!definition] Full Fine-tuning > Saare layers unfreeze karo aur poore model ko differential learning rates ke saath end-to-end train karo. **Kab use karna hai**: - Bada target dataset (> 100k samples) - Target task source se bahut alag ho (jaise medical images vs. natural images) - Maximum performance chahiye ## Worked Example: Bird Species Classification > [!example] Complete Transfer Learning Pipeline **Setup**: 200 bird species classify karo, har species mein 50 images (total 10k). Source: ResNet50 on ImageNet. **Step 1: Task similarity analyze karo** ImageNet mein 120 bird species hain → high similarity → transfer achha kaam karega. Dataset size: 10k images → medium size → fine-tuning appropriate hai. **Step 2: Feature extraction baseline** ```python base = ResNet50(include_top=False, weights='imagenet', input_shape=(224,3)) base.trainable = False model = Sequential([ base, GlobalAveragePooling2D(), # (7,7,2048) → (2,) Dense(512, activation='relu'), BatchNormalization(), Dropout(0.5), Dense(200, activation='softmax') ]) model.compile( optimizer=Adam(1e-3), loss='categorical_crossentropy', metrics=['accuracy'] ) # Train for 20 epochs # Result: ~75% validation accuracy ``` **GlobalAveragePooling2D kyun?** Base 224×224 input ke liye $(7, 7, 2048)$ shape ke spatial feature maps output karta hai. GAP compute karta hai: $$\text{GAP}(F)_c = \frac{1}{7 \times 7} \sum_{i=1}^{7} \sum_{j=1}^{7} F_{i,j,c}$$ har channel $c$ ke liye. Yeh: 1. Parameters reduce karta hai (koi spatial FC layer nahi chahiye) 2. Variable input sizes allow karta hai 3. Structural regularization ki tarah kaam karta hai **Yeh step kyun?** Head randomly initialized hai. Agar hum base layers turant unfreeze karein, toh head ke random gradients pretrained features corrupt kar denge. Pehle hum head ko ek reasonable state mein laate hain. **Step 3: Last block fine-tune karo** ```python # Unfreeze last residual block (conv5_x in ResNet50) for layer in base.layers[-33:]: # Empirically determined layer.trainable = True # Reduce learning rate by 10× model.compile( optimizer=Adam(1e-4), # Was 1e-3 loss='categorical_crossentropy', metrics=['accuracy'] ) # Train another 30 epochs with early stopping # Result: ~87% validation accuracy (+12%) ``` **+12% kyun?** Last block high-level object parts seekhta hai. Birds ke liye, iska matlab hai: - Beak shapes - Feather patterns - Body proportions Yeh ImageNet ke 120 bird species aur hamare 200 species ke beech thoda alag hain. Fine-tuning karke, hum in features ko adapt karte hain. **Step 4: (Optional) Full fine-tuning with discriminative learning rates** ```python # Unfreeze everything base.trainable = True # Layer-wise learning rates layer_lrs = { 'conv1': 1e-6, # First conv: almost frozen 'conv2_x': 5e-6, # Early residual blocks 'conv3_x': 1e-5, 'conv4_x': 5e-5, 'conv5_x': 1e-4, # Last block: largest adaptation } # Result: ~91% validation accuracy (+4%) ``` **Diminishing returns**: Full fine-tuning se gain chhota hota hai kyunki early layers (edges, colors) pehle se bird images ke liye optimal hain. ## Common Mistakes and Fixes > [!mistake] Mistake 1: Fine-tuning Mein Bahut Badi Learning Rate **Galat approach**: ```python base.trainable = True model.compile(optimizer=Adam(1e-3)) # Same as initial training! ``` **Kya hota hai**: Randomly-initialized head ke bade gradients backward flow karte hain aur base mein pretrained features destroy kar dete hain. Validation accuracy frozen baseline se bhi neeche chali jaati hai—==catastrophic forgetting==. **Yeh sahi kyun lagta hai**: "Agar main model train kar raha hoon, toh mujhe normal learning rate use karni chahiye." **Fix**: Pretrained layers unfreeze karte waqt LR ko 10-100× reduce karo. Ya discriminative LRs use karo. **Derivation**: Pretrained weights $w_{\text{pretrained}}$ ka loss landscape: $$\mathcal{L}_{\text{source}}(w_{\text{pretrained}}) \approx \mathcal{L}_{\text{min}}$$ Badi $\eta$ ke saath unfreeze karne ke baad, update hai: $$w^{t+1} = w_{\text{pretrained}} - \eta \nabla \mathcal{L}_{\text{target}}(w_{\text{pretrained}})$$ Agar $\|\eta \nabla \mathcal{L}_{\text{target}}\| \gg \|w_{\text{pretrained}} - w_{\text{min,source}}\|$, toh hum basin se bahut door chale jaate hain. Target task gradient ek aisi direction mein point kar sakta hai jo source task loss dramatically badhata hai, general features erase kar deta hai. > [!mistake] Mistake 2: Bahut Jaldi Unfreeze Karna **Galat approach**: ```python # Immediately unfreeze and train everything base.trainable = True model.compile(optimizer=Adam(1e-4)) model.fit(...) # Head is still random! ``` **Kya hota hai**: Head ke random gradients (jisne abhi kuch seekha hi nahi hai) pretrained base corrupt kar dete hain. Model slowly converge karta hai aur worse solution par pahunchta hai. **Yeh sahi kyun lagta hai**: "Agar fine-tuning better hai, toh turant shuru kyun na karein?" **Fix**: Hamesha pehle head ko 5-20 epochs ke liye frozen base ke saath train karo. Phir unfreeze karo. **Mathematical intuition**: Loss gradient decompose hota hai: $$\nabla_{\theta_{\text{base}}} \mathcal{L} = \nabla_{\theta_{\text{base}}} f_{\text{head}} \cdot \nabla_{f_{\text{head}}} \mathcal{L}$$ Initially, $f_{\text{head}}$ random hai, toh $\nabla_{f_{\text{head}}} \mathcal{L}$ ki high variance aur arbitrary direction hoti hai. Head ko pretrain karke, hum ensure karte hain ki $\nabla_{f_{\text{head}}} \mathcal{L}$ ek meaningful direction mein point kare base ko modify karne ki permission dene se pehle. > [!mistake] Mistake 3: Galat Data Preprocessing **Galat approach**: ```python # Using custom normalization train_transform = Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]) ``` **Kya hota hai**: Pretrained model ImageNet normalization expect karta hai: $$x_{\text{normalized}} = \frac{x - \mu_{\text{ImageNet}}}{\sigma_{\text{ImageNet}}}$$ jahaan $\mu = [0.485, 0.456, 0.406]$ aur $\sigma = [0.229, 0.224, 0.225]$ (RGB). Alag normalization use karne se input distribution shift hoti hai, aur pretrained features galat respond karte hain (woh ImageNet distribution ke liye optimize kiye gaye the). **Yeh sahi kyun lagta hai**: "Main nayi data par train kar raha hoon, toh mujhe uski statistics use karni chahiye." **Fix**: Hamesha source dataset jaisi preprocessing use karo. ImageNet models ke liye, ImageNet ka mean aur std use karo. **Quantitative impact**: Mismatched normalization accuracy ko 10-30% tak drop kar sakti hai kyunki: $$f_{\theta}(x_{\text{wrong}}) \neq f_{\theta}(x_{\text{correct}})$$ Seekhe gaye decision boundaries ne inputs ko ek specific range mein assume kiya tha. Range shift karne se data feature space ke unexplored regions mein chali jaati hai. ## Advanced: Gradual Unfreezing > [!formula] Progressive Fine-tuning Schedule Saare layers ek saath unfreeze karne ki jagah, top se bottom tak gradually unfreeze karo: **Epoch schedule**: - Epochs 1-10: Saara base freeze, sirf head train - Epochs 11-20: Last 1 block unfreeze - Epochs 21-30: Last 2 blocks unfreeze - Epochs 31-40: Sab discriminative LR ke saath unfreeze **Yeh kyun kaam karta hai**: Yeh har layer ke liye effective learning rate ka ek annealing schedule hai. Layer $\ell$ ke liye epoch $t$ par **effective learning rate** define karo: $$\eta_{\text{eff}}^\ell(t) = \begin{cases} 0 & \text{if frozen} \\ \eta_0 \cdot d^\ell \cdot s(t) & \text{if unfrozen} \end{cases}$$ jahaan: - $d^\ell$ = depth discount (earlier layers ke liye chhota) - $s(t)$ = schedule function (learning rate decay) Gradual unfreezing effectively implement karta hai: $$\eta_{\text{eff}}^\ell(t) = \eta_0 \cdot d^\ell \cdot \mathbb{1}[t > T_{\text{unfreeze}}^\ell] \cdot s(t)$$ Har layer progressively activate hoti hai, model ko hierarchically adapt karne deta hai: pehle task-specific head, phir mid-level features, aakhir mein low-level edges (jinhe usually minimal adaptation chahiye). ## Practical Recipe > [!example] Step-by-Step Transfer Learning **Given**: Dataset with $N$ samples, $C$ classes, ImageNet ke saath task similarity $\alpha \in [0,1]$. **Step 1**: Pretrained model choose karo - $N < 1000$: Lightweight models use karo (MobileNet, EfficientNet-B0) - $1000 < N < 100k$: ResNet50 ya EfficientNet-B2 use karo - $N > 100k$: Larger models use karo (ResNet101, EfficientNet-B4) **Step 2**: Feature extraction baseline ```python base.trainable = False lr_head = 1e-3 epochs_1 = 10+ 10 * (1 - α) # More epochs if dissimilar ``` **Step 3**: Fine-tuning strategy decide karo - $N < 5k$ aur $\alpha > 0.7$: Yaheen ruko (sirf feature extraction) - $5k < N < 50k$: Last 1-2 blocks fine-tune karo - $N > 50k$: Discriminative LR ke saath full fine-tuning **Step 4**: Fine-tune karo ```python # Unfreeze last k blocks k = floor(log10(N / 1000)) # More blocks as dataset grows base.layers[-k*blocks_per_stage:].trainable = True lr_fine = lr_head / 10 epochs_2 = 20 + 5 * k ``` **Step 5**: Evaluate karo aur iterate karo - Train vs. val loss monitor karo: agar train >> val, regularization badhao (dropout, augmentation) - Agar improvement plateau pe aa jaaye, aur layers unfreeze karne ki koshish karo - Agar val loss badhne lage, LR reduce karo ya early stopping add karo ## Why Transfer Learning is Fundamental > [!intuition] The Deeper Principle Transfer learning kaam karta hai hierarchical representations ki ek fundamental property ki wajah se: **compositionality**. Low-level features (edges, textures) compose hokar mid-level features (object parts) banate hain, jo compose hokar high-level concepts (objects) banate hain. Yeh composition lower levels par largely **task-invariant** hoti hai. $$f_{\text{task}}(x) = g_{\text{task-specific}} \circ h_{\text{universal}}(x)$$ Function $h_{\text{universal}}$ (edges, textures, basic shapes) almost saare visual tasks mein shared hota hai. Sirf $g_{\text{task-specific}}$ vary karta hai. **Empirical evidence**: Random CNN features fail karte hain (10-20% accuracy), lekin pretrained ImageNet features turant kaam karte hain (nayi tasks par 60-80%). ImageNet se seekha gaya representation space original 1000 classes se kaafi aage useful structure capture karta hai. **Sample efficiency gain**: Scratch se training ke liye chahiye: $$N_{\text{scratch}} \propto d_{\text{VC}}(\text{full model})$$ jahaan $d_{\text{VC}}$ VC dimension hai (model capacity). Transfer learning ke liye chahiye: $$N_{\text{transfer}} \propto d_{\text{VC}}(\text{head only}) \ll d_{\text{VC}}(\text{full model})$$ Empirically, transfer learning data requirements **10-100×** reduce karta hai. > [!recall]- Ek 12-saal ke bacche ko explain karo > Socho tum piano seekh rahe ho guitar pehle se jaanne ke baad. Tumhari ungliyan pehle se jaanti hain ki strings/keys ko sahi timing ke saath kaise dabana hai, tum rhythm aur music padhna samajhte ho, aur tum jaante ho ki kya achha lagta hai. Tum ek poore beginner ki tarah shuru nahi karte! Transfer learning AI ke liye same hai. Computer ko images bilkul scratch se recognize karna sikhane ki jagah (jisme millions of examples chahiye), hum ek "brain" se shuru karte hain jo pehle se millions of pictures dekhke useful skills seekh chuka hai. Woh pehle se jaanta hai edges, shapes, aur textures kaisi dikhti hain. Hume sirf use woh specific cheez sikhani hai jo hum chahte hain—jaise healthy aur sick X-rays mein difference batana—aur woh bahut jaldi seekh leta hai kyunki woh zero se shuru nahi kar raha! Yeh race mein head start lene jaisa hai. Tum pehla mile skip karte ho kyunki tum woh kaam pehle hi kar chuke ho. > [!mnemonic] FLAIR for Transfer Learning > - **F**reze first (sirf head train karo) > - **L**ow learning rate when unfreezing > - **A**dapt gradually (progressively unfreeze karo) > - **I**mageNet preprocessing (source stats match karo) > - **R**egularize heavily (dropout, augmentation) ## Connections - [[3.4.1-Introduction-to-CNs]] - Yeh samajhna ki CNs kya features seekhte hain - [[3.4.7-Batch-normalization]] - Fine-tuning mein BN layers ko special handling kyun chahiye - [[3.4.8-Residual-connections]] - ResNet architecture jo commonly transfer ke liye use hoti hai - [[3.2.5-Regularization-techniques]] - Chhote datasets ke liye Dropout aur augmentation - [[3.2.3-Gradient-descent-and-backpropagation]] - Chhoti learning rates catastrophic forgetting kyun prevent karti hain - [[4.1.3-Data-augmentation]] - Chhote datasets ke saath transfer learning use karte waqt zaroori --- #flashcards/ai-ml Transfer learning kya hai? :: Ek model jo ek task par pretrained hai use ek alag lekin related task ke liye starting point ki tarah use karna, scratch se train karne ki jagah. Transfer learning kyun kaam karta hai? ::: Kyunki early CNN layers generic features (edges, textures, shapes) seekhte hain jo kai visual tasks mein useful hote hain, toh hume unhe dobara seekhne ki zaroorat nahi. Teen main transfer learning strategies kya hain? ::: 1) Feature extraction (base freeze karo), 2) Fine-tuning (kuch layers unfreeze karo), 3) Full fine-tuning (sab differential LR ke saath unfreeze karo). Feature extraction vs fine-tuning kab use karni chahiye? :: Feature extraction bahut chhote datasets ke liye (<1k samples) ya high task similarity ke liye. Fine-tuning medium datasets (1k-100k) ya moderate similarity ke liye. Full fine-tuning bade datasets (>100k) ke liye. Fine-tuning karte waqt chhoti learning rate kyun use karni chahiye? ::: Catastrophic forgetting se bachne ke liye—badi learning rates pretrained features destroy kar sakti hain achhi initialization se bahut door jaake. Catastrophic forgetting kya hai? ::: Jab bahut badi learning rate ke saath fine-tuning pretrained features destroy kar deti hai, performance frozen baseline se bhi neeche le jaate hue. Base layers unfreeze karne se pehle head pehle kyun train karein? ::: Kyunki untrained head ke random gradients pretrained features corrupt kar denge. Hume base ko modify karne dene se pehle head ko ek reasonable state mein laana hoga. Discriminative learning rate kya hai? ::: Alag layers ke liye alag learning rates use karna—early layers (generic features) ke liye sabse chhoti, late layers (task-specific features) ke liye sabse badi. ImageNet-pretrained models ke saath ImageNet preprocessing kyun use karni chahiye? ::: Kyunki pretrained features ImageNet ke mean aur std se normalized inputs ke liye optimize kiye gaye the. Alag normalization input distribution shift kar deti hai aur seekhe gaye features tod deti hai. Gradual unfreezing kya hai? ::: Multiple training phases mein layers ko top se bottom tak progressively unfreeze karna, hierarchical adaptation allow karte hue. Transfer learning data requirements kitna reduce kar sakta hai? ::: Scratch se train karne ke comparison mein 10-100×, task similarity aur dataset size par depend karte hue. Transfer learning mein sample complexity mathematically kam kyun hoti hai? ::: Hum sirf parameters ka ek chhota fraction (head) optimize karte hain, trainable parameters aur dataset size ke ratio ko dramatically reduce karte hain, jo sample complexity determine karta hai. Early CNN layers tasks ke paar achhe kyun transfer hoti hain? ::: Woh low-level features (edges, colors, textures) seekhte hain jo kisi bhi visual recognition task ke liye compositional building blocks hain—woh task-invariant hain. Layers bahut jaldi unfreeze karne par kya hota hai? ::: Untrained head ke random gradients pretrained features corrupt kar dete hain, slow convergence aur worse final performance hoti hai. Gradual unfreezing mein effective learning rate kya hai? ::: Ek layer jo actual learning rate experience karti hai, jo frozen hone par zero hoti hai aur layer ke unfreeze hone aur schedule aage badhne par gradually badhti hai. ![[3.4.11-Transfer-learning-and-fine-tuning.png]] ## 🖼️ Concept Map ```mermaid flowchart TD PT[Pretrained Model on Large Dataset] TL[Transfer Learning] HF[Hierarchical Features] EL[Early Layers Generic Edges Textures] LL[Late Layers Task-Specific Concepts] BASE[Feature Extractor h_base] HEAD[Task Head g_head] TGT[Small Target Task] FE[Feature Extraction Frozen Base] FT[Fine-tuning] REG[Strong Regularization] SC[Lower Sample Complexity] PT -->|provides weights| TL TL -->|exploits| HF HF -->|contains| EL HF -->|contains| LL EL -->|highly transferable| BASE LL -->|replaced by| HEAD TL -->|decomposes into| BASE TL -->|decomposes into| HEAD HEAD -->|trained on| TGT FE -->|freezes| BASE FT -->|updates| BASE BASE -->|frozen acts as| REG REG -->|reduces trainable params| SC ```