データセットの99%はどこへ消えたのか
数百万件の訓練サンプルからなるデータセットを作ろうとしていた。パイプラインが終わったとき、手元に渡されたのはそのうちのほんの数パーセント——タイプミスかと思うほど小さな割合だった。何もクラッシュしていない。エラーも一つも出ていない。データの生成に失敗したわけではなく、自分自身のほとんどを静かに捨て去り、そして成功したと報告してきたのだ。
正しいはずがないほど小さかった数字
この種のバグの奇妙なところは、自分から名乗り出ないことだ。クラッシュするパイプラインは騒がしい。あまりに少ない量を静かに吐き出すだけのパイプラインは、ただ終わり、ファイルを手渡し、あなたが気づくのを待つ。期待していたサンプル数がおおよそどれくらいだったかをたまたま覚えていなかったら、生き残った分で訓練し、残りが消えていたことに一生気づかなかったかもしれない。
唯一の兆候は、ほぼ二桁ずれた件数だった。そして件数が間違っているというのは、世界で最も見過ごしやすい兆候の一つだ。なぜなら、期待より小さい数でも依然として本物の数に見えるからだ。それはエラーには感じられない。結果に感じられるのだ。
「なぜこんなに少ないんだ?」は立派なバグの一種である
私たちは壊れるものをデバッグするよう訓練されている。だが、ただ存在しないものをデバッグするのははるかに苦手だ——存在すべきなのに存在しないデータ、作られるべきだったのに一度も作られなかったサンプル。通らなかった道に対するスタックトレースは存在しない。パイプラインは私が命じたことを正確に実行した。ただ、私が命じた内容が、途中で入力の大半を捨てるものだったというだけだ。
データはどこへ行ったのか
原因は、ほとんど恥ずかしくなるほど平凡だった。プロセスのどこかで、私はタイムラインを大股で進んでいた——ある瞬間を見て、長い間隔を飛ばして次へ、そしてまた飛ばす。飛び越えたすべての位置が、一度も検査されず一度も作られなかった潜在的なサンプルだった。その歩幅はもう思い出せない理由で早い段階に設定し、そしてそこにあることを忘れていた。
つまりデータセットは、破損していたわけでも、フィルタされていたわけでも、クリーニングで削られていたわけでもない。ただ一度も完全に見られなかったのだ。利用可能なデータの圧倒的大半は、ループの歩幅から一歩外れたところに手つかずで横たわり、その傍らをパイプラインが行進し、終わったと報告したのだった。
静かな損失こそが危険な種類だ
ここが、私が何度も立ち返る部分だ。騒がしい失敗は贈り物である。それはあなたを止め、自らを指し示し、注意を要求する。静かな損失はそのどれも与えてくれない。もっともらしく見える出力を生み出し、文句一つ言わずに走り、下流のすべてが築かれる土台を静かに変えてしまう。モデルを訓練し、評価し、そこから結論を導く——そのすべてを、自分が手にしていると思っていたものの、密かに小さく偏った一片にすぎないデータセットの上で行えてしまうのだ。
危険なのは、数字が間違っていることだけではない。数字が間違っていてなおかつシステムがそれに満足していること——すべてが緑、すべてが稼働中、すべてが最初の一歩であなたを裏切った土台の上に築かれているのだ。
修正:すべてを検査し、それから何を残すかを選ぶ
修復とは、飛ばすのをやめることだった。タイムラインを大股で渡り、たまたま着地した点だけを調べる代わりに、プロセスに一つひとつの位置を順に検討させた——そして何を残すかの判断を、サンプリング工程の偶発的な副産物ではなく、明示的で意図的なフィルタにした。捨てたデータは、声に出して言える理由があって意図的に捨てるようになった。残したデータは、実際に見たうえで残した。
データセットは、本来あるべきサイズに近いところまで戻ってきた。賢いことは何一つしていない。ただ、意図せずデータを捨てるのをやめただけだ。
データ作業で最も安価なチェック
その教訓は、教訓と呼ぶには単純すぎるほどだ。期待したサイズと、得られたサイズを比べること。それは安価な健全性チェックであり、私はそれをひどく使いこなせていなかった。これがあれば数秒でこの問題を捕まえられただろう。自分が持っていると思っていたデータ量と実際に存在するデータ量の間の大きな隔たりは、バグとして扱われるに値する——何もクラッシュしてそれを教えてくれないときでさえ、いやそういうときこそなおさらだ。
いまや、どんなデータセットでも私が最初にすることは、その中身を見ることではない。その件数を見て、その数字がそもそも妥当なのかを問うことだ。私が経験した最悪のデータ問題の多くは、データを破損させはしなかった。ただ静かに、信じていたよりも少ない量しか生み出さず、その差分の上に私を構築させたのだ。
声を荒げることなくデータの大半を失うパイプラインは、クラッシュしているのではない——書かれたとおりに正確に走り、それでいて間違ったことをしている。バグは決して機械の故障ではなかった。それは、私が前提としたことと、私がわざわざ確認したことの間の隔たりにあったのだ。
— シグナルもリターンもなし、投資助言ではありません。