๐Ÿค— Transformers๋ฅผ ์ด์šฉํ•œ ์‹œ๊ณ„์—ด Transformer ํ™•๋ฅ ์  ์˜ˆ์ธก

TL;DR

Hugging Face๋Š” Time Series Transformer๋ฅผ ์†Œ๊ฐœํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹จ์ผ ๋ณ€์ˆ˜ ์‹œ๊ณ„์—ด์— ๋Œ€ํ•œ ์ „์—ญ ํ™•๋ฅ ์  ์˜ˆ์ธก์„ ํ•™์Šตํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ์ธ์ฝ”๋”โ€‘๋””์ฝ”๋” Transformer์ด๋ฉฐ, Tourism Monthly ๋ฐ์ดํ„ฐ์…‹์—์„œ ๊ธฐ์กด ๋ฒ ์ด์Šค๋ผ์ธ๋ณด๋‹ค ์šฐ์ˆ˜ํ•œ ์„ฑ๋Šฅ์„ ๋ณด์ž…๋‹ˆ๋‹ค.


์™œ ์ „์—ญ ํ™•๋ฅ  ๋ชจ๋ธ์ธ๊ฐ€?

๋งŽ์€ ๊ด€๋ จ ์‹œ๊ณ„์—ด์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ ๋ชจ๋ธ์„ ํ•™์Šตํ•˜๋Š” (global ๋ชจ๋ธ) ์€ ๋„คํŠธ์›Œํฌ๊ฐ€ ๊ณต์œ  ํŒจํ„ด๊ณผ ์ž ์žฌ ํ‘œํ˜„์„ ํฌ์ฐฉํ•˜๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ ์‹œ๊ณ„์—ด์„ ๋…๋ฆฝ์ ์œผ๋กœ ๋งž์ถ”๋Š” ๊ณ ์ „์ ์ธ โ€œlocalโ€ ๋ฐฉ๋ฒ•๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ํ™•๋ฅ ์  ์˜ˆ์ธกโ€”์  ์ถ”์ •์ด ์•„๋‹ˆ๋ผ ์ „์ฒด ๋ถ„ํฌ๋ฅผ ์˜ˆ์ธกํ•˜๋Š” ๊ฒƒโ€”์€ ํ•˜์œ„ ์˜์‚ฌ๊ฒฐ์ •์— ํ•„์ˆ˜์ ์ธ ๋ถˆํ™•์‹ค์„ฑ ์ •๋Ÿ‰ํ™”๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์•„ํ‚คํ…์ฒ˜ ๊ฐœ์š”

Time Series Transformer๋Š” ํ‘œ์ค€ Transformer (Vaswani et al., 2017)๋ฅผ ์ธ์ฝ”๋”โ€‘๋””์ฝ”๋” ๊ตฌ์„ฑ์œผ๋กœ ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:

  • Encoder ๊ณ ์ • ํฌ๊ธฐ์˜ ๊ณผ๊ฑฐ ๊ด€์ธก๊ฐ’ ์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ๋ฅผ ์†Œ๋น„ํ•ฉ๋‹ˆ๋‹ค.
  • Decoder ์ธ๊ณผ ๋งˆ์Šคํ‚น์„ ์‚ฌ์šฉํ•ด ๋ฏธ๋ž˜ ๊ฐ’์„ ์ž๋™ํšŒ๊ท€์ ์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ…์ŠคํŠธ ์ƒ์„ฑ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
  • Distribution head (default: Studentโ€‘t) ๊ฐ ์˜ˆ์ธก ๋‹จ๊ณ„์— ๋Œ€ํ•œ ํ™•๋ฅ  ๋ถ„ํฌ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ์žฅ์ :

  • ๋ˆ„๋ฝ๋œ ๊ฐ’์„ attention_mask์™€ ์œ ์‚ฌํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ์œˆ๋„์šฐ ๊ธฐ๋ฐ˜ ํ•™์Šต์„ ํ†ตํ•ด ์ž„์˜์˜ ์ปจํ…์ŠคํŠธ ๋ฐ ์˜ˆ์ธก ๊ธธ์ด๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • NLP ๋ชจ๋ธ๊ณผ ๋™์ผํ•œ API๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ถ”๋ก  ์‹œ generate()๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋ธ ๊ตฌ์„ฑ ์„ธ๋ถ€์‚ฌํ•ญ

