Mạng thần kinh tích chập (CNN): Cửa sổ nhìn vào thế giới hình ảnh

Mọi người hay nói camera là con mắt của máy tính. Nhưng bản thân con mắt còn có rất nhiều neural, cụ thể là số neural kết nối với ~100 triệu thụ cảm. Số lượng thụ cảm này chỉ thua đúng cerebellar granule cells [7]. Vậy có phải “gắn thêm” neurons vào các sensor của camera thì có thể biến nó thành con mắt thực sử của máy tính hay không? Tôi không biết. Ít nhất, cho đến hiện tại, ngành nghiên cứu thị giác máy tính đã và đang đạt được các thành tựu cực kì lớn trong việc tạo ra “con mắt” và “bộ xử lý hình ảnh” thực sự cho máy tính. Dưới đây là kết quả khi tôi nhờ Gemini 1.5 [8] phân tích một bức chụp màn hình của trang chủ Spiderum. Có thể phân tích rất nhiều thứ về kết quả này, nhưng trước hết, nó biết tên trang web là Spiderum. Điều này đòi hỏi khả năng “nhìn” vì bức ảnh mà tôi tải lên chỉ là những pixel màu mà thôi. Để có thể hiểu được khả năng này từ đâu ra, chúng ta hãy bắt đầu từ những thứ cơ bản nhất, đó là mạng CNN.
Tôi hỏi Gemini trả lời
Tôi hỏi Gemini trả lời
Bạn đã bao giờ tự hỏi làm thế nào mà các ứng dụng nhận diện khuôn mặt, phân loại ảnh lại có thể hoạt động chính xác đến vậy? Bí mật nằm ở một loại mạng thần kinh nhân tạo đặc biệt gọi là Mạng thần kinh tích chập (Convolutional Neural Network - CNN). CNN là một công cụ mạnh mẽ trong lĩnh vực học sâu, được thiết kế đặc biệt để xử lý dữ liệu hình ảnh. Với khả năng tự học và trích xuất các đặc trưng phức tạp từ hình ảnh, CNN đã đạt được những thành công đáng kể trong nhiều ứng dụng như: Nhận diện hình ảnh: Phân loại các đối tượng trong ảnh (chó, mèo, xe hơi,...) [1]; Xử lý ngôn ngữ tự nhiên: Xử lý ảnh văn bản[2], phát hiện đối tượng trong ảnh [3]; Y tế: Phân tích hình ảnh y tế để hỗ trợ chẩn đoán bệnh [4]; Xe tự lại: Nhận diện vật thể, phân đoạn làn đường [5],...

Mục tiêu của bài viết

Trong bài viết này, chúng ta sẽ cùng nhau sơ lược các khái niệm cơ bản về CNN, từ đó hiểu rõ hơn về cách hoạt động của nó. Ngoài ra, tôi sẽ lấy ví dụ xây dựng một mạng CNN đơn giản để giải quyết một bài toán phân loại hình ảnh cụ thể. Những gì bạn sẽ đọc được: Các khái niệm cốt lõi: Lớp tích chập, lớp pooling, lớp fully connected, hàm kích hoạt, hàm loss,... Quy trình huấn luyện: Xây dựng kiến trúc mạng, chuẩn bị dữ liệu, huấn luyện và đánh giá mô hình. Ví dụ thực tế: Xây dựng một mô hình CNN đơn giản để phân loại hình ảnh.
Được rồi, bắt đầu thôi!

Lớp tích chập - Trái tim của CNN

Đã được giải thích kĩ trong phần trước. Ở cuối bài, tôi cũng đã giải thích rõ về sự khác nhau của tích chập trong xử lý ảnh cổ điển và xử lý ảnh bằng AI hiện đại. Các khái niệm quan trọng cần nhớ lại gồm: - Bộ lọc (filter): Một ma trận nhỏ chứa các trọng số. Bộ lọc sẽ học cách trích xuất các đặc trưng khác nhau trong quá trình huấn luyện. - Kích thước bộ lọc (fileter size hoặc kernel size): Kích thước của ma trận bộ lọc, thường là các số lẻ như 3x3, 5x5. - Bước nhảy (stride): Số pixel mà bộ lọc di chuyển sau mỗi lần tích chập. - Padding: Việc thêm các pixel vào xung quanh hình ảnh để điều chỉnh kích thước của feature map đầu ra.

