Dropout Layer
Một lớp dropout ngẫu nhiên đặt một phần activation về 0 trong quá trình huấn luyện để mạng không phụ thuộc vào bất kỳ unit đơn lẻ nào, qua đó giảm overfitting.
Layer dropout là một thành phần regularization của mạng nơ-ron, ngẫu nhiên đặt một tỷ lệ p đầu vào thành 0 ở mỗi bước huấn luyện và giữ nguyên mọi giá trị trong lúc inference. Vì bất kỳ unit nào cũng có thể biến mất ở bất kỳ bước nào, mạng không thể phụ thuộc vào một vài neuron cụ thể hoặc những mối đồng thích nghi mong manh giữa chúng; do đó, mạng học được các đặc trưng dư thừa có khả năng khái quát hóa tốt hơn và ít overfit dữ liệu huấn luyện hơn. Geoffrey Hinton và các cộng sự giới thiệu kỹ thuật này vào năm 2012, còn Srivastava, Hinton và cộng sự mô tả đầy đủ kỹ thuật vào năm 2014. Đây là layer tích hợp sẵn trong PyTorch, TensorFlow và hầu hết framework deep learning khác, được dùng trong các kiến trúc từ head phân loại kết nối đầy đủ đến transformer.
Cách Dropout hoạt động#
Trong quá trình huấn luyện, layer lấy một mask ngẫu nhiên mới cho mỗi lượt lan truyền tiến, giữ lại từng phần tử với xác suất 1 − p và đặt phần tử đó bằng 0 với xác suất p. Vì vậy, mỗi bước huấn luyện một mạng con đã được thu gọn khác nhau; mạng đầy đủ được dùng khi kiểm thử xấp xỉ giá trị trung bình của vô số mạng con dùng chung trọng số, đó là lý do dropout thường được mô tả là huấn luyện ensemble với chi phí thấp. Để giữ giá trị activation kỳ vọng như nhau trong cả hai giai đoạn, các framework hiện đại dùng inverted dropout: những giá trị còn lại được nhân với 1 / (1 − p) trong quá trình huấn luyện, nhờ đó layer không làm gì khi inference. Trong PyTorch, nn.Dropout tuân theo chế độ huấn luyện hoặc đánh giá của module:
import torch
from torch import nn
torch.manual_seed(0)
dropout = nn.Dropout(p=0.5)
x = torch.ones(10)
# Chế độ huấn luyện: khoảng một nửa số giá trị được đặt bằng 0 và các giá trị còn lại được nhân với 1 / (1 - p) = 2
dropout.train()
print("Train:", dropout(x))
# Chế độ đánh giá: layer giữ nguyên mọi giá trị
dropout.eval()
print("Eval: ", dropout(x))Ở chế độ huấn luyện, sáu trong số mười giá trị bị loại bỏ và bốn giá trị còn lại trở thành 2.0, giữ giá trị kỳ vọng ở mức 1.0; ở chế độ đánh giá, cả mười giá trị vẫn là 1.0.
Các biến thể Dropout phổ biến#
- Spatial Dropout:
nn.Dropout2dcủa PyTorch đặt toàn bộ kênh feature map thành 0, phù hợp với mạng tích chập vì các pixel lân cận trong cùng một kênh có tương quan mạnh và việc bỏ từng pixel riêng lẻ hầu như không regularize được chúng. - Stochastic Depth (DropPath): Thay vì các activation riêng lẻ, toàn bộ nhánh residual được bỏ qua ngẫu nhiên cho từng mẫu; đây là thành phần tiêu chuẩn khi huấn luyện Vision Transformer và CNN hiện đại.
- Monte Carlo Dropout: Dropout vẫn hoạt động khi inference và model chạy nhiều lượt lan truyền tiến trên cùng một đầu vào. Mức độ phân tán của các dự đoán cung cấp ước tính độ bất định của model với chi phí thấp cho các hệ thống quan trọng về an toàn; Gal và Ghahramani diễn giải phương pháp này là suy luận Bayes xấp xỉ.
- DropConnect: Các trọng số riêng lẻ được đặt ngẫu nhiên thành 0 thay vì các activation, mỗi kết nối có mask riêng.
Dropout trong thực tế#
Tỷ lệ dropout được tinh chỉnh như mọi siêu tham số khác. Srivastava và cộng sự nhận thấy rằng xác suất loại bỏ các unit ẩn là 0.5 hoạt động tốt trên nhiều mạng và tác vụ, trong khi các unit đầu vào hoạt động tốt nhất khi tỷ lệ giữ lại gần 1; Transformer ban đầu sử dụng p = 0.1. Tỷ lệ quá cao làm chậm hội tụ và có thể gây underfitting; đặt dropout ngay trước batch normalization có thể làm giảm độ chính xác do dịch chuyển phương sai giữa huấn luyện và kiểm thử. Nhiều mạng nơ-ron tích chập chủ yếu dựa vào batch normalization, tăng cường dữ liệu và weight decay, chỉ dùng dropout cho head phân loại. Model phân loại Ultralytics YOLO26 áp dụng cách này: chúng có một layer dropout nằm giữa các đặc trưng 1,280 kênh đã pooling và bộ phân loại tuyến tính cuối cùng; tỷ lệ dropout được thiết lập bằng đối số huấn luyện dropout (mặc định là 0.0).
from ultralytics import YOLO
# Tải model phân loại YOLO26 có layer dropout trong head
model = YOLO("yolo26n-cls.pt")
# Huấn luyện với dropout 10% trong head phân loại trên một tập con MNIST nhỏ
results = model.train(data="mnist160", epochs=10, imgsz=64, dropout=0.1)Ứng dụng thực tế#
- Phân tích ảnh y tế: Việc gán nhãn ảnh quét tốn kém, vì vậy các bộ phân loại chẩn đoán thường được fine-tune từ backbone đã pretrained trên vài nghìn ảnh. Dropout trong head phân loại hạn chế mức độ head ghi nhớ các trường hợp riêng lẻ từ tập dữ liệu nhỏ như vậy.
- Xử lý ngôn ngữ tự nhiên: Các encoder Transformer như BERT áp dụng dropout với xác suất 0.1 ở tất cả layer, bao gồm trọng số attention, trong quá trình pre-training và fine-tuning.
Dropout và các kỹ thuật liên quan#
- Batch Normalization: Batch normalization chuẩn hóa đầu vào của mỗi layer để ổn định quá trình huấn luyện và chỉ thêm một lượng nhiễu nhỏ từ thống kê batch, không loại bỏ bất kỳ unit nào.
- Làm mượt nhãn: Làm mượt nhãn regularize thông qua các target huấn luyện bằng cách làm mềm nhãn one-hot, đồng thời giữ nguyên mọi activation.
- Pruning: Pruning loại bỏ vĩnh viễn các trọng số ít quan trọng để thu nhỏ model, còn dropout chỉ đặt các giá trị thành 0 trong một bước huấn luyện và giữ nguyên số lượng tham số.










