Ke Mana Perginya 99% Dataset Saya
Saya berniat membangun sebuah dataset berisi beberapa juta contoh pelatihan. Ketika pipeline-nya selesai, ia memberi saya beberapa persen dari itu — pecahan yang begitu kecil sampai terlihat seperti salah ketik. Tidak ada yang crash. Tidak ada error yang muncul. Datanya tidak gagal dihasilkan; ia diam-diam membuang hampir seluruh dirinya sendiri, lalu melaporkan keberhasilan.
Angka yang terlalu kecil untuk benar
Hal aneh tentang jenis bug ini adalah bahwa ia tidak mengumumkan dirinya sendiri. Pipeline yang crash itu berisik. Pipeline yang diam-diam menghasilkan terlalu sedikit hanya selesai, menyerahkan sebuah file kepada Anda, dan menunggu Anda menyadarinya. Seandainya saya tidak kebetulan ingat kira-kira berapa banyak contoh yang saya harapkan, mungkin saya akan melatih model pada para penyintas dan tidak pernah tahu bahwa sisanya telah hilang.
Satu-satunya gejala adalah jumlah yang meleset hampir dua orde besaran. Dan jumlah yang salah adalah salah satu gejala paling mudah di dunia untuk dilewatkan begitu saja, karena angka yang lebih kecil dari harapan tetap terlihat seperti angka sungguhan. Ia tidak terasa seperti sebuah error. Ia terasa seperti sebuah hasil.
”Kenapa cuma segini sedikit?” adalah sebuah kelas bug yang nyata
Kita dilatih untuk men-debug hal-hal yang rusak. Kita jauh lebih buruk dalam men-debug hal-hal yang sekadar tidak ada — data yang seharusnya eksis tapi tidak, contoh yang seharusnya tercipta tapi tidak pernah ada. Tidak ada stack trace untuk jalan yang tidak diambil. Pipeline-nya melakukan persis apa yang saya perintahkan; ternyata saja apa yang saya perintahkan untuk dilakukannya itu membuang sebagian besar input di sepanjang jalan.
Ke mana data itu pergi
Penyebabnya nyaris memalukan saking biasanya. Di suatu tempat dalam proses itu, saya menelusuri linimasa dengan langkah-langkah besar — melihat satu momen, lalu melompati jeda yang panjang ke momen berikutnya, lalu melompat lagi. Setiap posisi yang saya lewati adalah sebuah potensi contoh yang tidak pernah diperiksa dan tidak pernah tercipta. Saya telah menetapkan langkah itu di awal, untuk sebuah alasan yang sudah tidak saya ingat lagi, lalu lupa bahwa ia ada di sana.
Jadi dataset itu tidak rusak, atau tersaring, atau dibersihkan hingga menyusut. Ia sekadar tidak pernah benar-benar dilihat sepenuhnya. Mayoritas besar dari data yang tersedia terduduk satu langkah di luar jangkauan langkah loop, tak tersentuh, sementara pipeline berbaris melewatinya dan melaporkan bahwa ia sudah selesai.
Kehilangan senyap adalah jenis yang berbahaya
Inilah bagian yang terus saya pikirkan kembali. Kegagalan yang berisik adalah sebuah hadiah: ia menghentikan Anda, menunjuk pada dirinya sendiri, dan menuntut perhatian. Kehilangan yang senyap tidak memberi Anda satu pun dari itu. Ia menghasilkan output yang terlihat masuk akal, berjalan tanpa keluhan, dan diam-diam mengubah fondasi yang menjadi landasan semua hal di hilir. Anda bisa melatih sebuah model, mengevaluasinya, dan menarik kesimpulan darinya, semuanya di atas sebuah dataset yang diam-diam hanyalah serpihan kecil yang tidak representatif dari apa yang Anda kira Anda miliki.
Bahayanya bukan hanya bahwa angkanya salah. Bahayanya adalah bahwa angkanya salah dan sistemnya senang dengan itu — semua hijau, semua berjalan, semua terbangun di atas landasan yang mengkhianati Anda di langkah yang paling pertama.
Perbaikannya: periksa segalanya, lalu pilih apa yang disimpan
Perbaikannya adalah berhenti melompat. Alih-alih melangkahi linimasa dan hanya memeriksa titik-titik yang kebetulan saya darati, saya membuat proses itu mempertimbangkan setiap posisi secara bergiliran — lalu menjadikan keputusan tentang apa yang disimpan sebagai sebuah filter yang eksplisit dan disengaja, bukan produk sampingan yang tak sengaja dari sebuah langkah sampling. Data yang saya buang, kini saya buang dengan sengaja, untuk sebuah alasan yang bisa saya ucapkan keras-keras. Data yang saya simpan, saya simpan karena saya memang benar-benar telah melihatnya.
Dataset itu kembali mendekati ukuran yang seharusnya. Tidak ada hal pintar yang membuat itu terjadi. Saya sekadar telah berhenti membuang data tanpa bermaksud demikian.
Pengecekan termurah dalam pekerjaan data
Pelajarannya hampir terlalu sederhana untuk terasa seperti sebuah pelajaran: bandingkan ukuran yang Anda harapkan dengan ukuran yang Anda dapatkan. Itu adalah sebuah pemeriksaan kewarasan yang murah yang telah terlalu jarang saya gunakan, dan ia akan menangkap masalah ini dalam hitungan detik. Selisih besar antara berapa banyak data yang saya kira saya miliki dan berapa banyak data yang sebenarnya ada layak diperlakukan sebagai sebuah bug — bahkan, terutama, ketika tidak ada yang crash untuk memberi tahu Anda.
Kini, hal pertama yang saya lakukan dengan dataset apa pun bukanlah melihat isinya. Melainkan melihat jumlahnya, dan bertanya apakah angka itu bahkan masuk akal. Banyak dari masalah data terburuk yang pernah saya alami tidak merusak datanya. Mereka hanya diam-diam menghasilkannya lebih sedikit dari yang saya yakini, dan membiarkan saya membangun di atas selisihnya.
Sebuah pipeline yang kehilangan sebagian besar data Anda tanpa menaikkan suaranya bukanlah sedang crash — ia berjalan persis seperti yang ditulis, dan tetap saja melakukan hal yang salah. Bug-nya tidak pernah merupakan kesalahan pada mesinnya. Ia ada di celah antara apa yang saya asumsikan dan apa yang saya repotkan untuk memeriksa.
— Tidak ada sinyal, tidak ada imbal hasil, bukan nasihat investasi.