Lớp pooling: Giảm kích thước, giữ lại thông tin quan trọng

Hình 2: Minh hoạ max pooling và average-pooling
Hình 2: Minh hoạ max pooling và average-pooling
Sau khi lớp tích chập trích xuất các đặc trưng từ hình ảnh, lớp pooling sẽ tiếp tục xử lý các feature map thu được. Vai trò chính của lớp pooling là:
- Giảm kích thước feature map: Điều này giúp giảm số lượng tham số, giảm độ phức tạp tính toán và ngăn ngừa overfitting [9]. Hãy nhớ lại ở bài viết trước, tôi có đề cập đến bộ trọng số của các filter, tại mỗi lớp cũng ko chỉ có một filter mà có nhiều filter (filter bank). Nhưng như đã diễn giải ở bài viết về MLP, nhiều trọng số (kết nối) chưa hẳn là đã tốt và tối ưu. Pooling là một cách để giảm số lượng kết nối như vậy và phù hợp trên hình ảnh, vì lượng thông tin ở các pixel gần nhau có thể chập làm một (inductive bias). Giảm số lượng kết nối, trọng số thì cũng tương đương với giảm số lượng tính toán. Ngoài ra, một hệ quả tất kiểu là các lớp càng sâu thì chỉ còn nhìn vào các vùng cục bộ hơn, ít nhiễu hơn, dẫn đến tránh được nhiễu và các yếu tố trong background. - Tăng tính bất biến: Lớp pooling giúp mạng thần kinh trở nên ít nhạy cảm hơn với các biến đổi nhỏ về vị trí và kích thước của đối tượng trong hình ảnh. Để giải thích về vấn đề này, bạn đọc có thể tham khảo đến hình 3 được trích từ [6]. Bài toán là nhận dạng ra cái ô tô trong hình (a). Nếu nhìn vào hình (a), có rất nhiều thông tin từ background là nhiễu, đặc biệt là chiếc xe bus cũng có bánh xe và hình dạng khá giống với xe ô tô (car). Khi áp tính toán tích chập với các filter trong lớp CNN lên, thì trong filter#175 và filter#55 có một số vị trí cụ thể mà các neural ở đó kích hoạt mạnh - tức là màu sáng hơn (activate). Sau khi pooling, cụ thể là max-pooling chẳng hạn, rõ ràng là các vùng sáng sẽ cô đặc hơn, và vùng sáng nhất sẽ dần dần cục bộ hơn trên bức ảnh. Đến cuối cùng ta có thể biết chính xác vị trí của chiếc xe bằng các truy ngược lại thông qua receptive field.
Hình 3: Minh hoạ đơn giản về quá trình nhận diện vật thể trong ảnh bằng mạng CNN. Hình từ [6]
Hình 3: Minh hoạ đơn giản về quá trình nhận diện vật thể trong ảnh bằng mạng CNN. Hình từ [6]
Các loại pooling phổ biến: Max pooling: Lấy giá trị lớn nhất trong mỗi vùng của feature map. Average pooling: Tính giá trị trung bình của các phần tử trong mỗi vùng.
Nói tóm lại, lớp pooling là một công cụ quan trọng trong CNN, giúp giảm kích thước dữ liệu, tăng khả năng khái quát hóa và giảm overfitting. Kết hợp với lớp tích chập, lớp pooling tạo nên một kiến trúc mạng thần kinh hiệu quả cho các bài toán xử lý hình ảnh.

Lớp fully connected (FC): Cầu nối cuối cùng

