+1

[MLE - 03] Where should we experience ?

Chào các bạn! Trong bài viết trước chúng ta đã hiểu được tầm quan trọng của "tấm bia" và "thước" trong quá trình phát triển một dự án sử dụng Machine Learning. Hôm nay chúng ta sẽ tìm hiểu về "tấm bia" này nhé ! "Tấm bia" là nơi ta thực hiện việc đo đạc performance của hệ thống, độ chính xác của nó, tốt như thế nào, liệu mô hình có quá phức tạp hay quá đơn giản không ? Vậy nên "tấm bia" này chính là các tập dữ liệu (Chú ý rằng tập dữ liệu ở đây không phải là các tập dữ liệu khác nhau cho những bài toán khác nhau mà là các tập dữ liệu của cùng một nội dung, cùng một bài toán, cùng một vấn đề). Hãy điểm qua những tập dữ liệu điển hình trong Machine Learning.

1. Training set:

Khỏi phải giới thiệu, chỉ với cái tên của nó các bạn đã biết nó dùng cho mục đích gì. Đây là tập dữ liệu các bạn sử dụng trong quá trình training và thường xuyên được dùng để đo đếm nhiều vấn đề trong mô hình bạn đang làm. Nói cách khác, đây chính là sách vở, bài tập bạn học trong quá trình chuẩn bị cho kì thi. Nếu các bạn học chăm học và đủ trí nhớ và thông minh để học hết được những sách vở, bài tập đó thì việc thi những bài tập hay kiến thức trong đó hoàn toàn không phải là vấn đề. Khi ta đo performance của mô hình trên tập dữ liệu này, nếu độ chính xác thấp, sai số lớn thì không phải bàn cãi gì cả, bạn thực sự học "dốt". Nhưng liệu performance tốt thì bạn có "giỏi không" ? Xin trả lời bạn rằng là chúng ta không chắc ! Giả dụ như khi học bài, bạn chỉ đơn thuần ... học thuộc lòng chúng, hay nói cách khác bạn học vẹt! Với bài tập đã học, với nội dung có trong cuốn sách bạn học thuộc, bạn có thể trả lời "vanh vách" như sách vậy. Nhưng nếu như bài tập hơi khác một chút, kiến thức cần suy luận một chút, có thể bạn sẽ dễ dàng bị "bó tay". Nói một cách khác quá trình học của bạn đã trở nên quá máy móc, dập khuôn, bạn không có khả năng ứng dụng những gì mình đã học. Đây chính là vấn đề của khi mô hình của bạn quá phức tạp, chúng có thể hoàn toàn "học vẹt" toàn bộ dữ liệu của bạn mà lại không thể "hiểu" được cái "kiến thức" trong tập dữ liệu bạn cho nó, vấn đề này được gọi "Overfitting", nó trái ngược với khi bạn "học dốt" - được gọi là "Underfitting".

2. Dev set: (Validation set or Cross Validation set)

Vậy là với Training set, bạn có thể biết được mình có "học dốt" hay Underfitting hay không ? Còn bạn không thể xác định được rằng mình có học máy móc hay không hay có bị Overfitting hay không ? Đó là lý do chúng ta cần thêm một tập dữ liệu khác để xem mô hình có thực sự "học" được gì không ! Dev set là tập dữ liệu các bạn dùng để kiểm tra sai số của mô hình sau khi biết chắc nó tốt trên Training set, hay nó không bị Underfitting. Nếu như mô hình của bạn bị Overfitting, sai số trên Dev set của nó sẽ lớn. Nếu các bạn thắc mắc sai số ở đây là gì thì đó chính là thước đo của bạn, vậy nên đừng vội quan tâm tới nó ở đây. Tôi xin giải thích một chút về hình vẽ trên.

  • Trục tung (Trục có kí hiệu "error") là trục thể hiện sai số của mô hình trên Training set và Dev set. Chẳng hạn như tỉ lệ đoán sai của mô hình là bao nhiêu ( = 100% - độ chính xác).
  • $ J_{train} $ là sai số của mô hình khi dự đoán trên Training set.
  • $ J_{dev} $ là sai số của mô hình khi dự đoán trên Dev set.
  • Trục hoành (Trục không có kí hiệu) là trục thể hiện thay đổi của chúng ta đối với mô hình. Những thay đổi này thuộc về phạm vi của phần "Implement" nên tôi sẽ không nói rõ ở đây, chẳng hạn như chúng là việc ta thêm bớt các thành phần Regularization như weight decay, Drop-out hay việc mở rộng mô hình như tăng số lượng unit trong layer, tăng số lượng layer, hay thay đổi các hyperparameter nói chung.
  • Phần nét đứt bên dưới có chữ "Overfitting" cho thấy $ J_{train} $ nhỏ nhưng $ J_{dev} $ lại lớn, tức là sai số trên Training set thấp nhưng trên Dev set lại cao, một dấu hiệu của "Overfitting".
  • Phần nét đứt bên dưới có chữ "Underfitting" cho thấy $ J_{train} $ lớn và $ J_{dev} $ cũng lớn, tức là sai số trên Training set và Dev set đều cao, dấu hiệu rõ ràng của "Underfitting" Đôi khi vì Dev set nhỏ nên dẫn tới việc ta dễ dàng điều chỉnh mô hình để cho sai số trên Dev set nhỏ, trong trường hợp này có thể chỉ test trên Training set và Dev set cũng không xác định được. Tuy nhiên nếu như các bạn có Dev set đủ lớn thì chuyện này không thành vấn đề, nhưng để cho chắc chắn, tôi khuyên các bạn nên có thêm 1 tập dữ liệu nữa.

