ð€ Transformers ãçšããæç³»åãã©ã³ã¹ãã©ãŒããŒã®ç¢ºççäºæž¬
TL;DR
Hugging Face 㯠Time Series Transformer ãå°å ¥ããŸãããããã¯ãåå€éç³»åã«å¯ŸããŠã°ããŒãã«ãªç¢ºççäºæž¬ãåŠç¿ããããã©ã®ãšã³ã³ãŒãâãã³ãŒããã©ã³ã¹ãã©ãŒããŒã§ãTourism Monthly ããŒã¿ã»ããã«ãããŠåŸæ¥ã®ããŒã¹ã©ã€ã³ãäžåããŸãã
ãªãã°ããŒãã«ç¢ºççã¢ãã«ãªã®ãïŒ
å€ãã®é¢é£ããç³»åã«å¯ŸããŠåäžã®ã¢ãã«ãèšç·ŽããïŒã°ããŒãã« ã¢ãã«ïŒããšã§ããããã¯ãŒã¯ã¯å ±æãã¿ãŒã³ãæœåšè¡šçŸãæããããšãã§ããŸããããã¯ãåç³»åãåå¥ã«ãã£ãããããåŸæ¥ã®ãããŒã«ã«ãææ³ãšã¯ç°ãªããŸãã確ççäºæž¬âç¹æšå®ã§ã¯ãªãå®å šãªååžãäºæž¬ããããšâã¯ãäžæµã®æææ±ºå®ã«äžå¯æ¬ ãªäžç¢ºå®æ§ã®å®éåãæäŸããŸãã
ã¢ãŒããã¯ãã£æŠèŠ
The Time Series Transformer ã¯ããšã³ã³ãŒãâãã³ãŒãæ§æã§æšæºç㪠TransformerïŒVaswani et al., 2017ïŒãåå©çšããŸãã
- Encoder ã¯éå»èŠ³æž¬ã®åºå®ãµã€ãºã³ã³ããã¹ããŠã£ã³ããŠãæ¶è²»ããŸãã
- Decoder ã¯å æãã¹ãã³ã°ãçšããŠèªå·±ååž°çã«å°æ¥ã®å€ãçæããããã¹ãçæã«é¡äŒŒããŠããŸãã
- Distribution headïŒããã©ã«ã: StudentâtïŒã¯ãåäºæž¬ã¹ãããã®ç¢ºçååžã®ãã©ã¡ãŒã¿ãåºåããŸãã
Key benefits
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ïŒ
- Monash ã®
tourism_monthlyããŒã¿ã»ãããããŒãããŸãïŒtrain/validation/test ã«åå²ã366 ç³»åïŒã startã¿ã€ã ã¹ã¿ã³ããpandas.Periodã«å€æããæç³»åç¹åŸŽéã®çæã容æã«ããŸãã- GluonTS ã®å€æãã§ãŒã³ãå®çŸ©ãã
- æªäœ¿çšã®éç/åçãã£ãŒã«ããåé€ããŸãã
- ãã£ãŒã«ãã NumPy é åã«å€æããŸãã
- æ¬ æå€çšã® observedâmask ã远å ããŸãã
- æç³»åç¹åŸŽéïŒ
month_of_yearïŒãšãšã€ãžç¹åŸŽéãçæããŸãã - æéçç¹åŸŽéãã¹ã¿ãã¯ããTransformer API ã«åãããŠãã£ãŒã«ãåã倿ŽããŸãã
InstanceSplitterãäœæãããšã³ã³ãŒãçšã«context_length + max(lags)ããã³ãŒãçšã«prediction_lengthã®ãŠã£ã³ããŠããµã³ããªã³ã°ããŸãã3 ã€ã®ã¢ãŒãããµããŒãããŸãïŒtrainïŒã©ã³ãã ãŠã£ã³ããŠïŒãvalidationïŒæåŸã®ãŠã£ã³ããŠïŒãtestïŒæåŸã®ã³ã³ããã¹ãã®ã¿ïŒã- 倿ãããã€ã³ã¹ã¿ã³ã¹ããã³ãœã«ïŒ
past_valuesãpast_time_featuresãfuture_time_featuresãªã©ïŒã«ãããåãã DataLoaders ãæ§ç¯ããŸãã
ãã¬ãŒãã³ã°ã«ãŒãïŒ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ãèªåçã«ã·ããããŠå°€åºŠæå€±ãèšç®ããŸãã - ãã€ããŒãã©ã¡ãŒã¿ã®æ¢çŽ¢ã¯è¡ããã40 ãšããã¯ã§ååãªçµæãåŸãããŸããã
èªå·±ååž°çæã«ããæšè«
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 æ¬ã®ã¢ã³ãã«ã«ãè»è·¡ãçæããŸãã- ãµã³ãã«ã®äžå€®å€ãç¹äºæž¬ã®è©äŸ¡ã«äœ¿çšããŸãã
è©äŸ¡ææš
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 (this work) | 1.256 |
Transformer ã¯ããŒã¿ã»ããåºæã®ãã¥ãŒãã³ã°ãªãã§æãäœã MASE ãéæããã°ããŒãã«ãªæ³šæã¡ã«ããºã ãå£ç¯æ§ãšãã¬ã³ããã¿ãŒã³ã广çã«æããããããšã瀺åããŠããŸãã
å®è·µçãªãã€ã³ã
- ã°ããŒãã«ç¢ºççäºæž¬ã¯ãð€ Transformers ã©ã€ãã©ãªãçšããŠæ°è¡ã®ã³ãŒãã§å®è£ ã§ããŸãã
- èšèªã¢ãã«ã§äœ¿çšãããåã APIïŒ
generateãforwardãlossïŒãæç³»åããŒã¿ã«ãé©çšã§ããå®åè ã®ããŒãã«ãäžããŸãã - æ¬ æããŒã¿ã®åŠç㯠attention mask ã«ãã£ãŠãã€ãã£ãã«è¡ãããè£å®ã®å¿ èŠããªããªããŸãã
- äºæ¬¡çãªæ³šæã³ã¹ããã³ã³ããã¹ãé·ãå¶éãããããå°æ¥çã«ã¯å¹ççãªæ³šææ©æ§ã®å°å ¥ãæ€èšãããŸãã
ã³ãã¥ããã£ãžã®æ¬¡ã®ã¹ããã
- å€å€éæ¡åŒµ â 察è§ç¬ç«ããã³å šå ±åæ£ååžãããããµããŒãããŸãã
- æç³»ååé¡ â ç°åžžæ€ç¥ãªã©ã®ã¿ã¹ã¯åãã«åé¡ãããã远å ããŸãã
- äºååŠç¿ãã§ãã¯ãã€ã³ã â NLP/ããžã§ã³ã«é¡äŒŒãããç°çš®æç³»åã³ãŒãã¹ã§ã®å€§èŠæš¡äºååŠç¿ãæ€èšããŸãã
- ä»»æã®æ¥æå ¥å â æç€ºçãªã¿ã€ã ã¹ã¿ã³ãããªãããŒã¿ã»ããïŒäŸïŒç¥çµç§åŠã®èšé²ïŒã«ãã€ãã©ã€ã³ãé©å¿ãããŸãã
- å¹ççãªæ³šæ â ã¹ããŒã¹ãŸãã¯ç·åœ¢èšç®éã®æ³šææ©æ§ãçµ±åããå®çšçãªã³ã³ããã¹ããŠã£ã³ããŠãæ¡å€§ããŸãã
ãã®ãªãªãŒã¹ã¯ãé©åãªç¢ºçããããšããŒã¿ãã€ãã©ã€ã³ãçµã¿åãããããã©Transformerããåå€éäºæž¬ã«ãããŠç«¶äºåãããããšã瀺ããŠããŸããç ç©¶è ããšã³ãžãã¢ã¯ãHugging Face Hub ã®ä»ã®ããŒã¿ã»ããã§å®éšããåšæ³¢æ°åºæã®ãã©ã¡ãŒã¿ã調æŽããã©ã€ãã©ãªã«è¿œå ã¢ãã«ãè²¢ç®ããããšã奚å±ãããŠããŸãã