Sau khi các lớp tích chập và pooling trích xuất các đặc trưng cao cấp từ hình ảnh, lớp fully connected sẽ đóng vai trò như một cầu nối, kết nối các đặc trưng này với đầu ra cuối cùng của mạng. Sau đây là các bước theo thứ tự mà phần FC trong mạng CNN thực hiện:
1. Kết nối đầy đủ (Fully connected): Mỗi neuron trong lớp FC được kết nối với tất cả các neuron ở lớp trước đó. 2. Phẳng hóa (flatten): Trước khi vào lớp FC, feature map từ lớp pooling sẽ được "phẳng hóa" thành một vector một chiều. 3. Tính toán: Các neuron trong lớp FC thực hiện phép nhân trọng số và cộng bias tương tự như các lớp neuron khác. 4. Ra quyết định: Lớp FC cuối cùng thường sử dụng hàm softmax để đưa ra xác suất cho từng lớp, từ đó quyết định lớp nào có khả năng cao nhất.
CNN tốt như thế thì tại sao lại cần FC thì thực tế là CNN chỉ tối ưu cho việc phân tích tín hiệu, ở đây cụ thể là ảnh, tác vụ cuối cần tới sức mạnh của FC: - Tổng hợp thông tin: Lớp FC tổng hợp tất cả các thông tin đã được trích xuất từ các lớp trước đó để đưa ra quyết định cuối cùng. - Phân loại: Lớp FC thường được sử dụng để phân loại các đối tượng trong hình ảnh. - Kết nối với các mạng khác: Lớp FC có thể được kết nối với các mạng thần kinh khác để thực hiện các nhiệm vụ phức tạp hơn.
Nói ngắn gọn, lớp fully connected đóng vai trò quan trọng trong việc đưa ra quyết định cuối cùng của mạng CNN. Nó kết nối tất cả các thông tin đã được trích xuất từ các lớp trước đó và đưa ra dự đoán cuối cùng.

Hàm Kích Hoạt: Khơi dậy sức mạnh của mạng thần kinh

Hàm kích hoạt (activation function) đóng vai trò cực kỳ quan trọng trong các mạng thần kinh nhân tạo, đặc biệt là trong mạng CNN. Nó như một ngọn lửa, khơi dậy sức mạnh tính toán và giúp mạng học được những đặc trưng phức tạp từ dữ liệu.
Hàm kích hoạt là một hàm toán học, thường khá đơn giản, được áp dụng lên đầu ra của mỗi neuron trong mạng thần kinh. Nó quyết định xem thông tin có được truyền đi tiếp hay không, và với cường độ như thế nào. Hàm kích hoạt giúp mô phỏng cách hoạt động của các neuron sinh học, nơi mà tín hiệu chỉ được truyền đi khi đạt đến một ngưỡng nhất định. Giống như bộ não, đường đi của các kích thích sẽ hoạt hoá các vùng cụ thể trong não để thực hiện các chức năng cụ thể, và chính xác. Tuy nhiên, đấy là ý tưởng của việc mô phỏng bộ não, về mặt toán học ta có một sự hiểu khác khá rõ ràng. Bản thân mạng thần kinh suy cho cùng chỉ là một hàm số (mapping - function) mà nó mô phỏng được các mối quan hệ phức tạp trong dữ liệu đầu vào. Các mối quan hệ này rất phức tạp mà một hàm tuyến tính không thể làm được. Vì thế, ta cần các hàm phi tuyến để “kích hoạt” tính phi tuyến của hàm số mà mạng thần kinh học.
Các hàm kích hoạt phổ biến, hãy tham khảo [10] để biết thêm cụ thể hơn:
- ReLU (Rectified Linear Unit): Là hàm kích hoạt được sử dụng rộng rãi nhất hiện nay. Nó đơn giản, hiệu quả và giúp giảm vấn đề gradient vanishing. Công thức: f(x) = max(0, x) - Sigmoid: Trước đây được sử dụng phổ biến nhưng hiện nay ít được ưu tiên hơn ReLU. Công thức: f(x) = 1 / (1 + exp(-x)) - Tanh: Tương tự sigmoid nhưng giá trị nằm trong khoảng [-1, 1]. Công thức: f(x) = (exp(x) - exp(-x)) / (exp(x) + exp(-x)) Và nhiều hàm khác: Leaky ReLU, ELU, Softmax,...

Hàm Loss: Đo lường sự khác biệt giữa dự đoán và thực tế

