CBAM: Cơ chế chú ý kép giúp mạng nơ-ron tích chập mạnh mẽ hơn

Công nghệ20 tháng 9, 2026·4 phút đọc

CBAM (Convolutional Block Attention Module) là một module chú ý kép kết hợp chú ý kênh và chú ý không gian, giúp mạng nơ-ron tích chập tập trung vào những đặc trưng quan trọng nhất. Bài viết phân tích chi tiết cơ chế này và hướng dẫn cài đặt từ đầu bằng PyTorch.

CBAM: Cơ chế chú ý kép giúp mạng nơ-ron tích chập mạnh mẽ hơn

Trong lĩnh vực thị giác máy tính, các mô hình mạng nơ-ron tích chập (CNN) ngày càng trở nên sâu và phức tạp hơn. Tuy nhiên, việc tăng độ sâu không đồng nghĩa với việc mô hình biết tập trung vào đâu. CBAM (Convolutional Block Attention Module) ra đời như một giải pháp nhẹ nhàng nhưng hiệu quả, giúp mô hình "biết nhìn đúng chỗ" thông qua cơ chế chú ý kép.

CBAM là gì và vì sao nó quan trọng?

CBAM được giới thiệu trong bài báo khoa học năm 2018 của Sanghyun Woo và cộng sự. Đây là một module chú ý (attention module) dành riêng cho mạng tích chập, có thể được gắn vào hầu hết các kiến trúc CNN hiện có như ResNet, MobileNet hay EfficientNet.

Điểm đặc biệt của CBAM nằm ở chỗ nó áp dụng hai cơ chế chú ý tuần tự:

  • Chú ý kênh (Channel Attention): Trả lời câu hỏi "đặc trưng nào quan trọng?"
  • Chú ý không gian (Spatial Attention): Trả lời câu hỏi "vị trí nào trên ảnh quan trọng?"

Sự kết hợp này giúp CBAM vừa chọn lọc đặc trưng theo chiều kênh, vừa định vị vùng không gian chứa thông tin giá trị nhất.

Cơ chế chú ý kênh

Chú ý kênh vận hành dựa trên giả định rằng mỗi kênh đặc trưng đại diện cho một loại thông tin khác nhau. Module này sử dụng hai phép gộp (pooling) song song:

  • Global Average Pooling: Nắm bắt thông tin tổng quát
  • Global Max Pooling: Nắm bắt những đặc trưng nổi bật nhất

Hai vector kết quả sau đó được đưa qua một mạng MLP chia sẻ (thường là hai lớp fully-connected với hệ số giảm chiều), rồi cộng lại và áp dụng hàm sigmoid để tạo ra trọng số cho từng kênh.

Cơ chế chú ý không gian

Sau khi đã chọn lọc theo kênh, CBAM tiếp tục áp dụng chú ý không gian để xác định vùng quan trọng trên bản đồ đặc trưng. Quá trình này gồm các bước:

  • Gộp trung bình và gộp cực đại theo chiều kênh, tạo ra hai bản đồ đặc trưng 2D
  • Ghép hai bản đồ này lại theo chiều kênh
  • Áp dụng một lớp tích chập để học trọng số không gian
  • Chuẩn hóa qua hàm sigmoid để thu được bản đồ chú ý

Cài đặt CBAM bằng PyTorch

Dưới đây là phần cài đặt cốt lõi của CBAM. Trước tiên là module chú ý kênh:

import torch
import torch.nn as nn

class ChannelAttention(nn.Module):
    def __init__(self, in_channels, reduction=16):
        super().__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.max_pool = nn.AdaptiveMaxPool2d(1)
        self.mlp = nn.Sequential(
            nn.Linear(in_channels, in_channels // reduction),
            nn.ReLU(),
            nn.Linear(in_channels // reduction, in_channels)
        )
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        b, c, _, _ = x.size()
        avg_out = self.mlp(self.avg_pool(x).view(b, c))
        max_out = self.mlp(self.max_pool(x).view(b, c))
        out = self.sigmoid(avg_out + max_out).view(b, c, 1, 1)
        return x * out

Tiếp theo là module chú ý không gian:

class SpatialAttention(nn.Module):
    def __init__(self, kernel_size=7):
        super().__init__()
        self.conv = nn.Conv2d(2, 1, kernel_size, padding=kernel_size // 2)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        avg_out = torch.mean(x, dim=1, keepdim=True)
        max_out, _ = torch.max(x, dim=1, keepdim=True)
        out = torch.cat([avg_out, max_out], dim=1)
        out = self.sigmoid(self.conv(out))
        return x * out

Cuối cùng, ghép hai module lại thành CBAM hoàn chỉnh:

class CBAM(nn.Module):
    def __init__(self, in_channels, reduction=16, kernel_size=7):
        super().__init__()
        self.channel_attention = ChannelAttention(in_channels, reduction)
        self.spatial_attention = SpatialAttention(kernel_size)

    def forward(self, x):
        x = self.channel_attention(x)
        x = self.spatial_attention(x)
        return x

Ứng dụng và lợi ích thực tế

CBAM mang lại nhiều lợi ích thiết thực cho các dự án thị giác máy tính:

  • Tăng độ chính xác: Cải thiện kết quả phân loại ảnh, phát hiện đối tượng trên các bộ dữ liệu chuẩn như ImageNet hay COCO
  • Chi phí tính toán thấp: Chỉ thêm một lượng nhỏ tham số, phù hợp với các thiết bị biên (edge devices)
  • Tính linh hoạt cao: Có thể tích hợp vào bất kỳ kiến trúc CNN nào mà không cần thiết kế lại

Đối với các kỹ sư và nhà phát triển AI tại Việt Nam đang làm việc với các bài toán như nhận diện biển số xe, giám sát giao thông hay kiểm tra chất lượng sản phẩm trong nhà máy, CBAM là một kỹ thuật đáng cân nhắc để nâng cao hiệu suất mô hình mà không đòi hỏi tài nguyên phần cứng quá lớn.

Kết luận

CBAM là minh chứng cho việc đôi khi chỉ cần thêm một cơ chế chú ý thông minh là đủ để mô hình hoạt động tốt hơn đáng kể. Với thiết kế gọn nhẹ và dễ triển khai, đây là công cụ hữu ích trong bộ công cụ của bất kỳ ai làm việc với học sâu và thị giác máy tính.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