Melatih regresi linear dengan gradient descent
Latih model y^=Xw+b dengan full-batch gradient descent pada loss MSE. Mulai dari w = 0 dan b = 0, lakukan tepat steps langkah dengan learning rate lr, lalu kembalikan np.append(w, b).
X = [[1],[2],[3]], y = [2,4,6], lr = 0.1, steps = 1 → [1.8667, 0.8]
X = [[0],[1],[2],[3]], y = [1,3,5,7], lr = 0.05, steps = 2000 → ≈ [2, 1]
Gradien MSE terhadap bobot
Dengan e=Xw+b−y dan L=N1∥e∥2:
∂w∂L=N2X⊤e,∂b∂L=N2i∑eiBentuk X⊤e selalu cocok: (d, N) @ (N,) → (d,), sama dengan bentuk w. Gradien suatu parameter selalu berbentuk sama dengan parameter itu. Ini cara cepat mengecek rumusmu.
Satu langkah training
- Forward: hitung prediksi dan galat.
- Backward: hitung gradien.
- Update:
param -= lr * grad.
Di PyTorch (dan minitorch), langkah 2 dikerjakan loss.backward() dan langkah 3 oleh optimizer.step(). Tapi isinya persis seperti yang kamu tulis di sini.
Solusi tertutup
Regresi linear juga punya solusi langsung w=(X⊤X)−1X⊤y. Kita tetap memakai GD karena GD bisa dipakai untuk model apa pun, termasuk yang tidak punya solusi tertutup.
Penjelasan
Yang diminta. Latih w dan b dari nol dengan tepat steps langkah GD full-batch, lalu kembalikan [w..., b].
Gradiennya. Misalkan galat e=Xw+b−y berbentuk (N,) dan L=N1∑ei2:
- ∂L/∂w=N2X⊤e. Bentuknya
(d, N) @ (N,) → (d,), sama denganw. Setiap komponen wj menerima jumlah galat dikali fitur ke-j. - ∂L/∂b=N2∑iei. Bias memengaruhi setiap prediksi dengan bobot 1.
Langkah di kode (satu iterasi):
- Forward:
err = X @ w + b - y. - Backward + update:
w -= lr * (2/N) * (X.T @ err)danb -= lr * (2/N) * err.sum().
Keduanya memakai err yang sama, yang dihitung sebelum update apa pun. Kalau w di-update dulu lalu err dihitung ulang untuk b, hasilnya berbeda dari GD yang sebenarnya.
Cek satu langkah. X = [[1],[2],[3]], y = [2,4,6], mulai dari 0: err = [-2,-4,-6], ∇w=32(−2−8−18)=−18.67, ∇b=32(−12)=−8. Dengan lr = 0.1, w = 1.867 dan b = 0.8.
Yang dikembalikan: np.append(w, b), array (d + 1,).
Topik
Petunjuk 1
Untuk L = mean((Xw + b − y)²): dL/dw = (2/N) Xᵀ(Xw + b − y) dan dL/db = (2/N) Σ(Xw + b − y).
Petunjuk 2
Hitung err = X @ w + b − y sekali per langkah, lalu perbarui w dan b dari err yang sama.
Nilai ditulis sebagai JSON. Output yang diharapkan dihitung dari solusi referensi.