[ML – 21] Convolution Neural Network : LeNet-5
Trong phần cuối bài trước, tôi đã giới thiệu tới các bạn một số kiến trúc CNN đã đạt được kết quả khả quan, hôm nay chúng ta sẽ tìm hiểu cụ thể xem một trong số chúng, LeNet-5 như thế nào!
Origin Paper:
Đây là mô hình được phát triển bởi Yann LeCunn (Director of AI Research Facebook) cùng với Léon Bottou, Yoshua Bengio (đồng tác giả với Ian Goodfellow của cuốn “Deep Learning”) và Patrick Haffner.
Input 32x32:
Đầu vào của mô hình là ảnh với kích thước 32x32x1, nghĩa là chiều dài ảnh = 32 pixel, chiều rộng ảnh = 32 pixel và số lượng kênh ảnh là 1 (ảnh đen trắng).
C1: feature maps 6@28x28:
C1 trong đó C có nghĩa là layer convolution, 1 nghĩa là layer thứ nhất. Output của layer này là tensor 28x28x6. Để có được output này, ảnh 32x32x1 ban đầu sẽ đi qua 6 filter 5x5x1 , tốc độ stride = 1 (6 * 5 * 5 * 1 = 150 weights và 1 * 6 = 6 bias, layer này có 156 param có thể train được). Hàm activation ở đây là Sigmoid Input ban đầu thực hiện convolution với mỗi filter sẽ cho ra 1 feature map với kích thước 28x28. -> Với 6 filter ta có 6 feature map. Số connect: = 28 * 28 * (5 * 5 + 1) * 6 = 122304 Giải thích: Vì layer convolution này không sử dụng padding nên sẽ chỉ có 28x28 lần thực hiện tích chập, và mỗi tích chập sử dụng (5 * 5) * 6 + 1 * 6 = (5 * 5 + 1) * 6 connection.
S2: f.maps 6@14x14:
S2 trong đó S có nghĩa là Subsampling hay layer pooling. Không như “Max Pooling”, layer này có 2 trainable param cho mỗi feature map. Số lượng feature map là 6 nên số lượng trainable param là 6 * 2 = 12. Ở C1, ta có 6 feature map. Mỗi phần tử trong 1 feature map của S2 là kết quả pooling trên 1 “window” 2x2 của C1. Công thức tính các unit (phần tử) đó như sau:
\(x_1\) | \( x_2 \) |
---|---|
\(x_3\) | \( x_4 \) |
=> \( unit = (x_1 + x_2 + x_3 + x_4) * weight + bias \)
Nếu trong trường hợp pooling là Max Pool thì công thức là \( unit = max(x_1, x_2, x_3, x_4) \). Còn trong kiến trúc này tác giả sử dụng “Average Pool” với 2 tham số weight và bias có thể train. Tương tự với cách tính ở C1 ta có số lượng connection: 14 * 14 * (2 * 2 + 1) * 6 = 5880
C3: f.maps 16@10x10:
Cũng như C1, C3 cũng là một convolution layer với output là tensor 10x10x16 tức là được thực hiện tích chập với 16 filter 5x5. Điểm đặc biệt ở layer này là nó không sử dụng tất cả các filter cho input (output của S2) mà sử dụng theo một cách đặc biệt:
C3 có output là tensor 10x10x16 hay có thể coi là 16 matrix (feature map) 10x10. Trong đó sự cấu thành của các matrix hay feature map này được mô tả ở hình trên. Cụ thể:
- Feature map 0 được tạo bởi 3 feature map 0,1,2 của S2 (14x14) với filter thứ 0 (3 feature map 0,1,2 tạo thành tensor 14x14x3 được tính tích chập 2d với filter thứ 0 có kích thước 5x5x3).
Số lượng param = 5 * 5 * 3 + 1 = 76 (+1 là tham số bias)
Số lượng connect = 10 * 10 * (5 * 5 * 3 + 1) = 7600 (Tương tự như cách tính connection ở trên) - Feature map 1 được tạo bởi 3 feature map 1,2,3 của S2 với filter thứ 1.
Số lượng param = 5 * 5 * 3 + 1 = 76
Số lượng connect = 10 * 10 * (5 * 5 * 3 + 1) = 7600 - Feature map 2 được tạo bởi 3 feature map 2,3,4 của S2 với filter thứ 2.
Số lượng param = 5 * 5 * 3 + 1 = 76
Số lượng connect = 10 * 10 * (5 * 5 * 3 + 1) = 7600 - Feature map 3 được tạo bởi 3 feature map 3,4,5 của S2 với filter thứ 3.
Số lượng param = 5 * 5 * 3 + 1 = 76
Số lượng connect = 10 * 10 * (5 * 5 * 3 + 1) = 7600 - Feature map 4 được tạo bởi 3 feature map 4,5,0 của S2 với filter thứ 4.
Số lượng param = 5 * 5 * 3 + 1 = 76
Số lượng connect = 10 * 10 * (5 * 5 * 3 + 1) = 7600 - Feature map 5 được tạo bởi 3 feature map 5,0,1 của S2 với filter thứ 5.
Số lượng param = 5 * 5 * 3 + 1 = 76
Số lượng connect = 10 * 10 * (5 * 5 * 3 + 1) = 7600 - Feature map 6 được tạo bởi 4 feature map 0,1,2,3 của S2 với filter thứ 6. (4 feature map 0,1,2,3 tạo thành tensor 14x14x4 được tính tích chập 2d với filter thứ 6 có kích thước 5x5x4)
Số lượng param = 5 * 5 * 4 + 1 = 101
Số lượng connect = 10 * 10 * (5 * 5 * 4 + 1) = 10100 - Feature map 7 được tạo bởi 4 feature map 1,2,3,4 của S2 với filter thứ 7.
Số lượng param = 5 * 5 * 4 + 1 = 101
Số lượng connect = 10 * 10 * (5 * 5 * 4 + 1) = 10100 - Feature map 8 được tạo bởi 4 feature map 2,3,4,5 của S2 với filter thứ 8.
Số lượng param = 5 * 5 * 4 + 1 = 101
Số lượng connect = 10 * 10 * (5 * 5 * 4 + 1) = 10100 - Feature map 9 được tạo bởi 4 feature map 3,4,5,0 của S2 với filter thứ 9.
Số lượng param = 5 * 5 * 4 + 1 = 101
Số lượng connect = 10 * 10 * (5 * 5 * 4 + 1) = 10100 - Feature map 10 được tạo bởi 4 feature map 4,5,0,1 của S2 với filter thứ 10.
Số lượng param = 5 * 5 * 4 + 1 = 101
Số lượng connect = 10 * 10 * (5 * 5 * 4 + 1) = 10100 - Feature map 11 được tạo bởi 4 feature map 5,0,1,2 của S2 với filter thứ 11.
Số lượng param = 5 * 5 * 4 + 1 = 101
Số lượng connect = 10 * 10 * (5 * 5 * 4 + 1) = 10100 - Feature map 12 được tạo bởi 4 feature map 0,1,3,4 của S2 với filter thứ 12.
Số lượng param = 5 * 5 * 4 + 1 = 101
Số lượng connect = 10 * 10 * (5 * 5 * 4 + 1) = 10100 - Feature map 13 được tạo bởi 4 feature map 1,2,4,5 của S2 với filter thứ 13.
Số lượng param = 5 * 5 * 4 + 1 = 101
Số lượng connect = 10 * 10 * (5 * 5 * 4 + 1) = 10100 - Feature map 14 được tạo bởi 4 feature map 0,2,3,5 của S2 với filter thứ 14.
Số lượng param = 5 * 5 * 4 + 1 = 101
Số lượng connect = 10 * 10 * (5 * 5 * 4 + 1) = 10100 - Feature map 15 được tạo bởi 6 feature map 0,1,2,3,4,5 của S2 với filter thứ 15. (6 feature map tạo thành tensor 14x14x6 được tính tích chập 2d với filter thứ 15 có kích thước 5x5x6)
Số lượng param = 5 * 5 * 6 + 1 = 151
Số lượng connect = 10 * 10 * (5 * 5 * 6 + 1) = 15100
Tổng số lượng tham số giữa S2 và C3 là : 76 * 6 + 101 * 9 + 151 = 1516
Tổng số lượng connect giữa S2 và C3 là : 7600 * 6 + 10100 * 9 + 15100 = 151600
S4: f.maps 16@5x5:
Tương tự S2 ta có S4 là layer average pooling với output là tensor 5x5x16 với:
- 16 * 2 = 32 trainable param
- Số lượng connection = 5 * 5 * (2 * 2 + 1) * 16 = 2000
C5: layer 120:
C5 là convolution layer với 120 feature map có kích thước 1x1, để có được output như vậy S4 cần thực hiện tích chập với 120 filter có kích thước 5x5x16. Nên
- Số lượng tham số và connection đều là: 120 * (5 * 5 * 16 + 1) = 48120
F6: layer 84:
F6 là Fully-connected layer, với mỗi unit đều được connect với tất cả 120 unit của C5.
- Số lượng tham số và connection đều là: 84 * (120 + 1) = 10164
Output 10:
Output layer có 10 unit, mỗi unit đại diện cho 1 hàm RBF (Euclidean Radial Basis Function) RBF được tính như sau: \[ y _{i} = \sum _{j} (x _{j} - w _{ij}) ^{2} \]
Một cách trực quan các bạn có thể tưởng tượng rằng mỗi unit được tính dựa trên các weight \( w _{ij} \), đây chính là toạ độ các kernel, \( y_i \) chính là bình phương khoảng cách giữa toạ độ output của layer F6 với kernel thứ \(i\). Vector output của layer F6 gần với kernel nào hơn thì nó thuộc label đó. Các bạn hoàn toàn có thể thay đổi layer này bằng Softmax.
Trên đây là cấu trúc của một mạng LeNet-5. Nếu như các bạn muốn tìm hiểu kĩ hơn về loss function cũng như các ưu nhược điểm và quá trình thử nghiệm của tác giả thì không gì tốt hơn là đọc paper này :) Hẹn gặp lại các bạn trong bài viết tiếp theo!