Mạng nơ-ron tích chập, hay CNN, là một mạng nơ-ron tìm các mẫu cục bộ nhỏ rồi kết hợp chúng thành những mẫu lớn hơn. Trong ảnh, các lớp đầu thường phát hiện cạnh hoặc góc, các lớp giữa phát hiện kết cấu hoặc bộ phận, còn các lớp sâu hơn dùng những tín hiệu đó để hỗ trợ dự đoán cuối cùng.

Ý tưởng cốt lõi là chia sẻ trọng số. Thay vì học một trọng số riêng cho từng cặp vị trí-pixel, CNN tái sử dụng cùng một bộ lọc nhỏ ở nhiều vị trí. Điều đó khiến nó rẻ hơn nhiều so với một lớp dense áp dụng trực tiếp lên ảnh thô, đồng thời giúp nó phát hiện cùng một kiểu mẫu ở nhiều nơi khác nhau.

Mạng nơ-ron tích chập làm gì

Trong một lớp kết nối đầy đủ, mỗi đầu ra có thể phụ thuộc vào mọi giá trị đầu vào cùng lúc. CNN có cấu trúc chặt chẽ hơn. Nó dùng các kernel nhỏ, thường được gọi là bộ lọc, để nhìn vào từng vùng cục bộ một lần.

Với đầu vào một kênh xx và kernel k×kk \times kKK, một phần tử đầu ra có thể được viết là

yi,j=m=0k1n=0k1Km,nxi+m,j+n.y_{i,j} = \sum_{m=0}^{k-1} \sum_{n=0}^{k-1} K_{m,n} x_{i+m,j+n}.

Đây là ý tưởng tổng có trọng số cục bộ đứng sau một lớp tích chập. Trong nhiều thư viện machine learning, phép toán được cài đặt về mặt kỹ thuật là tương quan chéo thay vì phép tích chập toán học có lật kernel, nhưng trực giác thực tế là như nhau: kernel quét qua đầu vào và tạo ra một feature map.

Feature map cho bạn biết nơi mà mẫu đã học xuất hiện mạnh.

Vì sao bộ lọc dùng chung lại hữu ích

Nếu cùng một cạnh dọc xuất hiện gần góc trên bên trái của ảnh hoặc gần trung tâm, ta thường muốn mô hình vẫn nhận ra nó trong cả hai trường hợp. CNN hỗ trợ điều đó bằng cách tái sử dụng cùng một tham số bộ lọc ở nhiều vị trí.

Điều này có hai tác động thực tế:

  • Nó làm giảm số lượng tham số cần học so với một lớp dense trên ảnh thô.
  • Nó khuyến khích mạng phát hiện các mẫu cục bộ lặp lại thay vì ghi nhớ một vị trí cố định.

Sự tái sử dụng đó là một trong những lý do CNN trở nên hiệu quả cho các bài toán về ảnh.

Kiến trúc CNN cơ bản trông như thế nào

Một CNN cơ bản thường đi theo mẫu sau:

  1. lớp tích chập
  2. hàm kích hoạt như ReLU
  3. pooling hoặc downsampling tùy chọn
  4. thêm các khối tích chập
  5. lớp dự đoán cuối cùng

Các lớp đầu thường nắm bắt cấu trúc cục bộ đơn giản. Các lớp sâu hơn kết hợp những phản hồi đó thành các đặc trưng lớn hơn và đặc thù hơn cho từng tác vụ.

Pooling không bắt buộc, nhưng khi được dùng, nó làm co các chiều không gian để các lớp sau có thể làm việc với một biểu diễn gọn hơn. Một ví dụ phổ biến là max pooling, giữ lại giá trị lớn nhất trong mỗi vùng nhỏ.

Nếu stride là 11 và padding là 00, thì đầu vào n×nn \times n với kernel k×kk \times k sẽ tạo ra đầu ra (nk+1)×(nk+1)(n-k+1) \times (n-k+1). Quy tắc kích thước này rất hữu ích khi bạn kiểm tra xem một ví dụ tính tay có hợp lý hay không.

Ví dụ chi tiết: cách tạo feature map trong CNN

Xét ảnh đầu vào 4×44 \times 4 sau:

X=[3300330000330033]X = \begin{bmatrix} 3 & 3 & 0 & 0 \\ 3 & 3 & 0 & 0 \\ 0 & 0 & 3 & 3 \\ 0 & 0 & 3 & 3 \end{bmatrix}

Dùng kernel 2×22 \times 2 sau:

K=[1111]K = \begin{bmatrix} 1 & 1 \\ 1 & 1 \end{bmatrix}

Giả sử stride 11 và không có padding. Vì đầu vào là 4×44 \times 4 và kernel là 2×22 \times 2, đầu ra phải là 3×33 \times 3. Mỗi phần tử đầu ra là tổng của một vùng 2×22 \times 2 vì mọi phần tử trong kernel đều bằng 11.

Giá trị đầu ra ở góc trên bên trái là

y1,1=3(1)+3(1)+3(1)+3(1)=12.y_{1,1} = 3(1) + 3(1) + 3(1) + 3(1) = 12.

Vùng dịch sang phải một bước là

[3030],\begin{bmatrix} 3 & 0 \\ 3 & 0 \end{bmatrix},

