Mục lục
- Mục tiêu bài học
- Module 4 — bối cảnh
- Ảnh là loại dữ liệu gì
- Vấn đề 1 — parameter explosion
- Vấn đề 2 — không translation invariant
- Vấn đề 3 — bỏ qua spatial structure
- Ý tưởng cốt lõi của CNN
- Ba inductive bias của CNN
- Lược sử CNN
- Vision Transformer và vị trí của CNN
- Ứng dụng của CNN trong computer vision
- CNN ngoài ảnh 2D
- Bộ phận chính của một CNN
- Lộ trình Module 4 — 7 bài
- Demo trực quan — MNIST
- So sánh số tham số — MLP vs CNN
- Code Python — đếm parameter
- Bài tập
- Tóm tắt
Mục tiêu bài học
Sau bài học, bạn sẽ:
- Nêu được ba lý do MLP không phù hợp với ảnh: số parameter quá lớn, không translation invariant, mất cấu trúc spatial khi flatten.
- Tính được số tham số của một MLP layer cho ảnh kích thước cho trước và so sánh với CNN kernel tương đương.
- Giải thích ý tưởng cốt lõi của CNN: local connectivity, weight sharing, hierarchical feature.
- Liệt kê ba inductive bias của CNN (locality, translation equivariance, hierarchy) và biết khi nào chúng phù hợp với bài toán.
- Biết các mốc lịch sử chính: Neocognitron (1980), LeNet (1998), AlexNet (2012), VGG / ResNet / EfficientNet, ViT (2020).
- Hình dung được lộ trình 7 bài của Module 4 và vai trò của từng thành phần (conv, pooling, flatten + FC).
Bài này nối tiếp Bài 26 — Data Augmentation (đã làm quen với việc thao tác trên ảnh) và đặt nền cho Bài 28 — Convolutional Layer.
Module 4 — bối cảnh
Sau ba module đầu, bạn đã có:
- Module 1: perceptron, MLP, activation, loss, backpropagation — toàn bộ cơ chế học của một mạng neural.
- Module 2: PyTorch — tensor, autograd,
nn.Module, optimizer, training loop, dataloader. - Module 3: regularization và optimization — overfitting, dropout, batch norm, early stopping, LR schedule, data augmentation.
Với những thành phần này, về mặt nguyên lý ta đã có thể train một MLP cho bất kỳ dữ liệu nào có thể flatten thành vector. Bài này trả lời câu hỏi: tại sao riêng với ảnh, MLP lại không phải lựa chọn tốt, và CNN giải quyết vấn đề gì?
Lưu ý: bài này không xây CNN — đó là việc của Bài 28 trở đi. Ở đây chỉ là motivation và bức tranh tổng quát.
Ảnh là loại dữ liệu gì
Một ảnh màu được biểu diễn dưới dạng tensor 3 chiều \( (H, W, C) \) — chiều cao, chiều rộng, số kênh (ví dụ \( C = 3 \) cho RGB). Khác với vector tabular, ảnh có ba tính chất quan trọng:
- Spatial structure: hai pixel cạnh nhau nhiều khả năng cùng thuộc một vùng (texture, edge). Hai pixel ở góc đối diện hầu như độc lập. Trên vector tabular không có khái niệm "cạnh nhau".
- Translation: cùng một object có thể xuất hiện ở góc trái, giữa, hay góc phải khung hình. Mèo vẫn là mèo dù nằm ở pixel \( (10, 10) \) hay \( (200, 150) \).
- Hierarchy: cảm nhận ảnh tổ chức theo bậc — pixel hợp thành edge, edge hợp thành texture, texture hợp thành part (mắt, tai), part hợp thành object. Mỗi bậc là composition của bậc dưới.
Khi xây mô hình cho ảnh, ta muốn kiến trúc tôn trọng ba tính chất này. MLP không tôn trọng — và đó là lý do của Module 4.
Vấn đề 1 — parameter explosion
Một ảnh ImageNet cỡ \( 224 \times 224 \times 3 \) flatten thành vector dài:
\[ 224 \times 224 \times 3 = 150{,}528 \]
Giả sử ta nối vào một MLP layer 256 neuron. Số tham số ở layer đầu (chỉ weight, chưa kể bias):
\[ 150{,}528 \times 256 = 38{,}535{,}168 \]
Riêng một layer đã hơn 38 triệu parameter — và đây mới là layer đầu trên kích thước ảnh trung bình. Với MLP nhiều layer ẩn cho ảnh ImageNet, số param có thể vượt hàng trăm triệu, cộng thêm các hệ quả:
- Tốn RAM / VRAM: 38M parameter float32 = ~150 MB chỉ riêng weight của một layer.
- Dễ overfit: nhiều parameter hơn rất nhiều so với số sample train (ImageNet ~1.28M ảnh) → đủ chỗ để model "thuộc lòng".
- Train chậm: gradient cũng cùng kích thước với weight; mỗi step cập nhật là một phép multiply ma trận lớn.
Để so sánh, một CNN với kernel \( 3 \times 3 \times 3 \) và 64 filter ở layer đầu có số param chỉ:
\[ (3 \times 3 \times 3 + 1) \times 64 = 28 \times 64 = 1{,}792 \]
Chênh lệch hơn 20 000 lần ở cùng "layer đầu" — không phải vì CNN nhỏ hơn, mà vì cách kết nối khác hẳn (mục 7).
Vấn đề 2 — không translation invariant
Trong MLP, mỗi neuron của hidden layer kết nối với tất cả pixel của ảnh. Weight \( w_{ij} \) tương ứng với cặp (pixel \( j \), neuron \( i \)) — học giá trị "tốt" cho cặp đó.
Hệ quả: pattern (ví dụ "edge dọc") chỉ được học ở vị trí cụ thể nơi nó xuất hiện trong tập train. Nếu cùng pattern đó dịch sang một vị trí khác trong ảnh test:
- Weight đã học trên các pixel cũ giờ "trỏ" vào vùng khác — không match pattern.
- Vùng mới có pattern nhưng weight chưa từng học gì ở đó — không phản ứng.
Nói cách khác, MLP không có khái niệm "cùng pattern, vị trí khác". Để học pattern ở mọi vị trí, MLP cần thấy data augmentation đầy đủ (shift / crop ngẫu nhiên ở mọi tọa độ) — và vẫn phải dành parameter riêng cho mỗi vị trí.
CNN dùng convolution kernel trượt qua ảnh: cùng một bộ weight quét toàn bộ vị trí. Pattern phát hiện được ở chỗ này thì cũng phát hiện được ở chỗ khác — gọi là translation equivariance (mục 8). Đây là lý do CNN cần ít data hơn MLP cho cùng accuracy trên ảnh.
Vấn đề 3 — bỏ qua spatial structure
Để đưa ảnh vào MLP phải flatten về vector 1D. Thao tác này phá vỡ topology:
- Pixel \( (0, 0) \) cạnh \( (0, 1) \) trên ảnh — sau flatten, chúng cạnh nhau trong vector (index 0 và 1).
- Pixel \( (0, W-1) \) cạnh \( (1, 0) \) trên ảnh? Không — chúng cách nhau cả một hàng. Nhưng trong vector flatten chúng kề nhau (index \( W-1 \) và \( W \)).
- Pixel \( (0, 0) \) và \( (1, 0) \) cạnh nhau theo trục dọc trên ảnh, nhưng cách nhau \( W \) phần tử trong vector.
MLP nhận vector này và xử lý như một vector chung — không có cơ chế biết pixel nào "cạnh nhau" trên ảnh gốc. Toàn bộ thông tin về khoảng cách 2D phải được học từ data, hoàn toàn từ đầu.
CNN làm khác: kernel operate trực tiếp trên tensor 2D \( (H, W) \) (hoặc 3D nếu có nhiều kênh). Mỗi phép tính chỉ liên quan đến một vùng nhỏ kế nhau — locality được "hard-code" vào kiến trúc thay vì phải học.
Ý tưởng cốt lõi của CNN
CNN giải ba vấn đề ở trên bằng ba kỹ thuật, ăn khớp với nhau:
- Local connectivity: mỗi neuron của layer kế tiếp chỉ kết nối với một vùng nhỏ \( k \times k \) (receptive field) của layer hiện tại — không kết nối toàn bộ. Giảm mạnh số kết nối → giảm parameter.
- Weight sharing: cùng một bộ weight (kernel) được dùng lại cho mọi vị trí trượt trên ảnh. Một filter \( 3 \times 3 \times 3 \) = 27 weight được áp cho hàng chục nghìn vị trí. Detect cùng pattern dù xuất hiện ở đâu.
- Hierarchy qua stacking: chồng nhiều conv layer. Layer đầu thấy patch nhỏ (vài pixel) — học edge. Layer giữa thấy patch lớn hơn — học texture. Layer cuối thấy patch rộng — học part / object. Receptive field tăng theo độ sâu.
Three-in-one: ít param hơn (local + sharing), translation equivariance (sharing), và phù hợp với spatial hierarchy của ảnh (stacking). Đây là lý do CNN được thiết kế đúng "khớp" với dữ liệu ảnh.
Ba inductive bias của CNN
Inductive bias là giả định mà kiến trúc áp đặt lên data trước khi train — nói cách khác, "model giả định data có dạng thế này". Inductive bias đúng → cần ít data, train nhanh, tổng quát tốt. Inductive bias sai → ngược lại.
CNN mang ba inductive bias chính:
- Locality: feature có ý nghĩa thường nằm trong một vùng nhỏ. Pixel xa nhau ít tương quan trực tiếp (chỉ tương quan gián tiếp qua nhiều layer). Đúng cho ảnh tự nhiên, đúng cho audio short-time, đúng cho time series có dependence ngắn.
- Translation equivariance: dịch input một khoảng → output dịch cùng khoảng. Hệ quả: pattern detect được ở vị trí này thì cũng detect được ở vị trí khác. Phù hợp khi nhãn không phụ thuộc vị trí tuyệt đối (mèo vẫn là mèo dù ở góc nào).
- Hierarchical composition: feature phức tạp = composition của feature đơn giản. Edge → texture → part → object. Phù hợp với cách thị giác sinh học hoạt động (Hubel & Wiesel 1959 — neuron vùng V1 phản ứng với edge tại vị trí cụ thể, vùng cao hơn phản ứng với pattern phức tạp).
Trên ảnh tự nhiên, ba bias này phần lớn đúng → CNN học tốt với data tương đối ít. Trên data không có spatial structure (vd tabular), ba bias này vô nghĩa → CNN không có ưu thế.
Lược sử CNN
Các mốc chính:
- Neocognitron (Fukushima 1980): mạng neural lấy cảm hứng từ Hubel & Wiesel, có khái niệm "simple cell" / "complex cell" tương ứng với conv / pooling sau này. Train không hoàn toàn bằng backprop nên giới hạn về scale.
- LeNet-5 (LeCun et al. 1998): CNN thành công đầu tiên ở quy mô thực tế — đọc chữ số viết tay trên cheque ngân hàng. Đã có đầy đủ conv + subsampling + fully-connected ở cuối.
- AlexNet (Krizhevsky, Sutskever, Hinton 2012, arXiv:1102.0183 ImageNet paper): thắng ImageNet 2012 với top-5 error 15.3% (so với 26.2% của runner-up không dùng deep learning). Dùng ReLU, dropout, train trên GPU. Cột mốc khiến deep learning trở thành tiêu chuẩn cho computer vision.
- VGG (Simonyan & Zisserman 2014, arXiv:1409.1556): rất sâu (16–19 layer), chỉ dùng kernel \( 3 \times 3 \), chứng minh "deeper is better" trong một giới hạn.
- GoogLeNet / Inception (Szegedy et al. 2014): module Inception với nhiều scale kernel song song. Top-5 error 6.67% trên ImageNet.
- ResNet (He et al. 2015, arXiv:1512.03385): skip connection cho phép train mạng > 100 layer. Top-5 error 3.57% — vượt human-level baseline.
- EfficientNet (Tan & Le 2019, arXiv:1905.11946): scale depth / width / resolution theo công thức cân bằng. Đạt accuracy cao với compute ít hơn ResNet.
- Vision Transformer (Dosovitskiy et al. 2020, arXiv:2010.11929): bỏ conv, dùng attention trên image patch. Khi train với data đủ lớn (JFT-300M) thì match hoặc vượt CNN.
Một dòng tiến triển dài hơn 40 năm — Module 4 chủ yếu làm việc với phần "kinh điển" từ LeNet đến ResNet / EfficientNet.
Vision Transformer và vị trí của CNN
ViT (Dosovitskiy et al. 2020) chia ảnh thành patch (vd \( 16 \times 16 \)), coi mỗi patch như một token rồi áp dụng Transformer giống NLP. Không còn convolution.
Quan sát quan trọng từ paper:
- Với dataset cỡ ImageNet (~1.3M ảnh), ViT thua CNN một khoảng — vì ViT không có inductive bias của locality và translation equivariance, phải học tất cả từ data.
- Với dataset cỡ JFT-300M (300M ảnh), ViT bằng hoặc vượt CNN — đủ data để vượt qua điểm yếu inductive bias.
Kết quả thực tế: CNN vẫn là lựa chọn mặc định cho data nhỏ–trung bình, edge device, real-time, hoặc khi cần inductive bias mạnh. ViT (và hybrid như ConvNeXt) phổ biến hơn trong các bài có data rất lớn hoặc khi pretrain trên dataset khổng lồ rồi fine-tune.
Module 4 tập trung vào CNN — vẫn là nền tảng cần thiết để hiểu cả ViT về sau (Module 7 trở đi của lộ trình AI Engineer).
Ứng dụng của CNN trong computer vision
- Image classification: gắn nhãn cho cả ảnh. ResNet, EfficientNet, ConvNeXt.
- Object detection: tìm bounding box + nhãn cho nhiều object trong ảnh. YOLO (single-stage), Faster R-CNN (two-stage).
- Semantic segmentation / instance segmentation: gắn nhãn cho từng pixel. U-Net (medical), DeepLab, Mask R-CNN.
- Medical imaging: phát hiện tổn thương trên X-ray, MRI, CT. U-Net là kiến trúc kinh điển.
- Video: 3D CNN xử lý chuỗi frame như tensor \( (T, H, W, C) \). I3D, SlowFast.
- Pose estimation, depth estimation, super-resolution, style transfer: hầu hết kiến trúc gốc dựa trên CNN, một số nay đã chuyển sang hybrid CNN-Transformer.
Module 4 chủ yếu làm classification (B31 — CIFAR-10) và transfer learning (B32). Detection và segmentation thuộc các bài chuyên sâu hơn ngoài phạm vi module này.
CNN ngoài ảnh 2D
Ý tưởng "kernel trượt qua vùng cục bộ với weight sharing" áp dụng được cho nhiều loại data có cấu trúc theo trục:
- 1D CNN: kernel trượt theo trục thời gian. Dùng cho time series (forecasting, anomaly detection), audio waveform, ECG, EEG. WaveNet (van den Oord et al. 2016) là 1D CNN sâu cho audio.
- 3D CNN: kernel \( k_d \times k_h \times k_w \) cho dữ liệu volume — CT, MRI medical, hay video (chiều thứ 3 là thời gian).
- Graph CNN (GNN): tổng quát hóa "vùng cục bộ" thành "tập hàng xóm trong graph". Convolution trên graph thay vì grid. Áp dụng cho molecule, social network, knowledge graph.
Module 4 chỉ làm 2D CNN cho ảnh. 1D / 3D / Graph CNN là phần mở rộng có cùng nguyên lý.
Bộ phận chính của một CNN
Một CNN cổ điển có 4 loại layer:
- Convolutional layer (B28): áp kernel lên input để sinh feature map. Mỗi filter học một pattern khác nhau.
- Activation: thường là ReLU (B6), áp element-wise lên feature map.
- Pooling layer (B29): downsample feature map. Max pooling lấy giá trị lớn nhất trong vùng; average pooling lấy trung bình. Giảm kích thước, giảm overfit, tăng receptive field.
- Flatten + Fully-connected (B30): cuối mạng, flatten feature map thành vector rồi nối với MLP nhỏ để ra logit cho class.
Pattern điển hình: [Conv → ReLU → Conv → ReLU → Pool] × N → Flatten → FC → Softmax. Các kiến trúc hiện đại (ResNet, EfficientNet) thay đổi pattern này nhưng cốt lõi giữ nguyên.
Lộ trình Module 4 — 7 bài
- Bài 27 (bài này) — Motivation: vì sao MLP không phù hợp cho ảnh, ý tưởng cốt lõi của CNN.
- Bài 28 — Convolutional Layer: kernel, stride, padding, feature map, công thức kích thước output.
- Bài 29 — Pooling Layer: max pooling, average pooling, global pooling.
- Bài 30 — Flatten + Fully Connected: chuyển từ feature map sang vector và classification head.
- Bài 31 — Xây CNN từ đầu cho CIFAR-10: training loop, kết quả baseline.
- Bài 32 — Transfer Learning: fine-tune ResNet pretrained trên ImageNet cho task riêng.
- Bài 33 — Overview các kiến trúc nổi bật: VGG, ResNet, EfficientNet — khác nhau ở điểm nào, dùng khi nào.
Kết thúc Module 4 bạn sẽ tự build được CNN cho task ảnh trung bình, và biết khi nào nên dùng transfer learning thay vì train from scratch.
Demo trực quan — MNIST
MNIST là ảnh xám \( 28 \times 28 \) (chữ số viết tay 0–9). Hai cách đưa vào model:
- MLP: flatten thành vector dài 784 (= \( 28 \times 28 \)). Pixel \( (0, 0) \) → index 0. Pixel \( (0, 1) \) → index 1. Pixel \( (1, 0) \) → index 28. Thông tin "pixel \( (0, 0) \) và \( (1, 0) \) nằm cạnh nhau theo trục dọc" không còn trong cấu trúc — phải học từ data.
- CNN: giữ nguyên tensor \( (1, 28, 28) \) — 1 kênh, 28 chiều cao, 28 chiều rộng. Conv kernel \( 3 \times 3 \) trượt qua, mỗi bước nhìn 9 pixel kế nhau theo đúng topology 2D.
Trên MNIST, MLP đã đạt ~98% accuracy — bài quá đơn giản để thấy rõ chênh lệch. Nhưng trên CIFAR-10 (\( 32 \times 32 \times 3 \), ảnh tự nhiên), MLP thường dừng ở 50–55% trong khi CNN nhỏ đã vượt 70–80% và CNN sâu (ResNet) lên trên 95%. Chênh lệch xuất hiện khi data có spatial structure phức tạp hơn.
So sánh số tham số — MLP vs CNN
So sánh con số trên ImageNet (\( 224 \times 224 \times 3 \), 1000 class):
- MLP "đơn giản" với hai hidden layer 4096 neuron (giống FC head của AlexNet nhưng nối thẳng từ input):
- Layer 1: \( 150{,}528 \times 4{,}096 \approx 617M \) param.
- Layer 2: \( 4{,}096 \times 4{,}096 \approx 16.8M \) param.
- Output: \( 4{,}096 \times 1{,}000 \approx 4.1M \) param.
- Tổng > 600M param.
- ResNet-50 (He et al. 2015): ~25.6M param.
- VGG-16 (Simonyan & Zisserman 2014): ~138M param — nhiều vì có FC layer cuối lớn.
- EfficientNet-B0 (Tan & Le 2019): ~5.3M param.
ResNet-50 chỉ bằng ~4% số param của MLP nói trên — và đồng thời đạt accuracy cao hơn rất nhiều. Param ít hơn không phải vì model "yếu" mà vì kiến trúc khớp với data: weight được tái sử dụng qua weight sharing thay vì duplicate cho mỗi vị trí.
Code Python — đếm parameter
So sánh trực tiếp số tham số của một MLP layer và một Conv layer ở cùng "vị trí đầu vào". Chỉ là minh họa motivation — chưa xây CNN hoàn chỉnh (đợi B28).
import torch
import torch.nn as nn
def count_params(module: nn.Module) -> int:
return sum(p.numel() for p in module.parameters())
# Ảnh giả lập: 1 sample, 3 kênh, 224x224 (kích thước ImageNet)
x_image = torch.randn(1, 3, 224, 224)
x_flat = x_image.view(1, -1) # (1, 150528)
# MLP layer đầu: flatten -> 256 neuron
mlp_layer = nn.Linear(in_features=3 * 224 * 224, out_features=256)
print("MLP layer:")
print(f" input : {x_flat.shape}")
print(f" output : {mlp_layer(x_flat).shape}")
print(f" params : {count_params(mlp_layer):,}")
# Conv layer đầu: 3 input channel, 64 filter, kernel 3x3
conv_layer = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, padding=1)
print("\nConv layer:")
print(f" input : {x_image.shape}")
print(f" output : {conv_layer(x_image).shape}")
print(f" params : {count_params(conv_layer):,}")
Output điển hình:
MLP layer:
input : torch.Size([1, 150528])
output : torch.Size([1, 256])
params : 38,535,424
Conv layer:
input : torch.Size([1, 3, 224, 224])
output : torch.Size([1, 64, 224, 224])
params : 1,792
Chênh lệch ~21 500 lần ở layer đầu, dù output của conv layer (64 channel × 224 × 224 = ~3.2M giá trị) còn "giàu thông tin" hơn nhiều so với output MLP (256 giá trị). Đây là minh chứng cụ thể cho lý do CNN tồn tại.
Bài tập
- Tính số tham số của một MLP layer đầu cho ảnh ImageNet \( 224 \times 224 \times 3 \) với hidden 512 neuron (gồm cả bias). Đối chiếu với kết quả từ
nn.Lineartrong PyTorch. - Cùng câu 1 nhưng ảnh \( 32 \times 32 \times 3 \) (CIFAR-10). Tỉ lệ giảm bao nhiêu lần?
- Giải thích bằng lời tại sao CNN có translation equivariance còn MLP thì không — nói rõ chỗ nào trong cấu trúc tạo ra tính chất đó.
- Cho 5 task computer vision sau, xếp loại task nào nên dùng CNN, task nào MLP vẫn ổn, task nào cần cấu trúc khác (vd Transformer):
- Phân loại chữ số viết tay \( 28 \times 28 \) (MNIST).
- Dự đoán giá nhà từ 10 feature tabular.
- Phân loại ảnh y khoa độ phân giải cao \( 1024 \times 1024 \).
- Phân tích cảm xúc text 200 token.
- Detect 100 object trong video \( 720\text{p} \), 30 fps.
- Một ảnh đầu vào \( 224 \times 224 \times 3 \) đi qua Conv2d(3, 32, kernel_size=5, padding=2). Tính số param (cả bias) và shape output.
- Đọc lại định nghĩa "inductive bias" ở mục 8. Cho ví dụ một bài toán mà inductive bias locality sai (pixel xa nhau có tương quan trực tiếp quan trọng). Trong trường hợp đó, CNN có còn là lựa chọn tốt không?
Đáp án ngắn
- \( (224 \times 224 \times 3) \times 512 + 512 = 77{,}070{,}848 \) param.
- \( (32 \times 32 \times 3) \times 512 + 512 = 1{,}573{,}376 \) param. Giảm ~49 lần (tỉ lệ với số pixel).
- CNN dùng cùng một bộ weight (kernel) trượt qua mọi vị trí (weight sharing). Pattern detect được ở vị trí \( (i, j) \) đến từ kernel \( W \), pattern dịch sang \( (i+\Delta, j+\Delta) \) vẫn được detect bằng chính kernel \( W \) đó tại vị trí mới. MLP có weight riêng cho từng cặp (pixel, neuron) — pattern dịch chỗ thì weight cũ không match.
- MNIST: CNN nhẹ ổn (MLP cũng được nhưng kém hơn rõ trên CIFAR). Giá nhà tabular: MLP (CNN không phù hợp, không có spatial). Ảnh y khoa: CNN (U-Net, ResNet). Text cảm xúc: Transformer là default, CNN 1D / RNN cũng dùng được. Detect video: CNN backbone (YOLO, Faster R-CNN) + 3D CNN hoặc Transformer cho video.
- Param = \( (5 \times 5 \times 3 + 1) \times 32 = 76 \times 32 = 2{,}432 \). Output shape \( (32, 224, 224) \) (padding=2 giữ kích thước).
- Ví dụ: phân loại ảnh y khoa toàn cảnh dựa trên cặp pixel ở hai góc đối diện (giả thuyết). Hoặc bài có "global pattern" như xác định bố cục tổng thể. Khi đó cần CNN sâu (receptive field đủ lớn) hoặc kiến trúc có global attention (Transformer / ViT) — CNN nông sẽ thiếu thông tin global.
Tóm tắt
- Ảnh có ba tính chất riêng: spatial structure, translation, hierarchy. MLP không tôn trọng tính chất nào trong số đó.
- Ba vấn đề của MLP với ảnh: (1) số param explode — \( 150{,}528 \times 256 \approx 38M \) chỉ ở layer đầu cho ImageNet; (2) không translation invariant — weight gắn cứng vào vị trí pixel; (3) flatten làm mất topology 2D.
- CNN giải bằng ba kỹ thuật: local connectivity, weight sharing, hierarchy qua stacking. Số param giảm vài nghìn lần ở cùng position trong mạng.
- Ba inductive bias của CNN: locality, translation equivariance, hierarchical composition. Phù hợp với ảnh tự nhiên.
- Lịch sử: Neocognitron (1980) → LeNet (1998) → AlexNet (2012, ImageNet breakthrough) → VGG / Inception / ResNet / EfficientNet → ViT (2020).
- ViT cạnh tranh CNN khi data rất lớn (JFT-300M); với data nhỏ–trung bình CNN vẫn là default vì có inductive bias mạnh hơn.
- Ứng dụng CNN: classification, detection, segmentation, medical imaging, video. Ngoài ảnh: 1D CNN cho time series / audio, 3D CNN cho video / volumetric, GNN cho graph.
- Một CNN cổ điển = stack của Conv → ReLU → Pool, kết bằng Flatten + FC. Pattern này là cấu trúc của Module 4.
- Lộ trình Module 4: B27 motivation → B28 conv → B29 pooling → B30 flatten + FC → B31 CIFAR-10 → B32 transfer learning → B33 architectures.
- Dosovitskiy et al. (2020) - An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale (ViT)
- He et al. (2015) - Deep Residual Learning for Image Recognition (ResNet)
- Simonyan & Zisserman (2014) - Very Deep Convolutional Networks for Large-Scale Image Recognition (VGG)
- Tan & Le (2019) - EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks
- Krizhevsky, Sutskever, Hinton (2012) - ImageNet Classification with Deep Convolutional Neural Networks (AlexNet)
- LeCun et al. (1998) - Gradient-Based Learning Applied to Document Recognition (LeNet)
- Fukushima (1980) - Neocognitron: A Self-organizing Neural Network Model
- Hubel & Wiesel (1959) - Receptive fields of single neurones in the cat's striate cortex
- PyTorch Docs - nn.Conv2d
- PyTorch Docs - nn.Linear
- Stanford CS231n - Convolutional Neural Networks (course notes)
- Goodfellow, Bengio, Courville - Deep Learning Book, Chapter 9: Convolutional Networks
