Cảm ơn các góp ý của các độc giả trong bài trước. Mỗi khi tôi lên sườn bài cho phần tiếp theo thì ưu tiên là viết cho người chưa biết gì về Deep Learning. Dần dần, tôi nhận ra rằng có khá nhiều vấn đề mà nếu viết sơ qua thì dẫn đến khó hiểu. Nhưng phân tách quá nhỏ thì lại lan man và không đi vào trọng tâm chính. Trong bài viết này và 1-2 bài viết tới tôi sẽ thử tìm cách giải quyết vấn đề này. Thực ra, tôi muốn nhảy thẳng đến đoạn viết về Transformer, LLM, Flow-matching, Attention, Diffusion, State Space Model, etc. Nhưng có vẻ như đoạn đường sẽ còn khá xa. Nhờ có đóng góp của các bạn seri sẽ tốt hơn.

Tại sao lại dùng CNN

Cho đến hiện tại, tôi đã giới thiệu một mạng cơ bản nhất là fully-connected (MLP). Ở mạng này, tất cả các node ở ở layer trước nối với tất cả các node ở layer phía sau. Nhờ đó mà có hàng tá đường nối, tương đương là hàng tá đầu vào cho mỗi node để cân nhắc/tính toán thông tin cần thiết. Mạng này rất phù hợp để xấp xỉ hàm bất kì mà ta không biết gì nhiều về đầu vào và đầu ra của mô hình. Thêm nữa, rất nhiều điều không chắc chắn về số lớp, số node ở mỗi lớp làm cho số lượng các kết nối trở lên thừa và nhiều nghiên cứu chỉ ra rằng nhiều trong số chúng thật ra chẳng cần thiết [1]. Như đã trình bày ở bài trước đây, thực sự thì đưa kiến thức đặc thù vào giai đoạn thiết kế mô hình trở nên cần thiết. Nhờ vào việc này mà số lượng tham số cần cho một mô hình trở nên tối ưu hơn và đặc biệt là chúng ta cần ít dữ liệu huấn luyện hơn để có được một mô hình làm việc.
Mạng thần kinh tích chập (CNN) ra đời như một giải pháp tối ưu cho việc xử lý các dữ liệu có cấu trúc đặc biệt như hình ảnh và âm thanh, hoặc tín hiệu nói chung. Trong các dữ liệu này, thông tin thường được sắp xếp theo một cấu trúc lưới (grid) và các đặc trưng quan trọng thường xuất hiện ở nhiều vị trí khác nhau trong dữ liệu. CNN tận dụng lợi thế của cấu trúc này bằng cách sử dụng các lớp tích chập (convolutional layers) để trích xuất các đặc trưng cục bộ. Các lớp tích chập có khả năng học được các đặc trưng bất biến (invariant) như vị trí, kích thước và góc quay của đối tượng. Điều này có nghĩa là, nếu một con chó trong hình ảnh được dịch chuyển một chút hoặc thay đổi kích thước, CNN vẫn có thể nhận ra đó là một con chó. Khả năng này là rất quan trọng vì nó giúp cho các mô hình học máy trở nên linh hoạt hơn và ít phụ thuộc vào các biến đổi nhỏ trong dữ liệu đầu vào.
Ví dụ về invariant trong hình ảnh có con chó: Vị trí bất biến: Cho dù con chó nằm ở góc trên bên trái hay góc dưới bên phải của hình ảnh, CNN vẫn có thể nhận ra đó là một con chó. Kích thước bất biến: Con chó có thể lớn hoặc nhỏ, CNN vẫn có thể phân loại đúng. Góc quay bất biến: Con chó có thể đang nằm, đứng hoặc chạy, CNN vẫn có thể nhận diện được. Biến đổi ánh sáng: Con chó có thể được chụp trong điều kiện ánh sáng khác nhau, CNN vẫn có thể phát hiện ra nó.
Spatial localitytranslation invariance là hai tính chất khác rất quan trọng của dữ liệu hình ảnh mà CNN khai thác một cách hiệu quả. Spatial locality đề cập đến việc các pixel gần nhau trong một hình ảnh thường có mối liên hệ chặt chẽ về mặt ngữ nghĩa. Ví dụ, các pixel tạo thành một cạnh hoặc một góc thường nằm cạnh nhau. CNN tận dụng tính chất này bằng cách sử dụng các bộ lọc (filter) có kích thước nhỏ để trích xuất các đặc trưng cục bộ. Còn translation invariance có nghĩa là một đặc trưng trong hình ảnh vẫn được nhận dạng dù nó xuất hiện ở vị trí khác nhau. Nhờ vào việc chia sẻ trọng số (weight sharing) giữa các neuron trong cùng một lớp tích chập, CNN có khả năng học được các đặc trưng bất biến vị trí, giúp cho mô hình linh hoạt hơn trong việc nhận dạng các đối tượng. Ví dụ: Spatial locality: Khi chúng ta nhìn vào một bức ảnh, chúng ta thường tập trung vào các vùng nhỏ để nhận biết các đối tượng. Ví dụ, để nhận biết một con mèo, chúng ta sẽ chú ý đến các đặc trưng như đôi mắt, mũi, tai, và đuôi. Các pixel đại diện cho các đặc trưng này thường nằm gần nhau trong hình ảnh. Translation invariance: Nếu một con mèo xuất hiện ở góc trên bên trái hoặc góc dưới bên phải của một bức ảnh, chúng ta vẫn có thể dễ dàng nhận ra đó là một con mèo. CNN có khả năng học được các đặc trưng của một con mèo bất kể vị trí của nó trong hình ảnh.
Chú ý, không chỉ hình ảnh mới có các tính chất này. Ví dụ, dữ liệu âm anh như giọng nói của một người. Bản thân việc giọng đó ở đầu hay ở cuối đoạn âm thanh không làm biến đổi đặc trưng giọng nói của người đó.
Một ghi chú nhỏ cho pixel
Pixel (viết tắt của picture element) là đơn vị nhỏ nhất cấu tạo nên một hình ảnh kỹ thuật số. Hãy tưởng tượng một bức tranh được chia thành rất nhiều ô vuông nhỏ li ti, mỗi ô vuông đó chính là một pixel. Mỗi pixel có một giá trị số tương ứng với màu sắc của nó. Đó là lý do mà khi phóng to một bức ảnh thì chúng thường chia thành các ô màu.
Giá trị của pixel:
Pixel (viết tắt của picture element) là đơn vị nhỏ nhất cấu tạo nên một hình ảnh kỹ thuật số. Hãy tưởng tượng một bức tranh được chia thành rất nhiều ô vuông nhỏ li ti, mỗi ô vuông đó chính là một pixel. Mỗi pixel có một giá trị số tương ứng với màu sắc của nó. Đó là lý do mà khi phóng to một bức ảnh thì chúng thường chia thành các ô màu. Giá trị của pixel: Ảnh xám: Mỗi pixel thường được biểu diễn bằng một giá trị số từ 0 đến 255, trong đó 0 là màu đen và 255 là màu trắng. Ảnh màu: Mỗi pixel thường được biểu diễn bằng ba giá trị số tương ứng với cường độ của ba màu cơ bản: đỏ (Red), xanh lá (Green), và xanh dương (Blue). Đây được gọi là mô hình màu RGB. Giá trị của các pixel ở ảnh màu sẽ tuỳ vào loại ảnh mà bạn dùng. Về cơ bản, chúng ta cần kiểm tra giá trị của chúng trước khi tiến hành các bước tiếp theo

