Layer Linear + ReLU dengan autograd
Implementasikan forward satu layer nn.Linear diikuti ReLU dengan minitorch, lalu hitung gradien terhadap W dan b untuk loss L = out.sum().
W berbentuk (out, in), mengikuti konvensi PyTorch.
x = [[1, 2]], W = [[1, 1]], b = [0] → [[[3]], [[1, 2]], [1]]
Konvensi bentuk nn.Linear
PyTorch menyimpan bobot sebagai (out_features, in_features), sehingga forward-nya x @ W.T + b. Di soal NumPy sebelumnya kita memakai x @ W dengan W: (in, out). Keduanya benar. Yang penting adalah konsisten dan selalu mengecek bentuk.
Membaca gradiennya
Dengan L=∑out, gradien yang datang ke out bernilai 1 semua. ReLU meneruskan 1 hanya di posisi yang aktif, lalu:
dL/db[j]= berapa banyak contoh yang membuat neuronjaktif,dL/dW[j]= jumlah inputxdari contoh-contoh tersebut.
Bandingkan dengan rumus manual di “Backprop jaringan dua layer”. Hasilnya sama persis, tanpa menulis backward sendiri.
Modul
nn.Linear di minitorch hanyalah kelas yang menyimpan weight dan bias sebagai nn.Parameter (tensor dengan requires_grad=True) dan menjalankan baris forward di atas. model.parameters() mengumpulkan semua Parameter supaya bisa diberikan ke optimizer.
Penjelasan
Yang diminta. Forward relu(x @ W.T + b) dengan minitorch, lalu gradien W dan b untuk L = out.sum().
Langkah di kode:
- Bungkus
Wdanbdenganrequires_grad=Truekarena keduanya parameter.xcukuptorch.tensor(x). out = (x @ W.T + b).relu().Wberbentuk(out, in)sepertinn.Lineardi PyTorch, jadi perlu.Tagar(N, in) @ (in, out)cocok.out.sum().backward().return [out, W.grad, b.grad].
Membaca hasilnya. Dengan L=∑out, gradien yang datang ke setiap elemen out adalah 1. ReLU meneruskan 1 hanya di posisi yang aktif. Jadi:
b.grad[j]= banyaknya contoh yang membuat neuronjaktif.W.grad[j]= jumlah inputxdari contoh-contoh itu.
Case 2: neuron ke-0 aktif untuk kedua contoh, jadi b.grad[0] = 2 dan W.grad[0] = [1,-1] + [2,0] = [3,-1]. Neuron ke-2 tidak pernah aktif, jadi gradiennya 0.
Yang dikembalikan: [out (N,out), W.grad (out,in), b.grad (out,)].
Topik
Petunjuk 1
Bentuk W mengikuti PyTorch: (out_features, in_features). Karena itu forward-nya x @ W.T.
Petunjuk 2
Panggil .relu() pada hasil linear, lalu out.sum().backward(). Gradien W dan b ada di .grad.
Nilai ditulis sebagai JSON. Output yang diharapkan dihitung dari solusi referensi.