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:

  1. Global Average Pooling (GAP) - Tính giá trị trung bình của mỗi feature map

  2. 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=0

Trong 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_output

Trong 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,w

Tạ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

Tiêu chí
Global Average Pooling
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 x

Visualization 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