from transformers import TimeSeriesTransformerConfig, TimeSeriesTransformerForPrediction

config = TimeSeriesTransformerConfig(
    prediction_length=24,               # forecast horizon (months)
    context_length=48,                  # encoder window (2ร— horizon)
    lags_sequence=[1,2,3,4,5,6,7,11,12,13,23,24,25,35,36,37],
    num_time_features=2,                # monthโ€‘ofโ€‘year + age feature
    num_static_categorical_features=1, # series ID
    cardinality=[366],                  # 366 regions in the dataset
    embedding_dimension=[2],
    encoder_layers=4,
    decoder_layers=4,
    d_model=32,
)

model = TimeSeriesTransformerForPrediction(config)
  • ๋ชจ๋ธ์€ Studentโ€‘t ๋ถ„ํฌ๋ฅผ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค (model.config.distribution_output == "student_t").
  • ์ •์  ๋ฒ”์ฃผํ˜• ์ž„๋ฒ ๋”ฉ์€ ๊ฐ ์‹œ๊ณ„์—ด์˜ ์ •์ฒด์„ฑ์„ ์ธ์ฝ”๋”ฉํ•˜์—ฌ ํ•˜๋‚˜์˜ ๋ชจ๋ธ์ด 366๊ฐœ์˜ ์‹œ๊ณ„์—ด์„ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ (GluonTS + ๐Ÿค— Datasets)

  1. Monash tourism_monthly ๋ฐ์ดํ„ฐ์…‹์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค (train/validation/test ๋ถ„ํ• , 366 ์‹œ๊ณ„์—ด).
  2. start ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ pandas.Period ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค ๋กœ ์‰ฝ๊ฒŒ ์‹œ๊ฐ„ ํŠน์„ฑ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. GluonTS ๋ณ€ํ™˜ ์ฒด์ธ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค:
    • ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ •์ /๋™์  ํ•„๋“œ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
    • ํ•„๋“œ๋ฅผ NumPy ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    • ๋ˆ„๋ฝ๋œ ๊ฐ’์„ ์œ„ํ•œ observedโ€‘mask ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    • ์‹œ๊ฐ„ ํŠน์„ฑ(month_of_year)๊ณผ age ํŠน์„ฑ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • ์‹œ๊ฐ„ ํŠน์„ฑ์„ ์Šคํƒํ•˜๊ณ  ํ•„๋“œ๋ช…์„ Transformer API์— ๋งž๊ฒŒ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
  4. InstanceSplitter๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค ์ธ์ฝ”๋”์šฉ context_length + max(lags) ํฌ๊ธฐ์˜ ์œˆ๋„์šฐ์™€ ๋””์ฝ”๋”์šฉ prediction_length ํฌ๊ธฐ์˜ ์œˆ๋„์šฐ๋ฅผ ์ƒ˜ํ”Œ๋งํ•ฉ๋‹ˆ๋‹ค. ์„ธ ๊ฐ€์ง€ ๋ชจ๋“œ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค: train(๋ฌด์ž‘์œ„ ์œˆ๋„์šฐ), validation(๋งˆ์ง€๋ง‰ ์œˆ๋„์šฐ), test(๋งˆ์ง€๋ง‰ ์ปจํ…์ŠคํŠธ๋งŒ).
  5. DataLoaders๋ฅผ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค ๋ณ€ํ™˜๋œ ์ธ์Šคํ„ด์Šค๋ฅผ ํ…์„œ(past_values, past_time_features, future_time_features ๋“ฑ)๋กœ ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.

ํ•™์Šต ๋ฃจํ”„ (Accelerate)

from accelerate import Accelerator
from torch.optim import AdamW

accelerator = Accelerator()
model.to(accelerator.device)
optimizer = AdamW(model.parameters(), lr=6e-4, betas=(0.9, 0.95), weight_decay=1e-1)
model, optimizer, train_loader = accelerator.prepare(model, optimizer, train_loader)