Filters (Bộ lọc)

Hãy tưởng tượng bộ lọc như một khuôn mẫu nhỏ, được sử dụng để quét qua toàn bộ hình ảnh. Khi khuôn mẫu này được đặt lên một vùng nhỏ của hình ảnh, nó sẽ so sánh các giá trị pixel trong khuôn mẫu với các pixel tương ứng trong hình ảnh. Kết quả của quá trình so sánh này sẽ tạo ra một giá trị duy nhất, đại diện cho mức độ tương đồng giữa khuôn mẫu và vùng hình ảnh đó. Ví dụ đã được viết ở bài trước, sẽ giống như việc ta ra một khuôn mẫu con mắt trên tấm ảnh mặt người để tìm thấy vùng chứa phần mắt trong đó.
Hình 1. là một ví dụ đơn giản để bắt đầu. Hãy giả sử rằng ta có một “bức ảnh” một chiều như trên với các giá trị 0, 1. Ta dùng một filter (-1, 1) trượt dọc theo hình từ trái qua phải. Sau mỗi lần trượt, ta nhân filter với giá trị tương ứng tại bước đó trên ảnh, cộng kết quả lại, và điền vào bức hình mới. Kết quả là ta có một “bức hình” mới có tên gọi khác là feature map. Mời bạn đọc nhìn lại ảnh và thử đoán xem pattern mà filter này tìm thấy là gì? Đó chính là bất kể khi nào xuất hiện (0,1) ở trên bức ảnh thì trên feature maps sẽ được kết quả là 1.
Hình 1. là một ví dụ đơn giản để bắt đầu. Hãy giả sử rằng ta có một “bức ảnh” một chiều như trên với các giá trị 0, 1. Ta dùng một filter (-1, 1) trượt dọc theo hình từ trái qua phải. Sau mỗi lần trượt, ta nhân filter với giá trị tương ứng tại bước đó trên ảnh, cộng kết quả lại, và điền vào bức hình mới. Kết quả là ta có một “bức hình” mới có tên gọi khác là feature map. Mời bạn đọc nhìn lại ảnh và thử đoán xem pattern mà filter này tìm thấy là gì? Đó chính là bất kể khi nào xuất hiện (0,1) ở trên bức ảnh thì trên feature maps sẽ được kết quả là 1.
Tuy nhiên có một vấn đề được highlight bằng màu đỏ, chính là đầu ra của feature map này có chiều dài (rộng) hụt đi so với hình ban đầu. Điều này là do các pixel ở rìa hình ảnh không được tính toán đầy đủ khi bộ lọc đến gần mép. Việc giảm kích thước này có thể dẫn đến mất thông tin và làm giảm độ chính xác của mô hình. Hiểu đơn giản là ta bỏ qua thông tin ở các góc, rìa (mép) hình ảnh. Để giải quyết vấn đề giảm kích thước của feature map khi thực hiện tích chập, kỹ thuật padding được áp dụng. Cụ thể, ta thêm một lớp các pixel có giá trị thường bằng 0 (hoặc một giá trị khác) vào xung quanh hình ảnh ban đầu. Điều này giúp giữ nguyên hoặc thậm chí tăng kích thước của feature map đầu ra, đảm bảo rằng thông tin ở các cạnh của hình ảnh không bị mất mát, từ đó nâng cao hiệu suất của mô hình.
Hình 2. Chỉ cần thêm (pad) vào đầu và cuối của ảnh một pixel giả thì ta có thể giữ nguyên kích thước của hình ảnh.
Hình 2. Chỉ cần thêm (pad) vào đầu và cuối của ảnh một pixel giả thì ta có thể giữ nguyên kích thước của hình ảnh.
Các loại padding phổ biến: Zero padding: Đây là loại padding phổ biến nhất, trong đó các pixel được thêm vào có giá trị bằng 0. Reflection padding: Các pixel ở rìa được phản chiếu để tạo thành lớp padding. Replication padding: Các pixel ở rìa được sao chép để tạo thành lớp padding.
Tuy nhiên, ví dụ phía trên còn chưa đủ trực quan để cho dễ thấy cái gọi là các pattern sẽ được các filter tìm thấy. Dưới đây là một ví dụ trên ảnh 2D gồm các ô màu đỏ và ô không màu. Trong hình, ta có hai filter 1 và 2. Nếu kéo filter này đi từ trái sang phải, từ trên xuống dưới vài chỉ chọn những vị trí mà tại đó khớp với thứ tự màu trên filter. Thì ta có được kết quả là ảnh feature map 1 và feature map 2. Chú ý là nhờ ta có padding nên không bị mất ô màu ở cạnh của bức ảnh. Tại đây, độc giả cần nhớ 2 thuật ngữ: filter bank: tập hơn các filter channels: tập hợp các kết quả của phép tích chập (có thứ tự, theo thứ tự của filter tạo ra chúng)
Hình 3. Ví dụ về việc dùng 2 filter bank trên cùng một ảnh để tìm các pattern cụ thể. Ở đây, filter 1 tìm các vùng có 3 chấm đỏ liên tiếp theo chiều ngang, và filter 2 làm điều tương tự nhưng theo chiều dọc. Độc giả có thể đoán xem nếu ta kết hợp cả hai filter bank thì pattern chúng ta tìm là gì?
Hình 3. Ví dụ về việc dùng 2 filter bank trên cùng một ảnh để tìm các pattern cụ thể. Ở đây, filter 1 tìm các vùng có 3 chấm đỏ liên tiếp theo chiều ngang, và filter 2 làm điều tương tự nhưng theo chiều dọc. Độc giả có thể đoán xem nếu ta kết hợp cả hai filter bank thì pattern chúng ta tìm là gì?

