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=i∑tanh(xiwi)2lalu 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:
- mengurutkan graf secara topologis dari
Lke belakang, - memanggil fungsi backward lokal setiap operasi (seperti yang kamu tulis manual di N1),
- menjumlahkan gradien ke
.graddaun-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)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:
w = torch.tensor(w, requires_grad=True). Hanyawyang ingin kita turunkan.x = torch.tensor(x)tanparequires_grad, karenaxadalah data.L = (torch.tanh(x * w) ** 2).sum(): forward biasa. Di balik layar, grafw → x*w → tanh → **2 → sumterbentuk.L.backward()mengisiw.grad.return [L.item(), w.grad]..item()mengubah tensor 1 elemen menjadifloat;w.gradsudah berupa array NumPy.
Cek manual. Turunan analitiknya 2tanh(xw)(1−tanh2(xw))x. Untuk x = [1], w = [0]: tanh(0)=0, jadi loss dan gradien sama-sama 0. Untuk x = 3, w = 3: tanh(9)≈1 sehingga loss ≈ 1, tapi gradiennya hampir 0 karena tanh jenuh.
Yang dikembalikan: [float, array (d,)].
Topik
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.
Nilai ditulis sebagai JSON. Output yang diharapkan dihitung dari solusi referensi.