model.train()
for epoch in range(40):
    for batch in train_loader:
        optimizer.zero_grad()
        outputs = model(**batch)
        accelerator.backward(outputs.loss)
        optimizer.step()
  • ๋””์ฝ”๋”๋Š” future_values๋ฅผ ์ž๋™์œผ๋กœ ์‹œํ”„ํŠธํ•˜์—ฌ likelihood loss๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
  • ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ ํƒ์ƒ‰์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์•˜์œผ๋ฉฐ, 40 epoch๋งŒ์œผ๋กœ๋„ ๊ฐ•๋ ฅํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.

์ž๋™ํšŒ๊ท€ ์ƒ์„ฑ์œผ๋กœ ์ถ”๋ก 

model.eval()
forecasts = []
for batch in test_loader:
    out = model.generate(**batch)
    forecasts.append(out.sequences.cpu().numpy())
forecasts = np.vstack(forecasts)   # shape: (366, 100, 24)
  • generate()๋Š” ํ•™์Šต๋œ ๋ถ„ํฌ์—์„œ ์ƒ˜ํ”Œ๋งํ•˜์—ฌ ๊ฐ ์‹œ๊ณ„์—ด๋‹น 100๊ฐœ์˜ Monteโ€‘Carlo ๊ถค์ ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒ˜ํ”Œ๋“ค์˜ ์ค‘์•™๊ฐ’์„ ์  ์˜ˆ์ธก ํ‰๊ฐ€์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ‰๊ฐ€ ์ง€ํ‘œ

Using the evaluate library:

  • MASE (Mean Absolute Scaled Error) = 1.256 (366 ์‹œ๊ณ„์—ด ํ‰๊ท ).
  • sMAPE (Symmetric Mean Absolute Percentage Error) = 0.161.
  • ์ด ์ˆ˜์น˜๋Š” ๋™์ผ ๋ฒค์น˜๋งˆํฌ์—์„œ ๋‹ค์–‘ํ•œ ๊ณ ์ „ ๋ฐ ๋”ฅ ๋ฒ ์ด์Šค๋ผ์ธ์„ ๋Šฅ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๋ฒค์น˜๋งˆํฌ ๋น„๊ต

๋ชจ๋ธ MASE
SES 3.306
Theta 1.649
TBATS 1.751
ETS 1.526
(DHRโ€‘)ARIMA 1.589
PR 1.678
CatBoost 1.699
FFNN 1.582
DeepAR 1.409
Nโ€‘BEATS 1.574
WaveNet 1.482
Transformer (๋ณธ ์—ฐ๊ตฌ) 1.256