Ứng dụng của filter vào image processing

(Thời mà chúng mạng thần kinh nhân tạo chưa quá mạnh mẽ như hiện tại)
Từ lâu, các nhà xử lý ảnh đã khám phá và ứng dụng các bộ lọc tự thiết kế để tạo ra những hiệu ứng độc đáo và đa dạng. Thay vì chỉ dựa vào các bộ lọc có sẵn, các nghệ sĩ và kỹ sư đã tận dụng kiến thức về toán học và xử lý tín hiệu để tạo ra những công cụ tùy chỉnh. Điều này cho phép họ làm mờ hình ảnh một cách tinh tế, làm sắc nét các chi tiết nhỏ, phát hiện các cạnh với độ chính xác cao, và thậm chí tạo ra những hiệu ứng nghệ thuật độc đáo không thể tìm thấy ở bất kỳ phần mềm nào.
Các loại bộ lọc tự thiết kế phổ biến: Bộ lọc Laplacian, bộ lọc Sobel, bộ lọc Gaussian, bộ lọc trung bình... Các ứng dụng cụ thể của từng loại bộ lọc: Phát hiện cạnh, làm mờ, làm sắc nét, tăng cường độ tương phản... Các công cụ và phần mềm hỗ trợ thiết kế bộ lọc: MATLAB, OpenCV, Python... Các yếu tố ảnh hưởng đến hiệu quả của bộ lọc: Kích thước kernel (kích thước filter), hàm trọng số (hàm tính ra giá trị cho từng ô trên filter), loại hình ảnh...
Có hàng tá ví dụ cho các ứng dụng, ở đây tôi chọn một ví dụ đơn giản là làm mờ hình ảnh theo Gaussian Blur. Gaussian Blur là một kỹ thuật làm mờ hình ảnh phổ biến, được ứng dụng rộng rãi trong xử lý ảnh. Bằng cách tính trung bình giá trị pixel trong một vùng lân cận, Gaussian Blur giúp làm mờ nền, giảm nhiễu, chuẩn bị hình ảnh trước khi phát hiện cạnh và tạo ra các hiệu ứng nghệ thuật như sơn dầu. Nhờ những ưu điểm này, Gaussian Blur trở thành một công cụ không thể thiếu trong việc nâng cao chất lượng hình ảnh và tạo ra các hiệu ứng hình ảnh độc đáo. Ví dụ đơn giản là ta tạo ra một cái filter mà ở mỗi ô sẽ được đặt giá trị theo quy luật (tính toán được định trước, tôi sẽ không đi vào phần này vì nó đã ra ngoài tầm của bài viết).
Hình 4. Load một tấm hình trên mạng vào RAM bằng thư viện OpenCV.
Link hình bé puppy này: https://imgcdn.stablediffusionweb.com/2024/5/14/d5eac32d-74aa-458a-8d0b-53f397e0b817.jpg
Hình 4. Load một tấm hình trên mạng vào RAM bằng thư viện OpenCV. Link hình bé puppy này: https://imgcdn.stablediffusionweb.com/2024/5/14/d5eac32d-74aa-458a-8d0b-53f397e0b817.jpg
Hình 5: Hình puppy bị làm mờ sau khi tính convolution với một Gaussian Filter có độ lớn là 35x35 pixel. Giá trị cụ thể của kernel bạn đọc có thể tìm đọc tại <a href="https://docs.opencv.org/4.x/d4/d86/group__imgproc__filter.html#gae8bdcd9154ed5ca3cbc1766d960f45c1">đây</a>. Thực ra nó không quá quan trọng. Bạn hiểu những sự thay đổi tích cực mà một filter có thể tạo trên một hình ảnh đầu vào là được.
Hình 5: Hình puppy bị làm mờ sau khi tính convolution với một Gaussian Filter có độ lớn là 35x35 pixel. Giá trị cụ thể của kernel bạn đọc có thể tìm đọc tại đây. Thực ra nó không quá quan trọng. Bạn hiểu những sự thay đổi tích cực mà một filter có thể tạo trên một hình ảnh đầu vào là được.