Hàm loss (hay hàm mất mát) là một hàm toán học dùng để đo lường mức độ sai lệch giữa giá trị dự đoán của mô hình và giá trị thực tế. Trong quá trình huấn luyện, mục tiêu của chúng ta là tìm các tham số của mô hình để giảm thiểu giá trị của hàm loss. Phần này tôi đã viết rất kỹ trong phần [Nhập môn Deep Learning] Huấn luyện một mạng thần kinh. Ở đây, tôi sẽ liệt kê một vài hàm los thông dụng và chức năng (khi nào thì cần dùng).

Các hàm loss thường dùng trong CNN:

Cross-entropy loss: - Sử dụng phổ biến cho các bài toán phân loại (classification). - Đo lường sự khác biệt giữa phân phối xác suất dự đoán và phân phối xác suất thực tế. - Thường được sử dụng với hàm kích hoạt softmax ở lớp output. Mean Squared Error (MSE): - Sử dụng cho các bài toán hồi quy (regression). - Tính bình phương sai số giữa giá trị dự đoán và giá trị thực tế. Binary Cross-entropy: - Sử dụng cho các bài toán phân loại nhị phân. - Là một trường hợp đặc biệt của cross-entropy. Categorical Cross-entropy: - Sử dụng cho các bài toán phân loại đa lớp. - Là một dạng tổng quát của binary cross-entropy.

Ví dụ:

Giả sử chúng ta có một bài toán phân loại hình ảnh chó mèo. Mô hình dự đoán hình ảnh là chó với xác suất 0.8 và mèo là 0.2. Trong khi đó, nhãn thực tế là mèo (tức là xác suất là 0 cho chó và 1 cho mèo). Khi đó, hàm cross-entropy sẽ tính toán một giá trị loss lớn, cho biết mô hình dự đoán sai.

Chọn hàm loss phù hợp:

Việc lựa chọn hàm loss phù hợp phụ thuộc vào loại bài toán và cách đánh giá hiệu suất của mô hình. Ví dụ như sau: - Phân loại: Cross-entropy là lựa chọn phổ biến. - Hồi quy: MSE thường được sử dụng. Các bài toán đặc biệt: Có thể cần các hàm loss tùy chỉnh.
Một số lưu ý với hàm loss: - Scaling loss: Đôi khi cần scaling loss để tránh các vấn đề về độ ổn định trong quá trình huấn luyện. Ví dụ như nhân một hệ số vào loss để khiến cho độ ảnh hưởng của loss lên quá trình huấn luyện giảm dần về sau. - Các hàm loss khác: Ngoài các hàm loss kể trên, còn có nhiều hàm loss khác như Hinge loss, Focal loss,... mỗi hàm có những ưu điểm và nhược điểm riêng. - Kết hợp nhiều hàm loss: Huấn luyện mô hình AI hiện đại thường không chỉ dùng một hàm loss mà kết hợp rất nhiều hàm loss. Ý tưởng đơn giản là vì mỗi hàm loss thì tối ưu cho một việc nhất định, kết hợp chúng lại thì mô hình cuối cùng sẽ cùng lúc tối ưu (một cách cân bằng) cho tất cả các yêu cầu từ mỗi hàm loss. Dù sao thì, tổng của nhiều hàm thì vẫn được gọi là một hàm.
Tóm lại, hàm loss là một công cụ quan trọng trong quá trình huấn luyện mạng thần kinh. Việc lựa chọn hàm loss phù hợp giúp mô hình học được tốt hơn và đạt được hiệu suất cao hơn.

Thuật toán tối ưu (thuật toán học)

