← 문제 목록/Orthogonal Initialization
문제 해설

Orthogonal Initialization

신경망 · easy

preview

Orthogonal Initialization

87번 Xavier Init 은 scalar 분산을 맞춥니다. Orthogonal init (Saxe et al. 2013) 은 한 걸음 더 — 행렬 전체가 직교 가 되도록 초기화:

WW=I(fan_infan_out)W^\top W = I \quad (\text{fan\_in} \ge \text{fan\_out})

또는 반대: WW=I(fan_out>fan_in)W W^\top = I \quad (\text{fan\_out} > \text{fan\_in})

왜 직교?

선형 전파: ht+1=Whth_{t+1} = W h_t. WW 가 직교면: ht+1=Wht=ht\|h_{t+1}\| = \|W h_t\| = \|h_t\|

norm 보존 → 깊은 네트워크 / 긴 시퀀스에서 gradient 가 정확히 유지됨 (소실/폭발 없음).

RNN / deep CNN 의 초기화로 유용.

구현

  1. A ~ N(0, 1) shape (max(fan_in, fan_out), max(...)).
  2. Q, R = np.linalg.qr(A) — Q 가 직교 행렬.
  3. 필요한 shape 으로 slicing 해서 반환.

과제

함수 orthogonal_init(fan_in, fan_out, seed) 를 완성하세요.

  • 반환: shape (fan_in, fan_out).
  • 힌트:
    n = max(fan_in, fan_out)
    A = np.random.default_rng(seed).normal(size=(n, n))
    Q, _ = np.linalg.qr(A)
    return Q[:fan_in, :fan_out]
    

테스트 케이스

#이름검증
1shape
2정사각 (fan_in=fan_out): W @ W.T = I
3세로 긴 (fan_in > fan_out): W.T @ W = I
4가로 긴 (fan_out > fan_in): W @ W.T = I
5norm 보존: |Wx| ≈ |x|정사각
6시드 재현성
코드 작성
Loading...
실행 결과

코드를 작성하고 Run 을 눌러보세요.