
2-Layer MLP Forward/Backward [medium]
v1 Linear backward 는 단일 층. 실제 신경망은 여러 층 + 활성함수. 2-layer MLP forward/backward 를 한 함수에서 계산하는 것이 이번 문제.
구조
h &= X W_1 + b_1 \\
a &= \text{ReLU}(h) \\
\hat y &= a W_2 + b_2 \\
L &= \frac{1}{N} \|\hat y - y\|_F^2
\end{aligned}$$
## Backward (chain rule)
MSE gradient:
$$\frac{\partial L}{\partial \hat y} = \frac{2}{N} (\hat y - y)$$
Linear (layer 2):
$$dW_2 = a^\top \cdot \frac{\partial L}{\partial \hat y}, \quad db_2 = \sum_n \frac{\partial L}{\partial \hat y_n}, \quad \frac{\partial L}{\partial a} = \frac{\partial L}{\partial \hat y} \cdot W_2^\top$$
ReLU backward:
$$\frac{\partial L}{\partial h} = \frac{\partial L}{\partial a} \cdot \mathbb{1}[h > 0]$$
Linear (layer 1):
$$dW_1 = X^\top \cdot \frac{\partial L}{\partial h}, \quad db_1 = \sum_n \frac{\partial L}{\partial h_n}$$
## 과제
함수 `mlp_forward_backward(X, W1, b1, W2, b2, y)` 를 완성하세요.
- `X` shape `(N, D_in)`, `W1` `(D_in, H)`, `b1` `(H,)`, `W2` `(H, D_out)`, `b2` `(D_out,)`, `y` `(N, D_out)`.
- 반환: `(loss, dW1, db1, dW2, db2)` — loss Python `float`, grads 같은 shape.
## 테스트 케이스
| # | 이름 | 검증 |
|---|---|---|
| 1 | 반환 5-tuple (loss, dW1, db1, dW2, db2) | |
| 2 | loss 정확 (MSE) | 수식 검증 |
| 3 | gradient shape: 각 파라미터와 일치 | |
| 4 | 수치 미분 일치 (dW1) | |
| 5 | 수치 미분 일치 (dW2) | |
| 6 | 수치 미분 일치 (db1, db2) | |
| 7 | SGD 한 step 후 loss 감소 | |