99% Tập Dữ Liệu Của Tôi Đã Đi Đâu

Tôi đặt mục tiêu xây dựng một tập dữ liệu gồm vài triệu mẫu huấn luyện. Khi pipeline chạy xong, nó trả về cho tôi vỏn vẹn vài phần trăm con số đó — một tỉ lệ nhỏ đến mức trông như một lỗi đánh máy. Không có gì bị sập cả. Không có lỗi nào được kích hoạt. Dữ liệu không phải đã thất bại trong việc sinh ra; nó đã lặng lẽ vứt bỏ gần như toàn bộ chính mình, rồi báo cáo thành công.

Con số nhỏ đến mức không thể đúng được

Điều kỳ lạ về loại lỗi này là nó không tự thông báo về mình. Một pipeline bị sập thì ồn ào. Một pipeline lặng lẽ tạo ra quá ít dữ liệu thì chỉ đơn giản là chạy xong, đưa cho bạn một tệp tin, và chờ bạn để ý ra. Nếu tôi không tình cờ nhớ được đại khái mình kỳ vọng bao nhiêu mẫu, có lẽ tôi đã huấn luyện trên những kẻ sống sót và chẳng bao giờ biết rằng phần còn lại đã biến mất.

Triệu chứng duy nhất là một con số đếm bị lệch gần hai bậc độ lớn. Và một con số đếm bị sai là một trong những triệu chứng dễ bị bỏ qua nhất trên đời, bởi vì một con số nhỏ hơn kỳ vọng vẫn trông như một con số thật. Nó không có cảm giác như một lỗi. Nó có cảm giác như một kết quả.

”Sao lại ít thế?” là một loại lỗi thực sự

Chúng ta được rèn luyện để gỡ những thứ bị hỏng. Chúng ta tệ hơn nhiều trong việc gỡ những thứ chỉ đơn giản là vắng mặt — dữ liệu lẽ ra phải tồn tại nhưng lại không, những mẫu lẽ ra phải được tạo ra nhưng chưa từng được tạo. Không có stack trace cho một con đường không được đi. Pipeline đã làm đúng y những gì tôi bảo nó làm; chỉ có điều hóa ra những gì tôi bảo nó làm đã loại bỏ phần lớn đầu vào trên đường đi.

Dữ liệu đã đi đâu

Nguyên nhân thì mộc mạc đến mức gần như đáng xấu hổ. Ở đâu đó trong quá trình, tôi đang bước qua dòng thời gian bằng những sải dài — nhìn vào một thời điểm, rồi nhảy qua một khoảng trống dài tới thời điểm tiếp theo, rồi lại nhảy tiếp. Mỗi vị trí mà tôi bước qua là một mẫu tiềm năng chưa từng được xem xét và chưa từng được tạo ra. Tôi đã đặt sải bước đó từ sớm, vì một lý do mà giờ tôi không còn nhớ nữa, rồi quên béng mất là nó vẫn còn ở đó.

Vậy nên tập dữ liệu không hề bị hỏng, hay bị lọc, hay bị làm sạch bớt. Nó chỉ đơn giản là chưa từng được nhìn đến một cách trọn vẹn. Tuyệt đại đa số dữ liệu sẵn có nằm cách sải bước của vòng lặp đúng một bước, chưa được chạm tới, trong khi pipeline diễu qua nó và báo cáo rằng nó đã xong.

Mất mát thầm lặng là loại nguy hiểm

Đây là phần mà tôi cứ quay đi quay lại. Một thất bại ồn ào là một món quà: nó dừng bạn lại, chỉ tay vào chính mình, và đòi hỏi sự chú ý. Một mất mát thầm lặng chẳng cho bạn thứ gì trong số đó. Nó tạo ra đầu ra trông có vẻ hợp lý, chạy mà không một lời than phiền, và lặng lẽ thay đổi nền móng mà mọi thứ ở phía sau được xây dựng trên đó. Bạn có thể huấn luyện một mô hình, đánh giá nó, và rút ra kết luận từ nó, tất cả đều đặt trên một tập dữ liệu mà thực ra chỉ là một mảnh nhỏ tí xíu, không đại diện, của thứ bạn tưởng mình đang có.

Cái nguy hiểm không chỉ nằm ở chỗ con số bị sai. Nó nằm ở chỗ con số bị sai mà hệ thống lại hài lòng về điều đó — mọi thứ đều xanh, mọi thứ đều đang chạy, mọi thứ đều được dựng trên một nền tảng đã phản bội bạn ngay từ bước đầu tiên.

Cách sửa: xem xét tất cả, rồi chọn cái để giữ

Việc sửa chữa là ngừng nhảy cóc. Thay vì sải qua dòng thời gian và chỉ kiểm tra những điểm mà tôi tình cờ đáp xuống, tôi cho quá trình xem xét lần lượt từng vị trí — và rồi biến quyết định về việc giữ cái gì thành một bộ lọc tường minh, có chủ đích thay vì một sản phẩm phụ tình cờ của một bước lấy mẫu. Dữ liệu mà tôi loại bỏ, giờ tôi loại bỏ một cách cố ý, vì một lý do mà tôi có thể nói ra thành lời. Dữ liệu mà tôi giữ lại, tôi giữ vì tôi đã thực sự nhìn vào nó.

Tập dữ liệu quay trở lại gần với kích thước mà lẽ ra nó phải có. Không có gì khôn khéo khiến điều đó xảy ra. Tôi chỉ đơn giản là đã ngừng vứt bỏ dữ liệu mà không hề có ý định đó.

Phép kiểm tra rẻ nhất trong công việc dữ liệu

Bài học gần như đơn giản đến mức không có cảm giác là một bài học: hãy so sánh kích thước bạn kỳ vọng với kích thước bạn nhận được. Đó là một phép kiểm tra tỉnh táo rẻ tiền mà tôi đã sử dụng quá ít một cách tệ hại, và nó lẽ ra đã bắt được lỗi này trong vài giây. Một khoảng cách lớn giữa lượng dữ liệu tôi tưởng mình cólượng dữ liệu thực sự tồn tại xứng đáng được đối xử như một lỗi — kể cả, đặc biệt là, khi chẳng có gì sập để báo cho bạn biết điều đó.

Giờ đây, điều đầu tiên tôi làm với bất kỳ tập dữ liệu nào không phải là nhìn vào nội dung của nó. Mà là nhìn vào số đếm của nó, và tự hỏi liệu con số đó có hợp lý nổi hay không. Nhiều vấn đề dữ liệu tồi tệ nhất mà tôi từng gặp không hề làm hỏng dữ liệu. Chúng chỉ lặng lẽ tạo ra ít hơn so với những gì tôi tin tưởng, và để tôi xây dựng trên phần chênh lệch đó.

Một pipeline làm mất phần lớn dữ liệu của bạn mà không cao giọng thì không phải đang bị sập — nó đang chạy đúng y như được viết, và vẫn làm sai. Lỗi chưa bao giờ là một trục trặc trong cỗ máy. Nó nằm trong khoảng cách giữa những gì tôi giả định và những gì tôi chịu khó kiểm tra.

— Không tín hiệu, không lợi nhuận, không phải lời khuyên đầu tư.