b belajar.myudak

Autograd pertama dengan minitorch

Mulai sekarang kita memakai minitorch, library mini buatan sendiri yang meniru API PyTorch (import minitorch as torch). Ia berjalan di atas NumPy dan menghitung gradien otomatis.

Hitung

L=∑itanh⁡(xiwi)2L = \sum_i \tanh(x_i w_i)^2

lalu kembalikan [L, dL/dw] dengan memanggil L.backward(). Jangan menurunkan rumusnya sendiri.

x = [1], w = [0]  →  [0.0, [0.0]]

API yang dibutuhkan: torch.tensor(data, requires_grad=True), operator * ** + @, torch.tanh, .sum(), .backward(), .grad, .item().

Apa yang dilakukan autograd

Setiap operasi pada tensor yang requires_grad=True menghasilkan tensor baru yang mengingat operasi dan input-nya. Hasilnya adalah graf komputasi yang dibangun diam-diam selama forward. L.backward() lalu:

  1. mengurutkan graf secara topologis dari L ke belakang,
  2. memanggil fungsi backward lokal setiap operasi (seperti yang kamu tulis manual di N1),
  3. menjumlahkan gradien ke .grad daun-daunnya.

Akumulasi

Karena gradien dijumlahkan, memanggil backward() dua kali tanpa mengosongkan .grad akan menggandakannya. Itu sebabnya setiap training loop memanggil optimizer.zero_grad() sebelum loss.backward().

Mini-torch vs PyTorch

Pyodide tidak bisa menjalankan PyTorch sungguhan. minitorch punya nama dan perilaku yang sama untuk bagian yang kita butuhkan, jadi kode yang kamu tulis di sini hampir bisa langsung dipindah ke PyTorch.

Penjelasan

Yang diminta. Hitung L=∑itanh⁡(xiwi)2L = \sum_i \tanh(x_i w_i)^2 dan gradiennya terhadap w, tapi biarkan minitorch yang menurunkan.

Ide kunci. Tensor dengan requires_grad=True mencatat setiap operasi yang memakainya. Saat L.backward() dipanggil, minitorch berjalan mundur di catatan itu dan memakai aturan rantai seperti yang kamu lakukan manual di N1.

Langkah di kode:

  1. w = torch.tensor(w, requires_grad=True). Hanya w yang ingin kita turunkan.
  2. x = torch.tensor(x) tanpa requires_grad, karena x adalah data.
  3. L = (torch.tanh(x * w) ** 2).sum(): forward biasa. Di balik layar, graf w → x*w → tanh → **2 → sum terbentuk.
  4. L.backward() mengisi w.grad.
  5. return [L.item(), w.grad]. .item() mengubah tensor 1 elemen menjadi float; w.grad sudah berupa array NumPy.

Cek manual. Turunan analitiknya 2tanh⁡(xw) (1−tanh⁡2(xw)) x2\tanh(xw)\,(1 - \tanh^2(xw))\,x. Untuk x = [1], w = [0]: tanh⁡(0)=0\tanh(0) = 0, jadi loss dan gradien sama-sama 0. Untuk x = 3, w = 3: tanh⁡(9)≈1\tanh(9) \approx 1 sehingga loss ≈ 1, tapi gradiennya hampir 0 karena tanh jenuh.

Yang dikembalikan: [float, array (d,)].

Topik
minitorchautogradtensor
Petunjuk 1

Bungkus w dengan torch.tensor(w, requires_grad=True) supaya minitorch mencatat operasi yang memakainya.

Petunjuk 2

Setelah L.backward(), gradiennya ada di w.grad (array NumPy). L.item() mengubah tensor skalar menjadi float.

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.