Các lý do mạng neural network không hoạt động không chính xác

- Phạm Duy Tùng
Bạn huấn luyện một hình mất hơn 12 tiếng đồng hồ. Mọi thứ khá ổn, loss function giảm. Nhưng khi bạn mang mô hình ra predict thì điều tồi tệ nhất xảy ra, tất cả trả về đều là 0, không có cái nào nhận dạng chính xác cả. *Điều gì đã xảy ra, bạn đã làm gì sai?*.

Bạn huấn luyện một hình mất hơn 12 tiếng đồng hồ. Mọi thứ khá ổn: loss function giảm. Nhưng khi bạn mang mô hình ra predict thì điều tồi tệ nhất xảy ra: Tất cả trả về đều là 0, không có cái nào nhận dạng chính xác cả. “Điều gì đã xảy ra, bạn đã làm gì sai?”. Bạn hỏi máy tính, nó không trả lời bạn. Bạn đập bàn, đập ghế trong cơn tức giận và chẳng giải quyết được điều gì cả.

Có rất nhiều nguyên nhân gây ra vấn đề này. Việc cần làm của các bạn là phải tìm ra chính xác nguyên nhân và “sửa” nó, sau đó tốn hơn 12 tiếng đồng hồ để huấn luyện lại :), rồi lại sửa …

Hướng dẫn ban đầu

Nếu bạn gặp tình trạng như phần mô tả ở trên, bạn hãy thực hiện các bước mình mô tả bên dưới thử xem vấn đề của bạn là gì?

  • Bắt đầu huấn luyện mô hình bằng một mô hình đơn giản mà bạn biết chắc rằng nó hoạt động tốt với tập dữ liệu bạn đang có. Ví dụ, trong bài toán object detection, hãy sử dụng mô hình VGG. Và bạn hãy cố gắng sửa dụng standard loss nếu có thể.

  • Bỏ qua những thứ râu ria như là regularization hoặc data augmentation. Hãy tập trung vào xây dựng một mô hình cho một kết quả khả quan cái đã, sau đó mới cải tiến bằng các thứ râu ria trên sau.

  • Nếu bạn finetuning một mô hình, bạn hãy kiểm tra thật kỹ quá trình tiền xử lý dữ liệu. Chắc chắn rằng quá trình tiền xử lý của bạn giống y chang quá trình tiền xử lý của mô hình gốc.

  • Chắc chắn 100% rằng giá trị đầu vào là đúng.

  • Bắt đầu bằng một tập sample nhỏ (từ 2 đến 20 mẫu). Huấn luyện nó đến khi bị overfit và bổ sung thêm mẫu huấn luyện sau khi mô hình của bạn bị overfit.

  • Bổ sung thên các yếu tố râu ria như augmentation/regularization, custom loss functions, thử với một mô hình phức tạp hơn.

Nếu những cách trên vẫn không thành công. Mô hình vẫn trả về giá trị zero. Bạn có thể mắc phải một số lỗi được liệt kê bên dưới.

Kiểm tra rằng dữ liệu của bạn đưa vào mạng neural netwok thật sự có ý nghĩa và đúng. Ví dụ, hãy đảm bảo rằng bạn không nhầm lẫn / swap giá trị giữa width và height của hình ảnh, hoặc một lý do nào đó bạn đưa vào một zero image, hoặc bạn chỉ huấn luyện duy nhất một batch (ví dụ dữ liệu bạn lớn, chia làm 10 batch, và code nhầm sao đó chỉ đưa input là batch số 1 vào).

Một trường hợp nữa là khi input và output của bạn chẳng có mối liên hệ gì với nhau, và không cách nào nhận biết rằng nó phụ thuộc nhau bởi vì bản chất của dữ liệu là như vậy, hoặc input của bạn đang có chưa đủ chứng cứ để suy ra output. Một ví dụ của trường hợp này là giá chứng khoáng.

Kiểm tra kỹ dữ liệu train để đảm bảo không có đánh nhãn sai

Kiểm tra xem dữ liệu có bị mất cân bằng không. Hãy sử dụng các kỹ thuật để cân bằng lại dữ liệu.

Đảm bảo rằng trong 1 batch chứa dữ liệu của nhiều hơn 1 nhãn. Hãy xáo trộn ngẫu nhiên dữ liệu để tránh lỗi này.

Bài báo https://arxiv.org/abs/1609.04836 chỉ ra rằng khi bạn huấn luyện mô hình với batch size lớn có thể làm giảm tính tổng quát của mô hình.

Khoá học CS231 đã chỉ ra một lỗi khá phổ biến: “Bất kỳ một quá trình tiền xử lý nào cũng phải thực hiện trên tập train, và sau đó áp dụng vào tập validation,test”. Ví dụ, chúng ta tính trung bình trên toàn bộ dữ liệu, rồi sau đó chia tập dữ liệu thành train, test, predict là không đúng. Hành động đúng là chia tập dữ liệu thành train, test, vali trước, sau đó tính giá trị trung bình trên từng kênh màu trên tập train, rồi mới lấy giá trị trung bình đó áp cho tập test và tập validate.

Một vấn đề khác có thể là “Look for correct loss at chance performance”:

Ví dụ, với tập dữ liệu CIFAR-10 sử dụng softmax classifier, ở lần đầu tiên, giá trị loss mong đợi của chúng ta là 2.303, bởi vì có 1 thằng đúng, 10 thằng sai, xác suất là 110 = 0.1. softmax loss là -ln(0.1) = 2.302.

Với dữ liệu CIFAR-10 dùng SVM, ở lần lặp đầu tiên, giá trị loss chúng ta kỳ vọng là 9 (với mỗi lớp sai, giá trị margin sẽ là 1).

Nếu các giá trị trả ra không giống như mong đợi, vấn đề xảy ra là do giá trị init không đúng.

Một vấn đề nữa là khi tăng giá trị regularization thì cũng đồng thời tăng giá trị loss. => Nếu loss không tăng => có vấn đề.

Bài viết được lược dịch từ https://blog.slavv.com/37-reasons-why-your-neural-network-is-not-working-4020854bd607?fbclid=IwAR1Qj6jJW87oKi_LR7xWMDOMZDTx8xwLZEhCCMuvOw63ztwdD1MknZVjm_Q

Cảm ơn các bạn đã theo dõi. Hẹn gặp bạn ở các bài viết tiếp theo.


Bài viết khác
comments powered by Disqus