실습 · 연습문제 2개
2층 MLP의 gradient를 손으로 구현하기 mlp-backward
입력 batch (행이 샘플)에 대한 2층 MLP와 손실은 다음과 같다.
가중치 shape은 PyTorch의 nn.Linear와 같은 (출력 × 입력)이다.
| 인자 | shape |
|---|---|
X |
(N, D) |
y |
(N,) 정수 레이블 |
W1, b1 |
(H, D), (H,) |
W2, b2 |
(K, H), (K,) |
함수 mlp_grads(X, y, W1, b1, W2, b2)를 완성해 {"W1": ..., "b1": ..., "W2": ..., "b2": ...} 딕셔너리를 반환한다. 각 gradient의 shape은 해당 파라미터와 같아야 한다.
본문의 유도를 따라 출력 쪽에서 입력 쪽으로 계산한다.
- — softmax cross-entropy의 gradient
- ,
- ,
- ,
테스트는 유한차분 gradient와 상대오차로 비교하고, shape과 몇 가지 성질(모든 은닉 뉴런이 꺼지면 첫 층의 gradient가 0)을 확인한다.
힌트: 각 단계에서 shape을 주석으로 적어 보면 전치를 어디에 붙일지 정해진다. 는 다.
softmax cross-entropy와 그 gradient softmax-ce-grad
batch의 logit 행렬 와 정답 클래스 y(길이 의 정수 배열)가 주어진다. 번째 샘플의 확률은 이고, 손실은 batch 평균 cross-entropy
이다. 함수 softmax_ce(Z, y)를 완성해 (L, dZ)를 반환한다. dZ는 로 shape이 Z와 같은 (N, K)다.
요구 사항:
- 본문에서 유도한 을 쓴다. 여기서 은 one-hot 벡터다.
- logit이 1000처럼 커도
nan이나inf가 나오지 않아야 한다. 행마다 최댓값을 빼고 계산하면 softmax 값은 그대로이고 overflow를 피할 수 있다.
테스트는 유한차분과 비교하고, 큰 logit에서의 안정성, 모든 logit이 같을 때 손실이 인지, dZ의 각 행의 합이 0인지 확인한다.
힌트: 로 계산하면 을 피할 수 있다.