Stride và padding

Stride và Padding trong CNN - Hai Yếu Tố Quyết Định Hiệu Suất Mạng

Giới thiệu

Trong thế giới Convolutional Neural Networks (CNN), mỗi yếu tố thiết kế đều đóng vai trò quan trọng trong việc định hình hiệu suất và khả năng học của mô hình. Hai tham số quan trọng nhưng thường bị bỏ qua là stridepadding. Chúng không chỉ ảnh hưởng đến kích thước đầu ra của mỗi lớp mà còn tác động đến quá trình trích xuất đặc trưng và hiệu suất tổng thể của mạng.

Hôm nay, chúng ta sẽ đi sâu tìm hiểu về hai khái niệm này, hiểu cách chúng hoạt động, và khám phá cách ứng dụng chúng hiệu quả trong các mô hình CNN thực tế.

Stride - "Bước đi" của Kernel

Khái niệm cơ bản

Stride đơn giản là khoảng cách mà kernel "bước đi" sau mỗi lần thực hiện phép tích chập. Giống như cách bạn di chuyển một khuôn cookie trên bề mặt bột, stride quyết định bạn di chuyển khuôn bao xa sau mỗi lần cắt.

  • Stride = 1: Kernel di chuyển 1 pixel sau mỗi lần tính toán, tạo ra feature map với độ chi tiết cao nhất

  • Stride = 2: Kernel nhảy 2 pixel mỗi lần, bỏ qua một số vị trí và tạo ra feature map nhỏ hơn

  • Stride > 2: Thường được sử dụng cho downsampling mạnh, nhưng cũng có thể làm mất thông tin quan trọng

Ảnh hưởng của Stride

Lựa chọn stride có những tác động sau:

1. Kích thước feature map đầu ra

Công thức tính kích thước đầu ra:

Output size = [(Input size - Kernel size) / Stride] + 1

Ví dụ với ảnh đầu vào 28x28, kernel 3x3:

  • Stride = 1 → Output: 26x26

  • Stride = 2 → Output: 13x13

2. Lượng thông tin được bảo toàn

Stride lớn đồng nghĩa với việc nhiều thông tin không được xử lý. Điều này có thể là:

  • Ưu điểm: Giảm dư thừa, giảm chi phí tính toán, tăng receptive field hiệu quả

  • Nhược điểm: Có thể bỏ lỡ các đặc trưng quan trọng, giảm độ chính xác

3. Hiệu suất tính toán

Stride lớn hơn làm giảm kích thước đầu ra, dẫn đến:

  • Ít phép tính hơn

  • Ít bộ nhớ cần thiết hơn

  • Thời gian huấn luyện và suy luận nhanh hơn

Padding - "Đệm" cho Feature Maps

Khái niệm cơ bản

Padding là quá trình thêm các pixel (thường là giá trị 0) xung quanh ảnh đầu vào trước khi áp dụng phép tích chập. Điều này giống như việc thêm một đường viền xung quanh tấm vải trước khi cắt.

Các loại Padding phổ biến

1. Valid Padding (No Padding)

┌───────────────┐
│               │
│    Ảnh gốc    │
│               │
└───────────────┘
  • Không thêm pixel nào

  • Feature map đầu ra luôn nhỏ hơn đầu vào

  • Mất thông tin ở biên

2. Same Padding

┌─────────────────────┐
│                     │
│   ┌───────────┐     │
│   │           │     │
│   │  Ảnh gốc  │     │
│   │           │     │
│   └───────────┘     │
│                     │
└─────────────────────┘
  • Thêm đủ pixel để giữ kích thước đầu ra bằng đầu vào (với stride=1)

  • Bảo toàn thông tin không gian

  • Phổ biến trong nhiều kiến trúc CNN hiện đại

3. Full Padding

┌───────────────────────────┐
│                           │
│                           │
│       ┌───────────┐       │
│       │           │       │
│       │  Ảnh gốc  │       │
│       │           │       │
│       └───────────┘       │
│                           │
│                           │
└───────────────────────────┘
  • Thêm nhiều lớp padding

  • Feature map đầu ra lớn hơn đầu vào

  • Ít được sử dụng trong thực tế

Lợi ích của Padding

  1. Bảo toàn thông tin biên: Đặc biệt quan trọng đối với các đối tượng nhỏ hoặc chi tiết nằm ở rìa ảnh

  2. Kiểm soát kích thước đầu ra: Cho phép xây dựng mạng sâu hơn mà không bị giảm kích thước quá nhanh

  3. Cải thiện hiệu suất: "Same padding" thường giúp mô hình hoạt động tốt hơn vì bảo toàn thông tin không gian

