[Nhập môn deep learning] ” Mở mắt” cho AI – huấn luyện một mạng CNN đơn giản
[Nhập môn deep learning] ” Mở mắt” cho AI – huấn luyện một mạng CNN đơn giản
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á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!
Đã đượ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ư 3×3, 5×5.
– 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.
– 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ư 3×3, 5×5.
– 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
– 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.
– 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.
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.
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.
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.
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.
– 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 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.
– 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,…
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 (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.
– 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.
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.
– 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.
– 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.
Ý 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).
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.
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.
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.
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:
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
– 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.
– 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.
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.
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.
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.
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.
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.
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.
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.
Đ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.
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.
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.
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.
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.
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.
[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.