Inception modules


    Nếu bạn là một người thường xuyên cập nhật các công nghệ AI, chắc hẳn bạn đã biết rằng Google vừa công bố một mô hình với tên gọi Inception v3 với Tensorflow.
Hình 1. Mô hình Inception v3 (image source)
    Bạn có thể sử dụng mô hình này bằng cách train lại những layer cuối tùy thuộc vào yêu cầu bài toán phân loại của bạn. Nếu bạn thực sự hứng thú với việc này, hãy xem bài hướng dẫn rất thú vị sau của Siraj Raval. Tên gọi Inception v3 trùng với tên module Inception mà nó sử dụng, với những mô hình nhỏ hơn bên trong mô hình lớn hơn. Một cấu trúc Inception giống với nó được sử dụng trong mô hình GoogleLeNet năm 2014:

Hình 2. Kiến trúc GoogleLeNet với 9 module Inception (image source)
    Trong bài viết này, chúng ta sẽ bàn luận kỹ hơn về Inception modules, giải thích chi tiết hơn theo như bài báo gốc: "Going Deeper with Convolutions". Bài viết này đòi hỏi bạn phải có nền tảng hiểu biết cơ bản về mạng neural tích chập. Nếu không, chúng tôi khuyến khích bạn hãy đọc kỹ chương 9 của cuốn sách Deep Learning trước khi quay lại bài viết này.

Inception modules là gì ?

    Như một điều hiển nhiên khi nghiên cứu khoa học, nếu chúng ta hiểu được bản chất vấn đề, chúng ta sẽ dễ dàng biết được cách thức mà nó hoạt động. 
Hình 3. Ý tưởng của tên Inception ra đời từ meme này.
    Khóa học Deep Learning của Udacity đã có một bài giới thiệu rất hay về bài toán cũng như là những ưu điểm chính của kiến trúc Inception mà tôi sẽ trình bày lại trong bài viết này. Ý tưởng xuất phát từ việc bạn phải quyết định xem kích cỡ của cửa sổ trượt trong mỗi lớp tích chập trong mô hình mạng neural của bạn là bao nhiêu ? Bạn muốn cửa sổ trượt có kích cỡ 3x3, hay 5x5 ?. 
Hình 4. Video giải thích cơ chế đằng sau Inception của Udacity (image source).
    Vậy tại sao ta không sử dụng tất cả các cửa sổ trượt đó và để mô hình tự chọn ?. Ta thực hiện việc đó bằng cách tính tích chập với các kích thước của cửa sổ trượt khác nhau và nối các feature map lại trước khi đưa vào layer tiếp theo. 
Bây giờ, giả sử layer tiếp theo cũng là một Inception, mỗi feature map của layer Inception trước sẽ được truyền qua một hỗn hợp tích chập của layer hiện tại. Thú vị ở chỗ là bạn không cần quan tâm về thứ tự thực hiện nhân tích chập của các cửa sổ trượt, ví dụ 3x3 sau đó 5x5. Thay vào đó, cứ tính tích chập toàn bộ và để mô hình tự chọn những thuộc tính tốt nhất. Thêm nữa, kiến trúc này sẽ cho phép mô hình trích xuất được những thuộc tính khu vực dựa vào những cửa sổ trượt nhỏ và những thuộc tính trừu tượng lớn dựa vào tích chập với những cửa sổ trượt lớn hơn.

Kiến trúc Inception

    Chúng ta đã có những ý tưởng cơ bản, bây giờ hãy cùng xem xét chi tiết hơn về kiến trúc đặc biệt này. Hình dưới đây biểu diễn kiến trúc cơ bản của một module Inception đơn:
Hình 5. Kiến trúc Inception module (image source)
    Lưu ý rằng chúng ta sử dụng đa dạng các cửa sổ trượt tích chập, đặc biệt là, ta sẽ sử dụng 1x1, 3x3, và 5x5 convolutions bên cạnh 3x3 max pooling. Nếu bạn tự hỏi tại sao lớp max pooling lại xuất hiện bên cạnh các lớp tích chập khác, câu trả lời khá đơn giản, dựa vào lịch sử và thực nghiệm, các mô hình tốt đều có pooling. Các lớp tích chập lớn hơn đòi hỏi chi phí tính toán nhiều, do đó bài báo đưa ra giải pháp đầu tiên thực hiện tích chập 1x1 để giảm kích thước của các feature map, sau đó truyền các feature map qua hàm relu, sau đó tiếp tục tính tích chập lớn hơn (5x5 hoặc 3x3). Lớp tích chập 1x1 được sử dụng để giảm kích thước của các feature map sẽ được giải thích chi tiết hơn trong tiếp theo.