nên

y1,2=3+0+3+0=6.y_{1,2} = 3 + 0 + 3 + 0 = 6.

Tính qua tất cả các vị trí hợp lệ, ta được

Y=[12606660612].Y = \begin{bmatrix} 12 & 6 & 0 \\ 6 & 6 & 6 \\ 0 & 6 & 12 \end{bmatrix}.

Đầu ra này là feature map. Các giá trị lớn cho thấy nơi kernel tìm thấy sự khớp mạnh. Ở đây, bộ lọc phản hồi mạnh nhất tại những nơi xuất hiện trọn vẹn một khối sáng 2×22 \times 2.

Nếu bây giờ bạn áp dụng ReLU thì không có gì thay đổi vì mọi phần tử đều đã không âm. Nếu sau đó dùng max pooling 2×22 \times 2 với stride 11, đầu ra sau pooling sẽ là

[126612].\begin{bmatrix} 12 & 6 \\ 6 & 12 \end{bmatrix}.

Điều đó không tạo ra thông tin mới. Nó giữ lại các phản hồi mạnh nhất ở gần nhau và làm giảm lưới không gian.

Ví dụ này rất đơn giản, nhưng nó cho thấy rõ cơ chế cốt lõi: một bộ lọc trượt, tính các tổng có trọng số cục bộ và tạo ra bản đồ cho biết nơi một mẫu xuất hiện.

CNN học gì trong quá trình huấn luyện

Kernel ở trên được chọn bằng tay, nhưng trong một CNN thực tế thì các giá trị bộ lọc được học từ dữ liệu. Quá trình huấn luyện điều chỉnh các giá trị đó để các feature map tạo ra trở nên hữu ích cho tác vụ.

Nếu tác vụ là phân loại ảnh, mạng sẽ học các bộ lọc giúp tách biệt các lớp. Nếu tác vụ là segmentation hoặc detection, các lớp sau sẽ được huấn luyện cho những đầu ra đó. Cơ chế cơ bản vẫn giống nhau: forward pass, loss, backpropagation, cập nhật tham số.

Những lỗi thường gặp khi học CNN

Nghĩ rằng CNN chỉ có nghĩa là "bộ phân loại ảnh"

Ảnh là ví dụ tiêu chuẩn, nhưng CNN thực chất nói về cấu trúc cục bộ và các bộ lọc dùng chung. Nếu các giá trị lân cận là quan trọng, cùng ý tưởng đó có thể hữu ích ngoài bài toán ảnh.

Cho rằng pooling luôn bắt buộc

Nó phổ biến, nhưng không phải lúc nào cũng có. Một số kiến trúc giảm kích thước không gian bằng tích chập có stride, và một số khác giữ chi tiết không gian lâu hơn.

Bỏ qua stride và padding

Kích thước feature map phụ thuộc vào các lựa chọn này. Nếu bạn thay đổi stride hoặc padding, bạn không chỉ thay đổi hình dạng đầu ra mà còn thay đổi cả những vùng lân cận cục bộ mà mỗi đơn vị có thể nhìn thấy.

Xem lớp này chỉ như một công thức

Công thức tích chập là quan trọng, nhưng kiến trúc cũng quan trọng. CNN hoạt động hiệu quả vì tích chập, hàm kích hoạt, việc xếp chồng lớp và huấn luyện cùng phối hợp với nhau.

Khi nào mạng nơ-ron tích chập hữu ích

CNN được dùng rộng rãi trong các bài toán thị giác máy tính như phân loại ảnh, phát hiện đối tượng và segmentation. Chúng cũng xuất hiện trong một số bối cảnh xử lý tín hiệu và chuỗi khi các mẫu cục bộ có ý nghĩa.

Chúng đặc biệt hữu ích khi đầu vào có cấu trúc lưới rõ ràng hoặc cấu trúc lân cận có thứ tự. Nếu điều kiện đó yếu, một kiến trúc khác có thể phù hợp hơn.

Một mô hình tư duy giúp hiểu CNN dễ hơn

Hãy nghĩ về CNN như một bộ phát hiện mẫu bắt đầu từ những thứ nhỏ và trở nên trừu tượng hơn khi độ sâu tăng lên. Một lớp hỏi: "Mẫu nhỏ này có xuất hiện ở đây không?" Các lớp sau hỏi: "Những mẫu đơn giản này có kết hợp thành thứ gì có ý nghĩa hơn không?"

Đó là lý do CNN dễ hiểu hơn khi bạn tập trung vào feature map, chứ không chỉ vào từ "convolution".

Hãy thử phiên bản của riêng bạn

Giữ nguyên đầu vào, nhưng đổi kernel thành

[1111].\begin{bmatrix} 1 & -1 \\ 1 & -1 \end{bmatrix}.

Hãy tính lại feature map và xem vùng nào bây giờ tạo ra phản hồi dương lớn hoặc âm lớn. Thay đổi nhỏ đó sẽ làm rõ hơn nhiều cách các bộ lọc khác nhau phát hiện các mẫu khác nhau.

Cần trợ giúp giải bài?

Tải câu hỏi lên và nhận lời giải từng bước đã được xác minh trong vài giây.

Mở GPAI Solver →