Thứ Sáu, 23 tháng 11, 2018

Tìm hiểu về Convolutional Neural Network (CNN)

Chúng ta đã được tìm hiểu về mạng neural nhân tạo trong bài này. Nếu như đầu vào của chúng ta là 1 bức hình 30*30*3 pixel, thì lớp input của neural network sẽ là 30*30*3 neural. Số lượng neural này vẫn tạm chấp nhận được cho quá trình training vì chi phí tính toán cũng chưa phải là lớn lắm. Nhưng nếu đầu vào của chúng ta là bức hình 1000*1000*3, thì số lượng neural lúc này cực kì lớn và quá trình tính toán sẽ chậm đi rất nhiều, đồng thời mạng phức tạp sẽ dễ dẫn đến overfitting.
Mặt khác, với đối tượng đầu vào là bức hình, thì các pixel gần nhau hợp lại sẽ mang những thông tin hữu ích, nhưng neural network thì không khai thác được đặc điểm này. Do đó, có một mạng neural mới, được người ta nghiên cứu sáng tạo ra: đó là convolutional neural network (CNN). Vậy CNN khác với ANN như thế nào? Hiểu một cách nôm na thì CNN không đọc từng pixel riêng lẻ như ANN, mà nó sẽ đọc 1 loạt các pixel gần nhau để đưa vào tính toán. Nhưng để hiểu rõ hơn về cách hoạt động của CNN, chúng ta phải đi vào tìm hiểu từng thành phần cấu tạo nên mạng CNN mới rõ đc. Ở đây chúng ta sẽ tìm hiểu các khái niệm mới như Convolutional Layer, Pooling Layer.

Convolutional Layer:

Convolutional Layer là 1 lớp cực kì quan trọng trong CNN, nó đảm nhận hầu hết chức năng tính toán của mạng.
vi du mang cnn
Để giải thích về Convolutional Layer, mình sẽ đi thẳng trực tiếp vào ví dụ để giải thích cho trực quan.
Đầu tiên là khái niệm filter map: thay vì kết nối với từng pixel của hình ảnh đầu vào như ANN, CNN có những tấm filter dùng để áp vào những vùng của bức hình. Các filter map này thực chất là một ma trận 3 chiều gồm các con số. Và điều bạn cần phải cực kì lưu ý là các con số này chính là các parameter cần phải học. Filter map có kích thước dài và rộng là hyperparameter ( hyperparameter là gì thì mình có nói trong bài này) , riêng chiều cao ( mình sẽ gọi là depth - chiều sâu ) của filter map sẽ bằng với depth của lớp trước.
Ví dụ nhìn vào hình ví dụ ở trên, chúng ta có 2 filter map màu hồng là W0 và W1. Mỗi filter map có kích thước 3*3*3. Kích thước dài * rộng ( 3*3 ) là hyperparameter, còn chiều sâu (Depth) sẽ bằng với depth của input volumn, tức là bằng 3.
Stride: như đã nói ở trên, filter map được dùng để trượt lên tấm hình đầu vào, vậy trượt ở đây có nghĩa là như thế nào? Rất đơn giản, chỉ cần dịch filter map theo pixel từ trái sang phải theo từng dòng. Mỗi lần dịch như thế sẽ dựa vào 1 giá trị gọi là stride.
Ví dụ, stride = 1, thì mỗi lần dịch filter map sẽ sang phải 1 pixel, khi hết cạnh biên phải thì xuống 1 dòng và dịch tiếp. Còn nếu stride = 2 thì mỗi lần dịch sẽ sang phải 2 pixel, khi hết cạnh thì xuống 2 dòng.  
Padding: người ta sẽ thêm những giá trị 0 bao quanh lớp input. Ví dụ như ở trên hình, lớp input của chúng ta ban đầu có kích thước 5*5*3, nhưng vì giá trị padding = 1, nên được bao thêm 1 lớp 0 bên ngoài. Từ đó, kích thước của lớp input = 7*7*3.
Feature map: feature map thực chất là kết quả sau khi lớp input được filter map quét qua hết. Với mỗi lần filter map áp lên input, sẽ có quá trình tính toán xảy ra. Vậy quá trình tính toán này là gì? Thực chất đó là quá trình nhân 2 ma trận.
Ví dụ như trên hình, khi lớp trên cùng của filter map W0 áp vào lớp trên cùng của input volum, ma trận filtermap w0 3*3 sẽ được nhân với ma trận 3*3 của input sau đó cộng thêm bias=1, và đưa ra kết quả = 2 ở feature map. Kích thước feature map được tính như nào? Mỗi lần 1 filter map trượt hết lên input volum sẽ cho ra 1 lớp của feature map. Vậy nên, depth của feature map sẽ bằng số lượng filter map.
Ví dụ như hình trên, depth của feature map = số lượng filter map = 2. Còn chiều dài và chiều rộng của feature map sẽ được tính bằng công thức: (W + 2P - F)/S +1 . Trong đó, W là kích thước input, P là padding, F là kích thước filter map, S là stride.
Ví dụ với hình, W = 5, P =1, F = 3, S =1 , ta tính được kích thước của feature map là 3.
Ta có thể thấy được, nếu với ANN thông thường, 1 bức hình 7*7*3 như trên sẽ cần có 7*7*3 = 147 parameters (nếu lớp thứ 2 chỉ có 1 neural), nhưng với CNN lại cần ít hơn số parameter từ filter map và số lượng parameter này có thể được chúng ta định lượng.

