빠진 값과 있는 값을 같은 자리에 넣은 게 문제였어

“파라미터 0.65M짜리가 88.24M짜리보다 오차가 낮았어.”

센서 로그나 지표 데이터에는 구간이 통째로 비는 일이 생겨. 장비가 잠깐 꺼졌거나 수집이 끊겼거나. 그 빈칸을 앞뒤 값으로 메우는 걸 시계열 보간이라고 해.

지금까지 쓰던 방법에는 두 가지 걸림돌이 있었어. 하나는 빠진 자리와 관측된 자리를 구조적 구분 없이 같은 표현 공간에 넣는다는 것. 다른 하나는 디퓨전 계열이 원본 신호가 아니라 더해진 잡음을 맞히도록 학습된다는 것이야.

MASK 토큰을 따로 두고 원래 값을 바로 맞혀

arXiv에 8월 19일 올라온 MDTIM은 언어 모델 학습에서 쓰던 마스크 디퓨전 방식을 여기에 가져왔어.

MASK 토큰은 정상 관측값과 구조적으로 직교해. 그러니까 “여긴 비어 있다”는 표시가 실제 값과 같은 자리에서 섞이지 않아. 그리고 모델은 잡음이 아니라 원래 값을 직접 맞히게 학습돼.

문제는 언어와 달리 시계열 값은 연속이고 크기 순서가 있다는 거야. 그래서 Stochastic Discretization을 붙였어. 연속 값을 순서 정보를 담은 토큰으로 옮기되, 연속적인 움직임은 유지하는 방식이야.

작은 쪽이 큰 쪽보다 오차가 낮았어

Energy, ETTh, Weather, 합성 Sine 4개로 쟀고, 결손 비율은 30%, 50%, 70%를 다 봤어.

  • Energy 30% 결손: MAE 0.044. CSDI가 0.094, SAITS가 0.177이야. MAE는 낮을수록 좋아.
  • Energy 70% 결손: 0.085로 CSDI 0.139, SAITS 0.212보다 낮았어. 많이 비어도 격차가 유지됐어.
  • ETTh 30% 결손: 0.127인데 SAITS가 0.140이야. 여기선 차이가 크지 않아.
  • 긴 구간(길이 192): 0.123으로 BRITS 0.192, SAITS 0.145보다 낮았어.

규모와 속도 차이가 더 눈에 띄어. 작은 변형이 파라미터 0.65M으로 88.24M짜리 SAITS Large를 앞섰고, 추론이 4.05초로 CSDI의 401.69초보다 짧았거든.

따라 하기 전에 볼 것

  • 확인할 수 있는 출처가 원고 하나야: 코드 저장소도 프로젝트 페이지도 못 찾았어. 저자들이 보고한 값이라고 보는 게 맞아.
  • 격차가 데이터셋마다 달라: Energy에서는 CSDI 대비 오차가 절반 아래인데, ETTh에서는 SAITS와 0.013 차이야. 데이터 성격에 따라 폭이 달라진다는 뜻이야.
  • 속도 비교 조건이 안 나와 있어: 4.05초와 401.69초를 어떤 장비에서 쟀는지는 공개 자료에서 확인하지 못했어.
  • 가져갈 만한 관점: 모델을 키우는 대신 학습 목표를 문제에 맞게 바꾼 사례야. 빈 구간을 메우는 게 목적인데 잡음을 맞히도록 학습시키고 있진 않은지 볼 만해.

지금 당장 쓸 도구는 아니야. 코드가 나오고 남이 같은 수치를 다시 내는 걸 본 다음에 판단해도 늦지 않아.