Training loop: overfit satu batch
Lengkapi training loop standar PyTorch untuk model nn.Linear(d, 1) dengan loss MSE dan optimizer SGD. Kembalikan list loss di setiap langkah, dicatat sebelum step().
X = [[1],[2],[3]], y = [2,4,6], lr = 0.1, steps = 3
→ [18.6667, 0.2963, 0.0734] // turun cepat
lr = 0.3 → [18.67, 100.8, 545.9, ...] // learning rate terlalu besar: meledak
Bobot awal sengaja diset ke nol supaya hasilnya deterministik. Ini model yang sama dengan “Melatih regresi linear”, jadi kamu bisa membandingkan hasilnya.
Lima baris yang selalu sama
for batch in data:
opt.zero_grad() # 1. kosongkan gradien lama
pred = model(x) # 2. forward
loss = loss_fn(pred, y) # 3. loss
loss.backward() # 4. backward: isi .grad semua parameter
opt.step() # 5. update: param -= lr * gradDari regresi linear sampai GPT, lima baris ini tidak berubah. Yang berubah hanya model, loss_fn, dan optimizer-nya.
Overfit satu batch dulu
Sebelum melatih pada seluruh dataset, cobalah membuat model menghafal satu batch kecil sampai loss mendekati 0. Kalau tidak bisa, ada bug di model, loss, atau loop-mu, dan menambah data tidak akan menolong. Ini sanity check paling murah dan paling berguna di ML.
Jebakan bentuk
model(X) berbentuk (N, 1) sedangkan y berbentuk (N,). Pengurangan (N, 1) - (N,) di-broadcast menjadi (N, N): kodenya berjalan tanpa error, tapi loss-nya salah. Ingat soal broadcasting di P0.
Penjelasan
Yang diminta. Lima baris training loop PyTorch, diulang steps kali, sambil mencatat loss sebelum setiap update.
Langkah di kode:
opt = torch.optim.SGD(model.parameters(), lr=lr). Optimizer memegang daftar parameter yang akan ia ubah.Y = torch.tensor(y).reshape(-1, 1). Outputmodel(X)berbentuk(N, 1), jadi target juga harus(N, 1).- Di setiap langkah:
opt.zero_grad(): hapus gradien dari langkah sebelumnya. Gradien diakumulasi, jadi tanpa ini mereka menumpuk.loss = ((model(X) - Y) ** 2).mean(): forward dan loss.loss.backward(): isi.graduntukweightdanbias.opt.step():param -= lr * graduntuk setiap parameter.losses.append(loss.item()).
Jebakan bentuk. Kalau memakai y berbentuk (N,), (N, 1) - (N,) di-broadcast menjadi (N, N). Kode tetap berjalan tanpa error, tapi loss-nya salah. Ini bug ML yang sangat umum.
Cek silang. Model dan data di case pertama sama dengan soal “Melatih regresi linear”. Setelah satu langkah, w = 1.867 dan b = 0.8, persis seperti versi manual, sehingga loss kedua 0.2963. Autograd memberi angka yang sama dengan rumus yang kamu tulis sendiri.
Yang dikembalikan: list steps buah float.
Topik
Petunjuk 1
opt = torch.optim.SGD(model.parameters(), lr=lr). Satu langkah: opt.zero_grad(), loss.backward(), opt.step().
Petunjuk 2
Output model berbentuk (N, 1), jadi ubah y menjadi (N, 1) dengan reshape(-1, 1). Tanpa itu, broadcasting membuat (N, N)!
Nilai ditulis sebagai JSON. Output yang diharapkan dihitung dari solusi referensi.