Batch Normalization
Batch normalization chuẩn hóa từng channel trên một mini-batch, sau đó điều chỉnh lại bằng các tham số được học. Nội dung đề cập toán học, hành vi suy luận và những hạn chế.
Chuẩn hóa theo lô, hay BatchNorm, là một lớp mạng nơ-ron chuẩn hóa từng kênh đầu vào dựa trên giá trị trung bình và phương sai của mini-batch hiện tại, sau đó co giãn kết quả bằng hai tham số học được. Sergey Ioffe và Christian Szegedy đã giới thiệu phương pháp này vào năm 2015, giúp bộ phân loại ảnh Inception của họ đạt cùng độ chính xác chỉ với số bước huấn luyện bằng 1/14. BatchNorm cho phép sử dụng learning rate cao hơn, giúp quá trình huấn luyện ít nhạy cảm hơn với cách khởi tạo trọng số và trở thành thành phần tiêu chuẩn của các mạng nơ-ron tích chập (CNNs) như ResNet.
Batch Normalization hoạt động như thế nào#
Với một lớp tích chập, BatchNorm tính một giá trị trung bình μ và một phương sai σ² cho mỗi kênh, gộp dữ liệu trên mọi ảnh trong batch và mọi vị trí không gian. Sau đó, mỗi activation x trải qua hai bước:
- Chuẩn hóa: x̂ = (x − μ) / √(σ² + ε), trong đó ε nhỏ, mặc định là 1e-5 trong PyTorch, giúp tránh phép chia cho 0.
- Điều chỉnh tỷ lệ và dịch chuyển: y = γ·x̂ + β, trong đó γ và β được học cho từng kênh. Chúng cho phép mạng khôi phục trung bình và độ phân tán phù hợp với lớp kế tiếp, kể cả loại bỏ hoàn toàn hiệu ứng chuẩn hóa.
BatchNorm thường nằm giữa phép tích chập và hàm kích hoạt. Vì β đã cộng độ lệch riêng cho từng kênh, bias của phép tích chập đứng trước nó là dư thừa và thường được tắt.
Huấn luyện và suy luận#
Trong khi huấn luyện, mỗi lượt truyền xuôi cũng cập nhật giá trị trung bình và phương sai tích lũy dưới dạng trung bình động hàm mũ của thống kê batch. BatchNorm2d của PyTorch mặc định dịch chuyển chúng 10% về phía batch mới (momentum=0.1). Khi suy luận, lớp này thay vào đó chuẩn hóa bằng các giá trị trung bình tích lũy, nên dự đoán cho một ảnh không còn phụ thuộc vào những ảnh khác cùng batch. model.train() và model.eval() chuyển đổi giữa hai chế độ:
import torch
torch.manual_seed(0)
bn = torch.nn.BatchNorm2d(num_features=3)
# A batch of 8 three-channel feature maps with mean 5 and standard deviation 2
x = 5 + 2 * torch.randn(8, 3, 16, 16)
# Training mode normalizes with this batch's per-channel mean and variance
out = bn(x)
print(f"train mode: output mean {out.mean():.3f}, std {out.std():.3f}")
# The same call nudges the running averages 10% of the way toward the batch statistics
print(f"running mean {bn.running_mean[0]:.3f}, running var {bn.running_var[0]:.3f}")
# Eval mode normalizes with the running averages instead of the batch statistics
bn.eval()
out = bn(x)
print(f"eval mode: output mean {out.mean():.3f}, std {out.std():.3f}")Ở chế độ huấn luyện, đầu ra có trung bình 0.000 và độ lệch chuẩn 1.000 dù đầu vào có trung bình 5. Sau một batch, giá trị trung bình tích lũy chỉ tăng từ 0 lên 0.496 và phương sai tích lũy từ 1 lên 1.294, nên chế độ đánh giá tạo ra đầu ra có trung bình 3.920. Các giá trị trung bình tích lũy cần vài chục batch để hội tụ; model được đánh giá sai chế độ hoặc trước khi các thống kê ổn định sẽ có điểm thấp hơn nhiều so với độ chính xác thực.
Khi suy luận, BatchNorm là phép biến đổi tuyến tính cố định theo từng kênh, nên có thể gộp vào phép tích chập đứng trước: trọng số tích chập được nhân với γ/√(σ² + ε), còn bias trở thành β − γμ/√(σ² + ε). Khối tích chập tiêu chuẩn trong YOLO26 gồm phép tích chập không bias, tiếp theo là BatchNorm và hàm kích hoạt SiLU. Ultralytics gộp từng lớp BatchNorm này vào phép tích chập trước khi dự đoán và export, loại bỏ lớp đó mà vẫn tạo ra cùng đầu ra.
Vì sao Batch Normalization hữu ích#
Bài báo ban đầu cho rằng lợi ích của BatchNorm đến từ việc giảm dịch chuyển đồng biến nội tại (internal covariate shift), tức sự thay đổi phân phối đầu vào của mỗi lớp khi các lớp trước đó được cập nhật. Các thí nghiệm sau này đưa dịch chuyển phân phối ngẫu nhiên vào sau các lớp BatchNorm cho thấy quá trình huấn luyện hầu như không bị ảnh hưởng, đồng thời xác định lợi ích đến từ bề mặt loss mượt hơn với gradient dễ dự đoán hơn, cho phép optimizer thực hiện các bước lớn hơn và ổn định hơn. Việc giữ các giá trị trước activation gần với trung bình 0 và phương sai 1 cũng ngăn các hàm kích hoạt bão hòa rơi vào vùng phẳng, giúp hạn chế gradient biến mất.
Vì mỗi mẫu được chuẩn hóa bằng thống kê của một batch chọn ngẫu nhiên, BatchNorm cũng tạo thêm nhiễu đóng vai trò như một regularizer nhẹ; bài báo ban đầu cho biết trong một số trường hợp, phương pháp này có thể loại bỏ nhu cầu dùng dropout.
Hạn chế#
- Batch nhỏ: Thống kê batch trở nên nhiễu khi mỗi thiết bị chỉ chứa ít ảnh. Với 2 ảnh trên mỗi GPU, Group Normalization, tính thống kê trên các nhóm kênh bên trong mỗi ảnh, có lỗi ImageNet thấp hơn BatchNorm 10.6% trên ResNet-50.
- Huấn luyện đa GPU: Mỗi GPU chuẩn hóa bằng phần batch riêng, trừ khi các lớp được chuyển đổi sang SyncBatchNorm, phương pháp gộp thống kê giữa các thiết bị nhưng phải tốn thêm chi phí giao tiếp.
- Model chuỗi: Chuỗi có độ dài biến đổi và thống kê phụ thuộc batch không phù hợp với nhau, vì vậy transformer sử dụng layer normalization.
Batch Normalization và các thuật ngữ liên quan#
- Chuẩn hóa dữ liệu: Điều chỉnh tỷ lệ đầu vào thô một lần trong quá trình tiền xử lý, chẳng hạn chia giá trị pixel cho 255. BatchNorm chuẩn hóa activation trung gian ở mọi lớp và mọi bước huấn luyện.
- Layer normalization: Chuẩn hóa từng mẫu trên các đặc trưng của chính mẫu đó, nên hoạt động giống nhau trong huấn luyện và suy luận, không phụ thuộc vào batch size. RMSNorm, một biến thể đơn giản hơn không trừ giá trị trung bình, phổ biến trong large language model.
- Group normalization: Chia các kênh của mỗi ảnh thành nhóm rồi chuẩn hóa bên trong từng nhóm, phù hợp với model phát hiện và phân đoạn được huấn luyện bằng batch nhỏ.
- Instance normalization: Chuẩn hóa riêng từng kênh của mỗi ảnh, loại bỏ độ tương phản riêng của từng ảnh. Thay BatchNorm bằng instance normalization cả khi huấn luyện lẫn kiểm thử đã cải thiện đáng kể chất lượng chuyển đổi phong cách bằng mạng nơ-ron nhanh.










