Thuật toán CNN là gì? Cấu trúc mạng Convolutional Neural Network

CNN (Convolutional Neural Network) là gì?

CNN (Convolutional Neural Network) là một trong những mô hình Deep Learning tiên tiến. Với sự phát triển của CNN, chúng ta có thể xây dựng những hệ thống thông minh với độ chính xác cao như hiện nay.

Như hệ thống xử lý ảnh lớn như Facebook, Google hay Amazon đã áp dụng CNN vào sản phẩm của mình, như nhận diện khuôn mặt người dùng, phát triển xe tự lái và drone giao hàng tự động.

CNN được sử dụng rộng rãi trong các bài toán nhận dạng các đối tượng trong ảnh. Để hiểu tại sao thuật toán này được ưa chuộng cho việc nhận dạng, chúng ta hãy tìm hiểu về cấu trúc mạng CNN.

Tìm hiểu Convolutional là gì?

Convolutional là một cửa sổ trượt (Sliding Windows) trên một ma trận như mô tả hình dưới:

Tìm hiểu Convolutional là gì?

Các convolutional layer sử dụng các parameter (kernel) đã được học để lấy ra những thông tin chính xác nhất mà không cần chọn các feature.

Trong hình ảnh ví dụ trên, ma trận bên trái là một hình ảnh trắng đen được số hóa. Ma trận có kích thước 5×5 và mỗi điểm ảnh có giá trị 1 hoặc 0 là giao điểm của dòng và cột.

Convolution hay tích chập là nhân từng phần tử trong ma trận 3×3 để tạo ra một ma trận gọi là Convoled feature. Convoled feature này được sinh ra từ việc nhân ma trận Filter với ma trận ảnh 5×5 bên trái.

Tìm hiểu Convolutional là gì?
Tìm hiểu Convolutional là gì?

Cấu trúc mạng CNN

Mạng CNN là một tập hợp các lớp Convolution chồng lên nhau và sử dụng các hàm nonlinear activation như ReLU và tanh để kích hoạt các trọng số trong các node. Mỗi lớp sau khi thông qua các hàm kích hoạt sẽ tạo ra các thông tin trừu tượng hơn cho các lớp tiếp theo.

Mỗi lớp sau khi thông qua các hàm kích hoạt sẽ tạo ra các thông tin trừu tượng hơn cho các lớp tiếp theo. Trong mô hình mạng truyền ngược (feedforward neural network), mỗi neuron đầu vào cho mỗi neuron đầu ra trong các lớp tiếp theo.

Mô hình CNNs thì ngược lại. Các layer liên kết được với nhau thông qua cơ chế convolution.

Layer tiếp theo là kết quả convolution từ layer trước đó, nhờ vậy mà ta có được các kết nối cục bộ. Như vậy, mỗi neuron ở lớp kế tiếp sinh ra từ kết quả của filter áp đặt lên một vùng ảnh cục bộ của neuron trước đó.

Mỗi một lớp sử dụng các filter khác nhau, thông thường có hàng trăm hàng nghìn filter, và kết hợp kết quả của chúng lại. Ngoài ra, có một số layer khác như pooling/subsampling layer dùng để lọc lại các thông tin hữu ích hơn (loại bỏ các thông tin nhiễu).

Trong quá trình huấn luyện mạng CNN, thuật toán sẽ học các giá trị qua các lớp filter dựa vào cách thức mà bạn thực hiện. Ví dụ trong tác vụ phân loại ảnh, CNNs sẽ cố gắng tìm ra thông số tối ưu cho các filter tương ứng theo thứ tự raw pixel > edges > shapes > facial > high-level features. Layer cuối cùng được dùng để phân loại ảnh.

Cấu trúc của mạng CNN

Trong mô hình CNN, có hai khía cạnh cần quan tâm là tính bất biến (Location Invariance) và tính kết hợp (Compositionality). Với cùng một đối tượng, nếu đối tượng này được chiếu theo các gốc độ khác nhau (translation, rotation, scaling), thì độ chính xác của thuật toán sẽ bị ảnh hưởng đáng kể.

Pooling layer sẽ cho bạn tính bất biến đối với phép dịch chuyển (translation), phép quay (rotation) và phép co giãn (scaling). Tính kết hợp cục bộ cho ta các cấp độ biểu diễn thông tin từ mức độ thấp đến mức độ cao và trừu tượng hơn thông qua convolution từ các filter.

Đó là lý do tại sao CNNs cho ra mô hình với độ chính xác rất cao, giống như cách con người nhận biết các vật thể trong tự nhiên.

Mạng CNN sử dụng 3 ý tưởng cơ bản:

  • Các trường tiếp nhận cục bộ (local receptive field)
  • Trọng số chia sẻ (shared weights)
  • Tổng hợp (pooling).

Xem thêm: Tuyển dụng lập trình Network lương cao lên đến 3000 USD

Trường tiếp nhận cục bộ (local receptive field)

Đầu vào của mạng CNN là một ảnh. Ví dụ như ảnh có kích thước 28×28 thì tương ứng đầu vào là một ma trận có kích thước 28×28 và giá trị mỗi điểm ảnh là một ô trong ma trận. Trong mô hình mạng ANN truyền thống thì chúng ta sẽ kết nối các neuron đầu vào vào tầng ảnh.