3. Test set:

Ta đã có Training set, đã có Dev set. Mặc dù chỉ Training set tham gia vào quá trình training, nhưng Dev set lại đóng vai trò quan trọng trong việc điều chỉnh mô hình, vì vậy nên ta vẫn nên có một tập dữ liệu biệt lập hoàn toàn với 2 tập trên để phục vụ mục đích kiểm tra performance thực sự của mô hình. Nếu Dev set của bạn đủ lớn, bạn có thể bỏ qua tập dữ liệu này, nhưng tôi khuyến khích các bạn nên có, vì liệu ta có biết thế nào là đủ "lớn" 😃

4. Human Level:

Không phải lúc nào các vấn đề Machine Learning xử lý, con người cũng xử lý tốt, tuy nhiên các tác vụ ngày nay chúng ta muốn các mô hình Machine Learning thay thế lại phần lớn được con người thực hiện rất tốt. Chẳng hạn như nhận diện vật thể, khuôn mặt, xử lý ngôn ngữ tự nhiên,... Ngay bản thân con người với nhau, các tác vụ cũng có độ chính xác khác nhau, như người thường nhìn tấm chụp X-ray có thể nhận ra được xương bị gãy, nhưng bác sĩ chuyên khoa có thể nhận ra xương của bạn bị rạn hay vấn đề tiềm tàng nào đó. Vậy nên việc xác định Human Level ở đây cũng không hề đơn giản, có thể cần tới sự trợ giúp của các chuyên gia, hay tốn kém tiền bạc. Không nói đến chuyện xác định được Human Level, giả như khi có nó chúng ta dùng để làm gì ? Con người không hoàn hảo, nhưng đó là những gì tốt nhất hiện nay ta có, nên với những tác vụ mà con người làm tốt, thường không có gì làm tốt hơn thế, hoặc dẫu có chỉ hơn chút xíu. Ý tôi muốn nói ở đây, độ chính xác "hoàn hảo" mà ta nhắm tới trong nhiều dự án Machine Learning lại chính là độ chính xác của con người. Nếu như trên Training set, độ chính xác của bạn đạt tới 95% và bạn nghĩ đó là tín hiệu tốt nhưng con người có thể đạt tới 99.99%, tức là sai số giữa mô hình của ta với con người là ~ 4.99% (hay mô hình bị Underfitting so với con người). Bên cạnh đó ta cũng xác định được rằng mô hình đang bị Overfitting với độ chính xác trên Dev set chỉ là 91% (Sai khác giữa Training set và Dev set là 4%). Lúc này bạn sẽ vội vã điều chỉnh mô hình để giảm Overfitting hay tiếp tục làm nó phức tạp hơn để tránh Underfitting (Đôi khi người ta gọi trường hợp Underfitting này là Avoidable Bias - phần Underfitting bạn còn có thể tránh được để vươn tới độ chính xác hoàn hảo hay Bayes Error) ? Câu trả lời tuỳ thuộc vào resource các bạn có, tốc độ các bạn cần, hay những yêu cầu dự án cần thoả mãn. Tôi sẽ không đi quá sâu trong bài viết này. Hẹn gặp lại các bạn trong bài viết tiếp theo 😃 Tài liệu tham khảo: http://www.deeplearning.org/


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí