Convolution
Phép tích chập trượt một kernel trọng số nhỏ trên đầu vào để tạo bản đồ đặc trưng, đây là phép toán cốt lõi của CNN. Nội dung đề cập stride, padding và các biến thể.
Tích chập là phép toán trượt một lưới trọng số nhỏ, gọi là kernel hoặc filter, trên đầu vào và tính tổng có trọng số tại mỗi vị trí. Trong thị giác máy tính (CV), đầu vào là một hình ảnh hoặc một chồng feature map, và mỗi kernel tạo ra một map đầu ra có giá trị cao tại những vị trí xuất hiện mẫu của kernel: cạnh dọc, vùng kết cấu hoặc, ở các lớp sâu hơn trong mạng, một phần bánh xe hoặc khuôn mặt. Từ lâu, kernel được thiết kế thủ công đã được dùng trong xử lý ảnh để làm mờ, tăng độ nét và phát hiện cạnh. Trong mạng nơ-ron tích chập (CNN), các giá trị kernel là trọng số model được học trong quá trình huấn luyện, nhờ đó mạng tự tìm ra bộ phát hiện đặc trưng của riêng mình.
Cách thức hoạt động của tích chập#
Tại mỗi vị trí, kernel được đặt lên một vùng của đầu vào; mỗi trọng số kernel được nhân với giá trị đầu vào nằm bên dưới, rồi các tích được cộng lại cùng với bias để tạo thành một giá trị đầu ra. Trượt kernel trên toàn bộ chiều cao và chiều rộng sẽ tạo ra một map đầu ra hai chiều. Đầu vào thực tế có nhiều channel, chẳng hạn các channel đỏ, lục và lam của hình ảnh, nên mỗi kernel trải rộng trên tất cả channel đầu vào: kernel 3×3 trên đầu vào 64 channel chứa 3 × 3 × 64 = 576 trọng số nhưng vẫn chỉ tạo ra một channel đầu ra. Một lớp tích chập áp dụng nhiều kernel như vậy; số kernel xác định số channel đầu ra, vì thế lớp chuyển từ 64 sang 128 channel với kernel 3×3 có 3 × 3 × 64 × 128 = 73.728 trọng số.
Cùng một kernel được sử dụng lại ở mọi vị trí, nhờ đó các lớp tích chập cần ít tham số hơn nhiều so với lớp kết nối đầy đủ, đồng thời mẫu được học ở một góc ảnh cũng được nhận diện ở mọi nơi khác. Khi dịch chuyển đầu vào, đầu ra dịch chuyển cùng một khoảng; tính chất này được gọi là tương đương tịnh tiến. Mỗi giá trị đầu ra chỉ phụ thuộc vào một vùng lân cận nhỏ của đầu vào; việc xếp chồng các lớp mở rộng trường tiếp nhận mà một giá trị đầu ra sâu tổng hợp, từ vài pixel đến phần lớn hình ảnh.
Thư viện deep learning thực tế tính tương quan chéo: phép tích chập theo định nghĩa toán học đảo kernel trước khi trượt, còn Conv2d của PyTorch thì không. Vì kernel được học, mạng chỉ cần học các trọng số đã đảo, nên trên thực tế hai phép toán có thể thay thế cho nhau. Các thư viện GPU như cuDNN thường chuyển phép tích chập thành phép nhân ma trận lớn hoặc dùng thuật toán Winograd hay FFT để tính cùng kết quả nhanh hơn cách trượt kernel trực tiếp.
Stride, padding, dilation và groups#
Bốn hyperparameter kiểm soát hình dạng đầu ra của phép tích chập và chi phí tính toán:
- Stride: Khoảng bước giữa các vị trí kernel. Stride bằng 2 bỏ qua mỗi vị trí thứ hai và giảm một nửa chiều cao, chiều rộng đầu ra; đây là cách nhiều CNN hiện đại giảm kích thước.
- Padding: Các giá trị bổ sung, thường là số 0, được thêm quanh biên đầu vào. Padding bằng 1 giúp đầu ra của phép tích chập 3×3 có cùng kích thước với đầu vào khi stride bằng 1.
- Dilation: Tạo khoảng cách giữa các điểm lấy mẫu của kernel, vì vậy kernel 3×3 với dilation bằng 2 bao phủ vùng 5×5 nhưng vẫn dùng chín trọng số, mở rộng trường tiếp nhận mà không phát sinh thêm chi phí.
- Groups: Chia các channel thành những nhóm độc lập. Khi mỗi channel là một nhóm riêng, phép tích chập depthwise lọc từng channel riêng biệt; phép tích chập pointwise 1×1 tiếp theo trộn các channel. Cặp phép toán này được gọi là tích chập depthwise separable, được MobileNets phổ biến hóa cho phần cứng di động.
Với đầu vào kích thước n, kernel kích thước k, padding p, stride s và dilation d, kích thước đầu ra là ⌊(n + 2p − d(k − 1) − 1) / s⌋ + 1. Đoạn mã bên dưới áp dụng bốn lớp, mỗi lớp chuyển feature map 64 channel kích thước 80×80 thành 128 channel:
import torch
from torch import nn
x = torch.randn(1, 64, 80, 80) # a 64-channel, 80x80 feature map
# Four ways to map 64 input channels to 128 output channels
layers = {
"standard 3x3": nn.Conv2d(64, 128, kernel_size=3, padding=1, bias=False),
"stride 2": nn.Conv2d(64, 128, kernel_size=3, stride=2, padding=1, bias=False),
"dilation 2": nn.Conv2d(64, 128, kernel_size=3, padding=2, dilation=2, bias=False),
"depthwise separable": nn.Sequential(
nn.Conv2d(64, 64, kernel_size=3, padding=1, groups=64, bias=False), # one 3x3 filter per channel
nn.Conv2d(64, 128, kernel_size=1, bias=False), # 1x1 convolution mixes channels
),
}
for name, layer in layers.items():
params = sum(p.numel() for p in layer.parameters())
print(f"{name}: output {tuple(layer(x).shape)}, {params:,} weights")Lớp tiêu chuẩn tạo đầu ra (1, 128, 80, 80) với 73.728 trọng số. Stride 2 giảm một nửa đầu ra thành (1, 128, 40, 40) với cùng số trọng số; dilation 2 giữ kích thước 80×80 và 73.728 trọng số, trong khi mỗi đầu ra nhìn thấy vùng 5×5. Cặp depthwise separable tạo cùng đầu ra (1, 128, 80, 80) chỉ với 8.768 trọng số, ít hơn khoảng 8,4 lần. YOLO26 sử dụng cả hai ý tưởng: năm phép tích chập 3×3 stride 2 thu nhỏ hình ảnh 640×640 thành lưới 20×20 của feature map backbone sâu nhất, còn nhánh phân loại của detection head kết hợp tích chập depthwise 3×3 và pointwise 1×1 để giảm tính toán.
Tích chập trong các chiều khác#
- Tích chập 1D: Trượt dọc theo một trục, dùng cho dạng sóng âm thanh, tín hiệu cảm biến và chuỗi thời gian.
- Tích chập 3D: Bổ sung trục độ sâu hoặc thời gian, dùng cho video clip và ảnh quét thể tích như CT và MRI trong phân tích ảnh y tế.
- Tích chập chuyển vị: Phân tán từng giá trị đầu vào trên một đầu ra lớn hơn, phóng to feature map trong các model phân đoạn như U-Net. Phép toán này khôi phục kích thước không gian đã bị phép tích chập có stride giảm xuống, bằng cách sử dụng các trọng số được học riêng.
Tích chập và các phép toán liên quan#
- Lớp kết nối đầy đủ: Kết nối mọi đầu vào với mọi đầu ra bằng trọng số riêng. Tích chập là một lớp kết nối đầy đủ bị giới hạn ở các vùng lân cận cục bộ, với trọng số được chia sẻ giữa các vị trí.
- Pooling: Trượt một cửa sổ như phép tích chập nhưng áp dụng quy tắc cố định, chẳng hạn lấy giá trị lớn nhất, mà không cần trọng số được học.
- Self-attention: Tính trọng số phụ thuộc dữ liệu giữa mọi cặp vị trí, nhờ đó liên kết các phần xa nhau của hình ảnh chỉ trong một lớp. Tích chập áp dụng cùng một kernel cố định ở mọi nơi và chỉ nhìn thấy một cửa sổ cục bộ, giúp chi phí tăng tuyến tính theo số pixel.
- Lọc ảnh: Các filter cổ điển như làm mờ Gaussian và bộ phát hiện cạnh Sobel là các phép tích chập với kernel cố định được thiết kế thủ công.
filter2Dcủa OpenCV cũng tính tương quan, giống các thư viện deep learning; đảo kernel sẽ biến phép toán này thành tích chập thực sự.