Tuy nhiên, trong CNN chúng ta không làm như vậy. Chúng ta chỉ kết nối trong một vùng nhỏ của các neuron đầu vào như một filter có kích thước 5×5 tương ứng (28-5+1) 24 điểm ảnh đầu vào. Mỗi một kết nối sẽ học một trọng số và mỗi neuron ẩn sẽ học một bias. Mỗi một vùng 5×5 đấy gọi là một trường tiếp nhận cục bộ.

Một cách tổng quan, ta có thể tóm tắt các bước tạo ra 1 hidden layer bằng cách sau:

  1. Tạo ra neuron ẩn đầu tiên trong lớp ẩn 1
    Tạo ra neuron ẩn đầu tiên trong lớp ẩn 1
  2. Dịch filter qua bên phải một cột sẽ tạo được neuron ẩn thứ 2.
    Dịch filter qua bên phải một cột sẽ tạo được neuron ẩn thứ 2

Như vậy, local receptive field thích hợp cho việc phân tách dữ liệu ảnh, giúp chọn ra những vùng ảnh có giá trị nhất để đánh giá phân loại.

Trọng số chia sẻ (shared weight and bias)

Đầu tiên, các trọng số cho mỗi filter (kernel) phải giống nhau. Tất cả các nơ-ron trong lớp ẩn sẽ phát hiện chính xác feature tương tự, chỉ ở các vị trí khác nhau trong hình ảnh đầu vào. Chúng ta gọi việc map từ input layer sang hidden layer là một feature map. Vậy mối quan hệ giữa số lượng Feature map với số lượng tham số là gì?

Chúng ta thấy mỗi fearture map cần 25 = 5×5 shared weight và 1 shared bias. Như vậy mỗi feature map cần 5×5+1 = 26 tham số. Như vậy nếu có 10 feature map thì có 10×26 = 260 tham số. Chúng ta xét lại nếu layer đầu tiên có kết nối đầy đủ nghĩa là chúng ta có 28×28=784 neuron đầu vào như vậy ta chỉ có 30 neuron ẩn. Như vậy ta cần 28x28x30 shared weight và 30 shared bias. Tổng số tham số là 28x28x30+30 tham số lớn hơn nhiều so với CNN. Ví dụ vừa rồi chỉ mô tả để thấy được sự ước lượng số lượng tham số chứ chúng ta không so sánh được trực tiếp vì 2 mô hình khác nhau. Nhưng điều chắc chắn là nếu mô hình có số lượng tham số ít hơn, thì nó sẽ chạy nhanh hơn.

Tóm lại, một convolutional layer bao gồm các feature map khác nhau. Mỗi một feature map giúp phát hiện một vài feature trong bức ảnh. Lợi ích lớn nhất của trọng số chia sẻ là giảm tối đa số lượng tham số trong mạng CNN.

Lớp tổng hợp (pooling layer)

Lớp pooling thường được sử dụng ngay sau lớp convolutional để đơn giản hóa thông tin đầu ra và giảm số lượng neuron.

Lớp tổng hợp (pooling layer)

Thủ tục pooling phổ biến nhất là max-pooling, thủ tục này chọn giá trị lớn nhất trong vùng đầu vào 2×2.

Lớp tổng hợp (pooling layer)

Qua lớp Max Pooling, số lượng neuron giảm đi phân nửa. Trong một mạng CNN có nhiều Feature Map, nên mỗi Feature Map chúng ta sẽ áp dụng một Max Pooling khác nhau. Max Pooling là cách để tìm ra đặc trưng quan trọng nhất trong các đặc trưng này. Ngoài Max Pooling còn có L2 Pooling.

Cuối cùng, ta đặt tất cả các lớp lại với nhau thành một CNN với đầu ra gồm các neuron với số lượng tùy thuộc vào bài toán.

2 lớp cuối cùng của các kết nối trong mạng là một lớp đầy đủ kết nối (fully connected layer). Lớp này nối mọi neuron từ lớp max pooled tới mọi neuron của tầng ra.

Cách chọn tham số cho CNN

Có một số yếu tố quan trọng khi chọn tham số cho CNN:

  1. Số các convolution layer: Càng nhiều các convolution layer thì hiệu suất càng được cải thiện. Sau khoảng 3 hoặc 4 layer, các tác động đã đạt tới mức tối đa.
  2. Filter size: Thông thường, filter có kích thước 5×5 hoặc 3×3.
  3. Pooling size: Thông thường, pooling size là 2×2 hoặc 4×4 cho ảnh đầu vào lớn.
  4. Lựa chọn tham số tốt nhất bằng cách thực hiện nhiều lần train và test.

Hy vọng với những thông tin trong bài viết này, bạn đã tìm hiểu được về CNN là gì, cấu trúc mạng CNN và hiểu rõ hơn về mô hình CNN trong machine learning cơ bản. Chúc các bạn có những trải nghiệm thật bổ ích trong nghề Dev của mình!

Bạn có muốn tìm hiểu thêm về các công việc lập trình Network có thể xem tại đây.

Tham khảo thêm các công việc lập trình lương cao tại Topdev.

FEATURED TOPIC