Mục lục
- Mục tiêu bài học
- Dòng thời gian kiến trúc CNN — bức tranh tổng
- LeNet-5 (1998) — CNN thành công đầu tiên
- AlexNet (2012) — mốc bùng nổ deep learning
- VGG (2014) — kernel 3x3 và độ sâu
- GoogLeNet / Inception (2014) — multi-scale qua module song song
- ResNet (2015) — residual connection
- DenseNet (2017) — feature reuse triệt để
- MobileNet, SqueezeNet — CNN cho edge và mobile
- EfficientNet (2019) — compound scaling
- NAS — Neural Architecture Search
- ConvNeXt (2022) — CNN modern hoá theo Transformer
- Vision Transformer (ViT, 2020) — vị trí trong bức tranh
- Bảng so sánh — param, accuracy, latency, use case
- Khi nào chọn architecture nào
- Truy cập pretrained model qua torchvision và timm
- Key concept xuất hiện ở nhiều architecture
- Xu hướng hiện tại — CNN vs ViT vs hybrid
- Tổng kết Module 4 — CNN cho ảnh
- Code Python — load 3 pretrained, đếm param, benchmark, visualize filter
- Bài tập
Mục tiêu bài học
Sau bài học, bạn sẽ:
- Đặt được các kiến trúc CNN nổi bật vào dòng thời gian và biết mỗi kiến trúc đóng góp ý tưởng gì.
- Giải thích residual connection trong ResNet, Inception module, depthwise separable trong MobileNet, compound scaling trong EfficientNet.
- Đọc được bảng so sánh param / accuracy / latency và chọn kiến trúc phù hợp cho một use case cụ thể (edge, balance, highest accuracy).
- Load một pretrained model bất kỳ từ
torchvisionvà đếm số param. - Biết vị trí của Vision Transformer và xu hướng hybrid CNN + Attention.
Bài này nối Bài 32 — Transfer Learning (đã dùng ResNet làm backbone) với Bài 34 — Sequential Data (Module 5, mở sang RNN).
Dòng thời gian kiến trúc CNN — bức tranh tổng
Tóm tắt các mốc chính trong lịch sử CNN cho image classification:
| Năm | Kiến trúc | Đóng góp chính |
|---|---|---|
| 1998 | LeNet-5 | CNN thành công đầu tiên (MNIST, digit recognition). |
| 2012 | AlexNet | Thắng ImageNet 2012, mở đầu deep learning era. ReLU, Dropout, GPU. |
| 2014 | VGG | Stack nhiều Conv 3x3, độ sâu 16–19 layer. Cấu trúc đều, dễ hiểu. |
| 2014 | GoogLeNet (Inception v1) | Inception module: nhiều kernel song song. 1x1 bottleneck. |
| 2015 | ResNet | Residual connection \( y = F(x) + x \). Train được mạng 100+ layer. |
| 2016–17 | SqueezeNet, MobileNet v1/v2, Xception | Tối ưu cho mobile / edge. Depthwise separable, fire module. |
| 2017 | DenseNet | Connect mọi layer với mọi layer sau. Feature reuse. |
| 2017 | ResNeXt, SENet | Group convolution, squeeze-excitation block. |
| 2018–19 | NASNet, MnasNet, EfficientNet | Neural Architecture Search. Compound scaling. |
| 2020 | Vision Transformer (ViT) | Treat image patches như token, dùng Transformer encoder. |
| 2022 | ConvNeXt | CNN học lại best practice từ Transformer, cạnh tranh với ViT. |
Quy luật chung qua các năm: số layer tăng, param mỗi layer giảm thông qua kỹ thuật (1x1 bottleneck, depthwise separable), đồng thời mạng được structure hoá rõ hơn (block lặp lại, scaling rule). Accuracy ImageNet top-1 tăng từ ~58% (AlexNet) lên ~88% (ConvNeXt-XL / ViT-Large), trong khi efficiency cũng tăng — EfficientNet-B0 đạt ~77% với chỉ 5.3M param.
LeNet-5 (1998) — CNN thành công đầu tiên
LeNet-5 (LeCun et al., 1998) là CNN đầu tiên dùng được trong sản phẩm thực — đọc số viết tay trên check ngân hàng tại Mỹ. Train trên MNIST (28×28 grayscale digit).
Cấu trúc 7 layer (không tính input):
Input (1, 32, 32)
→ Conv 5x5, 6 filter → (6, 28, 28)
→ AvgPool 2x2 → (6, 14, 14)
→ Conv 5x5, 16 filter → (16, 10, 10)
→ AvgPool 2x2 → (16, 5, 5)
→ Flatten → 400
→ FC 120 → FC 84 → FC 10
Tổng param ~60K. Activation gốc là tanh / sigmoid (ReLU chưa phổ biến). Bài học từ LeNet vẫn áp dụng tới nay: stack Conv + Pool để rút gọn dần spatial, kết bằng FC layer cho classification.
Hạn chế: dataset MNIST quá đơn giản; LeNet trên ImageNet không train được vì compute thiếu và mạng không đủ sâu. Phải đợi 14 năm cho đến AlexNet.
AlexNet (2012) — mốc bùng nổ deep learning
AlexNet (Krizhevsky, Sutskever & Hinton, 2012) thắng ImageNet 2012 với top-5 error 15.3% — vượt xa kết quả tốt nhất trước đó (~26% bằng feature engineering thủ công + SVM). Đây là tín hiệu rõ ràng nhất cho cộng đồng CV rằng deep learning hoạt động.
Cấu trúc 8 layer (5 Conv + 3 FC), ~60M param:
Input (3, 224, 224)
→ Conv 11x11 stride 4, 96 filter → (96, 55, 55)
→ MaxPool 3x3 stride 2 → (96, 27, 27)
→ Conv 5x5, 256 filter → (256, 27, 27)
→ MaxPool → (256, 13, 13)
→ Conv 3x3, 384 filter → (384, 13, 13)
→ Conv 3x3, 384 filter → (384, 13, 13)
→ Conv 3x3, 256 filter → (256, 13, 13)
→ MaxPool → (256, 6, 6)
→ Flatten → FC 4096 → FC 4096 → FC 1000
Đóng góp kỹ thuật:
- ReLU thay tanh/sigmoid — train nhanh hơn nhiều và giảm vanishing gradient.
- Dropout trong FC layer — chống overfitting trên dataset 1.2M ảnh.
- GPU training — train trên 2 GPU NVIDIA GTX 580 (3GB VRAM mỗi cái), chia mạng thành hai stream song song. Đây là first major paper coi GPU như công cụ DL chuẩn.
- Data augmentation (random crop, horizontal flip, PCA color jitter).
- Local Response Normalization — sau này được thay bằng BatchNorm.
Hai stream trên 2 GPU không phải kiến trúc bắt buộc mà là constraint phần cứng thời đó. Implementation modern thường gộp lại thành một stream.
VGG (2014) — kernel 3x3 và độ sâu
VGG (Simonyan & Zisserman, 2014, Oxford) đặt câu hỏi: nếu chỉ dùng Conv 3x3, đẩy mạng sâu hơn, kết quả thế nào? Câu trả lời: rất tốt — VGG-16 đạt top-5 error ~7.3% trên ImageNet.
Quy tắc thiết kế VGG:
- Chỉ Conv 3x3 với padding 1 (giữ same size), stride 1.
- MaxPool 2x2 stride 2 giữa các block để downsample.
- Mỗi lần MaxPool, double số channel: 64 → 128 → 256 → 512.
- VGG-16 có 13 Conv + 3 FC = 16 layer trọng số; VGG-19 có 16 Conv + 3 FC.
Lý do dùng 3x3 thay vì kernel lớn (xem Bài 28 — receptive field): stack 2 Conv 3x3 cho receptive field 5x5 với ít param hơn và thêm phi tuyến giữa các layer.
Số param khá lớn — VGG-16 có ~138M param, trong đó ~123M nằm ở 3 layer FC cuối. Phần Conv chỉ ~15M. Đây cũng là lý do modern architecture thay FC bằng Global Average Pooling.
VGG vẫn được dùng phổ biến hôm nay: feature extractor cho style transfer (Gatys et al., 2015 — neural style dựa trên VGG-19), perceptual loss, GAN evaluator. Kiến trúc đơn giản, regular, dễ chỉnh.
GoogLeNet / Inception (2014) — multi-scale qua module song song
GoogLeNet (Szegedy et al., 2014, Google) thắng ImageNet 2014 cùng năm với VGG. Ý tưởng then chốt: Inception module — thay vì chọn 1 kernel size, dùng nhiều kernel size song song và concat kết quả.
Một Inception module v1 gồm 4 nhánh:
Input feature map
├── Conv 1x1
├── Conv 1x1 → Conv 3x3
├── Conv 1x1 → Conv 5x5
└── MaxPool 3x3 → Conv 1x1
↓
Concat dọc channel
Mỗi nhánh nhìn input qua receptive field khác nhau (1, 3, 5, hoặc pooling). Concat đầu ra cho mạng tự chọn pha trộn scale tốt nhất.
Vai trò Conv 1x1: bottleneck giảm channel trước khi Conv 3x3 hoặc 5x5 đắt tiền (xem Bài 28). Nhờ vậy GoogLeNet chỉ ~7M param — kém VGG-16 gần 20 lần, mà accuracy ngang.
Inception v2 (Ioffe & Szegedy, 2015) thêm BatchNorm; Inception v3 (Szegedy et al., 2016) thay Conv 5x5 bằng 2 Conv 3x3 (theo bài học VGG), thêm factorized Conv (3x3 → 1x3 + 3x1). Inception-ResNet (2016) kết hợp với residual connection.
ResNet (2015) — residual connection
ResNet (He et al., 2015, Microsoft Research) thắng ImageNet 2015 với top-5 error 3.57% — vượt cả human-level. Đóng góp: residual connection (skip connection) giải bài toán train mạng rất sâu.
Trước ResNet, train mạng >30 layer cho ImageNet thường tệ hơn mạng 20 layer — không phải overfitting mà là optimization khó. Vanishing gradient và degradation problem.
Ý tưởng: thay vì học mapping \( H(x) \) trực tiếp, học residual \( F(x) = H(x) - x \), output là:
\[ y = F(x) + x \]
Skip connection \( + x \) cộng input vào output. Nếu mapping tối ưu gần với identity, mạng chỉ cần đẩy \( F(x) \to 0 \) — dễ hơn nhiều so với học identity từ đầu. Đồng thời gradient có "đường tắt" về layer sớm — giảm vanishing.
Building block trong ResNet:
Basic block (ResNet-18, 34):
x ─┬─ Conv 3x3 → BN → ReLU → Conv 3x3 → BN ─ + ─ ReLU →
└────────────────── skip ───────────────────┘
Bottleneck block (ResNet-50, 101, 152):
x ─┬─ Conv 1x1 → BN → ReLU
│ → Conv 3x3 → BN → ReLU
│ → Conv 1x1 → BN ──── + ─ ReLU →
└─────── skip ───────────┘
Param theo variant:
| Model | Layer | Param | Block |
|---|---|---|---|
| ResNet-18 | 18 | ~11.7M | Basic |
| ResNet-34 | 34 | ~21.8M | Basic |
| ResNet-50 | 50 | ~25.6M | Bottleneck |
| ResNet-101 | 101 | ~44.5M | Bottleneck |
| ResNet-152 | 152 | ~60.2M | Bottleneck |
ResNet là default backbone cho rất nhiều task hiện nay: detection (Faster R-CNN, Mask R-CNN dùng ResNet-50/101), segmentation (DeepLab), feature extractor cho retrieval, perceptual loss. Khi không chắc dùng gì, ResNet-50 pretrained ImageNet là điểm xuất phát an toàn.
Skip connection đã lan ra ngoài CNN: Transformer (block residual), U-Net (skip cross-resolution), nhiều mô hình modern khác.
DenseNet (2017) — feature reuse triệt để
DenseNet (Huang et al., 2017) tổng quát hóa skip connection: mỗi layer nhận concat output của tất cả layer trước nó, thay vì chỉ cộng từ một layer.
Layer L nhận: [x0, x1, x2, ..., x_{L-1}] (concat dọc channel)
Lợi ích:
- Feature reuse: layer sâu có thể dùng feature từ layer rất sớm.
- Gradient flow tốt — mỗi layer có "đường tắt" tới mọi layer sau.
- Số param ít hơn ResNet cùng accuracy. DenseNet-121 chỉ ~8M param vs ResNet-50 ~25M.
Nhược: concat làm tăng channel nhanh; memory access pattern không thân thiện GPU như add. Trong thực tế DenseNet ít phổ biến hơn ResNet vì lý do engineering, nhưng ý tưởng dense connection xuất hiện lại trong nhiều mô hình segmentation và detection.
MobileNet, SqueezeNet — CNN cho edge và mobile
Smartphone, IoT, drone cần model nhỏ, latency thấp, ít RAM. Hai dòng tiêu biểu:
SqueezeNet (Iandola et al., 2016):
- Fire module: Conv 1x1 squeeze (giảm channel) → song song Conv 1x1 và Conv 3x3 expand.
- ~1.2M param — kém AlexNet 50 lần, accuracy ImageNet tương đương.
- Sau quantization (8-bit) còn ~0.5 MB — vừa firmware.
MobileNet (Howard et al., 2017 — v1, Sandler et al., 2018 — v2, Howard et al., 2019 — v3):
- Ý tưởng cốt lõi: depthwise separable convolution (xem Bài 28). Tách Conv thường thành depthwise (3x3 mỗi channel độc lập) + pointwise (1x1 trộn channel). Giảm param và FLOPs khoảng 8–9 lần với chất lượng feature giảm rất nhẹ.
- MobileNet v2 thêm inverted residual và linear bottleneck.
- MobileNet v3 dùng NAS để tinh chỉnh kiến trúc, kết hợp Squeeze-Excitation block và h-swish activation.
- MobileNet v2 ~3.4M param, ImageNet top-1 ~72%. v3-Large ~5.4M, ~75%.
Các variant này thường được benchmark theo cả accuracy lẫn latency thực đo trên smartphone (vd Pixel 1) chứ không chỉ FLOPs — vì FLOPs không đại diện chính xác cho thời gian thực.
EfficientNet (2019) — compound scaling
EfficientNet (Tan & Le, 2019, Google) đặt câu hỏi: khi muốn scale up một model có cùng base, scale chiều nào (depth, width, hay input resolution) là tốt nhất?
Câu trả lời: scale đồng thời cả ba theo một tỷ lệ tính toán được. Đây là compound scaling:
\[ \text{depth} = \alpha^\phi, \quad \text{width} = \beta^\phi, \quad \text{resolution} = \gamma^\phi \]
với ràng buộc \( \alpha \cdot \beta^2 \cdot \gamma^2 \approx 2 \) (compute tăng gấp đôi mỗi step \( \phi \)). \( \alpha, \beta, \gamma \) tìm bằng grid search nhỏ trên base model. \( \phi \) là biến scale chính.
EfficientNet base model (B0) tìm bằng NAS với constraint mobile. Sau đó scale lên B1 → B7 bằng compound scaling:
| Variant | Param | Input | ImageNet top-1 |
|---|---|---|---|
| B0 | 5.3M | 224 | 77.1% |
| B1 | 7.8M | 240 | 79.1% |
| B3 | 12M | 300 | 81.6% |
| B5 | 30M | 456 | 83.6% |
| B7 | 66M | 600 | 84.3% |
Tại thời điểm 2019–2020, EfficientNet cho tỷ lệ accuracy/param tốt nhất. Sau đó EfficientNet v2 (Tan & Le, 2021) cải thiện thêm tốc độ train với fused-MBConv.
Lưu ý: con số accuracy trên giấy phụ thuộc heavy data augmentation (AutoAugment, RandAugment), stochastic depth, EMA. So sánh cross-architecture nên đảm bảo cùng training recipe.
NAS — Neural Architecture Search
NAS (Neural Architecture Search) tự động hóa thiết kế kiến trúc thay vì thiết kế tay. Ý tưởng: định nghĩa search space (các block, kernel size, connection có thể) và dùng RL, evolutionary algorithm, hoặc gradient-based search để tìm kiến trúc tốt nhất theo metric (accuracy, latency).
Một số mốc:
- NASNet (Zoph et al., 2018) — search trên CIFAR rồi transfer sang ImageNet. Kết quả tốt nhưng compute rất đắt.
- MnasNet (Tan et al., 2019) — search có constraint latency trên thiết bị thật. Cho ra kiến trúc rẻ cho mobile.
- EfficientNet-B0 — base model tìm bằng MnasNet-style search.
- DARTS (Liu et al., 2019) — differentiable architecture search, dùng gradient để search trực tiếp. Rẻ hơn RL nhiều bậc.
NAS thuộc nhóm AutoML — tự động hoá phần nào pipeline ML. Hạn chế: compute đắt (nhiều GPU-day để search một kiến trúc), kết quả khó interpret, đôi khi overfit search criterion. Trong thực tế đa số team vẫn dùng kiến trúc public đã proven thay vì tự search.
ConvNeXt (2022) — CNN modern hoá theo Transformer
Sau 2020, ViT (Vision Transformer) cạnh tranh trực tiếp với CNN trên ImageNet. ConvNeXt (Liu et al., 2022, Meta AI) đặt câu hỏi: nếu áp dụng các best practice từ Transformer vào CNN cũ, kết quả thế nào?
Các thay đổi so với ResNet:
- Depthwise Conv 7x7 thay Conv 3x3 — bắt chước "global" receptive field của attention.
- LayerNorm thay BatchNorm.
- GELU thay ReLU.
- Inverted bottleneck (giống MobileNet v2, Transformer FFN).
- Patchify stem (Conv 4x4 stride 4) giống ViT.
- Bỏ activation và normalization ở một số chỗ — ít hơn so với ResNet.
Kết quả: ConvNeXt-T (29M param) ~82.1% ImageNet, ConvNeXt-XL (350M) ~87.8% — cạnh tranh với Swin Transformer và ViT cùng size. Bài này cho thấy CNN vẫn còn dư địa khi áp dụng đúng technique.
Vision Transformer (ViT, 2020) — vị trí trong bức tranh
Bài 33 focus CNN, nhưng cần biết ViT ở mức overview để hiểu landscape hiện tại.
Vision Transformer (Dosovitskiy et al., 2020, Google) áp dụng Transformer encoder (vốn cho NLP) cho ảnh:
- Chia ảnh thành các patch \( 16 \times 16 \) (hoặc \( 14 \times 14 \), \( 32 \times 32 \)).
- Flatten mỗi patch thành vector, thêm positional embedding.
- Đưa vào Transformer encoder (multi-head self-attention + FFN, stack nhiều layer).
- Class token cuối → MLP head cho classification.
Phát hiện chính: với dataset đủ lớn (JFT-300M, 300 triệu ảnh), ViT vượt ResNet/EfficientNet trên ImageNet. Với dataset nhỏ (chỉ ImageNet 1.2M), ViT hơi kém CNN vì không có inductive bias spatial sẵn (translation equivariance) như Conv.
Các variant kế tiếp: DeiT (data-efficient ViT, Touvron et al., 2021), Swin Transformer (Liu et al., 2021 — windowed attention, hierarchical, cạnh tranh trực tiếp với CNN trên detection/segmentation).
Chi tiết Transformer sẽ học trong Module 6 — đây chỉ là mention.
Bảng so sánh — param, accuracy, latency, use case
Số ImageNet top-1 dưới đây từ paper gốc hoặc torchvision model zoo (recipe modern, có thể cao hơn paper gốc vài %). Latency mang tính tương đối — phụ thuộc hardware, framework, batch size.
| Model | Năm | Param | Top-1 ImageNet | Inference (GPU, B=1) | Use case điển hình |
|---|---|---|---|---|---|
| LeNet-5 | 1998 | ~60K | — | — | Lịch sử, MNIST. |
| AlexNet | 2012 | ~60M | ~57% | nhanh | Lịch sử, học bài. |
| VGG-16 | 2014 | ~138M | ~71% | chậm | Style transfer, perceptual loss. |
| GoogLeNet (Inception v1) | 2014 | ~7M | ~70% | nhanh | Mạng nhỏ, hệ thống cũ. |
| ResNet-18 | 2015 | ~11.7M | ~70% | rất nhanh | Baseline, dataset nhỏ, học bài. |
| ResNet-50 | 2015 | ~25.6M | ~76–80% | nhanh | Default backbone cho hầu hết task. |
| ResNet-152 | 2015 | ~60.2M | ~78–82% | vừa | Cần accuracy hơn, compute ổn. |
| DenseNet-121 | 2017 | ~8M | ~75% | vừa | Ít param, segmentation/detection. |
| MobileNet v2 | 2018 | ~3.4M | ~72% | rất nhanh | Mobile / edge inference. |
| MobileNet v3-Large | 2019 | ~5.4M | ~75% | rất nhanh | Mobile cải tiến. |
| EfficientNet-B0 | 2019 | ~5.3M | ~77% | nhanh | Edge với accuracy cao hơn MobileNet. |
| EfficientNet-B3 | 2019 | ~12M | ~82% | vừa | Balance accuracy / size. |
| EfficientNet-B7 | 2019 | ~66M | ~84% | chậm | Cần accuracy cao, GPU. |
| ConvNeXt-Tiny | 2022 | ~29M | ~82% | vừa | Modern CNN backbone. |
| ConvNeXt-XL | 2022 | ~350M | ~87% | chậm | Server-side accuracy cao. |
| ViT-B/16 | 2020 | ~86M | ~84% | vừa | Cần dataset lớn hoặc pretrain mạnh. |
| ViT-L/16 | 2020 | ~307M | ~85–88% | chậm | Highest accuracy, server. |
Khi nào chọn architecture nào
Gợi ý chọn theo ngữ cảnh:
- Edge / mobile / latency < 30ms trên CPU: MobileNet v2/v3, EfficientNet-B0 hoặc B1. Sau khi train, quantize 8-bit để giảm thêm size.
- Balance accuracy & speed (server với GPU vừa, real-time): ResNet-50 hoặc EfficientNet-B3. ResNet-50 phổ biến hơn, framework / tooling support tốt nhất.
- Highest accuracy (offline batch, server với GPU mạnh): ConvNeXt-XL, EfficientNet-B7, ViT-Large. Khác biệt nhỏ — chọn theo dataset có sẵn pretrained và pipeline.
- Train from scratch nhanh trên dataset nhỏ (CIFAR, vài chục nghìn ảnh): ResNet-18 hoặc ResNet-20-CIFAR. Đủ accuracy, train được trên 1 GPU trong vài giờ.
- Detection / segmentation backbone: ResNet-50/101 vẫn là default vì compatible với Faster R-CNN, Mask R-CNN, FPN. ConvNeXt và Swin Transformer là alternative hiện đại.
- Style transfer, perceptual loss: VGG-16 hoặc VGG-19 — feature có texture detail tốt cho task này.
- Dataset rất lớn (hàng chục triệu ảnh) hoặc có pretrain self-supervised: ViT thường vượt CNN. Với ImageNet thuần (1.2M), khác biệt không lớn.
Quy tắc thực dụng: khi không chắc, bắt đầu với ResNet-50 pretrained ImageNet. Đo baseline, sau đó mới swap sang model lớn hơn hoặc nhỏ hơn theo nhu cầu.
Truy cập pretrained model qua torchvision và timm
torchvision.models cung cấp khoảng 30+ kiến trúc pretrained ImageNet:
from torchvision import models
resnet = models.resnet50(weights="DEFAULT")
efficientnet = models.efficientnet_b0(weights="DEFAULT")
convnext = models.convnext_tiny(weights="DEFAULT")
vgg = models.vgg16(weights="DEFAULT")
mobilenet = models.mobilenet_v3_large(weights="DEFAULT")
vit = models.vit_b_16(weights="DEFAULT")
weights="DEFAULT" dùng pretrained mới nhất. Mỗi model có thể có nhiều bộ weight (vd ResNet50_Weights.IMAGENET1K_V1 và V2) — V2 dùng recipe train hiện đại hơn, accuracy cao hơn.
Đi kèm transform chuẩn để input đúng phân phối:
weights = models.ResNet50_Weights.DEFAULT
preprocess = weights.transforms() # Resize, CenterCrop, Normalize
print(weights.meta["_metrics"]) # accuracy trên ImageNet
Cho thư viện rộng hơn (gồm ConvNeXt-V2, Swin-V2, MaxViT, RegNetY, hàng trăm variant), dùng timm (PyTorch Image Models, Wightman 2019):
# pip install timm
import timm
model = timm.create_model("convnext_tiny", pretrained=True)
model = timm.create_model("efficientnet_b0", pretrained=True)
model = timm.create_model("vit_base_patch16_224", pretrained=True)
print(len(timm.list_models())) # 700+ models
timm là chuẩn de facto cho image classification research vì cập nhật nhanh và bao phủ rộng hơn torchvision.
Key concept xuất hiện ở nhiều architecture
Một số ý tưởng xuất hiện đi xuất hiện lại — đáng nhớ kỹ:
- Skip / Residual connection (ResNet 2015): \( y = F(x) + x \). Cho phép train mạng rất sâu. Có mặt trong gần như mọi mô hình modern (CNN, Transformer, U-Net).
- 1x1 Convolution (Inception 2014, ResNet bottleneck): giảm/tăng channel với chi phí thấp, trộn channel mà không thay đổi không gian.
- Depthwise Separable Conv (MobileNet 2017, Xception 2017): tách spatial và channel mixing, giảm param/FLOPs ~9 lần.
- Squeeze-Excitation (SE) block (Hu et al., 2018 — SENet): học channel attention qua global pool + 2 FC + sigmoid. Có mặt trong EfficientNet, MobileNet v3.
- Group Convolution (AlexNet, ResNeXt 2017): chia channel thành nhóm độc lập. ResNeXt thay "depth" bằng "cardinality" (số nhóm).
- Global Average Pooling (NIN, GoogLeNet): thay FC cuối bằng average pool toàn feature map, giảm param mạnh.
- Batch / Layer Normalization: cải thiện training stability. BN trong CNN cổ điển, LN trong ConvNeXt và Transformer.
Khi đọc một paper architecture mới, thường gặp tổ hợp các block này với vài tweak nhỏ — biết các "viên gạch" giúp đọc paper nhanh.
Xu hướng hiện tại — CNN vs ViT vs hybrid
Bức tranh tại thời điểm 2024–2026 (dựa trên paper được trích nhiều):
- ViT thắng khi pretrain trên dataset rất lớn (JFT, LAION, DINOv2). Self-supervised pretraining + finetune cho downstream task hoạt động tốt với attention.
- CNN vẫn cạnh tranh tốt trong nhiều use case: detection (ResNet vẫn dominant trong production), edge, dataset trung bình. ConvNeXt-V2 chứng minh CNN khi modern hoá đầy đủ vẫn so kè ViT.
- Hybrid CNN + Attention: nhiều mô hình mới dùng Conv ở lớp đầu (early stage — feature local, có inductive bias spatial) và Attention ở lớp sâu (long-range reasoning). Vd CoAtNet, MaxViT, MobileViT.
- Foundation model cho vision: CLIP (OpenAI 2021 — image-text contrastive), DINOv2 (Meta 2023 — self-supervised), SAM (Meta 2023 — segmentation universal). Đa số dùng ViT backbone, train trên dataset cực lớn, output embedding/feature đủ tổng quát để dùng cho rất nhiều task downstream với rất ít label.
Lưu ý: "model tốt nhất" thay đổi theo task, dataset size, latency budget. Một benchmark tốt phải fix các yếu tố này trước khi so sánh.
Tổng kết Module 4 — CNN cho ảnh
Module 4 đi qua 7 bài, từ động lực đến kiến trúc thực tế:
- Bài 27 — Vì sao MLP không hiệu quả cho ảnh: motivation, locality, translation equivariance.
- Bài 28 — Convolutional Layer: kernel, feature map, stride/padding/dilation, weight sharing, 1x1 / depthwise / dilated.
- Bài 29 — Pooling Layer: max-pool, avg-pool, downsampling không học.
- Bài 30 — Flatten / FC: chuyển từ feature map sang vector, classifier head.
- Bài 31 — Build CNN: ghép các block thành CNN cụ thể, train trên CIFAR-10.
- Bài 32 — Transfer Learning: dùng backbone pretrained, freeze / fine-tune.
- Bài 33 (bài này) — Architectures overview.
Sau bài này, bạn có đủ vốn để đọc paper architecture mới (CNN hoặc ViT), implement một CNN cho task tùy chỉnh, và chọn backbone phù hợp cho project thực tế. Module 5 (từ Bài 34) sẽ rời ảnh, sang dữ liệu tuần tự (sequence) — text, time series, audio — và mô hình RNN/LSTM/GRU. Phần Transformer sẽ học ở Module 6.
Code Python — load 3 pretrained, đếm param, benchmark, visualize filter
Load 3 model và đếm param:
import torch
from torchvision import models
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
resnet = models.resnet50(weights="DEFAULT").to(device).eval()
effnet = models.efficientnet_b0(weights="DEFAULT").to(device).eval()
convnext = models.convnext_tiny(weights="DEFAULT").to(device).eval()
def count_params(m):
return sum(p.numel() for p in m.parameters())
for name, m in [("ResNet-50", resnet),
("EfficientNet-B0", effnet),
("ConvNeXt-Tiny", convnext)]:
print(f"{name:18s} {count_params(m) / 1e6:6.2f}M params")
# ResNet-50 25.56M params
# EfficientNet-B0 5.29M params
# ConvNeXt-Tiny 28.59M params
Benchmark inference time trên 1 batch:
import time
x = torch.randn(8, 3, 224, 224, device=device)
def benchmark(m, n_warmup=10, n_run=50):
with torch.no_grad():
for _ in range(n_warmup):
m(x)
if device.type == "cuda":
torch.cuda.synchronize()
t0 = time.perf_counter()
for _ in range(n_run):
m(x)
if device.type == "cuda":
torch.cuda.synchronize()
return (time.perf_counter() - t0) / n_run * 1000 # ms/batch
for name, m in [("ResNet-50", resnet),
("EfficientNet-B0", effnet),
("ConvNeXt-Tiny", convnext)]:
print(f"{name:18s} {benchmark(m):.2f} ms/batch (batch=8)")
Kết quả phụ thuộc hardware. Trên GPU consumer thường: EfficientNet-B0 nhanh nhất theo FLOPs nhưng có thể chậm hơn ResNet-50 wall-clock vì depthwise Conv tận dụng GPU kém. Đây là minh chứng "FLOPs không phải latency".
Visualize filter của Conv đầu tiên trong ResNet (kernel 7x7, 3 channel input):
import matplotlib.pyplot as plt
filters = resnet.conv1.weight.detach().cpu() # shape (64, 3, 7, 7)
print(filters.shape)
# Chuẩn hóa về [0, 1] để hiển thị
f_min, f_max = filters.min(), filters.max()
filters = (filters - f_min) / (f_max - f_min)
fig, axes = plt.subplots(8, 8, figsize=(8, 8))
for i, ax in enumerate(axes.flat):
ax.imshow(filters[i].permute(1, 2, 0))
ax.axis("off")
plt.tight_layout()
plt.savefig("resnet_conv1_filters.png")
Quan sát: filter layer đầu của ResNet pretrained ImageNet trông như Gabor wavelet — detect edge ở các hướng, blob màu, gradient. Phù hợp với phân cấp Zeiler & Fergus (2014). Filter ở layer sâu hơn (vd layer3, layer4) cần kỹ thuật visualization phức tạp hơn (activation maximization, Grad-CAM) vì chúng phụ thuộc input, không xem trực tiếp trên weight được.
Bài tập
- So sánh số param và accuracy của ResNet-18, ResNet-50, EfficientNet-B0 khi fine-tune trên CIFAR-10. Train 10 epoch mỗi model với cùng learning rate, optimizer, augmentation. Báo cáo accuracy test + thời gian train.
- Implement basic block của ResNet (không bottleneck) bằng
nn.Module:
Test với inputclass BasicBlock(nn.Module): def __init__(self, in_c, out_c, stride=1): super().__init__() # TODO: 2 Conv 3x3, BN, ReLU, skip connection # Lưu ý: nếu stride != 1 hoặc in_c != out_c, cần Conv 1x1 trên skip ... def forward(self, x): ...torch.randn(1, 64, 32, 32), output shape phải bằng input shape khi stride=1. - Đọc paper ResNet (He et al., 2015 — arXiv:1512.03385), viết tóm tắt 5 dòng: vấn đề (degradation), giải pháp (residual), kiến trúc, kết quả ImageNet, ý nghĩa rộng hơn.
- Load EfficientNet-B0 và EfficientNet-B3 qua
torchvision. So sánh số param, input size mặc định, accuracy ImageNet trên metadata. Verify compound scaling (B3 sâu hơn / rộng hơn / input lớn hơn B0). - Visualize filter của Conv đầu tiên trong VGG-16 và so sánh với ResNet-50. Cả hai pretrained ImageNet, kernel layer đầu lần lượt là 3x3 và 7x7 — quan sát khác biệt.
- Cài
timm, list các variant của ConvNeXt và Swin Transformer. Chọn một variant tương đương về param với ResNet-50, đo inference time trên cùng batch. So sánh wall-clock vs FLOPs. - Cho một use case cụ thể (vd phân loại bệnh lá cây trên smartphone Android, latency < 100ms, accuracy > 85%), đề xuất 2 architecture phù hợp và lý do.
Gợi ý ngắn
- Trên CIFAR-10, ResNet-18 thường ~93–94%, ResNet-50 ~94–95%, EfficientNet-B0 ~94–96%. EfficientNet đôi khi cần input upscale từ 32 lên 224. Thời gian train: ResNet-18 nhanh nhất.
- BasicBlock chuẩn:
Conv-BN-ReLU-Conv-BN-(+skip)-ReLU. Khi stride hoặc channel khác, skip =Conv1x1(stride). Khi giống, skip = identity. - Tóm tắt: (1) deep network bị degradation — sâu hơn không nhất thiết tốt hơn vì optimization. (2) Đề xuất residual learning \( F(x) + x \), dễ học identity. (3) Block basic và bottleneck (1x1-3x3-1x1). (4) ResNet-152 top-5 error 3.57% ImageNet 2015. (5) Skip connection trở thành building block universal.
- B0: 5.3M, input 224, ~77%. B3: 12M, input 300, ~82%. Đúng compound scaling.
- VGG kernel 3x3 đầu — filter trông đơn giản hơn (edge cơ bản). ResNet kernel 7x7 — filter giàu chi tiết hơn, có Gabor pattern và blob màu rõ.
- Wall-clock có thể khác FLOPs đáng kể — depthwise Conv và attention pattern phụ thuộc memory access nhiều.
- MobileNet v3-Large hoặc EfficientNet-B0 đều hợp lý. Pretrain ImageNet rồi fine-tune trên dataset bệnh lá. Quantize 8-bit (TFLite hoặc PyTorch Mobile) để giảm size và tăng tốc trên CPU mobile.
Bài kế tiếp: Bài 34 — Sequential Data — mở Module 5, đặc điểm dữ liệu tuần tự (text, time series, audio), vì sao MLP và CNN không phù hợp, dẫn đến RNN.
- LeCun, Bottou, Bengio & Haffner (1998) - Gradient-Based Learning Applied to Document Recognition (LeNet-5)
- Krizhevsky, Sutskever & Hinton (2012) - ImageNet Classification with Deep Convolutional Neural Networks (AlexNet)
- Simonyan & Zisserman (2014) - Very Deep Convolutional Networks for Large-Scale Image Recognition (VGG)
- Szegedy et al. (2014) - Going Deeper with Convolutions (GoogLeNet / Inception v1)
- Szegedy et al. (2016) - Rethinking the Inception Architecture for Computer Vision (Inception v3)
- He, Zhang, Ren & Sun (2015) - Deep Residual Learning for Image Recognition (ResNet)
- Huang, Liu, van der Maaten & Weinberger (2017) - Densely Connected Convolutional Networks (DenseNet)
- Iandola et al. (2016) - SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size
- Howard et al. (2017) - MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
- Sandler et al. (2018) - MobileNetV2: Inverted Residuals and Linear Bottlenecks
- Howard et al. (2019) - Searching for MobileNetV3
- Tan & Le (2019) - EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks
- Tan & Le (2021) - EfficientNetV2: Smaller Models and Faster Training
- Zoph, Vasudevan, Shlens & Le (2018) - Learning Transferable Architectures for Scalable Image Recognition (NASNet)
- Tan et al. (2019) - MnasNet: Platform-Aware Neural Architecture Search for Mobile
- Hu, Shen & Sun (2018) - Squeeze-and-Excitation Networks
- Xie, Girshick, Dollár, Tu & He (2017) - Aggregated Residual Transformations for Deep Neural Networks (ResNeXt)
- Liu et al. (2022) - A ConvNet for the 2020s (ConvNeXt)
- Dosovitskiy et al. (2020) - An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale (ViT)
- Liu et al. (2021) - Swin Transformer: Hierarchical Vision Transformer using Shifted Windows
- PyTorch Docs - torchvision.models
- timm - PyTorch Image Models (Wightman)
