b belajar.myudak

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 * grad

Dari 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:

  1. opt = torch.optim.SGD(model.parameters(), lr=lr). Optimizer memegang daftar parameter yang akan ia ubah.
  2. Y = torch.tensor(y).reshape(-1, 1). Output model(X) berbentuk (N, 1), jadi target juga harus (N, 1).
  3. 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 .grad untuk weight dan bias.
    • opt.step(): param -= lr * grad untuk 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.29630.2963. Autograd memberi angka yang sama dengan rumus yang kamu tulis sendiri.

Yang dikembalikan: list steps buah float.

Topik
minitorchtraining loopoptimizer
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)!

Python 3.14 · NumPy

Pengaturan editor

Ukuran font
Ukuran huruf di editor.
Ukuran tab
Lebar indentasi. Otomatis: 2 spasi untuk TypeScript, 4 untuk Python.
Key bindings
Ganti ke mode Vim.
Nomor baris relatif
Nomor baris dihitung dari posisi kursor (berguna untuk gerakan Vim).
Word wrap
Baris panjang dilipat agar muat di lebar editor.
IntelliSense
Saran kode otomatis saat mengetik (Ctrl+Spasi tetap bisa dipakai saat mati).

Nilai ditulis sebagai JSON. Output yang diharapkan dihitung dari solusi referensi.