Pooling layer

Thường giữa các lớp Convolutional Layer với nhau người ta sẽ chèn vào 1 lớp Pooling layer để giảm bớt số lượng parameter lại nếu như đầu vào quá lớn. Có nhiều loại pooling layer, nhưng mình chỉ giới thiệu max pooling.
  vi du mang pooling
 Ví dụ ở trên, lớp max pooling có kích thước là 2*2, stride = 2. Với mỗi lần áp lên input, nó sẽ lấy giá trị lớn nhất trong khoảng filter đó và để nó vào output.

ReLU layer

Khái niệm về ReLU mình đã nói trong bài này rồi, các bạn quay lại để xem nhá. Thường thì sau khi feature map được tính ra, người ta sẽ xếp theo sau đó 1 lớp ReLU, lớp này sẽ áp dụng hàm ReLU lên tất cả các giá trị của feature map.

Fully Connected Layer

Để đưa ra được kết quả dự đoán thì lớp Neural network sẽ được thêm vào sau một mang CNN. Lớp neural này cũng chỉ là ANN bình thường thôi chứ ko khác gì cả. Vậy một mạng CNN thông thường sẽ có cấu trúc các lớp như thế nào? Sau đây là ví dụ:
INPUT -> [[CONV -> RELU]*N -> POOL?]*M -> [FC -> RELU]*K -> FC
Share:

11 nhận xét:

  1. Cảm ơn bài viết khá chi tiết của anh, chúc anh sức khỏe và thành công!

    Trả lờiXóa
  2. bài viết rất hay, mình đã nắm được cơ bản về Convolutional Network. Hi vọng bạn sẽ tiếp tục viết nhiều bài như thế này nữa để giúp đỡ nhiều bạn sinh viên khác! Chúc bạn sức khoẻ và thành công

    Trả lờiXóa
    Trả lời
    1. Cám ơn bạn nhé. Chúc bạn thành công và nhiều sức khoẻ

      Xóa
  3. bạn ơi sao hình của bạn với ví dụ nó không trùng khớp vậy. Ví dụ như hình trên filter map =3 mà kết quả feature map = 2 là sao nhỉ

    Trả lờiXóa
    Trả lời
    1. À, ở trên hình số lượng filter map = 2 nhé ( gồm W0 và W1 ). Và mỗi filter map đó lại có độ sâu depth = 3. Chắc bạn bị nhầm chút xíu ở depth của filter map và số lượng filter map rồi ấy

      Xóa
  4. mình trích một đoạn trong bài viết của bạn.
    "Kích thước feature map được tính như nào? Mỗi lần 1 filter map trượt hết lên input volum sẽ cho ra 1 lớp của feature map. Vậy nên, depth của feature map sẽ bằng số lượng filter map."
    mình muốn hỏi là : tại sao sau mỗi lớp convolution thì thì lại cần nhiều kernel thế, thậm trí số kernel tăng lên rất nhanh?
    câu 2 là: Hệ số của convolutional layer là gì?

    Trả lờiXóa
    Trả lời
    1. hiện tại thì kiến thức của mình chưa đủ để trả lời câu hỏi của bạn. Nên bạn chờ mình một thời gian cho việc research nhé.

      Xóa
    2. sau khi hỏi bạn bè và dành một khoảng thời gian để research, mình xin giải đáp câu hỏi của bạn.
      câu 1: Kernel càng nhiều thì depth của feature map càng lớn. Mỗi feature map được xem như là 1 characteristic của bức ảnh. Tức là càng nhiều kernel thì sẽ càng thể hiện được nhiều thông tin của 1 đối tượng đầu vào.
      Câu 2: mình vẫn chưa hiểu hệ số convolutional layer là gì. Nếu ý bạn hệ số là weights, thì trong cnn, weights chính là các con số trên kernel.

      Xóa
  5. còn viết bài nữa không tác giả ơi. Bạn viết rất dễ hiểu

    Trả lờiXóa
    Trả lời
    1. cái series image classification này mình hoàn thành rồi nên sẽ không có bài mới ạ. Nếu có thì chắc sẽ là một series khác thôi bạn nha. ^^ cám ơn bạn đã ghé thăm blog của mình nha

      Xóa

Được tạo bởi Blogger.