Max pooling, average pooling

Pooling Layers: Max Pooling, Average Pooling

Các mạng nơ-ron tích chập (Convolutional Neural Networks - CNN) là một trong những kiến trúc quan trọng nhất trong lĩnh vực thị giác máy tính và xử lý ảnh. Một thành phần không thể thiếu trong kiến trúc CNN là pooling layers (các lớp gộp). Bài viết này sẽ giải thích chi tiết về hai loại pooling phổ biến nhất: max pooling và average pooling.

Pooling là gì?

Pooling là một kỹ thuật giảm chiều dữ liệu (downsampling) trong CNN, giúp giảm kích thước không gian của biểu diễn, từ đó giảm số lượng tham số và khối lượng tính toán trong mạng. Pooling hoạt động bằng cách lấy mẫu từ các vùng đầu vào, tạo ra các biểu diễn tóm tắt theo kích thước cửa sổ xác định.

Tại sao cần Pooling?

Pooling layers đóng vai trò quan trọng trong CNN vì nhiều lý do:

  1. Giảm kích thước - Giúp giảm độ phân giải không gian, giảm số lượng tham số và độ phức tạp tính toán.

  2. Bất biến tính không gian (Spatial invariance) - Giúp mạng nhận dạng đối tượng ngay cả khi vị trí của đối tượng thay đổi một chút.

  3. Chống overfitting - Thông qua giảm số lượng tham số, pooling giúp giảm nguy cơ overfitting.

  4. Trích xuất đặc trưng - Các phương pháp pooling khác nhau có thể trích xuất các đặc trưng khác nhau từ dữ liệu đầu vào.

Max Pooling

Max pooling là phương pháp pooling phổ biến nhất trong CNN. Nó hoạt động bằng cách:

  1. Chia đầu vào thành các cửa sổ không chồng lấp (thường là 2×2)

  2. Chọn giá trị lớn nhất từ mỗi cửa sổ

  3. Xuất các giá trị lớn nhất này như đầu ra của lớp pooling

Ưu điểm của Max Pooling:

  • Bảo toàn đặc trưng nổi bật - Giữ lại các giá trị cao nhất, thường tương ứng với các đặc trưng quan trọng nhất như cạnh, góc, hoặc các điểm đặc biệt khác.

  • Giảm nhiễu - Bỏ qua các giá trị thấp hơn, thường là nhiễu hoặc thông tin ít quan trọng hơn.

  • Hiệu quả tính toán - Chỉ lưu trữ giá trị lớn nhất, giảm đáng kể các tham số.

Công thức Max Pooling:

Với một cửa sổ pooling kích thước m×n, giá trị đầu ra tại vị trí (i,j) là:

output(i,j) = max(input(i*stride:i*stride+m, j*stride:j*stride+n))

Average Pooling

Average pooling (pooling trung bình) là phương pháp thay thế, hoạt động bằng cách:

  1. Chia đầu vào thành các cửa sổ không chồng lấp (tương tự max pooling)

  2. Tính giá trị trung bình của tất cả các giá trị trong mỗi cửa sổ

  3. Xuất các giá trị trung bình này làm đầu ra

Ưu điểm của Average Pooling:

  • Làm mượt đặc trưng - Cung cấp biểu diễn tổng quát hơn về vùng đầu vào, không chỉ tập trung vào đặc trưng nổi bật nhất.

  • Giảm nhiễu hiệu quả - Bằng cách lấy giá trị trung bình, có thể giảm tác động của các giá trị cực đoan hoặc nhiễu.

  • Phù hợp với một số tác vụ - Trong một số ứng dụng như phân loại bối cảnh hoặc texture, average pooling có thể hoạt động tốt hơn max pooling.

Công thức Average Pooling:

output(i,j) = average(input(i*stride:i*stride+m, j*stride:j*stride+n))

So sánh Max Pooling và Average Pooling

Tiêu chí
Max Pooling
Average Pooling

Giá trị đầu ra

Giá trị lớn nhất

Giá trị trung bình

Bảo toàn đặc trưng

Giữ lại đặc trưng nổi bật

Đại diện tổng quát hơn

Ứng dụng