Transformer๋Š” ๋ฐ์ดํ„ฐ์…‹โ€‘ํŠน์ • ํŠœ๋‹ ์—†์ด ๊ฐ€์žฅ ๋‚ฎ์€ MASE๋ฅผ ๋‹ฌ์„ฑํ–ˆ์œผ๋ฉฐ, ์ „์—ญ ์–ดํ…์…˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ๊ณ„์ ˆ์„ฑ ๋ฐ ์ถ”์„ธ ํŒจํ„ด์„ ํšจ๊ณผ์ ์œผ๋กœ ํฌ์ฐฉํ•  ์ˆ˜ ์žˆ์Œ์„ ์‹œ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์‹ค์šฉ์ ์ธ ์‹œ์‚ฌ์ 

  • ์ „์—ญ ํ™•๋ฅ  ์˜ˆ์ธก์€ ๐Ÿค— Transformers ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด ๋ช‡ ์ค„์˜ ์ฝ”๋“œ๋งŒ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์–ธ์–ด ๋ชจ๋ธ์— ์‚ฌ์šฉ๋˜๋Š” ๋™์ผํ•œ API(generate, forward, loss)๊ฐ€ ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ์—๋„ ์ ์šฉ๋˜์–ด ์‹ค๋ฌด์ž์˜ ์ง„์ž… ์žฅ๋ฒฝ์„ ๋‚ฎ์ถฅ๋‹ˆ๋‹ค.
  • ๋ˆ„๋ฝ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋Š” attention mask๋ฅผ ํ†ตํ•ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›๋˜์–ด ๋ณ„๋„์˜ ๋ณด๊ฐ„์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ด์ฐจ ์‹œ๊ฐ„ ๋ณต์žก๋„์˜ attention์€ ์ปจํ…์ŠคํŠธ ๊ธธ์ด๋ฅผ ์ œํ•œํ•˜๋ฏ€๋กœ, ํ–ฅํ›„ ์—ฐ๊ตฌ์—์„œ๋Š” ํšจ์œจ์ ์ธ attention ๋ณ€ํ˜•์„ ๋„์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ์œ„ํ•œ ๋‹ค์Œ ๋‹จ๊ณ„

  • ๋‹ค๋ณ€๋Ÿ‰ ํ™•์žฅ โ€“ ๋Œ€๊ฐ์„  ๋…๋ฆฝ ๋ฐ ์ „์ฒด ๊ณต๋ถ„์‚ฐ ๋ถ„ํฌ ํ—ค๋“œ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ์‹œ๊ณ„์—ด ๋ถ„๋ฅ˜ โ€“ ์ด์ƒ ํƒ์ง€ ๋ฐ ๊ธฐํƒ€ ์ž‘์—…์„ ์œ„ํ•œ ๋ถ„๋ฅ˜ ํ—ค๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์ „ ํ•™์Šต ์ฒดํฌํฌ์ธํŠธ โ€“ NLP/๋น„์ „๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์ด์งˆ์ ์ธ ์‹œ๊ณ„์—ด ์ฝ”ํผ์Šค์— ๋Œ€ํ•œ ๋Œ€๊ทœ๋ชจ ์‚ฌ์ „ ํ•™์Šต์„ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์„ ํƒ์  ๋‚ ์งœโ€‘์‹œ๊ฐ„ ์ž…๋ ฅ โ€“ ๋ช…์‹œ์  ํƒ€์ž„์Šคํƒฌํ”„๊ฐ€ ์—†๋Š” ๋ฐ์ดํ„ฐ์…‹(์˜ˆ: ์‹ ๊ฒฝ๊ณผํ•™ ๊ธฐ๋ก)์— ๋งž๊ฒŒ ํŒŒ์ดํ”„๋ผ์ธ์„ ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ํšจ์œจ์ ์ธ attention โ€“ ํฌ์†Œ ๋˜๋Š” ์„ ํ˜• ๋ณต์žก๋„ attention์„ ํ†ตํ•ฉํ•˜์—ฌ ์‹คํ˜„ ๊ฐ€๋Šฅํ•œ ์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ๋ฅผ ํ™•๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฒˆ ๋ฆด๋ฆฌ์Šค๋Š” ์ ์ ˆํ•œ ํ™•๋ฅ  ํ—ค๋“œ์™€ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ฒฐํ•ฉํ•œ ๊ธฐ๋ณธ์ ์ธ Transformer๊ฐ€ ๋‹จ๋ณ€๋Ÿ‰ ์˜ˆ์ธก์—์„œ๋„ ๊ฒฝ์Ÿ๋ ฅ์„ ๊ฐ–์ถ˜๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์—ฐ๊ตฌ์ž์™€ ์—”์ง€๋‹ˆ์–ด๋Š” Hugging Face Hub์˜ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ์…‹์„ ์‹คํ—˜ํ•˜๊ณ , ์ฃผํŒŒ์ˆ˜๋ณ„ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์กฐ์ •ํ•˜๋ฉฐ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ถ”๊ฐ€ ๋ชจ๋ธ์„ ๊ธฐ์—ฌํ•˜๋„๋ก ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค.

SUMMARY: Hugging Face๋Š” ์ „์—ญ ํ™•๋ฅ  ์‹œ๊ณ„์—ด ์˜ˆ์ธก์„ ์œ„ํ•œ ๊ธฐ๋ณธ Transformer ๋ชจ๋ธ์„ ์ถœ์‹œํ–ˆ์œผ๋ฉฐ, Tourism Monthly ๋ฒค์น˜๋งˆํฌ์—์„œ ์ตœ์ฒจ๋‹จ ์„ฑ๋Šฅ์„ ์ž…์ฆํ–ˆ์Šต๋‹ˆ๋‹ค.

TITLE: ๐Ÿค— Transformers๋ฅผ ์ด์šฉํ•œ ์‹œ๊ณ„์—ด Transformer ํ™•๋ฅ ์  ์˜ˆ์ธก

Sources