Gradient Descent (GD). Tham khảo [11] và [12] để có cái nhìn sâu sắc về thuật toán này. Sau đây, đẻ liền mạch suy nghĩ, tôi sẽ khái quát lại ý tưởng của GD.
Ý tưởng chính: GD là một thuật toán tối ưu hóa dùng để tìm giá trị nhỏ nhất của một hàm số. Trong machine learning, hàm số đó thường là hàm loss.Cách thức hoạt động:Bắt đầu từ một điểm ngẫu nhiên trong không gian tham số.Tính gradient (đạo hàm) của hàm loss tại điểm đó.Di chuyển một bước nhỏ theo hướng ngược lại của gradient.Lặp lại quá trình cho đến khi đạt được một điểm dừng nhất định (ví dụ: gradient đủ nhỏ hoặc đạt số lần lặp tối đa).
Tuy nhiên, trên thực tế, Gradient có một điểm yếu là nó duyệt qua từng datum một. Trong khi đó, dữ liệu thì lớn mà máy tính thì có thể tính song song. Tại sao ta không duyệt nhiều hơn là một mẫu tại mỗi bước? Đó chính là một motivation của SGD.
Stochastic Gradient Descent (SGD): Khác biệt so với GD: Thay vì tính gradient trên toàn bộ tập dữ liệu, SGD chỉ tính gradient trên một mini-batch (một phần nhỏ) của dữ liệu tại mỗi lần cập nhật.Ưu điểm:Tính toán nhanh hơn, đặc biệt với tập dữ liệu lớn.Có thể thoát khỏi các điểm cực tiểu cục bộ dễ dàng hơn.
Mặc dù vậy, SGD vẫn chưa đủ tốt cho quá trình học ở các mạng thần kinh phức tạp. Với rất nhiều nghiên cứu sau này, ta có hàng tá các thuật toán học hay còn gọi là Optimizer như Adam [13], AdamW [14], AdamGrad [15], etc. (thậm chí khá lạ như là Eden [16]). Trong kì này, tôi sẽ giới thiệu một ví dụ là Adam và dùng Adam trong huấn luyện mạng CNN ở phần sau.
Adam: Adam là một thuật toán tối ưu hóa thích ứng, kết hợp ưu điểm của Momentum và RMSprop. Cách thức hoạt động: Giữ lại một giá trị trung bình động của các gradient (momentum) và một giá trị trung bình động của bình phương các gradient. Tự động điều chỉnh learning rate cho từng tham số dựa trên các giá trị trung bình động này.
Tại sao cần các biến thể của GD? Hiệu suất: SGD và Adam thường hội tụ nhanh hơn và ổn định hơn so với GD. Khả năng tổng quát hóa: SGD giúp giảm overfitting nhờ tính ngẫu nhiên của mini-batch. Độ phức tạp tính toán: SGD phù hợp hơn với các tập dữ liệu lớn.
Nói chung, Gradient Descent là một thuật toán cơ bản để tối ưu hóa các mô hình máy học. SGD và Adam là các biến thể của GD, giúp cải thiện hiệu suất và khả năng tổng quát hóa của mô hình.

Quy trình huấn luyện một mạng CNN (khai thị)

Tất cả code phía sau có thể tìm thấy tại đây. Vui lòng bật GPU lên để train nhanh hơn vì default setting là CPU. (Runtime -> Change runtime type -> Chọn GPU T4)

1. Chuẩn bị dữ liệu:

Thu thập dữ liệu: Tập trung vào việc thu thập một lượng lớn dữ liệu hình ảnh chất lượng cao, đại diện cho các lớp cần phân loại.
Tiền xử lý, về cơ bản thì tiền xử lý làm đơn giản hoá hoặc chuẩn hoá dữ liệu theo một số chuẩn cụ thể tuỳ theo bài toán. Sau đây là một vài kiểu tiền xử lý: - Resize: Điều chỉnh kích thước của tất cả hình ảnh về một kích thước thống nhất. - Normalization: Chuẩn hóa giá trị pixel của ảnh vào khoảng từ 0 đến 1. - Augmentation: Tăng cường dữ liệu bằng các kỹ thuật như xoay, lật, phóng to, thu nhỏ, thêm nhiễu... để tăng độ đa dạng của tập dữ liệu và cải thiện khả năng tổng quát của mô hình. - Text Cleaning: Kiểm tra độ chính xác, an toàn, không thù địch, không racist của input text. - Audio Enhancement: Làm sạch dữ liệu âm thanh sau khi được thu để chỉ có các âm thanh cần thiết đi vào mạng thần kinh
Phân chia dữ liệu: Chia tập dữ liệu thành 3 phần. - Tập huấn luyện (training set): Sử dụng để cập nhật các tham số của mô hình. - Tập kiểm định (validation set): Sử dụng để đánh giá hiệu suất của mô hình trong quá trình huấn luyện. - Tập kiểm thử (test set): Sử dụng để đánh giá cuối cùng hiệu suất của mô hình đã được huấn luyện hoàn toàn.
Không nhất thiết phải chia làm 3 phần mà có thể chỉ cần dùng tập huấn luyện (train) và tập kiểm thử (test). Về cơ bản thì data hiện tại có quá nhiều, mặt khác, các data trong quá trình kiểm định cũng không được học bởi mô hình nên cũng không quá quan trọng.
Tôi sử dụng torchvision ở đây để tận dụng các bộ data được cung cấp sẵn. Sau đây là ví dụ về quá trình load dữ liệu của bộ CIFAR10 gồm 60000 hình ảnh kích thước 32x32 pixel của 10 sự vật khác nhau.
Hình 4: Đoạn code dùng để load bộ data CIFAR10
Hình 4: Đoạn code dùng để load bộ data CIFAR10
Hình 5: Một minh hoạ từ <a href="https://www.cs.toronto.edu/~kriz/cifar.html">CIFAR10</a>
Hình 5: Một minh hoạ từ CIFAR10

