पाठ 12 / 25

Regularisation: Dropout, Weight Decay and Augmentation

Fight overfitting in large networks.

Make memorising harder

Large networks can memorise small datasets. Dropout randomly zeroes a fraction of activations during training, forcing redundancy; it is switched off in eval() mode. Weight decay penalises large weights. Data augmentation (random crops, flips, noise, for text paraphrasing or masking) creates varied training examples. Early stopping keeps the checkpoint with the best validation score. The best remedy remains more, and more varied, data.

Dropout with a tiny training set, run

I ran this on CPU with Python 3, PyTorch 2.14.1, numpy 2.5.3 and scikit-learn 1.9.1, with fixed seeds and one thread. A large network trained on only 200 digit images reaches 1.000 training accuracy either way. Without dropout it scores 0.934 on the test set; with 50% dropout 0.946. A small but real gain on this run.

import torch
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
torch.set_num_threads(1)
X, y = load_digits(return_X_y=True)
X = torch.tensor(X / 16.0, dtype=torch.float32); y = torch.tensor(y)
X_tr, X_te, y_tr, y_te = train_test_split(X, y, train_size=200, random_state=0, stratify=y)   # tiny training set
def run(p):
    torch.manual_seed(0)
    m = torch.nn.Sequential(torch.nn.Linear(64, 512), torch.nn.ReLU(), torch.nn.Dropout(p),
                            torch.nn.Linear(512, 512), torch.nn.ReLU(), torch.nn.Dropout(p), torch.nn.Linear(512, 10))
    opt = torch.optim.Adam(m.parameters(), lr=1e-3)
    for _ in range(300):
        m.train(); opt.zero_grad()
        torch.nn.functional.cross_entropy(m(X_tr), y_tr).backward(); opt.step()
    m.eval()
    with torch.no_grad():
        return (m(X_tr).argmax(1) == y_tr).float().mean().item(), (m(X_te).argmax(1) == y_te).float().mean().item()
for p in [0.0, 0.5]:
    tr, te = run(p)
    print(f"dropout {p}: train accuracy {tr:.3f}  test accuracy {te:.3f}")

Output:

dropout 0.0: train accuracy 1.000  test accuracy 0.934
dropout 0.5: train accuracy 1.000  test accuracy 0.946

Augment with realistic changes

Only use augmentations that keep the label correct: flipping a digit 6 can turn it into a 9.

त्वरित जाँच: When is dropout active?

  • Only during evaluation
  • During training only; it is disabled in eval mode
  • Never
  • Only when saving the model
Answer

During training only; it is disabled in eval mode — model.eval() turns dropout off.