Kết hợp Stride và Padding trong thực tế

Các kịch bản sử dụng phổ biến

  1. Stride=1, Same padding: Lý tưởng cho các lớp trích xuất đặc trưng, không làm giảm kích thước không gian

# Keras/TensorFlow implementation
conv_layer = Conv2D(filters=64, kernel_size=3, strides=1, padding='same', activation='relu')
  1. Stride=2, Same padding: Thay thế cho pooling layers, giảm kích thước không gian nhưng vẫn giữ được nhiều thông tin hơn so với max pooling

# Keras/TensorFlow implementation
conv_layer = Conv2D(filters=64, kernel_size=3, strides=2, padding='same', activation='relu')
  1. Stride=1, Valid padding: Được sử dụng khi muốn giảm dần kích thước qua mỗi lớp, thường trong các mạng đơn giản

# Keras/TensorFlow implementation
conv_layer = Conv2D(filters=64, kernel_size=3, strides=1, padding='valid', activation='relu')

Ví dụ thực tế: ResNet

Trong kiến trúc ResNet nổi tiếng, stride và padding được sử dụng khéo léo:

  • Các block cơ bản sử dụng stride=1 và same padding để giữ kích thước không gian

  • Các block giảm kích thước sử dụng stride=2 và same padding để giảm một nửa kích thước không gian

# Ví dụ đơn giản về block ResNet
def resnet_block(x, filters, stride=1):
    identity = x
    
    # Lớp tích chập 1
    x = Conv2D(filters, kernel_size=3, strides=stride, padding='same')(x)
    x = BatchNormalization()(x)
    x = Activation('relu')(x)
    
    # Lớp tích chập 2
    x = Conv2D(filters, kernel_size=3, strides=1, padding='same')(x)
    x = BatchNormalization()(x)
    
    # Xử lý shortcut connection khi stride > 1
    if stride > 1:
        identity = Conv2D(filters, kernel_size=1, strides=stride, padding='same')(identity)
        identity = BatchNormalization()(identity)
    
    # Kết hợp đầu ra với identity connection
    x = Add()([x, identity])
    x = Activation('relu')(x)
    
    return x

Mẹo thiết kế CNN với Stride và Padding

  1. Giữ thông tin ở các lớp đầu: Sử dụng stride=1 và same padding ở những lớp đầu tiên để bảo toàn chi tiết

  2. Downsampling dần dần: Sử dụng stride=2 ở các lớp sau để giảm kích thước dần dần thay vì giảm đột ngột

  3. Cân nhắc chi phí tính toán: Stride lớn giúp giảm chi phí tính toán nhưng có thể ảnh hưởng đến độ chính xác

  4. Thử nghiệm: Stride và padding thường được coi là hyperparameters, đừng ngại thử nghiệm các cấu hình khác nhau

Hiểu cách Stride và Padding ảnh hưởng đến đầu ra

Cùng xem ví dụ cụ thể về cách stride và padding ảnh hưởng đến kích thước đầu ra:

Giả sử chúng ta có:

  • Ảnh đầu vào: 32x32

  • Kernel: 3x3

Stride
Padding
Kích thước đầu ra
Số tham số

1

Valid

30x30

Ít nhất

1

Same

32x32

Trung bình

2

Valid

15x15

Ít nhất

2

Same

16x16

Trung bình

Tối ưu hóa CNN của bạn

Stride và padding có thể cải thiện đáng kể hiệu suất mô hình CNN của bạn khi được cấu hình đúng cách:

  1. Tăng tốc quá trình huấn luyện: Sử dụng stride lớn hơn có thể giảm đáng kể thời gian huấn luyện

  2. Cải thiện độ chính xác: Sử dụng padding thích hợp có thể giúp mô hình bắt được các đặc trưng biên quan trọng

  3. Giảm overfitting: Stride lớn hơn có thể hoạt động như một dạng regularization, giảm số lượng tham số

Kết luận

Stride và padding là hai công cụ mạnh mẽ trong bộ công cụ của kỹ sư CNN. Hiểu được cách chúng hoạt động và tác động đến hiệu suất mô hình sẽ giúp bạn thiết kế các mạng CNN hiệu quả hơn, nhanh hơn và chính xác hơn.

Khi thiết kế CNN tiếp theo của bạn, hãy dành thời gian suy nghĩ về stride và padding - những chi tiết nhỏ này có thể tạo nên sự khác biệt lớn trong hiệu suất cuối cùng của mô hình.

Last updated