Kết luận về tầm quan trọng của bộ lọc trong xử lý tín hiệu và sự khác biệt trong CNN

Bộ lọc là một công cụ không thể thiếu trong xử lý tín hiệu, đóng vai trò như một chiếc "lưới lọc" giúp ta tách lọc những thông tin cần thiết và loại bỏ những thông tin nhiễu. Trong các hệ thống xử lý tín hiệu truyền thống, các bộ lọc thường được thiết kế sẵn dựa trên các kiến thức toán học và kỹ thuật.
Trong mạng nơ ron tích chập (CNN), bộ lọc lại có một vai trò đặc biệt và cách thức hoạt động khác biệt:
Bộ lọc học được: Thay vì được thiết kế sẵn, các bộ lọc trong CNN được học thông qua quá trình huấn luyện. Điều này có nghĩa là mạng sẽ tự động tìm ra những bộ lọc phù hợp nhất để trích xuất các đặc trưng cần thiết từ dữ liệu đầu vào.
Bộ trọng số: Các bộ lọc trong CNN được biểu diễn bởi các ma trận trọng số. Trong quá trình huấn luyện, các trọng số này sẽ được điều chỉnh để giảm thiểu sai số giữa đầu ra của mạng và nhãn thực tế.
Tính tối ưu và sâu: Tối ưu: Việc học các bộ lọc cho phép CNN thích ứng với từng loại dữ liệu cụ thể, từ đó đạt được hiệu suất cao hơn so với các bộ lọc được thiết kế sẵn. Sâu: Các lớp CNN chồng chất lên nhau, mỗi lớp học được các bộ lọc khác nhau, cho phép mạng học được các đặc trưng ở nhiều cấp độ trừu tượng khác nhau. Từ các đặc trưng đơn giản như cạnh, góc đến các đặc trưng phức tạp hơn như đối tượng, khuôn mặt.
Tại sao việc học bộ lọc trong CNN lại quan trọng?
Khả năng thích ứng cao: CNN có thể thích ứng với nhiều loại dữ liệu khác nhau, từ hình ảnh, âm thanh đến văn bản. Trích xuất đặc trưng tự động: CNN tự động tìm ra các đặc trưng quan trọng nhất trong dữ liệu, giúp giảm thiểu sự can thiệp của con người. Hiệu suất cao: CNN đạt được hiệu suất vượt trội trong nhiều nhiệm vụ như phân loại hình ảnh, nhận dạng đối tượng, xử lý ngôn ngữ tự nhiên.
Tóm lại, việc học các bộ lọc trong CNN là một bước đột phá trong lĩnh vực học máy, mở ra nhiều ứng dụng thực tế quan trọng. Khả năng tự học và thích ứng của CNN đã làm thay đổi cách chúng ta tiếp cận các bài toán xử lý dữ liệu.
Làm thế nào để thiết kế CNN và đạt được các filter tốt hơn so với các filter cũ trước đây trong xử lý ảnh sẽ được giới thiệu ở chương sau.
References
[1] Han, Song, et al. "Learning both weights and connections for efficient neural network." Advances in neural information processing systems 28 (2015).