Residual Networks (ResNet)
Mạng residual (ResNet) cộng đầu vào của mỗi block với đầu ra thông qua kết nối tắt để có thể huấn luyện các mạng rất sâu. Bài viết đề cập đến block, biến thể và mã nguồn.
Mạng residual (ResNet) là một mạng neural tích chập (CNN) sâu được xây dựng từ các residual block, trong đó một kết nối tắt cộng đầu vào của mỗi block với đầu ra của block đó. Do vậy, mỗi block chỉ học phần hiệu chỉnh cho đầu vào, giúp huấn luyện ổn định các mạng có 50, 152 hoặc hơn 1.000 lớp. Kaiming He, Xiangyu Zhang, Shaoqing Ren và Jian Sun thuộc Microsoft Research đã giới thiệu ResNet trong bài báo năm 2015 Học sâu phần dư để nhận dạng hình ảnh; một ensemble các mạng residual đã thắng tác vụ phân loại ILSVRC 2015 với tỷ lệ lỗi top-5 là 3.57% trên ImageNet. Kể từ đó, kết nối residual đã trở thành thành phần tiêu chuẩn trong hầu hết kiến trúc sâu, bao gồm transformer và bộ phát hiện đối tượng thời gian thực.
Vấn đề suy giảm#
Trước ResNet, việc thêm lớp vào một chuỗi convolution thuần cuối cùng khiến kết quả kém đi. Các tác giả ResNet cho thấy mạng thuần 56 lớp có lỗi huấn luyện cao hơn mạng 20 lớp, do đó không thể giải thích mức giảm này bằng overfitting. Mạng sâu hơn có thể khớp với mạng nông bằng cách đặt các lớp bổ sung thành ánh xạ đồng nhất, nhưng gradient descent không tìm ra nghiệm đó. Các tác giả gọi đây là vấn đề suy giảm. Vấn đề gradient biến mất phần lớn đã được giải quyết bằng khởi tạo trọng số đã chuẩn hóa và batch normalization, vì vậy mạng thuần sâu vẫn hội tụ, nhưng chỉ đến các nghiệm kém hơn.
Cách residual block hoạt động#
Residual block tính y = F(x) + x, trong đó x là đầu vào của block còn F là một chuỗi nhỏ các lớp, thường gồm hai hoặc ba convolution cùng batch normalization và ReLU. Nếu ánh xạ tốt nhất cho block gần với ánh xạ đồng nhất, các lớp chỉ cần đưa F về gần 0, dễ hơn nhiều so với học ánh xạ đồng nhất từ đầu. Kết nối tắt cũng tạo cho gradient một đường truyền ngược trực tiếp qua từng block. Kết nối tắt đồng nhất không thêm tham số và hầu như không tốn thêm phép tính. Khi block thay đổi số kênh hoặc giảm kích thước với stride bằng 2, x không còn khớp với hình dạng của F(x), vì vậy convolution 1×1 chiếu kết nối tắt sang hình dạng mới.
ResNet-18 và ResNet-34 xếp chồng các block cơ bản gồm hai convolution. ResNet-50, ResNet-101 và ResNet-152 sử dụng bottleneck block gồm ba convolution: convolution 1×1 giảm số kênh, convolution 3×3 xử lý chúng, rồi convolution 1×1 thứ hai khôi phục số kênh, giúp mô hình sâu có chi phí hợp lý. ResNet-50 có khoảng 25.6 triệu tham số. Bài báo gốc cũng huấn luyện một mạng 1.202 lớp trên CIFAR-10 để đạt lỗi huấn luyện dưới 0.1%, dù lỗi kiểm thử 7.93% kém hơn mức 6.43% của mạng 110 lớp; các tác giả cho rằng khoảng cách này là do overfitting trên tập dữ liệu nhỏ.
Các biến thể ResNet#
- Pre-activation ResNet: Trong nghiên cứu tiếp theo năm 2016 của cùng nhóm tác giả, batch normalization và ReLU được chuyển lên trước mỗi convolution, để đường kết nối tắt chỉ còn là ánh xạ đồng nhất; nghiên cứu cũng huấn luyện một mạng 1.001 lớp trên CIFAR-10.
- ResNeXt: Chia mỗi bottleneck thành nhiều nhánh song song có chiều rộng thấp, gọi là cardinality, giúp tăng độ chính xác với cùng chi phí tính toán.
- Wide ResNet: Sử dụng ít block hơn nhưng rộng hơn, cho thấy chiều rộng có thể thay thế một phần chiều sâu.
- ResNet hiện đại hóa: ConvNeXt (2022) cập nhật thiết kế ResNet bằng kernel lớn hơn, layer normalization và activation GELU để cạnh tranh với vision transformer.
Sử dụng ResNet đã huấn luyện trước#
ResNet đã huấn luyện trước vẫn thường được dùng làm baseline và backbone cho transfer learning. Các model ResNet của torchvision đi kèm trọng số ImageNet và quy trình tiền xử lý tương ứng, vì vậy chỉ cần vài dòng để phân loại ảnh:
import urllib.request
import torch
from torchvision.io import decode_image
from torchvision.models import ResNet50_Weights, resnet50
# Load ResNet-50 with ImageNet weights and its matching preprocessing
weights = ResNet50_Weights.DEFAULT
model = resnet50(weights=weights).eval()
preprocess = weights.transforms()
# Download and decode a sample image
data = urllib.request.urlopen("https://ultralytics.com/images/bus.jpg").read()
image = decode_image(torch.frombuffer(bytearray(data), dtype=torch.uint8))
# Classify the image and report the most likely ImageNet class
with torch.no_grad():
probs = model(preprocess(image).unsqueeze(0)).softmax(dim=1)
score, index = probs.max(dim=1)
print(f"{weights.meta['categories'][index.item()]}: {score.item():.2f}")Lệnh này in ra minibus: 0.25, lớp gần nhất trong 1.000 lớp ImageNet với chiếc xe buýt thành phố trong ảnh. Với tác vụ tùy chỉnh, thay lớp fully connected cuối cùng và fine-tune trên nhãn mới cho phép tái sử dụng các đặc trưng mà những tầng residual đã học từ ImageNet.
ResNet và các kiến trúc liên quan#
- Mạng thuần như VGG: VGG xếp chồng convolution 3×3 không có kết nối tắt và tối đa có 19 lớp trọng số. ResNet-152 sâu gấp tám lần nhưng có độ phức tạp thấp hơn VGG-19.
- Highway network: Được phát triển đồng thời với ResNet, các mạng này bổ sung cổng có thể học để đóng kết nối tắt. Kết nối tắt đồng nhất của ResNet không bao giờ bị đóng và không thêm tham số.
- DenseNet: Nối đầu ra của tất cả các lớp trước đó trong một block thay vì cộng một kết nối tắt; cách này tái sử dụng đặc trưng nhưng làm số kênh tăng dần.
- U-Net: Các kết nối skip của U-Net chuyển feature map của encoder sang decoder rồi nối chúng tại đó, liên kết các tầng cách xa nhau thay vì bao quanh từng block riêng lẻ.
- Vision transformer (ViT): Thay convolution bằng self-attention nhưng vẫn giữ kết nối residual quanh từng phân lớp attention và feed-forward, như mọi transformer khác.
Kết nối residual trong các model hiện đại#
Ý tưởng residual tồn tại lâu hơn các kiến trúc ResNet cụ thể. Mỗi lớp của một mô hình ngôn ngữ lớn (LLM) đưa các đầu ra attention và feed-forward của lớp đó trở lại luồng residual đang được tích lũy, và hầu hết bộ phát hiện CNN xây dựng backbone từ các khối residual. Trong YOLO26, các khối C3k2 được tạo từ các mô-đun bottleneck trả về x + F(x) bất cứ khi nào số kênh đầu vào và đầu ra khớp nhau, và gói Ultralytics cũng bao gồm các cấu hình RT-DETR của Baidu với backbone ResNet-50 và ResNet-101. Bài báo về ResNet đã giành Giải thưởng Bài báo xuất sắc nhất tại CVPR 2016, và một phân tích đăng trên Nature năm 2025 xếp bài báo này là bài báo được trích dẫn nhiều nhất trong thế kỷ XXI.










