راه
۳ کیو· خیلی سختپیشرفتهPYTHON۴ ثانیه · ۲۵۶ مگابایت

مشتق‌گیری خودکار کوچک خودتان

loss.backward() در PyTorch چه می‌کند؟ این‌جا یک نسخه‌ی کوچکش را برای عددها می‌سازید.

کلاس Value یک عدد است که یادش می‌ماند از کدام عددها (_parents) ساخته شده. هر عمل یک Value تازه می‌سازد و به آن یک تابع _backward می‌دهد که مشتق رسیده به خروجی را، ضرب در مشتق محلی، به والدها اضافه می‌کند:

  • جمع c=a+bc = a + b: به هر دو والد c.grad اضافه می‌شود.
  • ضرب c=a⋅bc = a \cdot b: به aa مقدار b.data * c.grad و به bb مقدار a.data * c.grad.
  • c=tanh⁡(a)c = \tanh(a): به aa مقدار (1−c2)(1 - c^2) ضرب در c.grad.

backward() همه‌ی گره‌های گراف را به ترتیب توپولوژیک مرتب می‌کند (هر گره بعد از والدهایش)، grad خودِ خروجی را یک می‌گذارد، و _backward گره‌ها را از آخر به اول صدا می‌زند.

مشتق‌ها جمع می‌شوند، نه جایگزین: در d * d هر دو والد یک گره‌اند و مشتقش باید 2d2d شود؛ و هر پارامتر در جمله‌ی همه‌ی نمونه‌ها به کار رفته.

تابع autograd(x, y, p) — که آماده است و به آن دست نزنید — با p = [w1, b1, w2, b2, w3] این زیان را می‌سازد:

hi=tanh⁡(w1xi+b1)L=1n∑i(w2hi+b2+w3xi−yi)2h_i = \tanh(w_1x_i + b_1) \qquad L = \frac{1}{n}\sum_{i}\big(w_2h_i + b_2 + w_3x_i - y_i\big)^2

و [L, dL/dw1, dL/db1, dL/dw2, dL/db2, dL/dw3] را برمی‌گرداند. شما __add__، __mul__، tanh و backward را کامل کنید.

نمونه‌ها

ورودی نمونه ۱
[[0.35, 0.82, 0.33], [0.08, 0.91, 0.41], [-0.43, 0.46, 0.29, 0.24, 0.02]]
خروجی نمونه ۱
[0.1525, -0.0862, -0.0873, -0.0088, -0.2951, -0.2974]

برای نوشتن پاسخ و دریافت امتیاز، ابتدا وارد حساب شوید.

ورود