2. Xây dựng kiến trúc mạng:

Chọn kiến trúc: Lựa chọn kiến trúc mạng phù hợp với bài toán (Một vài kiến trúc sử dụng CNN: LeNet[17], AlexNet [18], VGG [19], ResNet [20],...) hoặc tự thiết kế kiến trúc. Thiết kế các lớp: Xây dựng các lớp tích chập, pooling, fully connected và các lớp khác theo kiến trúc đã chọn. Khởi tạo trọng số: Khởi tạo các trọng số của mạng một cách ngẫu nhiên.
Đây là một đoạn code mô phỏng lại AlexNet làm việc trên mạng dataset CIFAR10.
Hình 6: Đoạn code thiết kế một mạng mô phỏng AlexNet
Hình 6: Đoạn code thiết kế một mạng mô phỏng AlexNet
Tôi nghĩ, một bài tập vẽ lại mô hình được code này theo Hình 7 là sẽ giúp độc giả hình dung dễ dàng hơn trong trường hợp mới bắt đầu.
Hình 7: Kiến trúc AlexNet được trình bày trong [18]. Hình trích từ [18].
Hình 7: Kiến trúc AlexNet được trình bày trong [18]. Hình trích từ [18].

3. Huấn luyện mạng:

Chọn hàm loss: Lựa chọn hàm loss phù hợp với bài toán (cross-entropy, MSE,...) Chọn thuật toán tối ưu hóa: Chọn thuật toán tối ưu hóa (SGD, Adam,...) và thiết lập các hyperparameter (learning rate, momentum,...). Vòng lặp huấn luyện (xem hàm train_step()): 1. Truyền (Feed forward): Truyền dữ liệu qua mạng để tính toán giá trị dự đoán. 2. Tính toán loss (compute loss): Tính toán hàm loss giữa giá trị dự đoán và nhãn thực tế. 3. Truyền ngược (loss.backward()): Tính toán gradient của hàm loss đối với các tham số của mạng. 4. Cập nhật tham số (optimizer.step()): Cập nhật các tham số của mạng theo hướng giảm giá trị loss. Kiểm tra trên tập kiểm định: Sau mỗi epoch (một lần quét qua toàn bộ tập huấn luyện), đánh giá hiệu suất của mô hình trên tập kiểm định. Dừng sớm: Dừng quá trình huấn luyện khi hiệu suất trên tập kiểm định không còn cải thiện.
Hiện nay, các thư viện lớn như HuggingFace, PyTorchLightning, fairseq đều là các object-oriented framework. Vì vậy, tôi chuẩn bị một bộ code mô phỏng đơn giản lại class Trainer thường gặp. Cũng là để cho bạn đọc tập thói quen đọc thư viện và object-oriented program.
Hình 8: Code của Trainer (part 1)
Hình 8: Code của Trainer (part 1)
Hình 9: Code của Trainer (part 2)
Hình 9: Code của Trainer (part 2)

