Global pooling
Global Pooling trong Mạng Nơ-ron Tích Chập
Global pooling là một kỹ thuật quan trọng đã cách mạng hóa thiết kế mạng nơ-ron tích chập (CNN) trong những năm gần đây. Khác với conventional pooling (max pooling, average pooling) hoạt động trên các cửa sổ cục bộ, global pooling áp dụng phép toán pooling trên toàn bộ feature map. Bài viết này sẽ giải thích chi tiết về global pooling, các loại và ứng dụng của nó trong các kiến trúc CNN hiện đại.
Global Pooling là gì?
Global pooling (gộp toàn cục) là kỹ thuật biến đổi feature map có kích thước không gian (H×W) thành một giá trị duy nhất cho mỗi kênh. Điều này có nghĩa là mỗi feature map 2D sẽ được tóm tắt thành một giá trị duy nhất, tạo ra một vector đặc trưng 1D có độ dài bằng số lượng feature map đầu vào.
Có hai loại global pooling chính:
Global Average Pooling (GAP) - Tính giá trị trung bình của mỗi feature map
Global Max Pooling (GMP) - Lấy giá trị lớn nhất của mỗi feature map
Global Average Pooling (GAP)
Global Average Pooling được giới thiệu trong bài báo "Network In Network" (Lin et al., 2013) và trở nên phổ biến trong nhiều kiến trúc CNN hiện đại như GoogLeNet/Inception, ResNet và DenseNet.
Cách thức hoạt động:
Nếu feature map đầu vào có kích thước (N × H × W), trong đó:
N là số lượng feature map
H là chiều cao
W là chiều rộng
GAP sẽ tính giá trị trung bình của mỗi feature map và trả về một vector có kích thước (N × 1):
output_i = (1 / (H * W)) * Σ Σ input_i[h, w]
h=0 w=0Trong Python, điều này có thể được triển khai đơn giản như sau:
import numpy as np
def global_average_pooling(feature_maps):
N, H, W = feature_maps.shape
gap_output = np.zeros(N)
for i in range(N):
gap_output[i] = np.mean(feature_maps[i])
return gap_outputTrong PyTorch:
import torch.nn as nn
# Định nghĩa lớp GAP
gap_layer = nn.AdaptiveAvgPool2d((1, 1))
# Input có kích thước [batch_size, channels, height, width]
# Output sẽ có kích thước [batch_size, channels, 1, 1]
# Sau đó squeeze để có [batch_size, channels]Global Max Pooling (GMP)
Global Max Pooling hoạt động tương tự GAP nhưng thay vì lấy giá trị trung bình, nó lấy giá trị lớn nhất từ mỗi feature map.
Cách thức hoạt động:
output_i = max(input_i[h, w]) for all h,wTại sao sử dụng Global Pooling?
1. Thay thế Fully Connected Layers
Một trong những lợi ích lớn nhất của global pooling là khả năng thay thế các lớp fully connected (FC) cuối cùng trong mạng CNN:
Giảm đáng kể số lượng tham số: Các lớp FC thường chứa phần lớn tham số trong CNN. Global pooling không có tham số để học.
Chống overfitting hiệu quả: Ít tham số hơn đồng nghĩa với khả năng chống overfitting tốt hơn.
2. Thiết kế mạng linh hoạt hơn
Không phụ thuộc kích thước đầu vào: Global pooling có thể xử lý feature map có kích thước không gian khác nhau, cho phép mạng xử lý hình ảnh đầu vào có kích thước khác nhau.
Không cần flattening: Không cần chuyển đổi từ biểu diễn 2D sang 1D trước khi đưa vào lớp FC.
3. Tương đương với cơ chế attention
Mối liên hệ giữa feature maps và lớp: Mỗi feature map có thể được xem như một "detector" cho một đặc trưng cụ thể. Global pooling tạo ra mối liên hệ rõ ràng giữa các feature map và lớp đầu ra.
Global Pooling trong kiến trúc CNN hiện đại
Network In Network (NIN)
NIN là kiến trúc đầu tiên giới thiệu GAP để thay thế các lớp FC. Điều này giúp giảm đáng kể overfitting và số lượng tham số.
GoogLeNet/Inception
GoogLeNet sử dụng GAP ở cuối mạng trước lớp softmax. Điều này giúp giảm số lượng tham số từ 5 triệu (với FC) xuống còn 1 triệu.
ResNet
ResNet sử dụng GAP sau lớp tích chập cuối cùng và trước lớp FC duy nhất để phân loại.
MobileNet và EfficientNet
Các mạng hiệu quả như MobileNet và EfficientNet sử dụng GAP để giảm kích thước tính toán và số lượng tham số.
Global Average Pooling so với Global Max Pooling
Đặc điểm
Tính trung bình toàn bộ feature map
Lấy giá trị lớn nhất từ feature map
Ưu điểm
Mượt hơn, ổn định hơn, ít nhạy cảm với nhiễu
Tập trung vào đặc trưng mạnh nhất
Nhược điểm
Có thể bỏ qua các đặc trưng mạnh nhưng cục bộ
Nhạy cảm với nhiễu, bỏ qua thông tin phân bố
Ứng dụng
Phổ biến hơn, đặc biệt trong các mạng hiện đại
Hữu ích khi chỉ quan tâm đến sự hiện diện của đặc trưng
Global Pooling trong hoạt động thực tế
Dưới đây là một ví dụ đơn giản về cách Global Average Pooling hoạt động trong một CNN điển hình:
import torch
import torch.nn as nn
import torch.nn.functional as F
class SimpleCNN(nn.Module):
def __init__(self, num_classes=10):
super(SimpleCNN, self).__init__()
# Các lớp tích chập
self.conv1 = nn.Conv2d(3, 32, kernel_size=3, padding=1)
self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)
self.conv3 = nn.Conv2d(64, 128, kernel_size=3, padding=1)
# Global Average Pooling
self.gap = nn.AdaptiveAvgPool2d(1)
# Lớp fully connected duy nhất cho phân loại
self.fc = nn.Linear(128, num_classes)
def forward(self, x):
# Xử lý tích chập
x = F.relu(self.conv1(x))
x = F.max_pool2d(x, 2)
x = F.relu(self.conv2(x))
x = F.max_pool2d(x, 2)
x = F.relu(self.conv3(x))
# Global Average Pooling
x = self.gap(x) # Kết quả: [batch_size, 128, 1, 1]
# Flatten để chuẩn bị cho FC layer
x = x.view(x.size(0), -1) # Kết quả: [batch_size, 128]
# Fully connected layer
x = self.fc(x)
return xVisualization và Class Activation Mapping (CAM)
Một lợi ích đáng chú ý khác của Global Average Pooling là khả năng tạo ra Class Activation Maps (CAM), cho phép hiểu được mạng tập trung vào đâu khi đưa ra dự đoán. GAP giúp tạo ra mối liên hệ trực tiếp giữa các feature map và các lớp đầu ra, cho phép trực quan hóa các vùng quan trọng trong hình ảnh.
# Ví dụ đơn giản về cách tạo CAM
def generate_cam(feature_maps, weights, class_idx):
# feature_maps: [C, H, W]
# weights: tham số của lớp FC cuối cùng [num_classes, C]
# Lấy trọng số cho lớp mục tiêu
target_weights = weights[class_idx, :] # [C]
# Tạo CAM bằng cách nhân feature maps với trọng số
cam = np.zeros((feature_maps.shape[1], feature_maps.shape[2]), dtype=np.float32)
for i, w in enumerate(target_weights):
cam += w * feature_maps[i, :, :]
return camƯu và nhược điểm của Global Pooling
Ưu điểm:
Giảm đáng kể số lượng tham số
Chống overfitting hiệu quả
Cho phép mạng xử lý hình ảnh đầu vào có kích thước khác nhau
Giúp tạo ra mối liên hệ rõ ràng giữa feature maps và lớp đầu ra
Hỗ trợ trực quan hóa và giải thích mạng (qua CAM)
Nhược điểm:
Có thể mất thông tin không gian (vị trí của đặc trưng)
Đôi khi quá đơn giản cho các tác vụ phức tạp
Có thể giảm hiệu suất so với một mạng được thiết kế tốt với FC layers
Kết luận
Global pooling, đặc biệt là Global Average Pooling, đã trở thành một kỹ thuật thiết yếu trong thiết kế CNN hiện đại. Nó không chỉ giúp giảm số lượng tham số và nguy cơ overfitting mà còn hỗ trợ trực quan hóa và giải thích mạng, một yếu tố ngày càng quan trọng trong nghiên cứu AI.
Mặc dù conventional pooling (max và average pooling) vẫn đóng vai trò quan trọng trong các giai đoạn đầu và giữa của mạng để giảm kích thước không gian, global pooling đã chứng minh được giá trị của nó như một thay thế hiệu quả cho các lớp fully connected ở giai đoạn cuối của mạng.
Khi thiết kế CNN cho các ứng dụng của riêng bạn, việc kết hợp cả conventional pooling và global pooling có thể mang lại hiệu suất tốt nhất, tận dụng ưu điểm của cả hai kỹ thuật.
Last updated