Bài 2

Tiến hóa kiến trúc CNN

Hành trình làm cho mạng tích chập ngày càng sâu hơnhiệu quả hơn — từ LeNet sơ khai, qua cú nổ AlexNet, tới sự gọn gàng của VGG và Inception. Cuối cùng ta gặp một vấn đề nan giải khi mạng quá sâu, chính là tiền đề mở đường cho ResNet ở bài tiếp theo.

LeNet-5 (1998)
CNN tiên phong — đặt nền móng cho tích chập

LeNet-5 do Yann LeCun và cộng sự đề xuất là một trong những mạng tích chập đầu tiên thực sự hoạt động, dùng để nhận dạng chữ số viết tay (bài toán MNIST, áp dụng vào đọc mã ZIP và séc ngân hàng). Đây là kiến trúc đặt nền móng cho toàn bộ ngành CNN về sau.

Cấu trúc của nó rất kinh điển và lặp đi lặp lại một mô-típ: conv → pool → conv → pool → các tầng fully-connected (FC). Mỗi tầng tích chập trích đặc trưng cục bộ (cạnh, nét cong), tầng pooling thu nhỏ kích thước và tăng tính bất biến vị trí, rồi các tầng FC ở cuối tổng hợp lại để phân loại.

# Sơ đồ rút gọn LeNet-5 (ảnh vào 32x32 thang xám)
Input 32x32x1
  Conv 5x5, 6 filter   # -> 28x28x6
  AvgPool 2x2          # -> 14x14x6
  Conv 5x5, 16 filter  # -> 10x10x16
  AvgPool 2x2          # -> 5x5x16
  FC 120  ->  FC 84  ->  Softmax 10  # 10 chữ số

LeNet nhỏ (chỉ khoảng 60 nghìn tham số) và dùng hàm kích hoạt tanh/sigmoid. Hạn chế của thời đó là thiếu dữ liệu lớn và sức tính toán, nên ý tưởng phải chờ hơn một thập kỷ mới bùng nổ.

AlexNet (2012)
Bước ngoặt mở ra kỷ nguyên deep learning

AlexNet là cú hích lịch sử: nó thắng cuộc thi ImageNet 2012 với cách biệt rất lớn (giảm sai số top-5 từ ~26% xuống ~16%), bỏ xa các phương pháp thủ công truyền thống. Khoảnh khắc này được xem là điểm khởi đầu chính thức của kỷ nguyên deep learning cho thị giác máy tính.

Về bản chất AlexNet giống một LeNet "phóng to" (5 tầng conv + 3 tầng FC), nhưng tập hợp nhiều cải tiến then chốt:

Vì sao ReLU quan trọng: đạo hàm của ReLU bằng 1 với mọi \( x \gt 0 \), nên gradient không bị "co" lại khi lan truyền ngược qua nhiều tầng — điều mà sigmoid (đạo hàm \( \lt 0.25 \)) gặp phải. Đây là một mảnh ghép giúp mạng sâu hơn trở nên khả thi.
VGG (2014)
Đơn giản, đồng nhất và rất sâu

VGG (nhóm Visual Geometry Group, Oxford) theo đuổi một triết lý cực kỳ gọn: chỉ dùng tích chập 3×3 xếp chồng lên nhau và pooling 2×2, lặp lại đều đặn để tạo ra mạng rất sâu (VGG-16 và VGG-19 với 16–19 tầng có trọng số). VGG chứng minh một thông điệp mạnh mẽ: độ sâu là yếu tố quyết định đến chất lượng đặc trưng.

Vì sao lại là 3×3 thay vì một kernel lớn? Xếp chồng hai tầng conv 3×3vùng tiếp nhận (receptive field) tương đương một tầng conv 5×5, và ba tầng 3×3 tương đương một tầng 7×7 — nhưng cách dùng nhiều tầng nhỏ lại lợi hơn:

# Một "block" điển hình của VGG
Conv 3x3, C filter  -> ReLU
Conv 3x3, C filter  -> ReLU
MaxPool 2x2          # giảm một nửa chiều cao & rộng
Nhược điểm: VGG rất nặng. Phần lớn trong ~138 triệu tham số của VGG-16 nằm ở các tầng FC khổng lồ ở cuối (riêng tầng FC đầu tiên đã hơn 100 triệu tham số). Mô hình tốn bộ nhớ và chậm, khó triển khai trên thiết bị hạn chế.
GoogLeNet / Inception (2014)
Sâu mà vẫn ít tham số nhờ module thông minh