4. Đánh giá mô hình (xem hàm evaluation()):

Tính toán các chỉ số đánh giá: Độ chính xác, độ nhạy, độ đặc hiệu,... Phân tích sai số: Xét các trường hợp mà mô hình dự đoán sai để tìm hiểu nguyên nhân và cải thiện mô hình.
Trên thực tế thì chúng ta thường dùng các tool có khả năng quan sát các thông số này trong quá trình huấn luyện khá trực quan như: tensorboard, wandb, etc. Chính như quan sát các thông số trực tiếp và liên tục trong quá trình huấn luyện mà người huấn luyện có thể kiểm soát cũng như ra các quyết định liên quan đến quá trình huấn luyện.

5. Điều chỉnh hyperparameter (nếu cần):

Thay đổi kiến trúc mạng: Thêm hoặc bớt các lớp, thay đổi kích thước bộ lọc,... Điều chỉnh hyperparameter của thuật toán tối ưu hóa: Thay đổi learning rate, momentum,... Thay đổi hàm loss: Chọn hàm loss phù hợp hơn.

6. Lưu mô hình:

Lưu lại mô hình đã được huấn luyện để sử dụng cho các dự đoán trong tương lai.

Môt số lưu ý nếu quá kết quả kiểm thử bất thường

Overfitting: Khi mô hình học quá kỹ tập huấn luyện và không thể tổng quát hóa tốt trên tập kiểm định. Các kỹ thuật như dropout, regularization, data augmentation có thể giúp giảm overfitting. Underfitting: Khi mô hình quá đơn giản và không thể học được các đặc trưng phức tạp của dữ liệu. Cần tăng độ phức tạp của mô hình hoặc thu thập thêm dữ liệu.
Huấn luyện một mạng CNN là một quá trình đòi hỏi sự kiên nhẫn và thử nghiệm nhiều lần. Việc lựa chọn kiến trúc mạng, hyperparameter và kỹ thuật tối ưu hóa phù hợp đóng vai trò quan trọng trong việc đạt được hiệu suất tốt.
Kết quả huấn luyện của mô hình phía trên sau 10 epoch một mô hình có thể phân loại chính xác 73% trên tập kiểm thử, dưới đây là một vài ví dụ phân loại bởi mô hình.
Hình 10: Kết quả kiểm thử một vài mẫu từ tập kiểm thử
Hình 10: Kết quả kiểm thử một vài mẫu từ tập kiểm thử

Một số phân tích bước đầu cho việc huấn đoạn code phía trên

Hình 11: Giá trị của hàm loss xuyên suốt quá trình huấn luyện
Hình 11: Giá trị của hàm loss xuyên suốt quá trình huấn luyện
Giá trị hàm loss mặc dù giảm nhanh ở đoạn đầu nhưng tăng giảm bất thường về phía sau. Điều này có thể khắc phục bằng cách thử qua các phương pháp như điều chỉnh learning rate, scale hàm loss, hoặc đơn giản là train model lâu hơn một chút xem liệu hàm loss có thể hội tụ hay không etc.
HÌnh 12: Độ chính xác khi phân loại của model xuyên suốt quá trình huấn luyện
HÌnh 12: Độ chính xác khi phân loại của model xuyên suốt quá trình huấn luyện
Giá trị accuracy có thể vẫn chưa bão hoà sau 10 epoch. Mặc dù độ chính xác không tăng đáng kể ờ hai epoch cuối. Song, vẫn chưa thể kết luận rằng mô hình không thể tăng thêm nữa. Một số giải pháp là huấn luyện mô hình thêm vài epoch. Tăng độ sâu cho mô hình, tăng độ rộng của mô hình (tăng độ lớn của filter), etc.

Kết luận

