Split train/val sebelum membuat jendela
Bagi urutan token menjadi bagian train dan validasi lalu buat jendela di masing-masing bagian:
n = int(len(ids) * (1 - val_frac)),train = ids[:n],val = ids[n:].- Dari setiap bagian, buat semua jendela input
s[i : i + block]denganidari0sampailen(s) - block - 1(sepertiXdi soal sebelumnya).
Kembalikan [X_train, X_val].
ids = [1..10], block = 2, val_frac = 0.4 → train = [1..6], val = [7, 8, 9, 10]
X_train = [[1,2], [2,3], [3,4], [4,5]]
X_val = [[7,8], [8,9]]
Kebocoran data
Kalau jendela dibuat dulu lalu diacak dan dibagi, jendela [5, 6, 7] bisa masuk train sementara [6, 7, 8] masuk validasi. Keduanya hampir identik, jadi loss validasi terlihat bagus padahal model hanya menghafal. Validasi yang bocor membuatmu salah memilih ukuran model, lama training, dan hyperparameter.
Aturannya: potong dulu, baru proses. Untuk teks, ambil bagian awal sebagai train dan bagian akhir sebagai validasi, tanpa ada jendela yang melintasi batas keduanya.
Membaca kurva loss
- train turun, val turun: model masih belajar.
- train turun, val naik: overfitting. Hentikan training (early stopping), tambah data, atau tambah regularisasi (dropout, weight decay).
- keduanya tinggi: model terlalu kecil atau training belum cukup lama (underfitting).
Penjelasan
Yang diminta. Potong urutan token menjadi train dan val dulu, baru buat jendela di masing-masing potongan.
Langkah di kode:
n = int(len(ids) * (1 - val_frac)): batas potong.train, val = ids[:n], ids[n:]: dua potongan yang bersambung, tanpa diacak.windows = lambda s: [s[i : i + block] for i in range(len(s) - block)], diterapkan ke masing-masing potongan.
Kenapa urutannya penting. Jendela yang bertetangga hampir identik: [5, 6, 7] dan [6, 7, 8] berbagi dua token. Jika jendela dibuat dari seluruh urutan lalu diacak ke train/val, val berisi jendela yang hampir sama dengan yang ada di train. Loss validasi jadi terlalu optimis, karena model cukup menghafal. Dengan memotong dulu, tidak ada jendela yang melintasi batas.
Cek case 1. 10 token, val_frac = 0.4, jadi n = 6. Train [1..6] memberi 4 jendela; val [7, 8, 9, 10] memberi 2 jendela. Jendela [6, 7] yang melintasi batas tidak ada di keduanya.
Yang dikembalikan: [X_train, X_val]. Salah satunya boleh kosong jika potongannya terlalu pendek.
Topik
Petunjuk 1
Bagi urutan token menjadi dua potong yang bersambung: 90% awal untuk train, sisanya untuk val. Jangan diacak.
Petunjuk 2
Baru setelah itu buat jendela di masing-masing potongan. Jendela tidak boleh melintasi batas train/val.
Nilai ditulis sebagai JSON. Output yang diharapkan dihitung dari solusi referensi.