실습 · 연습문제 2개
mask가 있는 MAE를 batch 단위로 집계하기 masked-mae-accumulator
길이가 다른 시계열을 padding해 batch로 묶으면, 각 batch는 예측 pred, 정답 target, 관측 여부 mask를 가진다(shape은 모두 (B, T), mask는 1이 관측·0이 padding). batch마다 B와 T가 다를 수 있다.
함수 masked_mae(batches)를 완성한다. batches는 (pred, target, mask) 튜플의 리스트이고, 반환값은 관측된 모든 값에 대한 평균 절대 오차다.
- batch 평균을 다시 평균하지 않는다. 분자와 분모를 따로 누적한다.
- padding 위치의 값은 무엇이든(0, 큰 수, NaN) 결과에 영향을 주면 안 된다.
mask가None이면 그 batch의 모든 값이 관측이다.- 관측값이 하나도 없으면
ValueError를 낸다(0으로 나누어nan을 조용히 반환하지 않는다).
테스트는 batch를 하나로 이어 붙여 계산한 값과 비교하고, batch 크기가 고르지 않은 경우와 padding에 NaN이 들어 있는 경우를 확인한다.
힌트: np.where(mask > 0, np.abs(pred - target), 0.0)은 padding 위치의 NaN도 0으로 바꾼다. mask * np.abs(...)는 0 * nan = nan이라 그렇지 않다.
정확히 재개되는 optimizer 만들기 resumable-sgd
MomentumSGD는 선형 회귀 를 minibatch momentum SGD로 학습한다. 매 step은 난수로 minibatch를 뽑고, 10 step마다 학습률을 절반으로 줄이고, 속도(velocity)를 갱신한 뒤 가중치를 움직인다.
step()은 이미 구현되어 있다. 두 메서드를 완성한다.
state_dict(): 재개에 필요한 상태를 dict로 반환한다.load_state_dict(state): 그 dict로 상태를 되돌린다.
요구 사항은 하나다. 12 step 학습 → 저장 → 새 객체(다른 시드로 만든)에 복원 → 13 step 학습의 결과가 끊김 없이 25 step 학습한 결과와 비트 단위로 같아야 한다.
step()의 결과에 영향을 주는 값이 무엇인지 코드에서 찾는다. 데이터X,y와 하이퍼파라미터는 생성자가 다시 만들어 준다.- NumPy
Generator의 상태는rng.bit_generator.state(dict)로 읽고 쓸 수 있다. - 저장본은 그 시점의 사진이어야 한다. 저장한 뒤 학습을 계속해도 저장본이 바뀌면 안 되고, 복원한 객체가 학습해도 저장본이 바뀌면 안 된다. 배열과 dict를 복사한다.
- 저장본은
pickle로 직렬화할 수 있어야 한다.