I. Giới thiệu
Đây sẽ là một bài giới thiệu sơ lược về các kiến trúc CNN kinh điển nhất bắt đầu từ AlexNet năm 2012, tới những mô hình được cải tiến sau này như VGG, ResNet, Inception, MobileNet, …
Mô hình CNN qua các năm ở các cuộc thi ImageNet Large Scale Visual Recognition Challenge
Nhóm các mô hình này được xây dựng dựa trên các lớp tích chập làm chủ đạo, ban đầu được sử dụng cho các bài toán Phân loại ảnh. Tới năm 2012, sự xuất hiện và thành công của AlexNet đã làm mọi người chú ý tới hướng đi này, lịch sử của nhóm mô hình này chỉ chưa được 10 năm nhưng đã tạo nên một nhánh riêng cho các mô hình máy học - các mô hình Deep learning.
Tuy vậy, khởi nguồn của các mô hình CNN đã có từ năm 1998 với mô hình CNN đầu tiên của Yann LeCun, mô hình tuy không quá nổi bật nhưng đã đặt ra nền tảng cho sự ra đời sau này ở năm 2012.
Tiếp theo mình sẽ đưa ra sơ lược về các mô hình CNN theo thứ tự thời gian, cũng như các cải tiến của những mô hình sau so với mô hình trước, một số các case study chúng ta có thể áp dụng.
Sự phát triển qua các năm và các hướng phát triển chính của mô hình CNN
II. Mô hình đầu tiên - LeNet-5:
Đây là mô hình do Yann LeCun và cộng sự tạo ra cho bộ dữ liệu MNIST cho chữ số viết tay với kích thước 28x28.
Các mô hình trước đây sử dụng các kiến trúc mạng nơ-ron như sử dụng các Multi-layer Peceptron (mạng nơ-ron truyền thẳng) và cuối cùng đưa vào một lớp softmax để phân loại.
Yann LeCun đã cải tiến và sử dụng thêm các lớp CNN với 2 mục tiêu sau:
- Lưu giữ các thông tin về mặt không gian sau những lần tích chập, từ đó học ra các đặc trưng cục bộ - local features.
- Các tham số của các kernel CNN được áp dụng cho toàn bộ ảnh, được gọi là đặc tính Parameter Sharing, với ý nghĩa như đã nêu, từ đó giảm bớt các tham sốnhưng vẫn đảm bảo khả năng học các thông tin từ ảnh.
Mọi người có thể tham khảo code mình tự implement tại đây.
Một số điểm đáng chú ý ở mô hình LeNet-5 lúc này làm nền tảng cho các mô hình sau như:
- Module cơ bản của các lớp CNN là: Một lớp Convolution + một hàm phi tuyến (lúc này LeNet sử dụng hàm sigmoid) + một lớp Pooling (LeNet sử dụng lúc này là một Average Pooling) để học các đặc trưng cục bộ. Bài viết về phép tích chập Convolution được anh Sơn giải thích rất kĩ trong blog này.
- Sau khi trải qua 2 Module cơ bản (CNN + Sigmoid + Pooling), các đặc trưng được làm phẳng (Flatten) và đưa qua các lớp Dense (chính là các lớp MLP) còn gọi là các Fully Connected Layer (FC Layer). Mục tiêu của các FC Layer là tổng hợp các đặc trưng cục bộ và tiến hành học các đặc trưng toàn cục để phân lớp cuối cùng.
Mọi người có thể đọc thêm về paper LeNet-5 tại đây. Có khá nhiều lý giải của tác giả về lý do lựa chọn kiến trúc này. Trong bài báo gốc thực tế tác giả không sử dụng các FC Layer ở cuối, mà sử dụng các kết nối các nơ-ron qua các hàm Gaussian RBF, nhưng ta có thể hiểu nó có tác dụng tương tự các FC Layer với kiến trúc MLP.
Tuy nhiên, dù có kết quả trên bộ MNIST khá tốt, nhưng mô hình CNN đầu tiên này vẫn ít nhận được sự chú ý, và với việc có những hạn chế về kĩ thuật lúc đấy nên LeNet-5 vẫn chưa thể vượt qua được các mô hình Machine Learning truyền thống như Support Vectors Machine.
Các mô hình Computer Vision lúc đấy đa phần được tạo ra từ những hand-crafted feature (đặc trưng thủ công) như SIFT, HOG, … Cách tạo ra các đặc trưng dựa nhiều vào kinh nghiệm của những người làm khoa học, và cách họ phân tích dữ liệu. Về sau, giới khoa học dần tạo ra một bộ dữ liệu cực lớn và tiến hành kiểm định các mô hình qua các năm, đó là lý do năm 2010 cuộc thi ILSVRC được tạo ra với bộ dữ liệu ImageNet cực lớn với 14 triệu ảnh và hơn 20000 lớp để phân loại.
Ngoài ra một nhân tố giúp cho các mô hình CNN cất cánh đó chính là các công cụ tính toán, với sự ra đời của các GPU và Nvidia hỗ trợ đã giúp cho các mô hình tận dụng khả năng tính toán song song mạnh mẽ hơn.
III. AlexNet:
AlexNet là mô hình chiến thắng tại ILSVRC năm 2012, với một khoảng cách độ lỗi giảm rất lớn so với mô hình năm trước từ 25.8 xuống còn 16.4, đó là một kết quả rất khó tin.
Mọi người có thể tham khảo code implement của mình cho mô hình AlexNet tại đây.
Một số cải tiến đáng chú ý so với LeNet-5
Nhìn chung AlexNet sử dụng đúng các nền tảng của LeNet từ năm 1998 với 1 số chỉnh sửa đáng chú ý:
- Sử dụng tới 5 lớp CNN (so với 2 của LeNet).
- Thay thế hàm kích hoạt Sigmoid bằng ReLU, đây là cải tiến đáng chú ý vì hàm sigmoid có độ phức tạp tính toán rất lớn so với hàm ReLU, giúp đẩy nhanh quá trình huấn luyện.
- Sử dụng Max Pooling, Max Pooling được đánh giá hiệu quả hơn trong việc tính toán đạo hàm, cũng như giảm overfiting so với Average Pooling, ngoài ra nó vẫn mang ý nghĩa downsampling, trích rút các thông tin gọn hơn.
Average Pooling
Max Pooling
Ngoài ra AlexNet còn một vài điểm thay đổi khác:
- Tận dụng được sức mạnh tính toán của GPU, tuy với bài báo gốc của AlexNet các thức huấn luyện với 2 GPU khác phức tạp và rối rắm.
- AlexNet có sử dụng 1 số kĩ thuật như Data Augmentation với các phép biến đổi ảnh, sử dụng Dropout nhằm tránh cho mô hình bị overfitting.
- Ngoài ra AlexNet còn dùng một số kĩ thuật khác để chuẩn hóa lại các tín hiệu gọi là Local Response Normalization (LRN), để tăng tốc độ huấn luyện, nhìn chung phương pháp này về sau cũng bị thay thế bởi các phương pháp Normalization khác như BatchNorm hay LayerNorm.
IV. ZFNet:
ZFNet không phải là mô hình vô địch ILSVRC năm 2013, tuy nhiên mô hình vô địch năm đó là Clarifai là một mô hình được phát triển dựa trên ZFNet và cùng chung tác giả với ZFNet.
ZFNet nhìn chung là mô hình kế thừa hoàn toàn lại kiến trúc của AlexNet và đưa ra một số chỉnh sửa. ZFNet còn cung cấp một kĩ thuật gọi là deconvnet nhằm visualize các đặc trưng học được và từ đó đưa ra các nhận xét về AlexNet để cải tiến.
Kĩ thuật deconvnet cho việc visualization
Ta biết rằng các module cơ bản của CNN từ mô hình AlexNet là: Convolution Layer + ReLU + Max Pooling. Kĩ thuật deconvnet sẽ đảo ngược các lớp và thứ tự tính toán đó, sau đó tiến hành và đưa các kết quả lên tương ứng với các pixel, từ đó ta có thể quan sát các giá trị học được và tương tác với vùng điểm ảnh đó.
Các lớp nghịch đảo sau tuy không lấy lại đúng các giá trị chính xác tham số học, nhưng cũng cho ta đánh giá phần nào về kết quả huấn luyện.
1. UnPooling: Đưa ra các kết quả đảo ngược từ các lớp Max Pooling
2. Rectification. Hàm kích hoạt là ReLU sẽ giữ các tín hiệu với giá trị dương và các giá trị âm được đưa về 0, với lớp Rectification này chúng ta chỉ có thể tiếp tục áp dụng ReLU 1 lần nữa để lấy các giá trị dương.
3. Deconvolution: Đây là phép tính nghịch đảo với Convolution và được áp dụng để lấy lại các kết quả trước khi Convolution.
Visualization một số lớp CNN từ AlexNet
Với lớp CNN thứ 1 và 2, tác giả ZFNet đưa ra các kết luận là ở 2 lớp này mô hình học được các đặc trưng cấp thấp. Tuy nhiên ở lớp 2 đang gặp vấn đề là Aliasing Problem, là một vấn đề trong xử lý tín hiệu số khi mà các tần số bị lẫn vào nhau, khó phân biệt được.
Lớp thứ 1, 2 của AlexNet khi visualize
Lớp CNN thứ 1 chỉ chứa các tần số cao và thấp, hoàn toàn thiếu đi tần số trung bình. Lớp CNN thứ 2 bị hiện tượng Aliasing, tác giả đưa ra lý do vì lớp CNN trước sử dụng stride 4 và các tín hiệu bị thưa đi, không còn rõ ràng.
Ở lớp CNN thứ 3, các tham số dần học được các pattern như dạng lưới, dạng chữ, biên cạnh.
Lớp 3 của AlexNet
Ở lớp CNN thứ 4, 5 ta thấy các tham số hình thành đã học được các đặc trưng phức tạp như khuôn mặt chó mèo, hình dáng của các vật thể trong hình ảnh, …
Cải tiến so với AlexNet
Từ các visualization từ mô hình AlexNet, tác giả của ZFNet đã đưa ra các cải tiến dựa trên việc chỉnh sửa 1 số hyperparameter như sau:
1. Giảm kernel size của lớp CNN đầu tiên từ 11x11 thành 7x7. Hình b chính là kết quả cải thiện của ZFNet, ta thấy được các đặc trưng học đã gồm nhiều tín hiệu tần số trung bình, ít các tín hiệu tần số cao hoặc thấp đi.
2. Chỉnh sửa stride của lớp CNN đầu tiên từ 4 thành 2, nhìn chung ta thấy các đặc trưng tín hiệu học được đã mượt hơn, dễ tách biệt hơn.
Mô hình tổng quát và kết quả thực nghiệm
Từ 2 chỉnh sửa nhỏ ở lớp đầu tiên (cũng như 1 số lớp khác), ZFNet đã vượt qua AlexNet. Đạt mức lỗi 16% trên tập validation top-5.
V. VGG:
Sau những thành công của AlexNet và sau đó là ZFNet, giới nghiên cứu bị thuyết phục bởi những kết quả ấn tượng từ CNN. Tuy nhiên các mô hình nhìn chung được chỉnh sửa mang nhiều công đoạn code phức tạp, chưa có một mẫu chung để lựa chọn các tham số cho các lớp như kernel size, stride, padding, …
VGG ra đời và đã tạo nên một kiểu mẫu tạo ra mô hình mà chúng ta đều có thể áp dụng được dễ dàng và tạo ra các mô hình large scale với hàng triệu tham số.
Cách chọn kernel size, filter, stride, padding cho Convolution
Thay vì sử dụng một kernel size lớn, VGG chỉ sử dụng các kernel size 3x3 cho tất cả lớp Convolution, với stride 1 và padding 1. Khi đưa qua các lớp convolution này, kích thước ảnh WxH không thay đổi.
Ý tưởng cơ bản của tác giả VGG đưa ra đó là việc sử dụng 3 lớp convolution 3x3 hiệu quả hơn so với sử dụng 1 lớp convolution 7x7 của ZFNet.
Đầu tiên về mặt đặc trưng, 3 lớp 3x3 với các channel lớn sẽ tối đa hóa sự đa dạng các đặc trưng học được hơn vì ta sử dụng tới 3 lần biến đổi phi tuyến. Thứ hai, về số lượng tham số kernel, 1 lớp convolution 7x7 có số tham số 1 × (7 × 7) × C = 49C, với C là số lượng filter của convolution, đối với 3 lớp convolution 3x3 ta chỉ có 3 × ( 3 × 3 ) × C = 27C, ít hơn hẳn nhưng vẫn giữ nguyên vùng nhận thức.
Max Pooling
VGG sử dụng các lớp Convolution để học đặc trưng, và các lớp Max Pooling để downsampling, các lớp Max Pooling có kernel size 2, stride 2. Khi đưa qua lớp Max Pooling này, kích thước của ảnh sẽ giảm đi 1/2.
Scale up các đặc trưng
Đây là mô hình đầu tiên sử dụng các lớp Convolution liên tiếp nhau trước khi sử dụng Max Pooling, VGG dùng số lượng filter của các lớp Convolution lũy thừa của 2 như 64, 128, 256, 512. Mô hình VGG nhìn chung là một mô hình có số lượng tham số cực lớn với hơn 128 triệu tham số, không gian lưu trữ của mô hình ước tính khoảng trên 600Mb.
Kiến trúc tổng quan
Từ đây ta thuộc nằm lòng mẫu thiết kế của VGG vì chúng lặp lại nhau, khi đi vào các lớp sâu hơn, kích thước channel sẽ tăng theo lũy thừa 2, và kích thước ảnh sẽ được giảm đi một nửa dần dần.
Mọi người có thể tham khảo code implement các cấu hình của mô hình VGG tại đây.
Kết quả thực nghiệm
Sau những thành công của AlexNet và sau đó là ZFNet, giới nghiên cứu bị thuyết phục bởi những kết quả ấn tượng từ CNN. Tuy nhiên các mô hình nhìn chung được chỉnh sửa mang nhiều công đoạn code phức tạp, chưa có một mẫu chung để lựa chọn các tham số cho các lớp như kernel size, stride, padding, …
Mô hình VGG vượt qua kết quả mô hình Clarifai trước đây với top-5 error giảm một nửa và ngang ngửa với mô hình cùng thời điểm đó là GoogleLeNet (sẽ được giới thiệu sau).
Tổng kết cho phần 1
Sau phần 1, chúng ta đã biết qua các mô hình CNN đầu tiên với các nhận xét sau:
- Các mô hình CNN với việc gia tăng các lớp Convolution và kích thước mô hình nhìn chung đã thể hiện sức mạnh trong việc học các đặc trưng và thể hiện kết quả đáng kinh ngạc. Với mô hình VGG đã là một mô hình large scale với số lượng tham số cực khủng.
- Một số case study chúng ta có thể áp dụng:
- Module cơ bản cho các mô hình CNN: Convolution + ReLU + Max Pooling
- Sử dụng các phương pháp để giảm overfiting như Dropout, Data Augmentation.
- Luôn thiết kế sao cho kích thước đầu vào của feature map giảm dần, kích thước số channel tăng dần.
- Các đặc trưng ở những lớp ban đầu là những đặc trưng cấp thấp, càng về sau mô hình học được nhiều đặc trưng cấp cao hơn.
Bây giờ, người ta chủ yếu chỉ còn sử dụng VGG cho 1 số task như Face Recognition, tuy nhiên vẫn còn hạn chế do kích thước mô hình rất lớn. Các mô hình còn lại như AlexNet, ZFNet không còn được sử dụng làm backbone nữa.