
MLP with GELU (Transformer 스타일)
85번 MLP with Tanh 에서 활성함수를 GELU (Gaussian Error Linear Unit) 로 교체:
GELU(x)≈0.5x(1+tanh(π2(x+0.044715x3)))
이게 BERT, GPT-2/3, ViT 등 대부분의 Transformer 의 FFN 층 활성.
수식
h=GELU(XW1+b1)
y=hW2+b2
GELU 의 특징
- x>0: 대략 x (ReLU 와 비슷)
- x<0: 0 이 아니라 작은 음수 값 (ReLU와 차이)
- x→−∞: 0 으로 부드럽게 수렴
- smooth, 미분 가능 전 구간 → ReLU 의 "0 에서 kink" 없음
vs ReLU, Tanh
| 활성 | x<0 영역 | 미분 | 사용처 |
|---|
| ReLU | 0 | kink at 0 | CNN 기본 |
| Tanh | 부호 반대, 포화 | smooth | RNN (구) |
| GELU | 음의 작은 값 | smooth | Transformer 기본 |
과제
함수 mlp_forward_gelu-v1(X, W1, b1, W2, b2) 를 완성하세요.
- 은닉층 활성에 GELU (위 공식) 적용.
- 힌트:
0.5 * x * (1 + np.tanh(np.sqrt(2/np.pi) * (x + 0.044715 * x**3))).
테스트 케이스
| # | 이름 | 검증 |
|---|
| 1 | shape (N, D_out) | |
| 2 | GELU(0) = 0 → W1=0, b1=0 → y=b2 | |
| 3 | GELU(x) ≠ ReLU(x) at x=-1 | 부호 있는 음수 |
| 4 | 대칭 실험: GELU(-1) < 0, GELU(1) > 0 | |
| 5 | 큰 양수 → GELU(x) ≈ x | |