같은 모델, 같은 파리 날씨 14일치 데이터, 그리고 동일한 홀드아웃(holdout) 데이터를 사용했습니다. 이 두 행 사이에서 제가 바꾼 유일한 것은 모델에 제공한 과거 데이터의 양이었습니다:
Timestral-209M, context = 한 여름 (158일) MAE 6.489 80% band covered the truth 43% of the time
Timestral-209M, context = 3년 (1,096일) MAE 3.326 80% band covered the truth 64% of the time
"어제와 똑같이 반복", 모델 없음 MAE 5.636
창(window)에 한 여름치 데이터만 넣었을 때는 Mistral의 최신 상태(state-of-the-art) 예측 모델이 마지막 값을 반복하는 기준선(baseline)보다 성능이 떨어졌습니다. 하지만 창에 10월 데이터를 세 번 넣자, 모든 기준선을 3분의 1씩 능가했습니다. 그리고 이 제품군에서 가장 작은 모델—디스크 용량 20.8 MB—은 플래그십 모델인 837 MB와 0.03의 오차 범위 내에 들어왔습니다. 중요했던 변수는 파라미터(parameters)가 아니었습니다. 바로 컨텍스트(context)였습니다. 아무런 리더보드도 이 사실을 알려주지 않지만, 90줄짜리 스크립트는 알려주며, 그 내용은 아래와 같습니다.
공개 및 '최초'라는 숫자의 의미
Mistral은 10월 15일, 최초의 시계열(time-series) 파운데이션 모델 제품군인 Timestral을 출시했습니다. 이 모델군은 5M, 28M, 123M, 그리고 209M 파라미터의 네 가지 오픈 웨이트(open-weight) 체크포인트로 구성되어 있으며, 21개의 분위수(quantiles)를 사용한 제로샷(zero-shot) 예측이 가능하고, 최대 32,768 스텝의 컨텍스트를 지원하며, PyTorch를 CPU 또는 GPU에서 사용할 수 있고, 코드는 Apache-2.0 라이선스 하에 GitHub에 공개되었습니다. 이 발표는 구체적입니다:
| Benchmark | Metric | Timestral-209M | Runner-up (t0-gamma) | Margin |
|---|
| GIFT-Eval | MASE ↓ | 0.658 | 0.661 | 0.003 |
| ... | | | | |
모든 행이 1등이며, 발표 내용도 모든 행에 대해 정확합니다. 헤드라인 벤치마크에서의 1위는 MASE 포인트 기준으로 3천 분의 1 차이입니다. 한 HN 댓글 작성자는 직설적으로 "0.03 개선을 5배 차이처럼 보이게 만드는 것이 놀랍다"고 언급했고, 카드에 적힌 숫자는 그보다 작습니다. 또 다른 사람은 "블로그 게시물은 실제 레퍼런스 대신 가상의 고객을 특징으로 한다"고 지적했습니다. 저는 이 페이지를 두 번 읽었지만, 이름이 언급된 고객은 없으며, 케이스 스터디는 "수천 개의 센서가 장비 전반에 걸쳐 있는 산업 플랜트를 가정해 봅시다"로 시작합니다.
이 모든 것이 모델이 나쁘다는 것을 의미하지는 않습니다. 오히려 이 표를 바 차트보다 먼저 읽을 가치가 있게 만듭니다. 그리고 발표 내용 중 한 줄이 제 테스트의 모습을 결정했습니다: "훈련 데이터의 대부분은 합성(synthetic)적이었습니다." 이 모델들은 생성된 프로세스—추세, 계절성, 노이즈—로 사전 훈련되었고, 이후 실제와 합성 데이터를 혼합하여 사후 훈련되었습니다. 합성 시계열 데이터는 이들의 주력 분야입니다.
스레드에서 요구한 테스트
토론 속에 숨겨진 것은 직업적으로 이런 일을 하는 댓글 작성자로부터 나온 프로토콜이었습니다: "시계열 예측 모델을 의미 있게 테스트하려면, 고신호 대 잡음비(high signal-to-noise ratio)를 가진 데이터 생성 프로세스를 사용해야 하며, 여기서 고전적인 방법(경험적 조건부 분포, 즉 카운팅)이 대부분의 신호를 포착할 수 있어야 합니다. 그런 다음 모델도 그 신호를 포착하는지 확인하십시오. 만약 높은 노이즈 프로세스에 대해서만 테스트한다면, 어떤 모델이든 똑같아 보일 것입니다." 이것이 테스트 A입니다. 테스트 B는 정반대입니다: 모델들이 업로드되었을 때 존재하지 않았던 실제 시계열 데이터—open-meteo의 어제 파리 일일 최고 기온 데이터, API 키 없이 사용했습니다. 테스트 C는 컨텍스트 윈도우(context window)를 3년 전으로 되돌린 테스트 B입니다.
세 가지 크기(5M, 28M, 209M), CPU 전용, 모든 예측이 결정론적(deterministic)입니다. 전체 스크립트를 두 번 실행하고 출력을 비교해 보니 바이트 단위로 동일했습니다. 기준선은 각각 한 줄씩 나열되어 있습니다: 마지막 값 반복, 마지막 7개 값의 평균, 그리고 계절성 시계열의 경우 지난 주 값 반복입니다. 지표는 MAE, MASE(in-sample naive error로 스케일링된 MAE, 리더보드와 같은 종류의 지표), 그리고 모델의 10%–90% 구간이 실제 참값(truth)을 실제로 포함한 빈도—불확실성이 정직하다면 약 80%여야 하는 수치입니다.
#!/usr/bin/env python3
"""timestral_test.py — 독자가 몇 분 안에 다시 실행할 수 있는 세 가지 테스트, API 키 불필요.
...
출력은 다음과 같습니다:
== TEST A known generator (context 364 pts, horizon 28, season m=7) ==
method MAE MASE cov80
naive-last 9.650 9.209 -
...
Test A — 알려진 생성기(known generator)
일별 데이터로 구성된 1년치 데이터입니다: 느린 추세, 고정된 형태의 주간 패턴, 폭이 1인 가우시안 노이즈가 포함되어 있습니다. 마지막 주 값 반복 방식(counting method)은 MASE 0.849를 기록했고, 이 시계열의 노이즈 바닥(noise floor)은 약 0.76이므로 승리할 여지가 많지 않습니다. Timestral-5M은 한 줄짜리 기준선과 동률(0.855)입니다. 209M 모델은 0.812를 기록하여, 바닥까지 남은 간격의 약 3분의 1을 메우며 약 4% 더 나은 성능을 보였습니다. 이 모델은 스프레드시트를 다루는 인간이 포착할 수 있는 신호를 포착합니다. 그 이상으로 초월하지는 못합니다.
더 조용한 숫자는 커버리지(coverage) 열입니다. 10%–90% 구간은 참값을 10번 중 8번 포함해야 하며, 실제로는 64%에서 68%의 빈도로 나타났습니다. 순전히 합성된 환경(synthetic home turf), 게다가 문자 그대로 가우시안 노이즈가 있는 상황에서, 이 모델의 불확실성은 너무 좁습니다. 이것은 점 예측(point forecast)에 대한 비판이 아닙니다. 이는 구간을 경고 알림(alert) 시스템에 연결하기 전에 원하는 수치입니다.
Test B — 파리의 한여름
이제 실제 시계열을 살펴보겠습니다: 158일의 컨텍스트(context), 5월 1일부터 10월 5일까지를 바탕으로 다음 14일을 예측합니다. 이 14일은 파리가 변화한 순간이었습니다. 홀드아웃 기간 첫날에는 24.3 °C였고, 마지막 날에는 12.4 °C였습니다. 세 개의 Timestral 모델은 반대 방향의 중앙값을 보였습니다. 즉, 209M 모델의 경로는 2주 동안 23.7 °C에서 24.9 °C로 상승하며 따뜻했던 10월 초의 추세를 상향 예측했습니다. 모든 크기의 모델이 '어제 반복'하는 방향으로 실패했습니다. 80% 신뢰 구간(band)은 14일 중 6일 동안 실제 값을 포함했습니다. 그 하한선은 18 °C 아래로 떨어진 적이 없었지만, 현실은 12 °C에서 끝났습니다.
이는 모델이 바보 같아서가 아닙니다. 158일의 컨텍스트를 가진 이 시계열에는 상승했다가 평평해진 여름과 이전 가을에 대한 기록이 없습니다. 창(window) 안의 어떤 것도 10월이 올 것이라고 말해주지 않습니다. 단변량 예측기(univariate forecaster)는 오직 창이 보여주는 것만을 계속할 수 있으며, 그 창은 따뜻한 한 주를 보여주었습니다.
테스트 C — 세 번의 10월
그래서 저는 한 가지를 변경했습니다: 컨텍스트가 이제 2023년 10월부터 시작하도록 했습니다. 즉, 1,096일로, 창 안에는 두 개의 완전한 가을이 포함되었습니다. 홀드아웃 기간은 동일하고, 모델과 기준선(baseline), 코드 경로는 동일합니다. 209M 모델의 중앙값은 이제 22.3 °C에서 17.6 °C로 하강합니다. MAE는 6.489에서 3.326으로 떨어졌는데, 이는 최고 기준선보다 3분의 1 더 나은 수치입니다. (기준선은 어차피 마지막 몇 개의 값만 보기 때문에 개선되지 않았습니다.) 커버리지(Coverage)는 43%에서 64%로 상승했습니다. 여전히 되어야 할 80%보다는 낮지만, 신뢰 구간의 하한선이 마침내 14 °C에 도달했습니다.
그리고 패밀리 전체가 수렴합니다: 5M은 3.354, 28M은 3.341, 209M은 3.326입니다. 디스크에서 네십 배나 작은 체크포인트(checkpoint)가 계절을 모두 볼 때만큼이나 플래그십 모델만큼 잘 예측합니다. 리더보드에서는 두 모델 간의 격차가 GIFT-Eval에서 0.047 MASE이지만, 올바른 역사를 가진 14일간의 날씨 데이터에서는 무시할 만한 노이즈입니다.
daigram stats
발표에 포함되지 않은 라이선스 라인
발표문에는 라이선스가 “Modified MIT”로 명시되어 있습니다. 수정 사항은 Hugging Face의 LICENSE 파일 2조에 있으며, 한 문장으로 다음과 같습니다: “귀하의 회사(또는 고용주의 회사)의 전 세계 통합 월간 매출이 이전 달에 2천만 달러(또는 다른 통화 기준 동등액)를 초과하는 경우 본 라이선스에 따른 어떠한 권리도 행사할 수 없습니다.” 다음 문장은 “(b)항의 이러한 제한”을 언급하지만, 라이선스에는 (b)항이 존재하지 않습니다. 조항은 1조와 2조로 번호가 매겨져 있습니다. 코드 저장소는 Apache-2.0이지만, 가중치(weights)는 그렇지 않습니다. 한 HN 독자가 이 조항을 발표문 페이지 어디에서도 찾을 수 없는 상태에서 몇 시간 만에 인용했습니다.
외부에서 검증할 수 없는 매출 테스트는 일종의 통제 장치입니다 이 시리즈는 QGIS로 평가됨: 제한되는 사람의 정직함에 의해 강제되는 규칙인 셈입니다. 이것은 불만이 아니라—대부분의 오픈 가중치(open-weight) 라이선스가 이런 식으로 구축되어 있다—기본 전제입니다. 판매 주소도 같은 조항에 포함되어 있습니다.
무엇을 노려야 하는가 (What to steal)
- 일단 한 줄짜리 기준 모델(baseline)부터 실행해 보세요. 계절성 단순 예측(Seasonal naive)은 한 줄로 0.849를 기록했고, 최첨단 모델(state-of-the-art model)은 837 MB에 달하며 0.812를 기록했습니다. 만약 귀하의 시계열 데이터가 계절성이 있고 깨끗하다면, 비용을 지불하는 격차는 4%입니다.
- 막대 그래프가 아닌 마진(margin) 열을 읽으세요. 카드에 적힌 모든 주장은 사실입니다. 헤드라인 마진은 0.003입니다. 2등 모델의 값을 직접 빼보세요. 몇 분이면 충분합니다.
- 밴드를 배포하기 전에 커버리지(coverage)를 확인하세요. 예측치가 4% 더 좋고 신뢰 구간(interval)이 64%의 확률로 맞는 것은 두 가지 다른 제품입니다.
- 맥락(context)이 모델입니다. 어느 여름에는: 플래그십 모델이 어제 날씨 데이터에 패배했습니다. 3년 동안: 20 MB짜리 모델이 모든 기준 모델을 1/3 이상 능가했습니다. 매개변수(parameters)를 찾기 전에, 창문(window)에 무엇을 공급하고 있는지 살펴보세요.
두 가지 정직한 한계 (Two honest limits)
두 개의 시리즈, 하나의 도시, 그리고 14일짜리 홀아웃은 벤치마크가 아니라 도구입니다. GIFT-Eval은 수백 개의 시계열을 집계합니다. 여기에는 Mistral의 표와 모순되는 것이 아무것도 없고, 또 모순될 수도 없습니다. 이 테스트가 보여주는 것은 집계된 데이터가 숨기는 것 — 동일한 모델로 한 여름과 3년 간의 차이 — 이며, 사용자가 자신의 시리즈를 바꿔 넣고 어떤 경우에 해당하는지 볼 수 있도록 스크립트가 마련되어 있습니다.
저는 Timestral을 단변량(univariate)이며 과거 데이터만 사용하는 예측기 — 그것이 지원하는 가장 간단한 모드입니다. 모델 카드에는 알려진 미래 공변량(covariates)과 다변량 입력(multivariate inputs)이 나열되어 있습니다. 저는 아무것도 넣어주지 않았는데, 그 이유는 질문이 시리즈 자체만으로 제로샷(zero-shot) 모델이 무엇을 하는지를 알아내는 것이었고, 또한 대부분의 초보 사용자가 그렇게 실행할 것이기 때문입니다. 날씨 예보를 공변량으로 제공하는 독자는 다른 테스트를 수행하고 있으며, 아마도 더 나은 제품일 것입니다.
당신 차례
세 가지 명령어: `pip install