Filters và kernels
Convolutional Neural Networks (CNN) - Convolution Layers - Filters và Kernels
Giới thiệu
Convolutional Neural Networks (CNNs) đã trở thành xương sống của nhiều ứng dụng computer vision hiện đại. Từ nhận dạng hình ảnh, phát hiện đối tượng đến phân loại video, CNNs đã chứng minh hiệu quả vượt trội trong việc hiểu và phân tích dữ liệu hình ảnh. Tuy nhiên, để hiểu sâu về cách thức hoạt động của các mạng này, chúng ta cần bắt đầu từ thành phần cơ bản nhất: các lớp tích chập (convolution layers), filters và kernels.
Bài viết này sẽ giải thích chi tiết về ba khái niệm này, cách chúng hoạt động cùng nhau, và tại sao chúng lại quan trọng đến vậy trong kiến trúc CNN.
Convolution Layer - Trái tim của CNN
Convolution là gì?
Trong toán học, tích chập (convolution) là một phép toán kết hợp hai hàm để tạo ra hàm thứ ba. Trong ngữ cảnh của CNN, convolution là quá trình áp dụng một filter (hay kernel) lên các vùng khác nhau của ảnh đầu vào để tạo ra một feature map.
Phép tính convolution trong CNNs có thể được biểu diễn bằng công thức:
$$(I * K)(i, j) = \sum_m \sum_n I(i+m, j+n) \cdot K(m, n)$$
Trong đó:
$I$ là ảnh đầu vào
$K$ là kernel
$*$ là phép tích chập
Để hình dung cụ thể, hãy tưởng tượng việc chúng ta trượt một cửa sổ nhỏ (kernel) trên toàn bộ bề mặt của ảnh, tại mỗi vị trí, chúng ta thực hiện phép nhân ma trận phần tử và tổng các giá trị thu được để tạo thành một phần tử trên feature map đầu ra.
Vai trò của Convolution Layer
Lớp tích chập trong CNN có một số chức năng quan trọng:
Trích xuất đặc trưng (Feature Extraction): Lớp tích chập giúp mạng học và trích xuất các đặc trưng như cạnh, góc, màu sắc từ ảnh đầu vào.
Giảm tham số (Parameter Reduction): Bằng cách chia sẻ trọng số (weight sharing), lớp tích chập giảm đáng kể số lượng tham số cần học so với mạng fully connected.
Tính bất biến dịch chuyển (Translation Invariance): CNN có khả năng nhận diện đối tượng bất kể vị trí của nó trong ảnh, nhờ vào cơ chế trượt filter.
Các tham số quan trọng của Convolution Layer
Stride: Số pixel mà filter di chuyển sau mỗi lần tính toán.
Padding: Thêm các giá trị (thường là 0) xung quanh ảnh đầu vào để điều chỉnh kích thước đầu ra.
Dilation: Khoảng cách giữa các phần tử của kernel, cho phép mở rộng receptive field mà không tăng số lượng tham số.
Filters và Kernels - Công cụ phát hiện đặc trưng
Filters/Kernels là gì?
Trong ngữ cảnh của CNN, các từ "filter" và "kernel" thường được sử dụng thay thế cho nhau. Đây là những ma trận nhỏ (thường có kích thước 3x3, 5x5, hoặc 7x7) chứa các trọng số (weights) mà mạng sẽ học trong quá trình huấn luyện.
Mỗi filter đóng vai trò như một bộ phát hiện đặc trưng (feature detector). Ví dụ, một filter có thể chuyên phát hiện cạnh ngang, một filter khác có thể phát hiện cạnh dọc, và một filter khác nữa có thể phát hiện các đặc trưng phức tạp hơn như kết cấu hoặc hình dạng.
Cách Filters hoạt động
Quá trình hoạt động của filter trong CNN có thể được mô tả qua các bước sau:
Filter được đặt tại một vị trí trên ảnh đầu vào
Thực hiện phép nhân phần tử giữa filter và vùng tương ứng trên ảnh
Tính tổng các giá trị thu được
Đặt kết quả vào vị trí tương ứng trên feature map đầu ra
Di chuyển filter theo stride đã định và lặp lại quá trình
# Ví dụ về convolution 2D trong Python sử dụng NumPy
import numpy as np
from scipy import signal
# Ảnh đầu vào (5x5)
image = np.array([
[1, 2, 3, 4, 5],
[6, 7, 8, 9, 10],
[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20],
[21, 22, 23, 24, 25]
])
# Kernel phát hiện cạnh ngang (3x3)
kernel = np.array([
[-1, -1, -1],
[0, 0, 0],
[1, 1, 1]
])
# Áp dụng convolution
output = signal.convolve2d(image, kernel, mode='valid')
print(output)Số lượng và kích thước Filters
Một lớp tích chập thường bao gồm nhiều filters, mỗi filter sẽ tạo ra một feature map. Số lượng filters quyết định số lượng feature maps đầu ra và do đó ảnh hưởng đến khả năng của mạng trong việc học các đặc trưng khác nhau.
Kích thước của filter ảnh hưởng đến receptive field - vùng ảnh đầu vào mà mỗi neuron trong feature map "nhìn thấy":
Filter nhỏ (3x3): Phát hiện đặc trưng cục bộ, chi tiết nhỏ
Filter lớn (5x5, 7x7): Phát hiện đặc trưng tổng quát, bao quát vùng lớn hơn
Học tập và trực quan hóa Filters
Quá trình học của Filters
Trong quá trình huấn luyện, các trọng số của filters được cập nhật thông qua thuật toán lan truyền ngược (backpropagation) và tối ưu hóa gradient (gradient descent). Ban đầu, các trọng số thường được khởi tạo ngẫu nhiên và dần dần điều chỉnh để giảm thiểu hàm mất mát (loss function).
Điều thú vị là khi trực quan hóa các filters đã được học, chúng ta có thể thấy rằng:
Các filters ở lớp đầu tiên thường học các đặc trưng cơ bản như cạnh và góc
Các filters ở các lớp sâu hơn học các đặc trưng phức tạp hơn như kết cấu, hình dạng, và thậm chí là các bộ phận của đối tượng
Ví dụ về các loại Filters phổ biến
Sobel Filter: Phát hiện cạnh theo hướng ngang và dọc
Gx = [[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]] Gy = [[-1, -2, -1], [0, 0, 0], [1, 2, 1]]Gaussian Filter: Làm mờ ảnh, giảm nhiễu
[1/16, 2/16, 1/16] [2/16, 4/16, 2/16] [1/16, 2/16, 1/16]Laplacian Filter: Phát hiện cạnh theo tất cả các hướng
[0, 1, 0] [1, -4, 1] [0, 1, 0]
Kiến trúc các lớp Convolution phức tạp hơn
Khi CNN phát triển, các biến thể phức tạp hơn của lớp tích chập đã xuất hiện:
Depthwise Separable Convolution
Tách phép tích chập thành hai bước: depthwise convolution (áp dụng filter riêng cho mỗi kênh đầu vào) và pointwise convolution (tích chập 1x1 để kết hợp thông tin từ các kênh). Phương pháp này giảm đáng kể số lượng tham số và tính toán, được sử dụng phổ biến trong các mô hình nhẹ như MobileNet.
Dilated/Atrous Convolution
Thêm các "lỗ" giữa các phần tử của kernel, cho phép mở rộng receptive field mà không tăng số lượng tham số. Rất hữu ích trong các tác vụ như phân đoạn ngữ nghĩa (semantic segmentation) khi cần thông tin ngữ cảnh rộng hơn.
Deformable Convolution
Cho phép kernel thay đổi hình dạng dựa trên dữ liệu đầu vào, giúp mạng thích ứng tốt hơn với các biến đổi hình học phức tạp.
Ứng dụng thực tế
Trích xuất đặc trưng với Keras/TensorFlow
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
# Xây dựng mô hình CNN đơn giản
model = Sequential([
# Lớp tích chập đầu tiên với 32 filters kích thước 3x3
Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
MaxPooling2D((2, 2)),
# Lớp tích chập thứ hai với 64 filters kích thước 3x3
Conv2D(64, (3, 3), activation='relu'),
MaxPooling2D((2, 2)),
# Làm phẳng đầu ra để kết nối với lớp fully connected
Flatten(),
# Lớp fully connected
Dense(128, activation='relu'),
Dense(10, activation='softmax')
])
# Tóm tắt kiến trúc mô hình
model.summary()Trực quan hóa Filters
import matplotlib.pyplot as plt
# Lấy trọng số của lớp tích chập đầu tiên
filters = model.layers[0].get_weights()[0]
# Trực quan hóa 16 filters đầu tiên
fig, axes = plt.subplots(4, 8, figsize=(16, 8))
for i, ax in enumerate(axes.flat):
if i < filters.shape[3]:
ax.imshow(filters[:,:,0,i], cmap='viridis')
ax.set_xticks([])
ax.set_yticks([])
plt.tight_layout()
plt.show()Kết luận
Convolution layers, filters và kernels là nền tảng của Convolutional Neural Networks, cho phép mạng học và trích xuất tự động các đặc trưng từ dữ liệu hình ảnh. Thông qua việc hiểu cách thức hoạt động của các thành phần này, chúng ta có thể thiết kế và tối ưu hóa các mạng CNN hiệu quả hơn cho các ứng dụng computer vision.
Sự phát triển không ngừng của các kỹ thuật tích chập tiên tiến đã mở rộng khả năng ứng dụng của CNN trong nhiều lĩnh vực từ y học, tự động hóa đến giải trí và an ninh. Khi các kiến trúc mạng trở nên phức tạp hơn, hiểu biết sâu sắc về các nguyên lý cơ bản này trở nên quan trọng hơn bao giờ hết.
Last updated