14.3 목적함수 설계의 원리

실습 · 연습문제 2개

mask로 손실 집계하기 masked-mean

길이가 다른 시퀀스를 padding해 만든 batch에서, token별 손실 loss(shape (B, T))와 실제 token 위치를 표시한 mask(shape (B, T), bool)가 주어진다. padding 위치의 loss 값은 아무 값이나 들어 있을 수 있다(0이라는 보장이 없다. nan일 수도 있다).

두 함수를 완성한다.

  1. masked_token_mean(loss, mask): 실제 token 전체에 대한 평균. 모든 token이 같은 비중을 갖는다. ∑b,tmbt ℓbt∑b,tmbt\frac{\sum_{b,t} m_{bt}\,\ell_{bt}}{\sum_{b,t} m_{bt}}
  2. masked_sequence_mean(loss, mask): 시퀀스마다 실제 token의 평균을 낸 뒤, 그 값들을 다시 평균한다. 모든 시퀀스가 같은 비중을 갖는다. 실제 token이 하나도 없는 시퀀스는 평균에서 뺀다.

테스트는 다음을 확인한다.

  • padding 위치의 값(큰 수, nan)이 결과에 영향을 주지 않는다.
  • padding 길이를 늘려도 결과가 같다.
  • 길이가 다른 시퀀스에서 두 함수의 값이 본문처럼 서로 다를 수 있다.
  • 분할 일관성: batch를 두 micro-batch로 나누어 계산한 결과를, token 합과 token 수를 따로 모아 합치면 전체 batch의 masked_token_mean과 같다. 테스트는 이를 위해 masked_token_sum_count(loss, mask)도 부른다. 이 함수는 (token 손실의 합, token 수)를 반환한다.

힌트: np.where(mask, loss, 0.0)은 mask가 거짓인 곳의 nan도 0으로 바꾼다. loss * mask는 nan * 0 = nan이므로 쓰면 안 된다.

우도에서 가중 최소제곱 유도하기 weighted-least-squares

선형 모델 yi=xi⊤β+εiy_i = \mathbf{x}_i^\top\boldsymbol\beta + \varepsilon_i에서 측정마다 잡음의 표준편차 σi\sigma_i가 알려져 있다고 하자: εi∼N(0,σi2)\varepsilon_i \sim \mathcal{N}(0, \sigma_i^2), 서로 독립.

두 함수를 완성한다.

  1. gaussian_nll(beta, X, y, sigma): 이 모형의 평균 음의 로그우도 [nat] 1N∑i=1N[(yi−xi⊤β)22σi2+log⁡σi+12log⁡2π]\frac{1}{N}\sum_{i=1}^{N}\left[\frac{(y_i - \mathbf{x}_i^\top\boldsymbol\beta)^2}{2\sigma_i^2} + \log\sigma_i + \frac12\log 2\pi\right]
  2. weighted_lstsq(X, y, sigma): 위 NLL을 최소화하는 β\boldsymbol\beta. W=diag(1/σi2)\mathbf{W} = \mathrm{diag}(1/\sigma_i^2)로 두면 정규방정식은 X⊤WXβ=X⊤Wy\mathbf{X}^\top\mathbf{W}\mathbf{X}\boldsymbol\beta = \mathbf{X}^\top\mathbf{W}\mathbf{y}다.
인자 shape
X (N, p)
y (N,)
sigma (N,), 모두 양수
beta (p,)

테스트는 다음을 확인한다.

  • weighted_lstsq의 해에서 NLL의 gradient가 0이다(다른 β\boldsymbol\beta보다 NLL이 작다).
  • 모든 σi\sigma_i가 같으면 보통의 최소제곱 해(np.linalg.lstsq)와 같다.
  • σ\sigma 전체에 상수를 곱해도 해는 변하지 않는다(가중치의 상대적 크기만 중요하다).
  • 잡음이 아주 큰 측정 하나를 추가해도 해가 거의 변하지 않는다.

힌트: W\mathbf{W}를 행렬로 만들지 않고 X / sigma[:, None], y / sigma로 각 행을 나눈 뒤 보통의 최소제곱을 풀어도 같다.