실습 · 연습문제 2개
mask로 손실 집계하기 masked-mean
길이가 다른 시퀀스를 padding해 만든 batch에서, token별 손실 loss(shape (B, T))와 실제 token 위치를 표시한 mask(shape (B, T), bool)가 주어진다. padding 위치의 loss 값은 아무 값이나 들어 있을 수 있다(0이라는 보장이 없다. nan일 수도 있다).
두 함수를 완성한다.
masked_token_mean(loss, mask): 실제 token 전체에 대한 평균. 모든 token이 같은 비중을 갖는다.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
선형 모델 에서 측정마다 잡음의 표준편차 가 알려져 있다고 하자: , 서로 독립.
두 함수를 완성한다.
gaussian_nll(beta, X, y, sigma): 이 모형의 평균 음의 로그우도 [nat]weighted_lstsq(X, y, sigma): 위 NLL을 최소화하는 . 로 두면 정규방정식은 다.
| 인자 | shape |
|---|---|
X |
(N, p) |
y |
(N,) |
sigma |
(N,), 모두 양수 |
beta |
(p,) |
테스트는 다음을 확인한다.
weighted_lstsq의 해에서 NLL의 gradient가 0이다(다른 보다 NLL이 작다).- 모든 가 같으면 보통의 최소제곱 해(
np.linalg.lstsq)와 같다. - 전체에 상수를 곱해도 해는 변하지 않는다(가중치의 상대적 크기만 중요하다).
- 잡음이 아주 큰 측정 하나를 추가해도 해가 거의 변하지 않는다.
힌트: 를 행렬로 만들지 않고 X / sigma[:, None], y / sigma로 각 행을 나눈 뒤 보통의 최소제곱을 풀어도 같다.