Phổ biến hơn trong các tác vụ nhận dạng đối tượng

Đôi khi tốt hơn đối với phân loại bối cảnh, texture

Nhạy cảm với nhiễu

Có thể bị ảnh hưởng bởi nhiễu cực đoan

Ổn định hơn đối với nhiễu

Các kích thước và stride phổ biến

Trong thực tế, các cấu hình pooling phổ biến nhất là:

  • Kích thước cửa sổ 2×2 với stride 2 (không chồng lấp)

  • Kích thước cửa sổ 3×3 với stride 2 (có chồng lấp)

Cấu hình 2×2 với stride 2 giảm chiều dữ liệu đi một nửa theo mỗi chiều, dẫn đến giảm 75% số lượng phần tử.

Mã Python triển khai Pooling với NumPy và PyTorch

Triển khai với NumPy

import numpy as np

def max_pooling(input_data, pool_size=2, stride=2):
    h, w = input_data.shape
    h_out = (h - pool_size) // stride + 1
    w_out = (w - pool_size) // stride + 1
    
    output = np.zeros((h_out, w_out))
    
    for i in range(h_out):
        for j in range(w_out):
            h_start = i * stride
            w_start = j * stride
            output[i, j] = np.max(input_data[h_start:h_start+pool_size, 
                                             w_start:w_start+pool_size])
    return output

def avg_pooling(input_data, pool_size=2, stride=2):
    h, w = input_data.shape
    h_out = (h - pool_size) // stride + 1
    w_out = (w - pool_size) // stride + 1
    
    output = np.zeros((h_out, w_out))
    
    for i in range(h_out):
        for j in range(w_out):
            h_start = i * stride
            w_start = j * stride
            output[i, j] = np.mean(input_data[h_start:h_start+pool_size, 
                                              w_start:w_start+pool_size])
    return output

Triển khai với PyTorch

import torch
import torch.nn as nn

# Max Pooling
max_pool = nn.MaxPool2d(kernel_size=2, stride=2)

# Average Pooling
avg_pool = nn.AvgPool2d(kernel_size=2, stride=2)

# Áp dụng pooling
input_tensor = torch.randn(1, 1, 4, 4)  # (batch_size, channels, height, width)
max_pooled = max_pool(input_tensor)
avg_pooled = avg_pool(input_tensor)

Xu hướng hiện tại và các phương pháp thay thế

Mặc dù max pooling và average pooling vẫn rất phổ biến, trong những năm gần đây một số kỹ thuật thay thế đã được phát triển:

  1. Global Average Pooling - Lấy trung bình trên toàn bộ feature map, thường được sử dụng ở cuối mạng để thay thế các lớp fully connected, giảm đáng kể số lượng tham số.

  2. Strided Convolutions - Thay vì sử dụng pooling layers, một số kiến trúc hiện đại (như All-Convolutional Networks) sử dụng các convolution với stride > 1 để giảm chiều dữ liệu.

  3. Mixed Pooling - Kết hợp max pooling và average pooling để tận dụng ưu điểm của cả hai phương pháp.

  4. Spatial Pyramid Pooling - Cho phép xử lý đầu vào có kích thước khác nhau và tạo ra đầu ra có kích thước cố định.

Kết luận

Pooling layers là thành phần quan trọng trong kiến trúc CNN, giúp giảm chiều dữ liệu, tăng hiệu quả tính toán, và cung cấp bất biến tính không gian. Max pooling và average pooling là hai phương pháp phổ biến nhất, mỗi phương pháp có những ưu điểm riêng phù hợp với từng loại ứng dụng cụ thể.

Việc lựa chọn loại pooling phù hợp phụ thuộc vào đặc điểm của bài toán và loại đặc trưng cần trích xuất. Max pooling thường là lựa chọn mặc định cho các tác vụ nhận dạng đối tượng, trong khi average pooling có thể phù hợp hơn cho các tác vụ phân loại texture hoặc bối cảnh.

Dù lựa chọn phương pháp nào, pooling vẫn là một kỹ thuật không thể thiếu trong thiết kế CNN hiệu quả, đặc biệt là đối với các mạng sâu xử lý dữ liệu hình ảnh có độ phân giải cao.

Last updated