Within Convolutional Layer - Phần 1: Connections cutting, Weights sharing

Convolutional Neural Network (CNN) là một biến thể dựa trên cảm hứng về sinh học của mô hình Multilayer Perceptron (MLP), được thiết kế mô phỏng hành vi của phần vỏ não điều khiển thị giác. CNN gần như đã khắc phục những khuyết điểm của kiến trúc MLP bằng cách khai thác sự tương quan không gian địa lý mạnh mẽ hiện diện trong các hình ảnh tự nhiên. - Wikipedia.
Series này sẽ đề cập chủ yếu đến một số vấn đề của layer quan trọng nhất trong CNN - Convolutional Layer và đôi điều vài người vẫn còn hiểu lầm. Nếu bạn chưa biết về CNN, bạn được khuyến khích nên tìm hiểu tại đây trước khi bắt đầu bài viết này.

Từ Multilayer Perceptron đến Convolutional Neural Network


Tất nhiên là CNN phức tạp với nhiều loại layer, activation function hơn hẳn so với MLP, và cũng "sinh học" hơn. Tuy nhiên có rất nhiều sự tương đồng giữa các layer của MLP với Convolutional Layer.



Multilayer Perceptron

Convolutional layer

Nhìn có vẻ không giống nhau lắm nhỉ, nhưng Conv-layer là phiên bản Connections cutting + Weights sharing của những layer trong MLP



Convolutional layer chắc chắn không phải full-connected layer. Với p input (ví dụ p điểm ảnh...) và filter có kích thước $m \times n$, không phải toàn bộ p input sẽ connnected để tạo ra mỗi output (như full-connected) mà số lượng này chỉ là $m \times n$.  Đây chính là Connections cutting.
Để lý giải cho Weights sharing, filter sẽ trượt trên toàn bộ feature map để thực hiện convoluton, đồng nghĩa với việc các weight của filter sẽ được sử dụng lại với mỗi bộ $m \times n$ input dùng để tính toán 1 output. Ví dụ như hình vẽ bên trên, filter có kích thước $2 \times 2$, 4 weight tương ứng các màu: lam, lục, tím ...đậm và tím nhạt. Bộ weight này được tái sử dụng với mỗi 4 input để tạo ra output tương ứng.
Hình vẽ sau có lẽ sẽ giúp bạn dễ dàng hình dung hơn:


Weight (Filter) bị "lộn ngược"


Không, không phải như vậy đâu!

À mà thực ra cũng đúng. Nếu để ý hình ảnh giải thích về Convolutional layer ở bên trên, bạn sẽ nhận thấy filter bị xoay 180° khi convolution. Đã có khá nhiều người nhầm lẫn lý thuyết  về việc này, nhưng thực tế sử dụng lại không gặp vấn đề gì. 
Đầu tiên, ta nhắc lại công thức của Convolution và người anh em cùng cha khác nội của nó, Cross-correlation
Với input 2-D $H$ và kernel (filter) 2-D $F$ kích thước $k \times k$:
  • Convolution Operator: $G = H \star F$ 
$\LARGE g_{i,j} = \sum\limits_{u}\sum\limits_{v}h_{u,v}f_{i-u,j-v}$
  • Correlation Operator: $G = H \otimes F$
$\LARGE g_{i,j} = \sum\limits_{u}\sum\limits_{v}h_{u,v}f_{i+u,j+v}$

Từ dấu ( $-$ ) và ( $+$ ) trong công thức trên, dễ dàng nhận thấy Convolution tương đương với việc flip kernel (filter) theo cả chiều dọc và ngang (cũng giống như xoay tròn 180°) sau đó thực hiện  Cross-correlation. Nói cách khác, về mặt lý thuyết nếu không "lộn ngược" weights, chúng ta đang áp dụng cross-correlation thay vì convolution.
Tuy nhiên, thực tế nếu ta chọn kernel $F' = ROT180(F)$ và thực hiện Correlation với $F'$ kết quả cũng giống hệt Convolution với $F$. Mặt khác, nếu kernel $F$ đối xứng thì cả hai đều cho cùng một output. Do đó, việc "lộn ngược" weights chỉ có ý nghĩa về mặt biểu thức toán học, và có thể bị bỏ qua trong một vài hướng dẫn.
Còn tiếp.





Comments

Popular posts from this blog

YOLO: You Only Look Once

Giới thiệu về Generative Adversarial Networks (GANs)

Intersection over Union (IoU) cho object detection