Cùng năm với VGG, GoogLeNet (kiến trúc Inception) đi theo hướng ngược lại với "to và đều": thay vì ép phải chọn một kích thước kernel, nó chạy song song nhiều kích thước cùng lúc rồi ghép kết quả lại. Một Inception module gồm các nhánh:

Tất cả các nhánh xử lý cùng một đầu vào rồi được nối (concatenate) theo chiều kênh, để mạng tự "chọn" tỉ lệ phù hợp ở mỗi vị trí.

Chìa khóa tiết kiệm tính toán là conv 1×1 làm "bottleneck". Trước khi đưa qua conv 3×3 hay 5×5 đắt đỏ, ta dùng conv 1×1 để giảm số chiều (số kênh) xuống trước, rồi mới tích chập. Ví dụ đầu vào có 256 kênh: đưa thẳng qua conv 5×5 ra 64 kênh tốn \( 5^2 \times 256 \times 64 \approx 410 \text{K} \) phép nhân-cộng cho mỗi vị trí; nếu chèn 1×1 hạ xuống 32 kênh trước thì chỉ còn \( (1^2\times256\times32) + (5^2\times32\times64) \approx 60 \text{K} \) — giảm gần 7 lần.

Inception module — các nhánh song song Scroll / zoom · Mở draw.io ↗

Nhờ vậy GoogLeNet sâu (22 tầng) nhưng chỉ ~5 triệu tham số — nhẹ hơn VGG cả chục lần. Nó cũng bỏ các tầng FC khổng lồ, thay bằng global average pooling (lấy trung bình mỗi bản đồ đặc trưng thành một số) ngay trước tầng phân loại, cắt giảm tham số mạnh mà vẫn giữ độ chính xác.

Vấn đề khi mạng quá sâu
Vì sao "thêm tầng" không còn giúp ích

Sau VGG và Inception, có vẻ công thức là cứ chồng thêm tầng thì mạng càng mạnh. Nhưng thực nghiệm cho thấy điều ngược ngạc nhiên: khi đẩy độ sâu lên quá cao (vài chục tầng trở lên), độ chính xác đầu tiên bão hòa, rồi giảm xuống — và đáng nói là cả sai số trên tập huấn luyện cũng tăng.

Đây KHÔNG phải overfitting. Overfitting là khi mô hình giỏi trên tập huấn luyện nhưng kém trên tập kiểm tra. Ở đây mạng sâu hơn lại tệ hơn ngay cả trên tập huấn luyện — nghĩa là vấn đề nằm ở khả năng tối ưu, không phải khả năng tổng quát hóa.

Hai nguyên nhân chính:

Chính bài toán này là động lực ra đời của ResNet: thay vì bắt mỗi khối học trực tiếp ánh xạ mong muốn \( H(x) \), nó để khối học phần dư (residual) \( F(x) = H(x) - x \) rồi cộng lại thành \( H(x) = F(x) + x \) thông qua một "đường tắt" (skip connection). Cách này giúp gradient đi thẳng qua được và mạng sâu hàng trăm tầng vẫn huấn luyện ổn định.

Tiếp theo: chi tiết cơ chế skip connection và residual block được trình bày ở Bài 3: ResNet.
Bảng so sánh nhanh
LeNet · AlexNet · VGG · Inception
Kiến trúcNămĐộ sâuĐiểm nổi bậtSố tham số
LeNet-51998~5 tầngCNN tiên phong; mô-típ conv-pool-FC cho nhận dạng chữ số~60 nghìn (rất nhỏ)
AlexNet20128 tầngThắng ImageNet; ReLU, Dropout, augmentation, train trên GPU~60 triệu (lớn)
VGG-16201416–19 tầngChỉ conv 3×3 xếp chồng; chứng minh độ sâu quan trọng~138 triệu (rất nặng)
GoogLeNet201422 tầngInception module song song; 1×1 bottleneck; global avg pooling~5 triệu (nhẹ)
Xu hướng chung: mạng ngày càng sâu hơn nhưng ít tham số hơn nhờ những module thông minh — conv 3×3 xếp chồng, bottleneck 1×1, global average pooling thay cho các tầng FC cồng kềnh. Đỉnh điểm của hướng "sâu mà vẫn huấn luyện được" chính là ResNet ở bài kế tiếp.
← Bài trước
Bài 1: CNN