Như vậy, tôi đã kết thúc một quá trình giới thiệu những khái niệm rất cơ bản của một mạng CNN và huấn luyện thử nó. Trong bài này, tôi cũng đã giới thiệu lại quá trình huấn luyện mô hình cũng như một đoạn code thể hiện quá trình huấn luyện khá tuần tự với thiết kế theo hướng OOP. Trong phần tiếp theo, có lẽ tôi sẽ bắt đầu với kiến trúc tiếp theo là Recurent Neural Network (RNN). Đây là mạng thần kinh mở ra kỷ nguyên thành công không tưởng của bài toán Sequence-to-Sequence. Mặc dù được thay thế bởi Transformer trong những năm gần đây, song RNN vẫn được sử dụng trong một số ứng dụng cần ít tài nguyên. Thêm nữa, các nghiên cứu trên RNN phần nào cũng đã thúc đẩy sự phát triển của Transformer và các lý thuyết trên bài toán Sequence-to-Sequence.

References

[1] Simonyan, Karen. "Very deep convolutional networks for large-scale image recognition." arXiv preprint arXiv:1409.1556 (2014). [2] Sarika, Naragudem, Nageswararao Sirisala, and Muni Sekhar Velpuru. "CNN based optical character recognition and applications." 2021 6th International conference on inventive computation technologies (ICICT). IEEE, 2021. [3] Redmon, J. "You only look once: Unified, real-time object detection." Proceedings of the IEEE conference on computer vision and pattern recognition. 2016. [4] Sarvamangala DR, Kulkarni RV. Convolutional neural networks in medical image understanding: a survey. Evol Intell. 2022;15(1):1-22. doi: 10.1007/s12065-020-00540-3. Epub 2021 Jan 3. PMID: 33425040; PMCID: PMC7778711. [5] Gao, Hongbo, et al. "Object classification using CNN-based fusion of vision and LIDAR in autonomous vehicle environment." IEEE Transactions on Industrial Informatics 14.9 (2018): 4224-4231. [6] He, Kaiming, et al. "Spatial pyramid pooling in deep convolutional networks for visual recognition." IEEE transactions on pattern analysis and machine intelligence 37.9 (2015): 1904-1916. [7] Masland RH. The neuronal organization of the retina. Neuron. 2012 Oct 18;76(2):266-80. doi: 10.1016/j.neuron.2012.10.002. Epub 2012 Oct 17. PMID: 23083731; PMCID: PMC3714606. [8] Team, Gemini, et al. "Gemini 1.5: Unlocking multimodal understanding across millions of tokens of context." arXiv preprint arXiv:2403.05530 (2024). [9] Caruana, Rich, Steve Lawrence, and C. Giles. "Overfitting in neural nets: Backpropagation, conjugate gradient, and early stopping." Advances in neural information processing systems 13 (2000). [10] Sharma, Sagar, Simone Sharma, and Anidhya Athaiya. "Activation functions in neural networks." Towards Data Sci 6.12 (2017): 310-316. [11] Vu Huu Tiep. Bài 7: Gradient Descent (phần 1/2). Blog Machine Learning Co ban [12] Vu Huu Tiep. Bài 8: Gradient Descent (phần 2/2). Blog Machine Learning Co ban [13] Kingma, Diederik P. "Adam: A method for stochastic optimization." arXiv preprint arXiv:1412.6980 (2014). [14] Loshchilov, I. "Decoupled weight decay regularization." arXiv preprint arXiv:1711.05101 (2017). [15] Duchi, John, Elad Hazan, and Yoram Singer. "Adaptive subgradient methods for online learning and stochastic optimization." Journal of machine learning research 12.7 (2011). [16] Dufourq, Emmanuel, and Bruce A. Bassett. "Eden: Evolutionary deep networks for efficient machine learning." 2017 Pattern Recognition Association of South Africa and Robotics and Mechatronics (PRASA-RobMech). IEEE, 2017. [17] LeCun, Yann, et al. "Gradient-based learning applied to document recognition." Proceedings of the IEEE 86.11 (1998): 2278-2324. [18] Krizhevsky, Alex, Ilya Sutskever, and Geoffrey E. Hinton. "Imagenet classification with deep convolutional neural networks." Advances in neural information processing systems 25 (2012). [19] Simonyan, Karen. "Very deep convolutional networks for large-scale image recognition." arXiv preprint arXiv:1409.1556 (2014). [20] He, Kaiming, et al. "Deep residual learning for image recognition." Proceedings of the IEEE conference on computer vision and pattern recognition. 2016.