CNN là gì? Giải thích mạng nơ-ron tích chập theo kiểu ELI5
Khám phá Convolutional Neural Network (CNN) qua góc nhìn ELI5: cách AI nhìn ảnh bằng kính lúp, ghép mảnh ghép và tự học nhận diện hình ảnh.
TL;DR: CNN (Convolutional Neural Network - Mạng Nơ-ron Tích Chập) giống như một bộ não chuyên phân tích thị giác. Thay vì nhìn toàn bộ bức ảnh cùng một lúc, nó dùng các “kính lúp” nhỏ để quét từng vùng tìm các nét đơn giản như đường thẳng, góc, cạnh ghép chúng thành các hình dạng cuối cùng dự đoán xem đó là con mèo 🐱, con chó 🐶 hay chiếc xe hơi 🚗.
1. Hãy tưởng tượng CNN đang học nhận ra con mèo 🐱#
Hãy bắt đầu bằng cách hình dung cách chúng ta dạy máy tính. Ta đưa cho máy hàng nghìn bức ảnh:
🐱 🐱 🐱 🐱 🐱 (Ảnh 1 -> MÈO, Ảnh 2 -> MÈO)
🐶 🐶 🐶 🐶 (Ảnh 3 -> CHÓ)
🚗 🚗 🚗 (Ảnh 4 -> XE HƠI)textBan đầu, máy tính hoàn toàn không có khái niệm thế nào là “con mèo”. Nó không biết mèo có lông mềm, có 2 tai nhọn hay có đuôi dài. Nó phải tự học mọi thứ từ con số 0.
Nhưng làm sao máy tính nhìn thấy được một bức ảnh?
2. Máy tính “nhìn” ảnh như thế nào?#
Đối với con người, bức ảnh là một khung cảnh rực rỡ. Nhưng đối với máy tính, mỗi bức ảnh thực chất chỉ là một bảng số khổng lồ (ma trận pixel).
Ví dụ ảnh đen trắng 5x5 pixel:
0 0 0 0 0
0 255 255 0 0
0 255 255 0 0
0 0 0 0 0
0 0 0 0 0text- Số
0đại diện cho màu đen tuyền. - Số
255đại diện cho màu trắng sáng. - Các số ở giữa (
1-254) là các mức độ xám khác nhau.
Nếu là ảnh màu, mỗi pixel sẽ gồm 3 con số tương ứng với 3 kênh màu RGB (Red, Green, Blue):
(255, 0, 0)Đỏ rực(0, 255, 0)Xanh lá cây(0, 0, 255)Xanh dương
[!NOTE] Với máy tính, một bức ảnh không phải là tác phẩm nghệ thuật, mà là hơn 6 triệu con số được xếp thành hàng và cột.
3. CNN nhìn ảnh bằng “kính lúp” (Convolution & Filter)#
Nếu bạn đưa cả triệu con số vào mạng nơ-ron truyền thống cùng lúc, máy sẽ bị “ngợp” và không nhận ra được mối liên kết không gian giữa các pixel liền kề.
CNN giải quyết vấn đề này bằng cách dùng Filter (hoặc Kernel) — đóng vai trò như một chiếc kính lúp nhỏ:
Ảnh gốc (5x5): Filter kính lúp (3x3):
⬜ ⬜ ⬜ ⬜ ⬜ ┌───────────┐
⬜ ⬛ ⬛ ⬜ ⬜ │ ⬜ ⬜ ⬜ │
⬜ ⬜ ⬜ ⬜ ⬜ │ ⬜ ⬛ ⬛ │ (Trượt từng bước)
⬜ ⬜ ⬜ ⬜ ⬜ │ ⬜ ⬜ ⬜ │
⬜ ⬜ ⬜ ⬜ ⬜ └───────────┘textChiếc kính lúp này sẽ trượt đều đặn qua từng vùng của bức ảnh từ trái sang phải, từ trên xuống dưới:
Quá trình trượt và nhân ma trận này gọi là Phép Tích Chập (Convolution) — đây chính là chữ C đầu tiên trong cái tên CNN.
4. Filter giống như một đội “thám tử” 🕵️#
Mỗi filter được tinh chỉnh để chuyên săn tìm một đặc điểm cụ thể:
- Thám tử A: “Tôi chuyên tìm nét thẳng đứng
|” - Thám tử B: “Tôi chuyên tìm nét ngang
-” - Thám tử C: “Tôi chuyên tìm nét chéo
/hoặc\” - Thám tử D: “Tôi chuyên tìm các góc nhọn
L”
Khi filter quét qua ảnh, nếu gặp đúng nét mà nó tìm kiếm, nó sẽ tạo ra tín hiệu số rất cao. Kết quả thu được sau khi quét toàn bộ ảnh là một Bản đồ đặc trưng (Feature Map):
Khi tìm thấy đường thẳng đứng:
0 0 1 0
0 0 1 0
0 0 1 0 --> "Aha! Cột số 3 có một đường thẳng đứng!"text[!TIP] Điều kỳ diệu nhất của Deep Learning: Con người không cần phải ngồi lập trình công thức tìm đường thẳng hay đường cong. CNN tự học ra các giá trị tối ưu cho từng filter thông qua dữ liệu!
5. Kiến trúc nhiều tầng (Deep Layers): Ghép mảnh ghép từ thấp đến cao#
Tại sao mạng này lại được gọi là Deep Neural Network? Bởi vì nó gồm rất nhiều tầng (layer) xếp chồng lên nhau, học các khái niệm từ đơn giản đến phức tạp:
flowchart TD
A["Ảnh đầu vào (Pixel ma trận)"] --> B["Layer 1: Cạnh, đường thẳng, góc, màu sắc"]
B --> C["Layer 2: Ghép thành hình tròn, vuông, vân mắt, tai"]
C --> D["Layer 3: Ghép thành các bộ phận (Mắt + Mũi + Tai + Râu)"]
D --> E["Layer 4: Ghép thành khuôn mặt & cơ thể"]
E --> F["Dự đoán cuối cùng: CON MÈO 🐱 (95%)"]
- Layer đầu tiên: Học các nét cơ bản nhất (
|,-,/,\, góc nhọn, mảng màu). - Layer tiếp theo: Ghép các nét đơn giản thành họa tiết (hình tròn, đường viền tai, vòng tròn mắt).
- Layer sâu hơn: Ghép mắt + mũi + tai + miệng thành bộ phận nhận diện khuôn mặt.
- Layer cuối cùng (Fully Connected): Tổng hợp mọi bộ phận để đưa ra kết luận: “Đây là một con mèo!”.
6. Rút gọn thông tin với Pooling (Max Pooling)#
Bức ảnh chứa rất nhiều chi tiết thừa. Sau khi tìm được các nét, ta cần thu nhỏ bản đồ đặc trưng để giảm tải tính toán mà vẫn giữ lại những điểm quan trọng nhất. Kỹ thuật này gọi là Pooling.
Phổ biến nhất là Max Pooling — chia ma trận thành các ô nhỏ rồi chỉ giữ lại con số lớn nhất:
Ma trận 4x4 ban đầu: Max Pooling (khung 2x2):
1 2 | 3 4 ┌─────────┬─────────┐
5 9 | 2 1 │ 9 │ 4 │
-------+------- ======> ├─────────┼─────────┤
4 3 | 8 2 │ 4 │ 8 │
1 2 | 1 7 └─────────┴─────────┘textMax Pooling hoạt động giống như việc bạn nhìn một bức tranh khổng lồ rồi chỉ ghi chép lại những chi tiết nổi bật và sắc nét nhất vào sổ tay.
7. Mạng tự sửa sai như thế nào? (Loss & Gradient Descent)#
Khi mới khởi tạo, các filter của CNN chứa những con số ngẫu nhiên. Khi nhìn bức ảnh con mèo 🐱, nó có thể dự đoán:
- Mèo:
- Chó:
- Xe hơi:
Đoán sai bét! 😭 Lúc này, hệ thống sẽ đo mức độ sai lệch thông qua một hàm số gọi là Loss:
Quá trình học giống hệt như một người đang chơi game bắn cung:
- Bắn phát đầu: Mũi tên lệch xa mục tiêu (Loss cao).
- Ước lượng sai lệch: Nhìn xem mình lệch về bên trái hay bên phải bao nhiêu độ.
- Điều chỉnh góc tay (Backpropagation & Gradient Descent): Xoay nhẹ cánh cung.
- Bắn lại: Lần này gần hồng tâm hơn rất nhiều!
Đứng trên đỉnh núi (Loss = 10)
🧍
/ \
/ \ -> Đi theo hướng dốc nhất để hạ thấp Loss
/ \
/ \___
↓
Đáy thung lũng (Loss = 0.01 -> Dự đoán chính xác 99%)text8. Ví dụ cài đặt CNN đơn giản với PyTorch#
Dưới đây là một mô hình CNN kinh điển nhận diện ảnh viết tay (MNIST) hoặc ảnh động vật cơ bản:
import torch
import torch.nn as nn
import torch.nn.functional as F
class SimpleCNN(nn.Module):
def __init__(self):
super(SimpleCNN, self).__init__()
# Layer 1: Nhận ảnh 1 kênh (grayscale), dùng 16 filter 3x3
self.conv1 = nn.Conv2d(in_channels=1, out_channels=16, kernel_size=3, padding=1)
# Layer 2: Nhận 16 kênh, tăng lên 32 filter
self.conv2 = nn.Conv2d(in_channels=16, out_channels=32, kernel_size=3, padding=1)
# Max pooling thu nhỏ kích thước ảnh đi 2 lần
self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
# Fully connected layer để đưa ra xác suất 10 lớp
self.fc1 = nn.Linear(32 * 7 * 7, 128)
self.fc2 = nn.Linear(128, 10)
def forward(self, x):
# Ảnh -> Conv1 -> ReLU -> Pool
x = self.pool(F.relu(self.conv1(x)))
# -> Conv2 -> ReLU -> Pool
x = self.pool(F.relu(self.conv2(x)))
# Duỗi thẳng ma trận (Flatten)
x = x.view(-1, 32 * 7 * 7)
# Fully Connected -> Phân loại
x = F.relu(self.fc1(x))
x = self.fc2(x)
return x
# Khởi tạo mô hình
model = SimpleCNN()
print(model)python9. Tóm tắt: 6 từ khóa cốt lõi cần nhớ về CNN#
Nếu cần giải thích cho một người bạn chỉ trong 30 giây, hãy tóm tắt bằng quy trình 6 bước sau:
1. ẢNH GỐC (Ma trận các con số pixel)
↓
2. CONVOLUTION (Kính lúp trượt quét qua từng vùng)
↓
3. FEATURE MAP (Bản đồ đánh dấu các đặc trưng tìm thấy)
↓
4. POOLING (Rút gọn kích thước, giữ lại điểm nổi bật nhất)
↓
5. DEEP LAYERS (Ghép mảnh ghép từ cạnh -> hình dạng -> khuôn mặt)
↓
6. PREDICTION (Xác suất dự đoán: Mèo 95%, Chó 3%, Xe 2%)text[!TIP] Điểm cốt lõi: Thay vì con người phải tự viết hàng nghìn dòng lệnh
if/elseđể định nghĩa thế nào là con mèo, CNN tự động học hàng triệu đặc trưng từ dữ liệu mẫu thông qua sức mạnh của giải thuật toán học!