Giảm kích thước

    Đây là một trong những phần thú vị nhất trong bài báo. Tác giả chỉ ra rằng ta có thể sử dụng tích chập 1x1 để giảm kích thước của đầu vào cho lớp tích chập lớn hơn, làm cho khối lượng tính toán được giảm thiểu. Để hiểu rõ hơn về vấn đề này, trước tiên ta cùng xem xét vấn đề về khối lượng tính toán khi không có sự giảm kích thước đầu vào.
Giả sử chúng ta sử dụng mô hình (theo như tên gọi của tác giả) Inception ngây thơ:
Hình 6. Mô hình Inception ngây thơ (image source)
    Hình 6 biểu diễn một Inception module giống với kiến trúc ở hình 5, chỉ khác ở chỗ không sử dụng lớp tích chập 1x1 trước các lớp tích chập lớn hơn (3x3 và 5x5 được xem xét là lớn hơn).
Ta hãy cùng xem xét số lượng tính toán cần thiết cho Inception module đầu tiên trong mạng GoogleLeNet. Kiến trúc của mô hình được mô tả ngắn gọn trong bảng sau:
Hình 7. Kiến trúc mô hình GoogleLeNet với kích thước của các layer trước và Inception module mà ta quan tâm được đánh dầu lần lượt bằng màu xanh và đỏ.

  
    Ta có thể nhận thấy rằng mạng sử dụng padding như nhau cho các lớp tích chập trong mô hình, bởi vì input và output đều có kích thước 28x28. Ta cùng xem xét chi phí tính toán lớp tích chập 5x5 khi không có sự giảm chiều của input. Hình 8 dưới đây mô tả sự tính toán.
Hình 8. Tích chập 5x5 bên trong Inception module trong mô hình Inception ngây thơ.
Số lượng tính toán là: 
    Rõ ràng đây là một con số khá lớn. Do đó người ta phải tìm cách giảm con số này xuống. Để làm được điều đó, chúng ta bỏ qua mô hình ngây thơ trong hình 6 và xem xét mô hình cải tiến trong hình 5. Với lớp tích chập 5x5, trước tiên ta truyền đầu vào qua lớp tích chập 1x1 để cho ra 16 lớp feature map 28x28 (ta lấy con số 16 ở cột #5x5 reduce trong hình 7), sau đó ta tính tích chập 5x5 trên các feature map này, kết quả cho ta 32 feature maps kích thước 28x28.
Hình 9. Tích chập 1x1 đóng vai trò như một bộ giảm kích thước của các feature maps trước khi truyền vào lớp tích chập 5x5 tiếp theo.
 Trong trường hợp này, số lượng tính toán sẽ là:

    Mặc dù đây vẫn là một con số lớn, nhưng chúng ta đã giảm được số lượng phép tính xuống tới 10 lần so với mô hình Inception ngây thơ ban đầu. Tương tự với trường hợp tích chập 3x3, ta sẽ không xem xét kỹ lưỡng ở đây. Hy vọng rằng, bạn đọc đã có thể hiểu được tại sao lớp tích chập 1x1 lại đặc biệt cần thiết trước lớp tích chập lớn hơn.

Lời kết

    Qua bài viết ngắn gọn này, bạn đọc đã có những hình dung chi tiết hơn về mô hình Inception, hiểu rõ hơn về cơ chế áp dụng lớp tích chập 1x1 để giảm kích thước đầu vào trước mỗi lớp tích chập lớn hơn, qua đó giảm thiểu số lượng tính toán. Với sự phát triển mạnh mẽ của trí tuệ nhân tạo nói chung và lĩnh vực thị giác máy nói riêng, ngày nay các nhà nghiên cứu đã công bố rất nhiều mô hình deep learning khác nhau, phục vụ giải quyết khá nhiều bài toán xử lý ảnh và thị giác máy, dựa trên nền tảng cơ bản là mạng neural tích chập. Ta sẽ cùng nhau bàn luận về các mô hình này trong các bài viết tiếp theo. 

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