<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Argon</title><description>AI/ML 엔지니어링 노트</description><link>https://fuwari.vercel.app/</link><language>ko</language><item><title>CloudCons 논문 리뷰: 시계열 예측을 잘하면 클라우드 자원 최적화도 잘할까?</title><link>https://fuwari.vercel.app/posts/cloudcons-forecasting-accuracy-vs-decision-utility/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/cloudcons-forecasting-accuracy-vs-decision-utility/</guid><description>KDD 2026 CloudCons 논문을 통해 Time Series Foundation Model의 zero-shot 예측 성능과 실제 Cloud Resource Consolidation 의사결정 성능 사이의 차이를 살펴봅니다.</description><pubDate>Thu, 03 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&amp;lt;!-- notion-managed: regenerated by scripts/sync-notion.mjs, do not edit --&amp;gt;&lt;/p&gt;
&lt;p&gt;:::note
&lt;strong&gt;논문 시리즈&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;논문:&lt;/strong&gt; CloudCons: A Comprehensive End-to-End Benchmark for Cloud Resource Consolidation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;학회:&lt;/strong&gt; KDD 2026&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;저자:&lt;/strong&gt; Xiaobin Zhang 외 9명&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DOI:&lt;/strong&gt; &lt;a href=&quot;https://doi.org/10.1145/3770855.3817559&quot;&gt;10.1145/3770855.3817559&lt;/a&gt;
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::tip
&lt;strong&gt;핵심 요약(TL;DR)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CloudCons&lt;/strong&gt;는 예측 정확도뿐 아니라 실제 &lt;strong&gt;Cloud Resource Consolidation 의사결정 성능&lt;/strong&gt;까지 평가하는 end-to-end benchmark입니다.&lt;/li&gt;
&lt;li&gt;Huawei Cloud, Microsoft Azure, Google Borg의 서로 다른 workload를 사용합니다.&lt;/li&gt;
&lt;li&gt;Chronos 2, TimesFM 2.5, Moirai 2, TOTO 등 최신 Time Series Foundation Model을 통계·딥러닝 모델과 비교합니다.&lt;/li&gt;
&lt;li&gt;Foundation Model은 전반적으로 &lt;strong&gt;zero-shot forecasting accuracy가 뛰어났습니다.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;하지만 &lt;strong&gt;낮은 forecasting error가 더 좋은 resource consolidation으로 이어지지는 않았습니다.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;특히 workload peak를 과소예측하면 평균 오차는 작더라도 실제 시스템에서는 capacity violation이 발생할 수 있습니다.&lt;/li&gt;
&lt;li&gt;효율과 안정성의 균형은 prediction quantile로 조절할 수 있습니다. 비용·효율 중심이라면 0.4–0.6, 안정성 중심이라면 0.8 이상을 고려할 수 있습니다.
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;왜 이 논문이 필요한가?&lt;/h1&gt;
&lt;p&gt;클라우드 데이터센터에서는 서비스 안정성을 보장하기 위해 실제 필요량보다 많은 자원을 미리 할당하는 &lt;strong&gt;over-provisioning&lt;/strong&gt;이 흔합니다. 논문은 이 때문에 글로벌 데이터센터의 평균 CPU utilization이 약 &lt;strong&gt;15–20%&lt;/strong&gt; 수준에 머문다고 설명합니다.&lt;/p&gt;
&lt;p&gt;이를 개선하는 대표적인 방법이 &lt;strong&gt;Resource Consolidation&lt;/strong&gt;입니다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;여러 VM을 가능한 한 적은 수의 Physical Machine(PM)에 배치해 서버 활용률을 높이는 것&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;하지만 현재 사용량만 보고 VM을 밀집 배치하면 workload spike가 발생했을 때 PM의 용량을 초과할 수 있습니다. 그래서 미래 수요를 먼저 예측하고 그 결과를 바탕으로 VM 배치를 최적화하는 &lt;strong&gt;Forecast-then-Optimize&lt;/strong&gt; 구조가 사용됩니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;과거 Workload
	↓
Time Series Forecasting
	↓
미래 Resource Demand 예측
	↓
Optimization
	↓
VM Placement / Consolidation
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;기존 benchmark는 대개 Forecasting 단계의 MAE, MASE 같은 예측 오차까지만 평가했습니다. CloudCons는 한 단계 더 나아가 그 예측으로 실제 배치를 결정했을 때 &lt;strong&gt;자원 효율성과 서비스 안정성이 어떻게 변하는지&lt;/strong&gt;까지 측정합니다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;CloudCons Benchmark&lt;/h1&gt;
&lt;p&gt;CloudCons는 세 cloud platform의 실제 workload를 정제해 사용합니다.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dataset&lt;/th&gt;
&lt;th&gt;Cloud&lt;/th&gt;
&lt;th&gt;주요 특징&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Huawei2025&lt;/td&gt;
&lt;td&gt;Huawei Cloud&lt;/td&gt;
&lt;td&gt;이질적인 workload와 높은 autocorrelation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure2019&lt;/td&gt;
&lt;td&gt;Microsoft Azure&lt;/td&gt;
&lt;td&gt;갑자기 부하가 튀는 pulse-like·bursty workload&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Borg2019-d&lt;/td&gt;
&lt;td&gt;Google Borg&lt;/td&gt;
&lt;td&gt;낮은 utilization과 high-frequency noise&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Borg2019-e&lt;/td&gt;
&lt;td&gt;Google Borg&lt;/td&gt;
&lt;td&gt;강한 24시간 주기&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이 구성이 중요한 이유는 모델이 한 종류의 데이터에서만 잘 맞는지를 보는 것이 아니라, &lt;strong&gt;서로 다른 workload 특성에서도 안정적으로 동작하는지&lt;/strong&gt; 확인할 수 있기 때문입니다.&lt;/p&gt;
&lt;h1&gt;어떤 모델을 비교했나?&lt;/h1&gt;
&lt;h2&gt;Statistical Models&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;AutoARIMA&lt;/li&gt;
&lt;li&gt;AutoETS&lt;/li&gt;
&lt;li&gt;AutoTheta&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Deep Learning Models&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;DLinear&lt;/li&gt;
&lt;li&gt;PatchTST&lt;/li&gt;
&lt;li&gt;DeepAR&lt;/li&gt;
&lt;li&gt;TFT&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Time Series Foundation Models&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Moirai 2&lt;/li&gt;
&lt;li&gt;Chronos 2&lt;/li&gt;
&lt;li&gt;TimesFM 2.5&lt;/li&gt;
&lt;li&gt;Sundial&lt;/li&gt;
&lt;li&gt;TOTO&lt;/li&gt;
&lt;li&gt;FlowState-9.1M&lt;/li&gt;
&lt;li&gt;Kairos 50M&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Foundation Model은 별도의 dataset-specific training 없이 &lt;strong&gt;zero-shot&lt;/strong&gt;으로 평가했습니다. 반면 Deep Learning 모델은 각 dataset에서 학습하고 hyperparameter tuning을 수행했습니다. Foundation Model에 더 불리해 보이는 설정에서도 강한 예측 성능을 보였다는 점이 흥미롭습니다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;RQ1 — Foundation Model은 Forecasting을 잘하는가?&lt;/h1&gt;
&lt;p&gt;결론부터 말하면 &lt;strong&gt;그렇습니다.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Huawei2025에서 Chronos 2는 MASE 0.752를 기록해 비교 대상 가운데 가장 좋은 수준의 성능을 보였습니다.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Huawei2025 MASE ↓&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AutoARIMA&lt;/td&gt;
&lt;td&gt;1.027&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PatchTST&lt;/td&gt;
&lt;td&gt;1.050&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TFT&lt;/td&gt;
&lt;td&gt;0.847&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Moirai 2&lt;/td&gt;
&lt;td&gt;0.869&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Chronos 2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.752&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TimesFM 2.5&lt;/td&gt;
&lt;td&gt;0.789&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Azure2019에서도 Chronos 2는 MASE 0.690, TimesFM 2.5는 0.700을 기록했습니다.&lt;/p&gt;
&lt;p&gt;:::tip
&lt;strong&gt;Foundation Model의 zero-shot generalization은 cloud workload에서도 강력했습니다.&lt;/strong&gt; 처음 보는 workload를 별도 학습 없이 예측했는데도 dataset별로 학습한 deep learning model과 경쟁하거나 능가했습니다.
:::&lt;/p&gt;
&lt;h1&gt;RQ2 — Forecasting을 잘하면 Resource Consolidation도 잘할까?&lt;/h1&gt;
&lt;p&gt;이 논문의 가장 중요한 결론은 &lt;strong&gt;그렇지 않을 수 있다&lt;/strong&gt;는 것입니다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Forecasting accuracy와 decision utility 사이에는 misalignment가 존재합니다.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Resource Consolidation에서는 전체 시점의 평균 오차보다 &lt;strong&gt;peak를 놓치지 않는 것&lt;/strong&gt;이 더 중요할 수 있습니다.&lt;/p&gt;
&lt;p&gt;예를 들어 실제 workload와 두 예측이 다음과 같다고 해보겠습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;실제:          20  20  20  20  90
Prediction A:  20  20  20  20  50
Prediction B:  25  25  25  25  95
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;평상시 오차만 보면 A가 좋아 보일 수 있습니다. 하지만 scheduler 관점에서는 90까지 올라갈 부하를 50으로 예상한 A가 훨씬 위험합니다. 여러 VM을 같은 PM에 배치한 뒤 실제 합산 사용량이 capacity를 넘을 수 있기 때문입니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;PM Capacity = 100
VM A 실제 사용량 50
VM B 실제 사용량 40
VM C 실제 사용량 20
---
Actual Total = 110
→ Capacity Violation
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::warning
&lt;strong&gt;Lower Forecast Error ≠ Better Decision&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;평균적인 예측 정확도가 좋아도 운영상 중요한 peak를 과소예측하면 더 나쁜 배치 결정을 만들 수 있습니다.
:::&lt;/p&gt;
&lt;h1&gt;Figure 6 사례 — 왜 Service Violation이 발생했나?&lt;/h1&gt;
&lt;p&gt;Appendix의 Figure 6은 이 misalignment를 가장 직관적으로 보여줍니다.&lt;/p&gt;
&lt;p&gt;Borg2019-e의 한 사례에서 optimizer는 Moirai 2의 예측을 바탕으로 5개 VM을 하나의 PM에 배치했습니다. 그러나 Moirai 2와 Sundial은 실제 aggregated demand peak를 크게 과소예측했습니다. optimizer는 안전한 배치라고 판단했지만 실제 workload는 PM capacity를 넘어섰습니다.&lt;/p&gt;
&lt;p&gt;반면 DeepAR은 전체 forecasting error는 더 컸지만 고부하 구간을 더 보수적으로 예측했습니다. 이 예측을 사용했다면 위험한 consolidation을 사전에 거부할 수 있었습니다.&lt;/p&gt;
&lt;p&gt;즉 모델 선택 기준은 다음 질문까지 포함해야 합니다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;이 모델이 평균적으로 얼마나 잘 맞는가가 아니라, &lt;strong&gt;잘못 예측했을 때 downstream system에 어떤 비용이 발생하는가?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h1&gt;무엇을 평가해야 할까?&lt;/h1&gt;
&lt;p&gt;CloudCons는 prediction metric과 consolidation metric을 함께 사용합니다.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;영역&lt;/th&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;의미&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Prediction&lt;/td&gt;
&lt;td&gt;MASE&lt;/td&gt;
&lt;td&gt;Forecasting error&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prediction&lt;/td&gt;
&lt;td&gt;CRPS&lt;/td&gt;
&lt;td&gt;Probabilistic forecasting 성능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resource Efficiency&lt;/td&gt;
&lt;td&gt;Util&lt;/td&gt;
&lt;td&gt;PM resource utilization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Load Balance&lt;/td&gt;
&lt;td&gt;PAR&lt;/td&gt;
&lt;td&gt;Peak 대비 평균 load&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reliability&lt;/td&gt;
&lt;td&gt;VR&lt;/td&gt;
&lt;td&gt;Capacity violation 발생 빈도&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reliability&lt;/td&gt;
&lt;td&gt;VS&lt;/td&gt;
&lt;td&gt;Violation의 심각도&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Uncertainty&lt;/td&gt;
&lt;td&gt;PICP&lt;/td&gt;
&lt;td&gt;Prediction interval coverage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Uncertainty&lt;/td&gt;
&lt;td&gt;MPIW&lt;/td&gt;
&lt;td&gt;Prediction interval width&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Uncertainty&lt;/td&gt;
&lt;td&gt;Winkler Score&lt;/td&gt;
&lt;td&gt;Coverage와 interval sharpness의 균형&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;CloudCons의 차별점은 &lt;strong&gt;얼마나 잘 맞췄는가&lt;/strong&gt;와 &lt;strong&gt;그 예측으로 운영했을 때 안전한가&lt;/strong&gt;를 분리해 측정한다는 데 있습니다.&lt;/p&gt;
&lt;h1&gt;Optimization Algorithm도 결과를 바꾼다&lt;/h1&gt;
&lt;p&gt;예측 이후에는 VM placement를 결정해야 합니다. 논문은 다음 네 방법을 비교합니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;FFD — First Fit Decreasing&lt;/li&gt;
&lt;li&gt;BFD — Best Fit Decreasing&lt;/li&gt;
&lt;li&gt;ACO — Ant Colony Optimization&lt;/li&gt;
&lt;li&gt;Gurobi MILP&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Gurobi는 가능한 한 적은 PM에 VM을 packing해 utilization을 높일 수 있습니다. 하지만 배치가 촘촘할수록 남는 buffer가 작아져 예측보다 workload가 조금만 증가해도 violation이 발생하기 쉽습니다.&lt;/p&gt;
&lt;p&gt;반대로 BFD 같은 heuristic에서 발생하는 fragmentation은 비효율처럼 보이지만, 실제로는 &lt;strong&gt;implicit safety margin&lt;/strong&gt; 역할을 할 수 있습니다.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;전략&lt;/th&gt;
&lt;th&gt;장점&lt;/th&gt;
&lt;th&gt;위험&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Aggressive Packing&lt;/td&gt;
&lt;td&gt;높은 utilization&lt;/td&gt;
&lt;td&gt;낮은 safety margin, 높은 violation risk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Conservative Packing&lt;/td&gt;
&lt;td&gt;높은 reliability&lt;/td&gt;
&lt;td&gt;낮은 utilization&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;:::tip
최적화 문제의 목적함수를 완벽히 푸는 것과 실제 시스템에서 가장 좋은 결과를 얻는 것은 같은 문제가 아닐 수 있습니다. 예측 불확실성을 목적함수와 제약조건에 어떻게 반영하는지가 중요합니다.
:::&lt;/p&gt;
&lt;h1&gt;Quantile은 효율과 안정성을 조절하는 손잡이다&lt;/h1&gt;
&lt;p&gt;Probabilistic forecasting model은 하나의 값 대신 여러 quantile을 출력할 수 있습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;P50 → 공격적인 배치
	→ 높은 utilization
	→ 높은 violation risk
P80 / P90 → 보수적인 배치
	→ 낮은 utilization
	→ 높은 reliability
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;논문의 Figure 5에서는 quantile이 높아질수록 Util과 VR이 함께 감소하는 패턴을 보여줍니다. 더 높은 수요를 가정해 배치하므로 서버 활용률은 낮아지지만 capacity violation도 줄어듭니다.&lt;/p&gt;
&lt;h2&gt;실무 가이드라인&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;운영 목표&lt;/th&gt;
&lt;th&gt;권장 Quantile&lt;/th&gt;
&lt;th&gt;해석&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cost-sensitive workload&lt;/td&gt;
&lt;td&gt;0.4–0.6&lt;/td&gt;
&lt;td&gt;Resource utilization을 유지하면서 violation을 일부 줄이는 균형 구간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mission-critical workload&lt;/td&gt;
&lt;td&gt;0.8 이상&lt;/td&gt;
&lt;td&gt;더 큰 safety margin을 확보해 service reliability 우선&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이 값은 모든 시스템에 그대로 적용되는 절대 기준이라기보다, CloudCons 실험에서 얻은 출발점입니다. 실제 운영에서는 SLA, workload 특성, capacity cost를 기준으로 다시 보정해야 합니다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;Fine-tuning을 하면 의사결정도 좋아질까?&lt;/h1&gt;
&lt;p&gt;Appendix의 추가 실험은 더 흥미로운 결과를 보여줍니다. 대표 Foundation Model을 fine-tuning하면 대체로 MASE와 CRPS는 개선됩니다. 그러나 downstream utility가 항상 좋아지는 것은 아닙니다.&lt;/p&gt;
&lt;p&gt;예를 들어 Azure2019에서 TOTO는 fine-tuning 후 MASE와 CRPS가 개선됐지만 violation rate는 &lt;strong&gt;0.122에서 0.150으로 악화&lt;/strong&gt;됐습니다. Huawei2025의 Chronos 2에서도 예측 정확도 개선과 달리 VR은 0.183에서 0.186으로 소폭 나빠졌습니다.&lt;/p&gt;
&lt;p&gt;:::warning
&lt;strong&gt;Fine-tuning으로 prediction metric을 개선했다고 배포 준비가 끝난 것은 아닙니다.&lt;/strong&gt; 반드시 downstream objective를 다시 평가해야 합니다.
:::&lt;/p&gt;
&lt;h1&gt;이 논문에서 가장 흥미로운 점&lt;/h1&gt;
&lt;p&gt;일반적인 forecasting benchmark의 논리는 다음과 같습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;MAE ↓
MSE ↓
MASE ↓
CRPS ↓
→ 좋은 모델
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;CloudCons는 한 단계 더 질문합니다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;그래서 그 예측을 실제 시스템에 사용하면 더 좋은 결정을 내릴 수 있는가?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;실험의 답은 &lt;strong&gt;반드시 그렇지는 않다&lt;/strong&gt;였습니다.&lt;/p&gt;
&lt;p&gt;이 메시지는 Cloud Resource Management뿐 아니라 예측을 사용하는 다양한 시스템에 적용됩니다.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prediction&lt;/th&gt;
&lt;th&gt;Downstream Decision&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Demand Forecasting&lt;/td&gt;
&lt;td&gt;Inventory Optimization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Traffic Forecasting&lt;/td&gt;
&lt;td&gt;Routing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Price Forecasting&lt;/td&gt;
&lt;td&gt;Trading Decision&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Energy Forecasting&lt;/td&gt;
&lt;td&gt;Grid Scheduling&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;각 문제에서 prediction metric과 downstream objective가 정말 정렬되어 있는지 따로 확인해야 합니다. 특히 과소예측과 과대예측의 비용이 비대칭적이라면 평균 오차 하나로 모델을 선택하는 것은 위험합니다.&lt;/p&gt;
&lt;h1&gt;장점과 한계&lt;/h1&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;구분&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;✅ 장점&lt;/td&gt;
&lt;td&gt;Forecasting과 optimization을 연결한 end-to-end 평가를 제공&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅ 장점&lt;/td&gt;
&lt;td&gt;서로 다른 세 cloud platform의 workload 특성을 비교&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅ 장점&lt;/td&gt;
&lt;td&gt;통계·딥러닝·Foundation Model을 같은 pipeline에서 평가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅ 장점&lt;/td&gt;
&lt;td&gt;Quantile 선택을 통해 efficiency–reliability trade-off를 분석&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⚠️ 한계&lt;/td&gt;
&lt;td&gt;Simulation 결과가 모든 실제 production 환경을 완전히 대변하지는 않음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⚠️ 한계&lt;/td&gt;
&lt;td&gt;CPU 중심 workload와 설정에 기반하므로 다른 resource·SLA에서는 재검증 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⚠️ 한계&lt;/td&gt;
&lt;td&gt;최적 quantile은 model, workload, optimizer와 비용 구조에 따라 달라질 수 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;마무리&lt;/h1&gt;
&lt;p&gt;CloudCons가 던지는 메시지는 명확합니다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;좋은 forecasting model과 좋은 decision-making system은 같은 것이 아닙니다.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Chronos 2와 TimesFM 2.5 같은 Foundation Model은 zero-shot forecasting에서 강력한 성능을 보여줍니다. 하지만 Resource Consolidation처럼 peak prediction과 risk가 중요한 downstream task에서는 평균적인 prediction accuracy만으로 모델을 평가해서는 부족합니다.&lt;/p&gt;
&lt;p&gt;결국 production 환경에서는 다음 세 가지를 함께 봐야 합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Forecast Accuracy
	-
Decision Utility
	-
Uncertainty Calibration
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;CloudCons는 이 세 요소를 하나의 benchmark 안에서 연결했다는 점에서 의미가 있습니다. 모델의 예측 점수가 좋아졌을 때 우리가 정말 확인해야 할 것은 숫자 하나가 아니라, &lt;strong&gt;그 예측이 실제 시스템의 결정을 어떻게 바꾸는가&lt;/strong&gt;입니다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;참고 자료&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://dl.acm.org/doi/10.1145/3770855.3817559&quot;&gt;CloudCons 논문 — ACM Digital Library&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/dmwyd/CloudCons&quot;&gt;CloudCons 공식 GitHub 저장소&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dl.acm.org/doi/proceedings/10.1145/3770855&quot;&gt;KDD 2026 Proceedings&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;이 글은 KDD 2026에 게재된 CloudCons 논문을 기준으로 정리했습니다.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>LSTM 이해하기 - RNN의 한계부터 Gate와 Cell State까지</title><link>https://fuwari.vercel.app/posts/lstm-rnn-gates-cell-state/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/lstm-rnn-gates-cell-state/</guid><description>일반 RNN의 장기 의존성 한계에서 출발해 LSTM의 Cell State와 Forget·Input·Output Gate가 왜 필요한지, 수식과 데이터 흐름, PyTorch 구현까지 연결해 설명합니다.</description><pubDate>Sun, 30 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&amp;lt;!-- notion-managed: regenerated by scripts/sync-notion.mjs, do not edit --&amp;gt;&lt;/p&gt;
&lt;p&gt;:::tip
&lt;strong&gt;핵심 요약(TL;DR)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;LSTM(Long Short-Term Memory)은 일반 RNN이 긴 시퀀스에서 과거 정보를 안정적으로 유지하기 어려운 문제를 완화하기 위해 만든 순환 신경망 구조입니다.&lt;/li&gt;
&lt;li&gt;핵심은 &lt;strong&gt;Cell State&lt;/strong&gt;라는 장기 기억 경로와, 정보를 선택적으로 버리고·쓰기·내보내는 &lt;strong&gt;Gate&lt;/strong&gt;입니다.&lt;/li&gt;
&lt;li&gt;Forget Gate, Input Gate, Output Gate가 각각 이전 기억의 유지, 새 정보의 저장, 현재 출력의 노출을 조절합니다.&lt;/li&gt;
&lt;li&gt;Cell State가 덧셈 중심으로 갱신되기 때문에 일반 RNN보다 장기 의존성(Long-term Dependency)을 학습하기 쉬워집니다.&lt;/li&gt;
&lt;li&gt;순서가 중요한 시계열·문장·이벤트 시퀀스 등에 사용할 수 있지만, 매우 긴 시퀀스나 대규모 병렬 처리가 중요한 문제에서는 Transformer가 더 적합할 수 있습니다.
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;왜 LSTM이 필요했을까?&lt;/h1&gt;
&lt;p&gt;문장을 왼쪽에서 오른쪽으로 읽는 RNN을 생각해 봅시다. 현재 단어를 해석할 때 이전 단어의 정보가 필요하므로, RNN은 이전 시점의 Hidden State를 다음 시점으로 전달합니다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;문장이 길어질수록, RNN은 아주 앞부분의 정보를 마지막까지 얼마나 잘 기억할 수 있을까?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;예를 들어 다음처럼 앞부분의 정보가 뒤에서 다시 필요할 수 있습니다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;나는 &lt;strong&gt;프랑스에서 태어났고&lt;/strong&gt; 여러 나라에서 오래 살았다. ... 그래서 내가 처음 배운 언어는 &lt;strong&gt;프랑스어&lt;/strong&gt;였다.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;마지막의 &quot;프랑스어&quot;를 예측하려면 꽤 앞에서 나온 &quot;프랑스&quot;라는 정보가 여전히 의미 있게 남아 있어야 합니다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;기존 방법: 일반 RNN은 어떻게 기억하는가?&lt;/h1&gt;
&lt;p&gt;일반 RNN은 현재 입력 $x_t$와 이전 Hidden State $h_{t-1}$를 이용해 새로운 Hidden State $h_t$를 계산합니다.&lt;/p&gt;
&lt;p&gt;$$
h_t = \tanh(W_x x_t + W_h h_{t-1} + b)
$$&lt;/p&gt;
&lt;p&gt;이 방식의 장점은 분명합니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;입력의 &lt;strong&gt;순서&lt;/strong&gt;를 반영할 수 있습니다.&lt;/li&gt;
&lt;li&gt;같은 파라미터를 모든 시점에 재사용하므로 길이가 다른 시퀀스도 처리할 수 있습니다.&lt;/li&gt;
&lt;li&gt;이전 상태가 다음 상태에 전달되므로 과거 문맥을 사용할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;하지만 중요한 문제가 하나 있습니다. &lt;strong&gt;과거의 정보가 매 시점마다 같은 변환을 반복해서 통과해야 한다&lt;/strong&gt;는 점입니다.&lt;/p&gt;
&lt;h1&gt;긴 시퀀스에서 무엇이 문제일까?&lt;/h1&gt;
&lt;p&gt;RNN을 학습할 때는 BPTT(Backpropagation Through Time)를 사용합니다. 마지막 시점의 Loss가 이전 시점들로 역전파되면서, 여러 Jacobian과 가중치가 반복해서 곱해집니다.&lt;/p&gt;
&lt;p&gt;이때 곱해지는 값들의 크기가 계속 1보다 작으면 Gradient가 매우 작아지는 &lt;strong&gt;Vanishing Gradient&lt;/strong&gt;가 발생할 수 있습니다. 반대로 반복 곱의 크기가 커지면 &lt;strong&gt;Exploding Gradient&lt;/strong&gt;가 발생할 수 있습니다.&lt;/p&gt;
&lt;p&gt;:::warning
&lt;strong&gt;중요한 포인트&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Vanishing Gradient는 단순히 &quot;RNN이 오래된 값을 저장할 공간이 부족하다&quot;는 문제가 아닙니다. 학습 과정에서 &lt;strong&gt;아주 오래전 입력이 현재 Loss에 어떤 영향을 주었는지 알려 주는 Gradient가 약해지기 쉬운 것&lt;/strong&gt;이 핵심입니다.
:::&lt;/p&gt;
&lt;p&gt;결과적으로 일반 RNN은 가까운 과거의 패턴은 잘 활용해도, 수십·수백 시점 떨어진 장기 의존성을 학습하기 어려울 수 있습니다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;그래서 필요한 것은 &lt;strong&gt;중요한 정보가 여러 시점을 지나도 비교적 안정적으로 흐를 수 있는 별도의 경로&lt;/strong&gt;였습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h1&gt;핵심 아이디어: 기억을 매번 새로 만들지 말고 관리하자&lt;/h1&gt;
&lt;p&gt;:::tip
&lt;strong&gt;LSTM의 핵심은 중요한 정보는 오래 유지하고, 필요 없는 정보는 선택적으로 버리는 것입니다.&lt;/strong&gt;
:::&lt;/p&gt;
&lt;p&gt;일반 RNN의 Hidden State 하나에 모든 역할을 맡기지 않고, LSTM은 상태를 두 종류로 나눕니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cell State&lt;/strong&gt; $c_t$: 장기적으로 전달할 기억&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hidden State&lt;/strong&gt; $h_t$: 현재 시점에서 외부로 드러나는 상태이자 다음 계산에 사용하는 단기 표현&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;그리고 세 개의 Gate가 정보 흐름을 조절합니다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Forget Gate&lt;/strong&gt;: 이전 Cell State에서 무엇을 유지할까?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Input Gate&lt;/strong&gt;: 새 정보 중 무엇을 Cell State에 기록할까?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Output Gate&lt;/strong&gt;: 현재 Cell State 중 무엇을 Hidden State로 보여 줄까?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Gate는 보통 Sigmoid를 사용해 각 원소에 대해 0~1 사이 값을 만듭니다. 0에 가까우면 거의 막고, 1에 가까우면 거의 통과시키는 &lt;strong&gt;연속적인 밸브&lt;/strong&gt;처럼 생각할 수 있습니다.&lt;/p&gt;
&lt;h1&gt;전체 구조 먼저 보기&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;┌──────────────────────────────────────────────┐
                │                Cell State                    │
cₜ₋₁ ──────────┼── × Forget ────────┐                       │
                │                    ├── + ───────────────→ cₜ│
                │      Candidate ─ × Input                     │
                └──────────────────────────────────────────────┘
                                     │
                                     tanh
                                      │
xₜ ───────┐                           × Output ─────────────→ hₜ
          ├──→ [Forget, Input, Candidate, Output Gates]
hₜ₋₁ ─────┘
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;한 시점 $t$에서 LSTM이 받는 핵심 입력은 세 가지입니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;현재 입력 $x_t$&lt;/li&gt;
&lt;li&gt;이전 Hidden State $h_{t-1}$&lt;/li&gt;
&lt;li&gt;이전 Cell State $c_{t-1}$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;그리고 다음 시점으로 $h_t$와 $c_t$를 전달합니다.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;구성 요소&lt;/th&gt;
&lt;th&gt;역할&lt;/th&gt;
&lt;th&gt;직관&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cell State $c_t$&lt;/td&gt;
&lt;td&gt;장기 기억 전달&lt;/td&gt;
&lt;td&gt;시퀀스를 따라 흐르는 메모리 통로&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hidden State $h_t$&lt;/td&gt;
&lt;td&gt;현재 시점의 표현&lt;/td&gt;
&lt;td&gt;지금 외부에 보여 줄 요약&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Forget Gate $f_t$&lt;/td&gt;
&lt;td&gt;이전 기억 유지 비율 결정&lt;/td&gt;
&lt;td&gt;지울 것과 남길 것을 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Input Gate $i_t$&lt;/td&gt;
&lt;td&gt;새 정보 저장 비율 결정&lt;/td&gt;
&lt;td&gt;새 메모리를 얼마나 쓸지 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Candidate $g_t$&lt;/td&gt;
&lt;td&gt;새로 기록할 후보 정보 생성&lt;/td&gt;
&lt;td&gt;메모장에 적을 내용의 초안&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output Gate $o_t$&lt;/td&gt;
&lt;td&gt;현재 기억의 노출 비율 결정&lt;/td&gt;
&lt;td&gt;메모리 중 지금 보여 줄 부분을 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h1&gt;핵심 구성 요소와 수식&lt;/h1&gt;
&lt;h2&gt;1. Forget Gate — 이전 기억을 얼마나 유지할까?&lt;/h2&gt;
&lt;p&gt;$$
f_t = \sigma(W_f [h_{t-1}, x_t] + b_f)
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$x_t$: 현재 입력&lt;/li&gt;
&lt;li&gt;$h_{t-1}$: 직전 시점의 Hidden State&lt;/li&gt;
&lt;li&gt;$[h_{t-1}, x_t]$: 두 벡터를 이어 붙인 값&lt;/li&gt;
&lt;li&gt;$W_f, b_f$: 학습되는 파라미터&lt;/li&gt;
&lt;li&gt;$\sigma$: 0~1 값을 만드는 Sigmoid&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Forget Gate의 출력 $f_t$는 Cell State와 같은 차원의 벡터입니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;어떤 원소가 0에 가까우면 → 해당 기억을 거의 제거&lt;/li&gt;
&lt;li&gt;어떤 원소가 1에 가까우면 → 해당 기억을 거의 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;즉, &quot;이전 기억 전체를 버릴까?&quot;를 하나의 스칼라로 정하는 것이 아니라 &lt;strong&gt;특징별로 유지 비율을 다르게 정합니다.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;2. Input Gate — 새 정보를 얼마나 저장할까?&lt;/h2&gt;
&lt;p&gt;먼저 새 정보를 얼마나 기록할지 결정합니다.&lt;/p&gt;
&lt;p&gt;$$
i_t = \sigma(W_i [h_{t-1}, x_t] + b_i)
$$&lt;/p&gt;
&lt;p&gt;그다음 실제로 기록할 후보 내용을 만듭니다.&lt;/p&gt;
&lt;p&gt;$$
g_t = \tanh(W_g [h_{t-1}, x_t] + b_g)
$$&lt;/p&gt;
&lt;p&gt;$i_t$는 &lt;strong&gt;쓰기 강도&lt;/strong&gt;, $g_t$는 &lt;strong&gt;쓸 내용&lt;/strong&gt;에 가깝습니다.&lt;/p&gt;
&lt;p&gt;Sigmoid를 사용하는 $i_t$는 0~1 사이에서 저장량을 조절하고, Tanh를 사용하는 $g_t$는 -1~1 범위의 후보 표현을 만듭니다.&lt;/p&gt;
&lt;h2&gt;3. Cell State Update — 기억을 실제로 갱신한다&lt;/h2&gt;
&lt;p&gt;$$
c_t = f_t \odot c_{t-1} + i_t \odot g_t
$$&lt;/p&gt;
&lt;p&gt;여기서 $\odot$는 원소별 곱(element-wise multiplication)입니다.&lt;/p&gt;
&lt;p&gt;이 식은 직관적으로 두 부분을 더합니다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;$f_t \odot c_{t-1}$ → &lt;strong&gt;과거 기억 중 남길 부분&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;$i_t \odot g_t$ → &lt;strong&gt;현재 새로 기록할 부분&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;일반 RNN과 비교했을 때 중요한 차이는 Cell State가 매번 완전히 새로운 비선형 변환으로 덮어쓰이지 않고, &lt;strong&gt;이전 상태를 선택적으로 유지한 뒤 새 정보를 덧붙이는 방식&lt;/strong&gt;으로 갱신된다는 점입니다.&lt;/p&gt;
&lt;p&gt;:::tip
이 덧셈 중심의 경로 덕분에 Gradient가 이전 시점으로 전달될 때 일반 RNN보다 안정적인 경로를 가질 수 있습니다. 다만 LSTM이 Vanishing Gradient를 수학적으로 완전히 제거하는 것은 아닙니다.
:::&lt;/p&gt;
&lt;h2&gt;4. Output Gate — 현재 시점에서 무엇을 보여 줄까?&lt;/h2&gt;
&lt;p&gt;$$
o_t = \sigma(W_o [h_{t-1}, x_t] + b_o)
$$&lt;/p&gt;
&lt;p&gt;$$
h_t = o_t \odot \tanh(c_t)
$$&lt;/p&gt;
&lt;p&gt;Cell State에는 장기 기억이 들어 있지만, 그 내용을 모두 현재 출력으로 사용할 필요는 없습니다.&lt;/p&gt;
&lt;p&gt;Output Gate는 현재 Cell State 중 &lt;strong&gt;지금 필요한 부분만 Hidden State로 노출&lt;/strong&gt;합니다. 이렇게 만들어진 $h_t$는 다음 시점의 Gate 계산에도 사용되고, 필요하면 분류기나 다음 레이어의 입력으로도 사용됩니다.&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;왜 Gate 계산에 $x_t$와 $h_{t-1}$를 함께 사용할까?&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt;현재 입력만 보면 &quot;지금 들어온 정보&quot;는 알 수 있지만 문맥은 알기 어렵습니다. 반대로 이전 Hidden State만 보면 과거 문맥은 알 수 있지만 현재 새 입력을 반영할 수 없습니다.&lt;/p&gt;
&lt;p&gt;두 값을 함께 사용하면 Gate가 &lt;strong&gt;현재 사건 + 지금까지의 문맥&lt;/strong&gt;을 기준으로 기억을 유지하거나 수정할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;역사적으로 모든 LSTM이 처음부터 Forget Gate를 가졌을까?&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt;아닙니다. 1997년의 초기 LSTM과 오늘날 프레임워크에서 흔히 사용하는 표준 LSTM은 세부 구조가 동일하지 않습니다. Forget Gate는 이후 제안되어 현대적인 LSTM의 대표 구성 요소가 되었습니다. 이 글은 &lt;strong&gt;현재 일반적으로 사용되는 LSTM Cell&lt;/strong&gt;을 기준으로 설명합니다.&lt;/p&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;데이터는 실제로 어떻게 흐를까?&lt;/h1&gt;
&lt;p&gt;배치 크기 32, 입력 특징 수 16, Hidden Size 64인 LSTM 한 층을 생각해 봅시다.&lt;/p&gt;
&lt;p&gt;현재 한 시점에서 텐서 크기는 다음과 같습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$x_t$: &lt;code&gt;[32, 16]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;$h_{t-1}$: &lt;code&gt;[32, 64]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;$c_{t-1}$: &lt;code&gt;[32, 64]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Gate 출력 $f_t, i_t, g_t, o_t$: 각각 &lt;code&gt;[32, 64]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;새 상태 $h_t, c_t$: 각각 &lt;code&gt;[32, 64]&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;입력&lt;/th&gt;
&lt;th&gt;계산&lt;/th&gt;
&lt;th&gt;결과&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;$&lt;code&gt;x_t&lt;/code&gt;, $&lt;code&gt;h_{t-1}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Forget Gate&lt;/td&gt;
&lt;td&gt;이전 기억의 유지 비율 $f_t$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;$&lt;code&gt;x_t&lt;/code&gt;, $&lt;code&gt;h_{t-1}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Input Gate + Candidate&lt;/td&gt;
&lt;td&gt;새로 저장할 양 $i_t$와 내용 $g_t$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;$c_{t-1}&lt;code&gt;, $&lt;/code&gt;f_t&lt;code&gt;, $&lt;/code&gt;i_t&lt;code&gt;, $&lt;/code&gt;g_t$&lt;/td&gt;
&lt;td&gt;Cell State Update&lt;/td&gt;
&lt;td&gt;새 장기 기억 $c_t$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;$x_t&lt;code&gt;, $&lt;/code&gt;h_{t-1}&lt;code&gt;, $&lt;/code&gt;c_t$&lt;/td&gt;
&lt;td&gt;Output Gate&lt;/td&gt;
&lt;td&gt;현재 Hidden State $h_t$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;$h_t&lt;code&gt;, $&lt;/code&gt;c_t$&lt;/td&gt;
&lt;td&gt;다음 시점으로 전달&lt;/td&gt;
&lt;td&gt;$t+1$의 이전 상태가 됨&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;작은 직관 예시&lt;/h2&gt;
&lt;p&gt;어떤 차원의 Cell State가 &quot;현재 문장의 주제가 금융인가?&quot; 같은 정보를 표현한다고 가정해 봅시다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;이전까지 금융 관련 문맥이 강했다면 $c_{t-1}$의 해당 성분이 큰 값을 가질 수 있습니다.&lt;/li&gt;
&lt;li&gt;현재 입력이 문맥과 무관한 수식어라면 Forget Gate가 1에 가까운 값을 내어 기존 정보를 유지할 수 있습니다.&lt;/li&gt;
&lt;li&gt;새로운 주제가 등장하면 Input Gate가 열리고 Candidate의 새 정보를 Cell State에 반영할 수 있습니다.&lt;/li&gt;
&lt;li&gt;현재 출력에 그 정보가 필요하지 않으면 Output Gate는 닫혀 있을 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;즉, &lt;strong&gt;기억하고 있는 것과 지금 출력하는 것은 다를 수 있습니다.&lt;/strong&gt; 이것이 Cell State와 Hidden State를 구분해서 봐야 하는 이유입니다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;전체 Forward 과정을 다시 연결하기&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;현재 입력 $x_t$와 이전 Hidden State $h_{t-1}$를 본다.&lt;/li&gt;
&lt;li&gt;Forget Gate로 이전 Cell State에서 유지할 정보를 정한다.&lt;/li&gt;
&lt;li&gt;Input Gate로 새 후보 정보 중 저장할 부분을 정한다.&lt;/li&gt;
&lt;li&gt;두 정보를 합쳐 새로운 Cell State $c_t$를 만든다.&lt;/li&gt;
&lt;li&gt;Output Gate로 Cell State 중 현재 노출할 부분을 정한다.&lt;/li&gt;
&lt;li&gt;새로운 Hidden State $h_t$를 만든다.&lt;/li&gt;
&lt;li&gt;$h_t$와 $c_t$를 다음 시점으로 넘긴다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;for each timestep t:
    decide what to keep from previous memory
    decide what new information to write
    update the cell state
    decide what part of the cell state to expose
    pass hidden state and cell state to the next timestep
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;PyTorch로 내부 계산 직접 구현하기&lt;/h1&gt;
&lt;p&gt;LSTM의 원리를 이해하려면 &lt;code&gt;nn.LSTM&lt;/code&gt;을 바로 쓰기 전에 Gate 계산을 직접 구현해 보는 것이 좋습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import torch
import torch.nn as nn


class MyLSTMCell(nn.Module):
    def __init__(self, input_size: int, hidden_size: int):
        super().__init__()
        self.hidden_size = hidden_size

        # [x_t, h_{t-1}]를 한 번에 받아
        # input, forget, candidate, output 네 벡터를 동시에 계산한다.
        self.linear = nn.Linear(
            input_size + hidden_size,
            4 * hidden_size,
        )

    def forward(self, x_t, state):
        h_prev, c_prev = state

        combined = torch.cat([x_t, h_prev], dim=-1)
        gates = self.linear(combined)

        i_raw, f_raw, g_raw, o_raw = gates.chunk(4, dim=-1)

        i_t = torch.sigmoid(i_raw)   # input gate
        f_t = torch.sigmoid(f_raw)   # forget gate
        g_t = torch.tanh(g_raw)      # candidate
        o_t = torch.sigmoid(o_raw)   # output gate

        c_t = f_t * c_prev + i_t * g_t
        h_t = o_t * torch.tanh(c_t)

        return h_t, c_t
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;핵심은 &lt;code&gt;linear&lt;/code&gt;의 출력 차원을 &lt;code&gt;4 * hidden_size&lt;/code&gt;로 만들고, 한 번의 선형 변환 결과를 네 Gate로 나누는 부분입니다. 수식에서는 Gate별로 $W_i, W_f, W_g, W_o$를 따로 썼지만, 구현에서는 효율을 위해 하나의 큰 행렬 연산으로 합치는 경우가 많습니다.&lt;/p&gt;
&lt;h2&gt;시퀀스 전체를 직접 순회하기&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;batch_size = 32
seq_len = 20
input_size = 16
hidden_size = 64

x = torch.randn(batch_size, seq_len, input_size)
cell = MyLSTMCell(input_size, hidden_size)

h_t = torch.zeros(batch_size, hidden_size)
c_t = torch.zeros(batch_size, hidden_size)

outputs = []

for t in range(seq_len):
    x_t = x[:, t, :]
    h_t, c_t = cell(x_t, (h_t, c_t))
    outputs.append(h_t)

outputs = torch.stack(outputs, dim=1)
print(outputs.shape)  # [32, 20, 64]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이 코드에서 중요한 것은 Python &lt;code&gt;for&lt;/code&gt;문 자체가 아니라 &lt;strong&gt;시점&lt;/strong&gt; $t$&lt;strong&gt;의 상태가&lt;/strong&gt; $t+1$ &lt;strong&gt;계산에 필요하다는 의존성&lt;/strong&gt;입니다. LSTM이 본질적으로 순차 계산을 요구하는 이유입니다.&lt;/p&gt;
&lt;h1&gt;실무에서는 &lt;code&gt;nn.LSTM&lt;/code&gt; 사용하기&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;import torch
import torch.nn as nn

batch_size = 32
seq_len = 20
input_size = 16
hidden_size = 64
num_layers = 2

x = torch.randn(batch_size, seq_len, input_size)

lstm = nn.LSTM(
    input_size=input_size,
    hidden_size=hidden_size,
    num_layers=num_layers,
    batch_first=True,
)

output, (h_n, c_n) = lstm(x)

print(output.shape)  # [32, 20, 64]
print(h_n.shape)     # [2, 32, 64]
print(c_n.shape)     # [2, 32, 64]
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;output&lt;/code&gt;: 마지막 레이어의 &lt;strong&gt;모든 시점 Hidden State&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;h_n&lt;/code&gt;: 각 레이어의 &lt;strong&gt;마지막 Hidden State&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;c_n&lt;/code&gt;: 각 레이어의 &lt;strong&gt;마지막 Cell State&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::warning
&lt;code&gt;batch_first=True&lt;/code&gt;는 입력과 &lt;code&gt;output&lt;/code&gt;을 &lt;code&gt;[batch, sequence, feature]&lt;/code&gt; 형태로 바꾸지만, &lt;code&gt;h_n&lt;/code&gt;과 &lt;code&gt;c_n&lt;/code&gt;의 차원 순서는 &lt;code&gt;[layers × directions, batch, hidden]&lt;/code&gt; 형태를 유지합니다.
:::&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;학습할 때는 무엇이 업데이트될까?&lt;/h1&gt;
&lt;p&gt;LSTM에서 직접 학습되는 것은 Gate의 결과값 자체가 아니라 Gate를 계산하는 &lt;strong&gt;가중치와 Bias&lt;/strong&gt;입니다.&lt;/p&gt;
&lt;p&gt;예를 들어 다음 파라미터들이 Gradient Descent로 업데이트됩니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Forget Gate의 $W_f, b_f$&lt;/li&gt;
&lt;li&gt;Input Gate의 $W_i, b_i$&lt;/li&gt;
&lt;li&gt;Candidate의 $W_g, b_g$&lt;/li&gt;
&lt;li&gt;Output Gate의 $W_o, b_o$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;학습 흐름은 일반적인 신경망과 같습니다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;시퀀스를 Forward 한다.&lt;/li&gt;
&lt;li&gt;모델 출력으로 Loss를 계산한다.&lt;/li&gt;
&lt;li&gt;BPTT를 통해 여러 시점으로 Gradient를 전달한다.&lt;/li&gt;
&lt;li&gt;Optimizer가 LSTM 파라미터를 업데이트한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;model = nn.LSTM(
    input_size=16,
    hidden_size=64,
    batch_first=True,
)

head = nn.Linear(64, 3)
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(
    list(model.parameters()) + list(head.parameters()),
    lr=1e-3,
)

x = torch.randn(32, 20, 16)
y = torch.randint(0, 3, (32,))

output, _ = model(x)
last_hidden = output[:, -1, :]
logits = head(last_hidden)
loss = criterion(logits, y)

optimizer.zero_grad()
loss.backward()
optimizer.step()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;학습과 추론에서 LSTM Cell의 기본 Forward 계산 자체는 같습니다. 다만 학습에서는 Gradient를 저장하고 역전파하며, 추론에서는 보통 Gradient 계산을 끕니다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;계산 특성&lt;/h1&gt;
&lt;p&gt;LSTM은 일반 RNN보다 장기 의존성을 다루기 쉬워졌지만 계산 비용은 더 큽니다. 한 시점마다 여러 Gate를 계산해야 하기 때문입니다.&lt;/p&gt;
&lt;p&gt;특히 중요한 특성은 &lt;strong&gt;시간축 병렬화가 어렵다&lt;/strong&gt;는 점입니다.&lt;/p&gt;
&lt;p&gt;$h_t$와 $c_t$를 계산해야 $h_{t+1}$와 $c_{t+1}$를 계산할 수 있으므로, 한 시퀀스 내부의 시점들을 완전히 독립적으로 계산할 수 없습니다.&lt;/p&gt;
&lt;p&gt;이 특성은 긴 시퀀스를 대규모로 처리할 때 Transformer 계열과 비교되는 대표적인 한계입니다.&lt;/p&gt;
&lt;h1&gt;장점과 한계&lt;/h1&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;구분&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;장점&lt;/td&gt;
&lt;td&gt;일반 RNN보다 장기 의존성을 학습하기 쉽다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;장점&lt;/td&gt;
&lt;td&gt;Cell State와 Gate를 통해 기억의 유지·수정·노출을 세밀하게 조절한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;장점&lt;/td&gt;
&lt;td&gt;길이가 가변적인 시퀀스를 자연스럽게 처리할 수 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;한계&lt;/td&gt;
&lt;td&gt;일반 RNN보다 파라미터와 계산량이 많다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;한계&lt;/td&gt;
&lt;td&gt;시간축 순차 의존성 때문에 긴 시퀀스의 병렬화가 어렵다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;한계&lt;/td&gt;
&lt;td&gt;매우 긴 거리의 의존성을 항상 안정적으로 해결하는 것은 아니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;:::warning
&lt;strong&gt;자주 오해하는 부분&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cell State와 Hidden State는 같은 값이 아닙니다.&lt;/li&gt;
&lt;li&gt;Forget Gate는 정보를 완전히 삭제하는 스위치가 아니라, 보통 0~1의 연속값으로 기억의 통과량을 조절합니다.&lt;/li&gt;
&lt;li&gt;LSTM이 Vanishing Gradient를 완전히 없애는 것은 아닙니다. 일반 RNN보다 장기 정보가 흐르기 좋은 경로를 제공하는 것입니다.&lt;/li&gt;
&lt;li&gt;Hidden State의 마지막 값 하나가 항상 시퀀스 전체를 완벽히 요약한다고 볼 수는 없습니다.
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h1&gt;실무에서 체크할 조건&lt;/h1&gt;
&lt;h2&gt;Padding이 있는 가변 길이 배치&lt;/h2&gt;
&lt;p&gt;문장마다 길이가 다르면 짧은 문장 뒤에 Padding을 붙이는 경우가 많습니다. 그대로 마지막 시점을 사용하면 실제 마지막 토큰이 아니라 Padding 위치의 Hidden State를 사용할 수 있습니다.&lt;/p&gt;
&lt;p&gt;PyTorch에서는 &lt;code&gt;pack_padded_sequence&lt;/code&gt;와 &lt;code&gt;pad_packed_sequence&lt;/code&gt;를 사용하면 Padding 구간을 불필요하게 순회하는 계산을 줄일 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;초기 Hidden/Cell State는 어떻게 정할까?&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt;가장 흔한 기본값은 0으로 초기화하는 것입니다. 다만 연속된 긴 스트림을 여러 Chunk로 나누어 처리할 때는 이전 Chunk의 상태를 다음 Chunk에 넘길 수도 있습니다.&lt;/p&gt;
&lt;p&gt;학습 그래프를 무한히 연결하지 않으려면 상황에 따라 상태를 &lt;code&gt;detach()&lt;/code&gt;해야 합니다.&lt;/p&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;Bidirectional LSTM은 무엇이 다른가?&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt;일반 LSTM은 과거 → 미래 방향으로만 상태를 전달합니다. Bidirectional LSTM은 정방향과 역방향 LSTM을 함께 사용해 각 위치가 양쪽 문맥을 이용할 수 있게 합니다.&lt;/p&gt;
&lt;p&gt;다만 미래 입력을 볼 수 없는 실시간 예측 문제에서는 역방향 정보가 사용 불가능할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;h1&gt;언제 LSTM을 사용하면 좋은가?&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;순서가 중요하고, 현재 예측에 이전 정보가 영향을 주는 시퀀스 데이터&lt;/strong&gt;에 잘 맞습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;중간 규모 시계열 데이터&lt;/strong&gt; → 과거 관측의 흐름이 현재 값에 영향을 주는 경우&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;텍스트 분류&lt;/strong&gt; → 단어 순서와 문맥을 순차적으로 읽어야 하는 경우&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;이벤트 로그 / 사용자 행동 시퀀스&lt;/strong&gt; → 이전 행동의 순서가 이후 행동 예측에 중요한 경우&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;스트리밍 입력&lt;/strong&gt; → 입력이 시간 순서대로 하나씩 도착하며 상태를 계속 이어갈 수 있는 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;특히 Transformer의 큰 병렬 처리 장점이 꼭 필요하지 않거나, 데이터·모델 규모가 비교적 작고 순환 상태라는 inductive bias가 유용한 상황에서는 여전히 실용적인 선택이 될 수 있습니다.&lt;/p&gt;
&lt;h1&gt;언제 다른 모델을 고려할까?&lt;/h1&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;상황&lt;/th&gt;
&lt;th&gt;추천&lt;/th&gt;
&lt;th&gt;이유 / 대안&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;짧고 단순한 순차 패턴&lt;/td&gt;
&lt;td&gt;✅ LSTM&lt;/td&gt;
&lt;td&gt;구조가 충분히 강력하면서 구현이 간단하다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;파라미터 수를 줄이고 싶음&lt;/td&gt;
&lt;td&gt;⚠️ GRU 고려&lt;/td&gt;
&lt;td&gt;Gate 구조가 더 단순하고 성능이 비슷한 경우가 많다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;매우 긴 문맥 + 대규모 병렬 학습&lt;/td&gt;
&lt;td&gt;❌ 우선순위 낮음&lt;/td&gt;
&lt;td&gt;Transformer 계열이 시간축 병렬화와 장거리 참조에 유리할 수 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;순서보다 지역 패턴이 핵심인 신호&lt;/td&gt;
&lt;td&gt;⚠️ CNN 고려&lt;/td&gt;
&lt;td&gt;고정된 지역 패턴을 효율적으로 추출하는 데 유리할 수 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;미래 정보 사용이 금지된 실시간 예측&lt;/td&gt;
&lt;td&gt;✅ 단방향 LSTM&lt;/td&gt;
&lt;td&gt;Bidirectional 구조는 미래 시점을 보기 때문에 주의해야 한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h1&gt;RNN, LSTM, GRU, Transformer 비교&lt;/h1&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;방법&lt;/th&gt;
&lt;th&gt;핵심 아이디어&lt;/th&gt;
&lt;th&gt;강점&lt;/th&gt;
&lt;th&gt;한계&lt;/th&gt;
&lt;th&gt;적합한 상황&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Vanilla RNN&lt;/td&gt;
&lt;td&gt;Hidden State 하나를 반복 전달&lt;/td&gt;
&lt;td&gt;구조가 가장 단순&lt;/td&gt;
&lt;td&gt;장기 의존성 학습이 어려움&lt;/td&gt;
&lt;td&gt;짧고 단순한 시퀀스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LSTM&lt;/td&gt;
&lt;td&gt;Cell State + 여러 Gate&lt;/td&gt;
&lt;td&gt;장기 기억 관리가 쉬움&lt;/td&gt;
&lt;td&gt;계산량과 파라미터가 증가&lt;/td&gt;
&lt;td&gt;중장기 시퀀스 패턴&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GRU&lt;/td&gt;
&lt;td&gt;Gate 구조를 단순화&lt;/td&gt;
&lt;td&gt;LSTM보다 가벼운 편&lt;/td&gt;
&lt;td&gt;문제에 따라 LSTM과 우열이 달라짐&lt;/td&gt;
&lt;td&gt;효율과 순환 모델이 모두 필요한 경우&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transformer&lt;/td&gt;
&lt;td&gt;Attention으로 위치 간 직접 참조&lt;/td&gt;
&lt;td&gt;병렬화와 장거리 관계 모델링에 강함&lt;/td&gt;
&lt;td&gt;Attention 비용과 메모리 사용이 커질 수 있음&lt;/td&gt;
&lt;td&gt;대규모 NLP, 긴 문맥, 병렬 학습&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;어떻게 발전했는가?&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;Vanilla RNN
   │
   │ 장기 의존성 / Gradient 문제
   ▼
LSTM
   │
   │ Gate 구조를 더 단순하게
   ▼
GRU
   │
   │ 멀리 떨어진 위치를 직접 참조하고 싶음
   ▼
Attention
   │
   │ 순환 계산 자체를 제거하고 병렬화
   ▼
Transformer
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이 흐름을 단순히 &quot;새 모델이 이전 모델보다 항상 좋다&quot;라고 이해하면 안 됩니다. 각 구조는 계산 자원, 데이터 크기, 입력 길이, 지연 시간, 온라인 처리 여부 등에 따라 다른 Trade-off를 가집니다.&lt;/p&gt;
&lt;h1&gt;실제 활용&lt;/h1&gt;
&lt;p&gt;LSTM은 다음과 같은 시퀀스 문제에서 오랫동안 널리 사용되어 왔고, 현재도 데이터 규모나 시스템 제약에 따라 유효한 선택입니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;시계열 예측&lt;/strong&gt;: 센서, 수요, 트래픽처럼 과거 흐름이 미래 값에 영향을 주는 데이터&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;텍스트 처리&lt;/strong&gt;: 문장 분류, sequence labeling 등 순서 기반 표현이 필요한 문제&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;음성·신호 처리&lt;/strong&gt;: 시간 순서가 중요한 연속 신호&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;이상 탐지&lt;/strong&gt;: 정상 시퀀스의 동역학을 학습해 비정상 패턴을 찾는 문제&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;행동 예측&lt;/strong&gt;: 클릭, 구매, 이벤트 로그처럼 이전 행동이 다음 행동과 관련된 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;실제 시스템에서는 LSTM 하나만 사용하는 것이 아니라 Embedding, CNN, Attention, MLP, CRF 등 다른 모듈과 조합하는 경우도 많습니다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;이해도 확인&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;일반 RNN보다 LSTM의 Cell State가 장기 정보를 전달하기 쉬운 이유는 무엇일까요?&lt;/li&gt;
&lt;li&gt;Forget Gate가 항상 0 또는 1만 출력한다면 어떤 문제가 생길까요?&lt;/li&gt;
&lt;li&gt;Cell State와 Hidden State를 별도로 유지하면 어떤 장점이 있을까요?&lt;/li&gt;
&lt;li&gt;LSTM이 Transformer보다 시간축 병렬화가 어려운 이유는 무엇일까요?&lt;/li&gt;
&lt;li&gt;가변 길이 문장을 Padding해서 학습할 때 마지막 Hidden State를 그대로 사용하는 것이 위험할 수 있는 이유는 무엇일까요?
&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;힌트&amp;lt;/summary&amp;gt;&lt;/li&gt;
&lt;li&gt;Cell State 갱신식에서 &quot;덮어쓰기&quot;보다 &quot;유지 + 추가&quot;가 어떻게 나타나는지 보세요.&lt;/li&gt;
&lt;li&gt;Gate를 연속적인 밸브로 생각해 보세요.&lt;/li&gt;
&lt;li&gt;&quot;오래 기억할 정보&quot;와 &quot;지금 출력할 정보&quot;가 항상 같은지 생각해 보세요.&lt;/li&gt;
&lt;li&gt;$t+1$ 계산 전에 필요한 값이 무엇인지 확인하세요.&lt;/li&gt;
&lt;li&gt;배치의 마지막 인덱스가 각 샘플의 실제 마지막 토큰인지 확인하세요.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;h1&gt;핵심 정리&lt;/h1&gt;
&lt;p&gt;:::tip&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;LSTM은 &lt;strong&gt;일반 RNN의 장기 의존성 학습 문제를 완화&lt;/strong&gt;하기 위해 등장했습니다.&lt;/li&gt;
&lt;li&gt;핵심은 &lt;strong&gt;Cell State라는 장기 기억 경로&lt;/strong&gt;와 정보 흐름을 조절하는 &lt;strong&gt;Forget/Input/Output Gate&lt;/strong&gt;입니다.&lt;/li&gt;
&lt;li&gt;Cell State는 $c_t = f_t \odot c_{t-1} + i_t \odot g_t$처럼 이전 기억을 선택적으로 유지하고 새 정보를 더하는 방식으로 갱신됩니다.&lt;/li&gt;
&lt;li&gt;일반 RNN보다 긴 문맥을 다루기 쉽지만, 순차 계산 때문에 &lt;strong&gt;긴 시퀀스의 병렬화가 어렵고 계산량이 더 큽니다.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;문제 규모와 시스템 요구에 따라 GRU, Attention, Transformer 같은 대안과 비교해서 선택해야 합니다.
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;다음에 공부하면 좋은 것&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;GRU&lt;/strong&gt; → LSTM의 Gate 구조를 더 단순하게 만든 순환 모델입니다. LSTM의 각 Gate가 정말 모두 필요한지 생각해 보기 좋습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bidirectional RNN/LSTM&lt;/strong&gt; → 한 방향 상태 전달의 한계를 보완해 양쪽 문맥을 사용하는 방법입니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Attention Mechanism&lt;/strong&gt; → 모든 정보를 하나의 순환 상태에 압축하지 않고, 필요한 시점의 표현을 직접 참조하는 아이디어입니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Transformer&lt;/strong&gt; → Attention을 중심으로 순환 구조를 제거해 시퀀스 내부 병렬화를 가능하게 만든 구조입니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h1&gt;참고 자료&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Hochreiter, S. &amp;amp; Schmidhuber, J. (1997), &lt;strong&gt;Long Short-Term Memory&lt;/strong&gt;, Neural Computation. &lt;a href=&quot;https://doi.org/10.1162/neco.1997.9.8.1735&quot;&gt;https://doi.org/10.1162/neco.1997.9.8.1735&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;PyTorch Documentation, &lt;strong&gt;torch.nn.LSTM&lt;/strong&gt;: &lt;a href=&quot;https://docs.pytorch.org/docs/stable/generated/torch.nn.LSTM.html&quot;&gt;https://docs.pytorch.org/docs/stable/generated/torch.nn.LSTM.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Chronos-2 이해하기 - 단변량 예측에서 범용 시계열 Foundation Model로</title><link>https://fuwari.vercel.app/posts/chronos-2-universal-time-series-forecasting/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/chronos-2-universal-time-series-forecasting/</guid><description>Chronos-2가 기존 시계열 Foundation Model의 단변량 한계를 Group Attention과 In-Context Learning으로 어떻게 확장했는지, 구조·데이터 흐름·확률 예측·Python 사용법까지 연결해 설명합니다.</description><pubDate>Sun, 30 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&amp;lt;!-- notion-managed: regenerated by scripts/sync-notion.mjs, do not edit --&amp;gt;&lt;/p&gt;
&lt;p&gt;:::tip
&lt;strong&gt;핵심 요약(TL;DR)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Chronos-2&lt;/strong&gt;는 Amazon이 공개한 사전학습 시계열 예측 모델(Time Series Foundation Model)로, 별도 학습 없이 &lt;strong&gt;zero-shot&lt;/strong&gt;으로 새로운 시계열을 예측할 수 있습니다.&lt;/li&gt;
&lt;li&gt;기존 시계열 Foundation Model이 주로 단변량(univariate) 예측에 집중했다면, Chronos-2는 &lt;strong&gt;단변량·다변량(multivariate)·외생변수(covariate)를 사용하는 예측&lt;/strong&gt;을 하나의 모델에서 처리합니다.&lt;/li&gt;
&lt;li&gt;가장 중요한 아이디어는 &lt;strong&gt;Group Attention&lt;/strong&gt;입니다. 같은 문제에 속한 여러 시계열이 서로의 정보를 참고하도록 만들어 In-Context Learning(ICL)을 수행합니다.&lt;/li&gt;
&lt;li&gt;시간축의 패턴은 &lt;strong&gt;Time Attention&lt;/strong&gt;, 변수·시계열 사이의 관계는 &lt;strong&gt;Group Attention&lt;/strong&gt;이 나누어 처리합니다.&lt;/li&gt;
&lt;li&gt;결과를 하나의 값으로만 출력하지 않고 여러 &lt;strong&gt;Quantile&lt;/strong&gt;을 직접 예측하므로 예측값뿐 아니라 불확실성도 함께 표현할 수 있습니다.
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;시계열 예측에서 반복되던 문제&lt;/h1&gt;
&lt;p&gt;시계열 예측(Time Series Forecasting)을 실제 서비스에 적용한다고 생각해 봅시다.&lt;/p&gt;
&lt;p&gt;쇼핑몰이라면 상품별 판매량을 예측해야 하고, 데이터센터라면 CPU·Memory·Disk I/O를 예측해야 합니다. 전력 수요를 예측할 때는 온도나 날씨도 중요하고, 상품 수요를 예측할 때는 예정된 할인 행사나 가격 정보가 영향을 줍니다.&lt;/p&gt;
&lt;p&gt;그런데 전통적인 예측 시스템에서는 새로운 데이터셋이나 새로운 서비스가 생길 때마다 다음 과정을 반복하는 경우가 많습니다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;데이터를 수집한다.&lt;/li&gt;
&lt;li&gt;해당 데이터에 맞는 모델을 고른다.&lt;/li&gt;
&lt;li&gt;Feature와 Hyperparameter를 조정한다.&lt;/li&gt;
&lt;li&gt;모델을 학습한다.&lt;/li&gt;
&lt;li&gt;검증하고 다시 튜닝한다.&lt;/li&gt;
&lt;li&gt;다른 데이터셋이 생기면 비슷한 과정을 반복한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;언어 모델처럼, 시계열에서도 이미 다양한 패턴을 학습한 하나의 모델을 가져와 바로 예측할 수는 없을까?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;이 질문에서 Time Series Foundation Model이라는 흐름이 시작됩니다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;기존 방법은 어떻게 시계열을 예측했을까?&lt;/h1&gt;
&lt;h2&gt;Local Model: 시계열마다 따로 학습&lt;/h2&gt;
&lt;p&gt;ARIMA, ETS(Exponential Smoothing)와 같은 전통적 방법은 개별 시계열에 모델을 맞추는 방식이 대표적입니다.&lt;/p&gt;
&lt;p&gt;예를 들어 상품 A와 상품 B의 판매량이 있다면 각각 별도의 파라미터를 추정할 수 있습니다.&lt;/p&gt;
&lt;p&gt;이 방식은 데이터의 구조를 명확하게 해석할 수 있고 작은 데이터에서도 강력한 경우가 많습니다. 하지만 수천·수만 개의 시계열을 운영하면 모델 관리 비용이 커집니다.&lt;/p&gt;
&lt;h2&gt;Global Model: 여러 시계열에서 하나의 모델 학습&lt;/h2&gt;
&lt;p&gt;DeepAR, TFT, N-BEATS, N-HITS 같은 딥러닝 기반 모델은 여러 시계열을 함께 학습하면서 공통 패턴을 공유할 수 있습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;여러 시계열 데이터
        ↓
하나의 Global Model 학습
        ↓
해당 데이터셋의 여러 시계열 예측
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Local Model보다 확장성이 좋아졌지만 여전히 대개 &lt;strong&gt;특정 데이터셋을 위한 학습 과정&lt;/strong&gt;이 필요합니다.&lt;/p&gt;
&lt;h1&gt;Foundation Model은 무엇을 바꿨을까?&lt;/h1&gt;
&lt;p&gt;Foundation Model의 발상은 다릅니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;대규모·다양한 시계열 데이터
          ↓
      Pretraining
          ↓
범용 시계열 Foundation Model
          ↓
┌─────────┼─────────┐
전력      판매량      트래픽
예측      예측        예측
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;모델을 한 번 대규모로 사전학습한 뒤 처음 보는 데이터에서도 추가 학습 없이 예측하는 &lt;strong&gt;Zero-shot Forecasting&lt;/strong&gt;을 목표로 합니다.&lt;/p&gt;
&lt;p&gt;:::tip
&lt;strong&gt;Zero-shot forecasting&lt;/strong&gt;은 새로운 데이터셋을 모델이 처음 보더라도 그 데이터에 맞춰 추가 학습·Fine-tuning하지 않고 바로 예측하는 설정입니다.
:::&lt;/p&gt;
&lt;p&gt;이 방식이 잘 작동한다면 시계열 예측 파이프라인을 크게 단순화할 수 있습니다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;Chronos: 시계열을 언어처럼 다뤄보자&lt;/h1&gt;
&lt;p&gt;Amazon이 2024년에 공개한 첫 Chronos의 핵심 아이디어는 매우 흥미로웠습니다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;실수값으로 이루어진 시계열을 Token으로 변환하면 언어 모델과 비슷하게 학습할 수 있지 않을까?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;기존 Chronos는 시계열 값을 Scaling한 뒤 Quantization을 통해 구간(bin)에 대응하는 Token으로 변환했습니다. 이후 T5 계열 언어 모델 구조를 사용해 다음 Token을 예측하도록 학습합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;실수 시계열
[12.1, 12.5, 13.0, 12.8, ...]
        ↓ Scaling
        ↓ Quantization
시계열 Token
[241, 248, 257, 253, ...]
        ↓
Transformer
        ↓
미래 Token 생성
        ↓ Dequantization
미래 시계열
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이 접근은 &lt;strong&gt;시계열에도 대규모 사전학습 + Zero-shot 예측이 가능하다&lt;/strong&gt;는 것을 보여주었습니다.&lt;/p&gt;
&lt;p&gt;하지만 실제 예측 시스템에서는 한 가지 중요한 문제가 남았습니다.&lt;/p&gt;
&lt;h1&gt;기존 Chronos 계열의 중요한 한계&lt;/h1&gt;
&lt;p&gt;현실의 예측 문제는 하나의 숫자 흐름만 보는 경우보다 훨씬 복잡합니다.&lt;/p&gt;
&lt;p&gt;예를 들어 전력 소비량을 예측한다고 해봅시다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Target
전력 사용량 ─────────────→ 미래 사용량 예측

관련 정보
온도 ────────────────────┐
습도 ────────────────────┤
요일 ────────────────────┤ → 예측에 도움
공휴일 여부 ──────────────┤
예보된 미래 온도 ─────────┘
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;기존 시계열 Foundation Model 대부분은 &lt;strong&gt;하나의 시계열 과거값만 입력받는 단변량 예측&lt;/strong&gt;에 집중했습니다.&lt;/p&gt;
&lt;p&gt;그러면 다음 정보를 충분히 활용하기 어렵습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;여러 Target이 함께 움직이는 관계&lt;/li&gt;
&lt;li&gt;다른 변수와의 상호작용&lt;/li&gt;
&lt;li&gt;과거에만 관측되는 Covariate&lt;/li&gt;
&lt;li&gt;미래 값을 미리 알고 있는 Covariate&lt;/li&gt;
&lt;li&gt;여러 유사 시계열 사이에 반복되는 패턴&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::warning
**Covariate(공변량·외생변수)**는 예측 대상 자체는 아니지만 Target의 미래값을 설명하는 데 도움이 되는 추가 변수입니다. 판매량 예측의 가격·프로모션, 전력 예측의 날씨가 대표적입니다.
:::&lt;/p&gt;
&lt;p&gt;즉 Foundation Model이라는 범용성을 실제 문제까지 확장하려면 단순히 &lt;strong&gt;한 시계열을 잘 예측하는 모델&lt;/strong&gt;을 넘어 &lt;strong&gt;여러 시계열과 보조 정보의 관계를 그 자리에서 파악하는 모델&lt;/strong&gt;이 필요했습니다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;Chronos-2의 핵심 아이디어&lt;/h1&gt;
&lt;p&gt;:::tip
&lt;strong&gt;Chronos-2의 핵심은 같은 예측 문제에 속한 여러 시계열을 하나의 Group으로 묶고, Group Attention을 통해 서로의 정보를 참고하게 만드는 것입니다.&lt;/strong&gt;
:::&lt;/p&gt;
&lt;p&gt;이 구조 덕분에 하나의 Chronos-2 모델이 서로 다른 형태의 문제를 처리할 수 있습니다.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;문제 유형&lt;/th&gt;
&lt;th&gt;입력 예시&lt;/th&gt;
&lt;th&gt;모델이 활용하는 관계&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Univariate&lt;/td&gt;
&lt;td&gt;상품 A 판매량&lt;/td&gt;
&lt;td&gt;한 시계열 내부의 시간 패턴&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross Learning&lt;/td&gt;
&lt;td&gt;여러 상품의 판매량&lt;/td&gt;
&lt;td&gt;비슷한 상품 사이의 패턴&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multivariate&lt;/td&gt;
&lt;td&gt;CPU, Memory, Disk I/O&lt;/td&gt;
&lt;td&gt;여러 Target이 함께 변하는 관계&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Covariate-informed&lt;/td&gt;
&lt;td&gt;판매량 + 가격 + 프로모션&lt;/td&gt;
&lt;td&gt;Target과 외생변수 사이의 관계&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;중요한 점은 문제마다 별도의 모델 구조를 만들지 않는다는 것입니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;어떤 시계열을 같은 Group으로 지정하는가&lt;/strong&gt;, 그리고 &lt;strong&gt;미래에 어떤 값이 관측 가능한가&lt;/strong&gt;를 통해 모델이 예측 문제의 형태를 파악합니다.&lt;/p&gt;
&lt;h1&gt;전체 구조 먼저 보기&lt;/h1&gt;
&lt;p&gt;Chronos-2의 데이터 흐름을 큰 그림으로 보면 다음과 같습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Targets + Covariates
        │
        ▼
Robust Scaling
(Standardization + asinh)
        │
        ▼
Time Index + Missing Mask 추가
        │
        ▼
Non-overlapping Patches
        │
        ▼
Residual Network Embedding
        │
        ▼
┌────────────────────────────┐
│      Transformer Stack     │
│                            │
│  Time Attention            │
│        ↓                   │
│  Group Attention           │
│        ↓                   │
│  Time Attention            │
│        ↓                   │
│  Group Attention           │
└────────────────────────────┘
        │
        ▼
Quantile Head
        │
        ▼
미래 여러 시점의 확률적 예측
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Chronos-2는 &lt;strong&gt;Encoder-only Transformer&lt;/strong&gt;이며 T5 Encoder 설계를 기반으로 합니다. 하지만 일반 Transformer와 달리 Time Attention과 Group Attention을 번갈아 배치합니다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;1. 입력 구성: Target과 Covariate를 같은 틀에 넣는다&lt;/h1&gt;
&lt;p&gt;예측하려는 Target을 $Y$, 추가 Covariate를 $X$라고 하겠습니다.&lt;/p&gt;
&lt;p&gt;과거 구간에서는 Target과 Covariate의 관측값을 함께 사용합니다.&lt;/p&gt;
&lt;p&gt;$$
V = [Y_{1:T}, X_{1:T}]
$$&lt;/p&gt;
&lt;p&gt;미래 구간에서는 상황이 다릅니다.&lt;/p&gt;
&lt;p&gt;미래 Target은 아직 알 수 없으므로 Missing으로 둡니다. 반면 미리 알고 있는 Covariate가 있다면 실제 미래 값을 넣을 수 있습니다.&lt;/p&gt;
&lt;p&gt;예를 들어 내일의 전력 사용량을 예측할 때:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;변수&lt;/th&gt;
&lt;th&gt;과거&lt;/th&gt;
&lt;th&gt;미래&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;전력 사용량(Target)&lt;/td&gt;
&lt;td&gt;관측됨&lt;/td&gt;
&lt;td&gt;❓ Missing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;실제 온도&lt;/td&gt;
&lt;td&gt;관측됨&lt;/td&gt;
&lt;td&gt;상황에 따라 Missing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;예보 온도(Known Covariate)&lt;/td&gt;
&lt;td&gt;관측됨&lt;/td&gt;
&lt;td&gt;✅ 알려져 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;요일&lt;/td&gt;
&lt;td&gt;관측됨&lt;/td&gt;
&lt;td&gt;✅ 알려져 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이렇게 하면 모델은 미래 정보를 부정하게 보는 것이 아니라 &lt;strong&gt;실제로 예측 시점에 사용할 수 있는 정보&lt;/strong&gt;만 입력받습니다.&lt;/p&gt;
&lt;h1&gt;2. Robust Scaling: 서로 다른 크기의 시계열을 맞춘다&lt;/h1&gt;
&lt;p&gt;시계열마다 값의 범위는 크게 다릅니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CPU 사용률:       0 ~ 100
상품 판매량:      0 ~ 10,000
전력 가격:       -값 ~ 매우 큰 Spike
센서 측정값:      아주 작은 실수
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Chronos-2는 각 변수의 과거 구간에서 평균 $\mu_d$와 표준편차 $\sigma_d$를 계산한 뒤 Standardization을 수행하고, 추가로 inverse hyperbolic sine 변환을 적용합니다.&lt;/p&gt;
&lt;p&gt;$$
\tilde{v}&lt;em&gt;{t,d}=\sinh^{-1}\left(\frac{v&lt;/em&gt;{t,d}-\mu_d}{\sigma_d}\right)
$$&lt;/p&gt;
&lt;p&gt;단순 Standardization 뒤에 $\sinh^{-1}$을 적용하면 큰 값의 영향을 완화하는 log-like 효과를 얻을 수 있습니다. 특히 Spike나 Outlier가 존재하는 시계열에서 학습 목표가 극단값에 지나치게 좌우되는 것을 줄이는 데 도움이 됩니다.&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;왜 로그가 아니라 asinh를 사용할까?&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt;일반적인 로그 변환은 0 이하의 값을 그대로 처리하기 어렵습니다. $\sinh^{-1}$은 양수와 음수를 모두 처리할 수 있으면서 절댓값이 큰 구간에서는 로그와 비슷하게 증가합니다. 따라서 음수가 가능한 가격·변화량 등의 시계열에도 자연스럽게 적용할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;h1&gt;3. Time Index와 Mask: 값뿐 아니라 상황도 알려준다&lt;/h1&gt;
&lt;p&gt;Chronos-2는 각 값에 두 가지 Meta Feature를 추가합니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Time Index&lt;/strong&gt;: 현재 위치가 과거와 미래 중 어디인지, 시간축에서 어느 지점인지 표현&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mask&lt;/strong&gt;: 실제로 관측된 값인지 Missing인지 표현&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mask는 특히 Covariate를 처리할 때 중요합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;미래 Target            → Mask = 0
미래 Known Covariate   → Mask = 1
과거 관측값             → Mask = 1
과거 Missing Value      → Mask = 0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;모델은 이 Mask를 통해 &lt;strong&gt;무엇이 예측 대상이고 무엇이 이미 알고 있는 미래 정보인지&lt;/strong&gt; 구분할 수 있습니다.&lt;/p&gt;
&lt;h1&gt;4. Patching: 한 시점씩 보지 않고 구간을 묶는다&lt;/h1&gt;
&lt;p&gt;Chronos-2는 입력 시계열을 길이 $P$의 겹치지 않는 Patch로 나눕니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;원본
[t1 t2 t3 t4 | t5 t6 t7 t8 | t9 t10 t11 t12 | ...]

                 ↓

Patch 1          Patch 2          Patch 3
[t1 t2 t3 t4]    [t5 t6 t7 t8]    [t9 t10 t11 t12]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;각 Patch에는 다음 정보가 함께 들어갑니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[시계열 값 Patch, Time Index Patch, Mask Patch]
                    ↓
              Residual Network
                    ↓
             Patch Embedding
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Patching을 사용하면 긴 시계열을 모든 시점 단위 Token으로 처리하는 것보다 Transformer가 다뤄야 하는 Sequence 길이를 줄일 수 있습니다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;Time Attention과 Group Attention은 무엇이 다를까?&lt;/h1&gt;
&lt;p&gt;Chronos-2를 이해할 때 가장 중요한 부분입니다.&lt;/p&gt;
&lt;h2&gt;Time Attention: 한 변수의 시간 흐름을 본다&lt;/h2&gt;
&lt;p&gt;Time Attention은 일반적인 Self-Attention과 비슷하게 &lt;strong&gt;같은 시계열의 여러 시간 Patch&lt;/strong&gt; 사이에서 정보를 교환합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CPU
Patch1 ↔ Patch2 ↔ Patch3 ↔ Patch4
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;여기에서는 다음과 같은 패턴을 잡는 것이 중요합니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Trend&lt;/li&gt;
&lt;li&gt;Seasonality&lt;/li&gt;
&lt;li&gt;반복 패턴&lt;/li&gt;
&lt;li&gt;장기적인 시간 의존성&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;즉 질문은 다음과 같습니다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;이 변수의 과거 시간 흐름에서 어떤 구간을 참고해야 하는가?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Group Attention: 같은 문제에 속한 여러 시계열을 본다&lt;/h2&gt;
&lt;p&gt;Group Attention은 방향이 다릅니다.&lt;/p&gt;
&lt;p&gt;같은 Patch 위치에서 &lt;strong&gt;같은 Group에 속한 여러 시계열&lt;/strong&gt; 사이에 Attention을 수행합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;같은 시간 구간

CPU ─────┐
Memory ──┼──→ Group Attention
Disk ────┘
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;또는 판매량 예측이라면:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;판매량(Target) ─────┐
가격 ───────────────┤
프로모션 ───────────┼──→ Group Attention
요일 ───────────────┤
날씨 ───────────────┘
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::tip
&lt;strong&gt;Time Attention이 “시간적으로 무엇을 참고할까?”를 결정한다면, Group Attention은 “같은 문제 안에서 어떤 다른 시계열을 참고할까?”를 결정합니다.&lt;/strong&gt;
:::&lt;/p&gt;
&lt;p&gt;이 두 Attention을 번갈아 수행하면 모델은 &lt;strong&gt;시간 관계와 변수 관계를 분리해 학습하면서도 최종적으로 두 정보를 결합&lt;/strong&gt;할 수 있습니다.&lt;/p&gt;
&lt;h1&gt;Group은 정확히 무엇일까?&lt;/h1&gt;
&lt;p&gt;Group은 고정된 의미를 가진 개념이 아닙니다.&lt;/p&gt;
&lt;p&gt;Chronos-2에서는 문제에 따라 Group의 의미가 달라질 수 있습니다.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;상황&lt;/th&gt;
&lt;th&gt;Group 구성&lt;/th&gt;
&lt;th&gt;효과&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;독립적인 단변량 예측&lt;/td&gt;
&lt;td&gt;시계열마다 다른 Group ID&lt;/td&gt;
&lt;td&gt;서로 정보를 공유하지 않음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;관련 상품 Cross Learning&lt;/td&gt;
&lt;td&gt;관련 상품을 같은 Group&lt;/td&gt;
&lt;td&gt;다른 상품 패턴 참고&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;다변량 예측&lt;/td&gt;
&lt;td&gt;여러 Target을 같은 Group&lt;/td&gt;
&lt;td&gt;변수 간 동적 관계 활용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Covariate 예측&lt;/td&gt;
&lt;td&gt;Target과 Covariate를 같은 Group&lt;/td&gt;
&lt;td&gt;외생변수가 Target에 주는 정보 활용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Group Attention에는 변수 사이의 자연스러운 순서가 없기 때문에 논문에서는 Group Attention에 별도의 Position Embedding을 사용하지 않습니다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;In-Context Learning은 LLM의 Prompt와 같은 것일까?&lt;/h1&gt;
&lt;p&gt;Chronos-2 논문에서 중요한 표현 중 하나가 **In-Context Learning(ICL)**입니다.&lt;/p&gt;
&lt;p&gt;LLM에서는 몇 개의 예시를 Prompt 안에 넣어주면 모델 파라미터를 업데이트하지 않아도 해당 예시를 참고해 새로운 문제를 해결할 수 있습니다.&lt;/p&gt;
&lt;p&gt;Chronos-2에서는 관련된 여러 시계열을 같은 Group에 넣는 것이 비슷한 역할을 합니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;관련 시계열 A ─┐
관련 시계열 B ─┼── 현재 입력 Context
관련 시계열 C ─┤
예측 대상 D ───┘
        │
        ▼
Group Attention
        │
        ▼
D를 예측하면서 A/B/C의 패턴도 참고
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;모델의 Weight는 바뀌지 않습니다. 하지만 현재 입력 안의 다른 시계열 정보를 활용해 예측을 조정합니다.&lt;/p&gt;
&lt;p&gt;이것이 특히 유용한 상황이 &lt;strong&gt;Cold Start&lt;/strong&gt;입니다.&lt;/p&gt;
&lt;p&gt;새 상품처럼 자체 히스토리가 짧더라도 비슷한 상품의 긴 히스토리가 있다면 관련 시계열을 함께 제공해 도움을 받을 수 있습니다.&lt;/p&gt;
&lt;p&gt;:::warning
여기서 ICL은 “아무 시계열이나 많이 넣으면 성능이 좋아진다”는 뜻이 아닙니다. 관련성이 낮은 시계열을 같은 Group으로 묶는 것이 항상 도움이 된다고 보장할 수는 없습니다. 실제 데이터에서는 Group 구성과 검증이 중요합니다.
:::&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;Quantile Head: 미래를 하나의 숫자로 단정하지 않는다&lt;/h1&gt;
&lt;p&gt;시계열 예측에서는 미래의 불확실성이 중요합니다.&lt;/p&gt;
&lt;p&gt;예를 들어 내일 판매량을 단순히 &lt;code&gt;100개&lt;/code&gt;라고 예측하는 것보다 다음처럼 표현하면 더 많은 정보를 얻을 수 있습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;10% Quantile:  72
50% Quantile: 101
90% Quantile: 138
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이를 해석하면 모델이 생각하는 미래 분포의 범위를 어느 정도 파악할 수 있습니다.&lt;/p&gt;
&lt;p&gt;Chronos-2는 &lt;strong&gt;21개의 Quantile&lt;/strong&gt;을 직접 예측합니다.&lt;/p&gt;
&lt;p&gt;$$
Q={0.01, 0.05, 0.1, \dots, 0.9, 0.95, 0.99}
$$&lt;/p&gt;
&lt;p&gt;특히 0.01과 0.99 같은 극단 Quantile까지 제공해 Tail Risk나 이상 상황을 분석할 때 활용할 여지가 있습니다.&lt;/p&gt;
&lt;h2&gt;Quantile Loss의 직관&lt;/h2&gt;
&lt;p&gt;Quantile $q$에 대한 예측값을 $\hat{z}^{q}$, 실제값을 $z$라고 하면 Chronos-2는 Quantile Regression Loss를 사용합니다.&lt;/p&gt;
&lt;p&gt;$$
L_q(z,\hat{z}^{q}) = q\max(z-\hat{z}^{q},0)+(1-q)\max(\hat{z}^{q}-z,0)
$$&lt;/p&gt;
&lt;p&gt;핵심은 &lt;strong&gt;과소 예측과 과대 예측의 벌점을 Quantile에 따라 다르게 준다&lt;/strong&gt;는 것입니다.&lt;/p&gt;
&lt;p&gt;예를 들어 0.9 Quantile을 학습할 때 실제값보다 너무 낮게 예측하면 상대적으로 큰 벌점을 받습니다. 그 결과 90% Quantile에 맞는 위치를 학습하게 됩니다.&lt;/p&gt;
&lt;h1&gt;Direct Multi-step Forecasting&lt;/h1&gt;
&lt;p&gt;Chronos-2는 미래 값을 한 시점씩 Autoregressive하게 생성하는 대신 여러 미래 Patch를 한 번에 출력할 수 있습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Context
[t1 ... t100]
     ↓
Chronos-2
     ↓
Future
[t101 ... t124]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이는 긴 Forecast Horizon을 효율적으로 처리하는 데 도움이 됩니다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;전체 데이터 흐름을 하나의 예제로 따라가 보기&lt;/h1&gt;
&lt;p&gt;목표는 &lt;strong&gt;앞으로 24시간의 전력 사용량&lt;/strong&gt;을 예측하는 것입니다.&lt;/p&gt;
&lt;p&gt;사용 가능한 데이터는 다음과 같다고 하겠습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Target: 전력 사용량&lt;/li&gt;
&lt;li&gt;Past-only Covariate: 실제 관측 기온&lt;/li&gt;
&lt;li&gt;Known Covariate: 기상 예보 온도&lt;/li&gt;
&lt;li&gt;Known Covariate: 시간대&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Step 1. 과거 데이터 준비&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;시간       전력    실제기온    예보기온    시간대
00:00      82      15         16          0
01:00      78      14         15          1
...
23:00      91      18         18          23
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 2. 미래 입력 구성&lt;/h2&gt;
&lt;p&gt;미래의 전력 사용량은 모릅니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;시간       전력      실제기온      예보기온    시간대
+1h        Missing   Missing       19          0
+2h        Missing   Missing       18          1
...
+24h       Missing   Missing       16          23
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 3. 같은 예측 문제로 Group 지정&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;전력 사용량       ┐
실제 기온         │
예보 기온         ├── 같은 Group
시간대            │
                  ┘
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 4. Scaling + Meta Feature + Patching&lt;/h2&gt;
&lt;p&gt;각 시계열은 독립적으로 Scale되고 Time Index와 Mask가 추가된 뒤 Patch Embedding으로 변환됩니다.&lt;/p&gt;
&lt;h2&gt;Step 5. Time Attention&lt;/h2&gt;
&lt;p&gt;전력 사용량의 이전 패턴, 온도의 주기, 하루 단위 반복 구조 등 &lt;strong&gt;각 변수 자신의 시간 정보&lt;/strong&gt;를 처리합니다.&lt;/p&gt;
&lt;h2&gt;Step 6. Group Attention&lt;/h2&gt;
&lt;p&gt;같은 시간 구간에서 전력과 기온, 시간대 정보를 서로 연결합니다.&lt;/p&gt;
&lt;p&gt;모델은 학습 과정에서 익힌 패턴을 이용해 현재 입력 Context 안에서 이 관계를 추론합니다.&lt;/p&gt;
&lt;h2&gt;Step 7. Quantile Forecast&lt;/h2&gt;
&lt;p&gt;최종적으로 각 미래 시점에 대해 여러 Quantile이 출력됩니다.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;시간&lt;/th&gt;
&lt;th&gt;q=0.1&lt;/th&gt;
&lt;th&gt;q=0.5&lt;/th&gt;
&lt;th&gt;q=0.9&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;+1h&lt;/td&gt;
&lt;td&gt;83&lt;/td&gt;
&lt;td&gt;90&lt;/td&gt;
&lt;td&gt;98&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;+2h&lt;/td&gt;
&lt;td&gt;81&lt;/td&gt;
&lt;td&gt;89&lt;/td&gt;
&lt;td&gt;99&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;위 숫자는 구조를 설명하기 위한 예시이며 실제 모델 출력값이 아닙니다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;학습 데이터가 중요한 이유&lt;/h1&gt;
&lt;p&gt;Group Attention만 추가한다고 처음 보는 변수 관계를 자동으로 잘 이해하게 되는 것은 아닙니다.&lt;/p&gt;
&lt;p&gt;모델이 다양한 관계를 미리 경험해야 합니다.&lt;/p&gt;
&lt;p&gt;그런데 현실에는 Foundation Model을 학습하기에 충분할 만큼 크고 다양한 &lt;strong&gt;다변량 + Covariate 시계열 데이터셋&lt;/strong&gt;이 많지 않습니다.&lt;/p&gt;
&lt;p&gt;Chronos-2는 이 문제를 &lt;strong&gt;Synthetic Data&lt;/strong&gt;로 해결하려고 합니다.&lt;/p&gt;
&lt;p&gt;논문에서는 단변량 시계열 생성기를 기반으로 여러 시계열 사이에 인위적인 관계를 부여하는 &lt;strong&gt;Multivariatizer&lt;/strong&gt;를 사용합니다.&lt;/p&gt;
&lt;h2&gt;Cotemporaneous 관계&lt;/h2&gt;
&lt;p&gt;같은 시점의 변수 사이에 관계를 만듭니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Xₜ ─────→ Yₜ
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;선형·비선형 변환을 사용해 동시점 상관 구조를 생성합니다.&lt;/p&gt;
&lt;h2&gt;Sequential 관계&lt;/h2&gt;
&lt;p&gt;시간을 가로질러 관계를 만듭니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Xₜ ─────→ Yₜ₊₁
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Lead-Lag 효과나 Cointegration처럼 더 복잡한 동적 관계를 만들 수 있습니다.&lt;/p&gt;
&lt;p&gt;:::tip
Chronos-2 논문에서 다변량 및 Covariate 학습 데이터는 &lt;strong&gt;전적으로 Synthetic Data를 사용했다&lt;/strong&gt;고 설명합니다. 이는 실제 다변량 사전학습 데이터 부족을 해결하기 위한 핵심 설계 선택입니다.
:::&lt;/p&gt;
&lt;p&gt;이렇게 다양한 가상의 관계를 경험한 모델은 처음 보는 데이터에서 입력 Context를 이용해 변수 사이 관계를 추론하도록 학습됩니다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;Python으로 Chronos-2 사용하기&lt;/h1&gt;
&lt;p&gt;공식 &lt;code&gt;chronos-forecasting&lt;/code&gt; 패키지를 사용할 수 있습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pip install chronos-forecasting
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;모델은 Hugging Face의 &lt;code&gt;amazon/chronos-2&lt;/code&gt;를 사용할 수 있으며 공개된 Base 모델은 약 &lt;strong&gt;120M parameters&lt;/strong&gt;입니다.&lt;/p&gt;
&lt;h2&gt;가장 기본적인 흐름&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;import pandas as pd
from chronos import Chronos2Pipeline

pipeline = Chronos2Pipeline.from_pretrained(
    &quot;amazon/chronos-2&quot;,
    device_map=&quot;cuda&quot;,
)

context_df = pd.read_parquet(&quot;train.parquet&quot;)

pred_df = pipeline.predict_df(
    context_df,
    prediction_length=24,
    quantile_levels=[0.1, 0.5, 0.9],
    id_column=&quot;id&quot;,
    timestamp_column=&quot;timestamp&quot;,
    target=&quot;target&quot;,
)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;핵심은 일반적인 모델처럼 &lt;code&gt;fit()&lt;/code&gt;을 호출하지 않았다는 점입니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Pretrained Model Load
        ↓
Historical Data 입력
        ↓
predict_df()
        ↓
Forecast
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이것이 Zero-shot 사용 방식입니다.&lt;/p&gt;
&lt;h2&gt;미래 Covariate 함께 사용하기&lt;/h2&gt;
&lt;p&gt;프로모션 일정이나 날씨 예보처럼 미래 값을 이미 알고 있다면 &lt;code&gt;future_df&lt;/code&gt;로 전달할 수 있습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;from chronos import Chronos2Pipeline

pipeline = Chronos2Pipeline.from_pretrained(
    &quot;amazon/chronos-2&quot;,
    device_map=&quot;cuda&quot;,
)

pred_df = pipeline.predict_df(
    context_df,
    future_df=future_df,
    prediction_length=24,
    quantile_levels=[0.1, 0.5, 0.9],
    id_column=&quot;id&quot;,
    timestamp_column=&quot;timestamp&quot;,
    target=&quot;target&quot;,
)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;context_df&lt;/code&gt;에는 과거 Target과 과거 Covariate가 들어가고, &lt;code&gt;future_df&lt;/code&gt;에는 예측 시점에 실제로 알 수 있는 미래 Covariate를 넣습니다.&lt;/p&gt;
&lt;p&gt;:::warning
미래 Covariate를 사용할 때는 &lt;strong&gt;실제 운영 시점에도 그 값을 알 수 있는가&lt;/strong&gt;를 반드시 확인해야 합니다. 예측 시점에는 알 수 없는 미래 실제값을 넣으면 Data Leakage가 발생합니다.
:::&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;GPU가 반드시 필요한가?&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;p&gt;아닙니다. Chronos-2는 CPU에서도 추론할 수 있습니다. 다만 데이터 규모와 Latency 요구사항에 따라 GPU가 훨씬 유리할 수 있습니다. 공식 저장소에서는 AWS 기반 CPU/GPU 배포 방법도 제공하고 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;Chronos, Chronos-Bolt, Chronos-2는 무엇이 다를까?&lt;/h1&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;모델&lt;/th&gt;
&lt;th&gt;핵심 아이디어&lt;/th&gt;
&lt;th&gt;강점&lt;/th&gt;
&lt;th&gt;주요 제약&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Chronos&lt;/td&gt;
&lt;td&gt;시계열을 Quantized Token으로 변환해 언어 모델 방식으로 생성&lt;/td&gt;
&lt;td&gt;TS Foundation Model의 강력한 Zero-shot 가능성 제시&lt;/td&gt;
&lt;td&gt;주로 단변량 중심, Autoregressive 생성 비용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chronos-Bolt&lt;/td&gt;
&lt;td&gt;Patch 기반 Direct Multi-step Forecasting&lt;/td&gt;
&lt;td&gt;기존 Chronos보다 빠르고 효율적인 추론&lt;/td&gt;
&lt;td&gt;기본적으로 단변량 중심&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chronos-2&lt;/td&gt;
&lt;td&gt;Time Attention + Group Attention + Quantile Head&lt;/td&gt;
&lt;td&gt;단변량·다변량·Covariate·Cross Learning을 통합&lt;/td&gt;
&lt;td&gt;관계가 없는 변수까지 묶었을 때의 효과는 데이터별 검증 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Chronos-2는 단순히 기존 Chronos를 더 크게 만든 모델이 아닙니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Chronos
시계열도 Language Modeling처럼 Pretraining할 수 있다
        ↓
Chronos-Bolt
시계열에 더 적합한 Patch + Direct Forecasting으로 효율화
        ↓
Chronos-2
여러 시계열과 Covariate까지 Context 안에서 함께 추론
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;즉 발전 방향이 &lt;strong&gt;단일 시계열 예측 성능 → 계산 효율 → 실제 예측 문제의 범용성&lt;/strong&gt;으로 이동했다고 볼 수 있습니다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;성능을 어떻게 봐야 할까?&lt;/h1&gt;
&lt;p&gt;Chronos-2 기술 보고서는 fev-bench, GIFT-Eval, Chronos Benchmark II에서 당시 비교한 공개 사전학습 모델 가운데 가장 높은 성능을 보고했습니다.&lt;/p&gt;
&lt;p&gt;특히 fev-bench에서 Chronos-2의 평균 Win Rate는 &lt;strong&gt;90.7%&lt;/strong&gt;, Skill Score는 **47.3%**로 보고되었으며, Covariate가 포함된 문제에서 ICL의 이득이 가장 크게 나타났습니다.&lt;/p&gt;
&lt;p&gt;또한 Base Chronos-2는 약 120M parameters이며, 논문에서는 NVIDIA A10G에서 Context Length 2048, Prediction Length 64, Batch 1024 조건으로 약 &lt;strong&gt;초당 300개 시계열&lt;/strong&gt;의 처리량을 보고합니다.&lt;/p&gt;
&lt;p&gt;:::warning
&lt;strong&gt;Benchmark 1위 = 내 데이터에서도 무조건 최고라는 뜻은 아닙니다.&lt;/strong&gt; 데이터의 Frequency, Horizon, Noise, Covariate 품질, 평가 Metric, Latency 요구사항에 따라 ARIMA·LightGBM·TFT·PatchTST·TimesFM 같은 다른 방법이 더 적합할 수 있습니다.
:::&lt;/p&gt;
&lt;p&gt;또한 논문은 Chronos-2의 학습 Corpus와 일부 GIFT-Eval 데이터의 &lt;strong&gt;Training 부분에 부분적 overlap&lt;/strong&gt;이 있음을 명시합니다. Test portion과는 겹치지 않도록 관리했다고 설명하며, 더 엄격한 Zero-shot 검증을 위해 Synthetic-only 모델에 대한 Ablation도 제공합니다.&lt;/p&gt;
&lt;p&gt;이런 세부사항까지 함께 보는 것이 Benchmark를 올바르게 해석하는 방법입니다.&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;장점과 한계&lt;/h1&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;구분&lt;/th&gt;
&lt;th&gt;내용&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;✅ 장점&lt;/td&gt;
&lt;td&gt;새로운 데이터셋에서 별도의 모델 학습 없이 Zero-shot 예측 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅ 장점&lt;/td&gt;
&lt;td&gt;Univariate, Multivariate, Covariate-informed Forecasting을 하나의 구조로 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅ 장점&lt;/td&gt;
&lt;td&gt;관련 시계열 사이의 Cross Learning을 In-Context 방식으로 수행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅ 장점&lt;/td&gt;
&lt;td&gt;여러 Quantile을 직접 출력해 예측 불확실성을 표현&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅ 장점&lt;/td&gt;
&lt;td&gt;최대 Context를 8192까지 확장하도록 학습되어 장기 패턴을 다룰 수 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⚠️ 한계&lt;/td&gt;
&lt;td&gt;Foundation Model이므로 전통적인 작은 모델보다 계산 자원이 더 필요할 수 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⚠️ 한계&lt;/td&gt;
&lt;td&gt;어떤 시계열을 같은 Group으로 묶는 것이 좋은지는 실제 문제의 의미와 검증이 중요함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⚠️ 한계&lt;/td&gt;
&lt;td&gt;다변량·Covariate Pretraining이 Synthetic Data에 크게 의존하므로 현실의 모든 변수 관계를 포함한다고 볼 수 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⚠️ 한계&lt;/td&gt;
&lt;td&gt;높은 Benchmark 성능이 특정 운영 데이터·비즈니스 Metric에서 그대로 재현된다고 보장되지 않음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h1&gt;자주 오해하는 부분&lt;/h1&gt;
&lt;p&gt;:::warning
&lt;strong&gt;1. Chronos-2는 LLM에 숫자를 Prompt로 넣는 모델이 아닙니다.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Chronos-2는 시계열 전용으로 학습된 Encoder-only Transformer이며 Patch Embedding과 시계열용 출력 Head를 사용합니다.
:::&lt;/p&gt;
&lt;p&gt;:::warning
&lt;strong&gt;2. In-Context Learning이라고 해서 텍스트 Prompt를 작성하는 것은 아닙니다.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;관련 시계열과 Covariate를 같은 Group으로 제공하면 모델이 현재 Context에서 이들 사이 정보를 공유한다는 의미에 가깝습니다.
:::&lt;/p&gt;
&lt;p&gt;:::warning
&lt;strong&gt;3. Multivariate는 단순히 Feature가 여러 개인 것과 완전히 같은 말이 아닙니다.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;여러 Target 자체를 동시에 예측하는 문제를 Multivariate Forecasting이라고 부르며, Target을 돕는 추가 변수는 Covariate로 구분할 수 있습니다.
:::&lt;/p&gt;
&lt;p&gt;:::warning
&lt;strong&gt;4. Zero-shot은 모델이 아무 정보 없이 예측한다는 뜻이 아닙니다.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;새 데이터에 대해 Weight를 다시 학습하지 않는다는 뜻이며, 실제 예측에는 해당 시계열의 Historical Context가 필요합니다.
:::&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;언제 Chronos-2를 사용하면 좋을까?&lt;/h1&gt;
&lt;h2&gt;많은 시계열을 빠르게 Baseline하고 싶을 때&lt;/h2&gt;
&lt;p&gt;여러 데이터셋에 대해 각각 모델을 학습하기 전에 강력한 Zero-shot Baseline을 빠르게 만들 수 있습니다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;새 데이터셋
    ↓
Chronos-2 Zero-shot
    ↓
성능 확인
    ↓
필요하면 Task-specific Model과 비교
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;여러 시계열이 서로 관련되어 있을 때&lt;/h2&gt;
&lt;p&gt;상품군, 서버군, 센서군처럼 여러 시계열이 유사한 패턴을 공유한다면 Cross Learning을 활용할 수 있습니다.&lt;/p&gt;
&lt;h2&gt;미래 Covariate가 중요한 문제&lt;/h2&gt;
&lt;p&gt;프로모션 일정, 가격 계획, 공휴일, 날씨 예보처럼 &lt;strong&gt;미래 시점에도 미리 알 수 있는 Feature&lt;/strong&gt;가 예측에 중요한 경우 Chronos-2의 장점이 커집니다.&lt;/p&gt;
&lt;h2&gt;Cold Start 시계열&lt;/h2&gt;
&lt;p&gt;새 상품이나 새 센서처럼 자체 Historical Data가 짧지만 비슷한 시계열이 많이 존재한다면 Group Attention을 통해 주변 Context를 활용할 수 있습니다.&lt;/p&gt;
&lt;h1&gt;언제 다른 방법도 함께 검토해야 할까?&lt;/h1&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;상황&lt;/th&gt;
&lt;th&gt;추천&lt;/th&gt;
&lt;th&gt;이유 / 대안&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;데이터가 매우 작고 구조가 단순함&lt;/td&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;td&gt;ETS, ARIMA 같은 간단한 모델이 더 빠르고 충분히 정확할 수 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;엄격한 해석 가능성이 가장 중요함&lt;/td&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;td&gt;통계 모델이나 명시적인 Feature 모델이 더 해석하기 쉬울 수 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Latency와 비용이 극도로 제한됨&lt;/td&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;td&gt;작은 전용 모델이나 통계 모델과 반드시 비용 비교 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;풍부한 학습 데이터와 도메인 Feature가 있고 최고 성능이 목표&lt;/td&gt;
&lt;td&gt;✅/⚠️&lt;/td&gt;
&lt;td&gt;Chronos-2 Zero-shot을 강력한 Baseline으로 사용하고 Task-specific 모델과 비교&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;관련 시계열과 미래 Covariate가 많음&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Chronos-2가 해결하려는 핵심 문제와 잘 맞음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h1&gt;이해도 확인&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;기존 시계열 Foundation Model이 실제 서비스에서 단변량 예측만 지원한다면 어떤 정보들을 놓칠 수 있을까요?&lt;/li&gt;
&lt;li&gt;Chronos-2에서 Time Attention과 Group Attention은 각각 어느 방향의 관계를 학습할까요?&lt;/li&gt;
&lt;li&gt;미래 Target은 Missing인데 미래 날씨 예보는 입력할 수 있는 이유는 무엇일까요?&lt;/li&gt;
&lt;li&gt;관련된 여러 단변량 시계열을 같은 Group으로 묶으면 왜 Cold Start 예측에 도움이 될 수 있을까요?&lt;/li&gt;
&lt;li&gt;Chronos-2가 21개의 Quantile을 출력하는 것은 하나의 Point Forecast만 출력하는 것과 비교해 어떤 장점이 있을까요?
&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;힌트 보기&amp;lt;/summary&amp;gt;&lt;/li&gt;
&lt;li&gt;현실에서는 여러 Target·가격·프로모션·날씨 등이 서로 영향을 줍니다.&lt;/li&gt;
&lt;li&gt;하나는 시간축, 다른 하나는 같은 Group의 시계열 축을 봅니다.&lt;/li&gt;
&lt;li&gt;예측 시점에 실제로 알고 있는 정보인지 생각해 보세요.&lt;/li&gt;
&lt;li&gt;자신의 과거가 짧더라도 관련 시계열의 패턴은 길게 존재할 수 있습니다.&lt;/li&gt;
&lt;li&gt;미래의 불확실성과 Prediction Interval을 생각해 보세요.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;핵심 정리&lt;/h1&gt;
&lt;p&gt;:::tip&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chronos-2는 &lt;strong&gt;새로운 데이터에 별도 학습 없이 적용하는 범용 Time Series Foundation Model&lt;/strong&gt;입니다.&lt;/li&gt;
&lt;li&gt;기존 모델의 단변량 중심 한계를 넘어 &lt;strong&gt;Multivariate와 Covariate-informed Forecasting&lt;/strong&gt;을 통합한 것이 중요한 변화입니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Time Attention&lt;/strong&gt;은 한 시계열의 시간 관계를, &lt;strong&gt;Group Attention&lt;/strong&gt;은 여러 관련 시계열 사이의 관계를 처리합니다.&lt;/li&gt;
&lt;li&gt;Group Attention을 이용한 &lt;strong&gt;In-Context Learning&lt;/strong&gt; 덕분에 관련 시계열 Cross Learning과 Cold Start 상황에서도 주변 정보를 활용할 수 있습니다.&lt;/li&gt;
&lt;li&gt;강력한 Zero-shot Baseline이지만 실제 운영에서는 데이터 특성·비용·Latency·평가 Metric을 기준으로 기존 통계·딥러닝 모델과 함께 검증해야 합니다.
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;다음에 공부하면 좋은 것&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Chronos / Chronos-Bolt&lt;/strong&gt; → Chronos-2가 어떤 설계에서 출발했고 Tokenization에서 Patch 기반 예측으로 어떻게 변화했는지 이해할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PatchTST&lt;/strong&gt; → 시계열을 Patch 단위로 Transformer에 입력하는 아이디어를 더 깊게 이해할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Temporal Fusion Transformer(TFT)&lt;/strong&gt; → Known/Past Covariate를 사용하는 전통적인 Task-specific 딥러닝 접근과 Chronos-2를 비교하기 좋습니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TimesFM / Moirai / Toto&lt;/strong&gt; → Time Series Foundation Model들이 범용성과 다변량 처리를 서로 어떤 방식으로 해결하는지 비교할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h1&gt;참고 자료&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://arxiv.org/abs/2510.15821&quot;&gt;Chronos-2: From Univariate to Universal Forecasting — Technical Report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.science/blog/introducing-chronos-2-from-univariate-to-universal-forecasting&quot;&gt;Amazon Science — Introducing Chronos-2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/amazon-science/chronos-forecasting&quot;&gt;amazon-science/chronos-forecasting — GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://huggingface.co/amazon/chronos-2&quot;&gt;amazon/chronos-2 — Hugging Face&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;이 글의 Chronos-2 구조, 학습 방식, Benchmark 수치는 2025년 공개된 Chronos-2 기술 보고서와 Amazon의 공식 공개 구현을 기준으로 정리했습니다.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>ADP</title><link>https://fuwari.vercel.app/posts/adp-adsp/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/adp-adsp/</guid><pubDate>Fri, 24 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&amp;lt;!-- notion-managed: regenerated by scripts/sync-notion.mjs, do not edit --&amp;gt;&lt;/p&gt;
&lt;p&gt;이 계시물은 ADP자격증 필기시험을 위해 제작되었습니다. 모든내용이 아닌 합격하기위한 충분한 내용을 담아 내고 있습니다. 암기법은 콜아웃을 사용하여 눈에 보이게 제작하였습니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/%EC%95%94%EA%B8%B0-%EC%A0%95%EB%A6%AC/&quot;&gt;암기 정리&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/2%EA%B3%BC%EB%AA%A9-%EC%95%94%EA%B8%B0/&quot;&gt;2과목 암기&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/3%EA%B3%BC%EB%AA%A9-%EC%95%94%EA%B8%B0/&quot;&gt;3과목 암기&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/4%EA%B3%BC%EB%AA%A9-%EC%A0%95%EB%A6%AC/&quot;&gt;4과목 정리 &lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;1. 데이터 이해&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;/posts/untitled/&quot;&gt;Untitled&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/%EC%95%94%EB%AC%B5%EC%A7%80-%ED%98%95%EC%8B%9D%EC%A7%80-dikw-1/&quot;&gt;암묵지, 형식지, DIKW (1)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%A0%95%EC%9D%98%EC%99%80-%ED%8A%B9%EC%A7%95-1/&quot;&gt;데이터 베이스 정의와 특징 (1)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/oltp-olap-%EB%B0%8F-%EC%95%BD%EC%96%B4-%EC%A0%95%EB%A6%AC-1/&quot;&gt;OLTP, OLAP 및 약어 정리 (1)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/database-db-data-warehouse-dw-data-mart-dm-1/&quot;&gt;Database(DB) · Data Warehouse(DW) · Data Mart(DM) (1)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;etc. 메타데이터, 인덱스, 엔티티, 속성, 인스턴스 등등&lt;/p&gt;
&lt;h2&gt;2. 데이터의 가치와 미래&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;/posts/%EB%B9%85%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%9D%98-3v/&quot;&gt;빅데이터의 3V&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/%EB%B9%85%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%9D%98-%EA%B8%B0%EB%8A%A5%EA%B3%BC-%EB%B3%80%ED%99%94/&quot;&gt;빅데이터의 기능과 변화&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;데이터 가치가 달라지는 3가지 이유&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;데이터 활용 방식이 다양함&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;같은 데이터라도 &lt;strong&gt;누가&lt;/strong&gt;, &lt;strong&gt;어떤 목적&lt;/strong&gt;으로, &lt;strong&gt;어떤 방식&lt;/strong&gt;으로 활용하느냐에 따라 가치가 달라집니다.&lt;/p&gt;
&lt;p&gt;예를 들어 _위치 데이터_는&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;내비게이션: 경로 안내&lt;/li&gt;
&lt;li&gt;유통업: 상권 분석&lt;/li&gt;
&lt;li&gt;보험업: 위험도 분석
처럼 활용됩니다.
→ 즉, 데이터는 &lt;strong&gt;그 자체로 고정된 가치가 있는 것이 아니라 활용 맥락에 따라 가치가 달라집니다.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;새로운 가치 창출 가능성을 미리 알기 어려움&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;지금은 쓸모없어 보이는 데이터도 &lt;strong&gt;나중에 다른 데이터와 결합&lt;/strong&gt;하면 새로운 가치를 만들 수 있습니다.&lt;/p&gt;
&lt;p&gt;예를 들어 _클릭 기록_은 단순 로그처럼 보이지만, _구매 데이터_와 결합하면&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;상품 추천&lt;/li&gt;
&lt;li&gt;이탈 고객 예측&lt;/li&gt;
&lt;li&gt;맞춤형 광고
등에 활용 가능합니다.
→ 그래서 데이터가 앞으로 만들 &lt;strong&gt;새로운 가치를 사전에 정확히 예측하기 어렵습니다.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;분석 기술이 계속 발전함&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;과거에는 분석이 어려웠던 데이터도 기술이 발전하면서 활용할 수 있게 됩니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;이미지·음성 데이터: 과거엔 활용 어려움&lt;/li&gt;
&lt;li&gt;현재: 인공지능/머신러닝으로 분석 가능
→ 따라서 데이터의 가치는 &lt;strong&gt;분석 기술 수준에 따라 계속 변합니다.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/adp-%EB%B9%85%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%99%9C%EC%9A%A9-%EA%B8%B0%EB%B3%B8-%ED%85%8C%ED%81%AC%EB%8B%89-7%EA%B0%80%EC%A7%80/&quot;&gt;ADP 빅데이터 활용 기본 테크닉 7가지 &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/%EC%9C%84%EA%B8%B0%EC%9A%94%EC%9D%B8%EA%B3%BC-%ED%86%B5%EC%A0%9C%EB%B0%A9%EC%95%88/&quot;&gt;위기요인과 통제방안&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/%EA%B0%9C%EC%9D%B8%EC%A0%95%EB%B3%B4-%EB%B9%84%EC%8B%9D%EB%B3%84-%EA%B8%B0%EC%88%A0/&quot;&gt;개인정보 비식별 기술 &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%82%AC%EC%9D%B4%EC%96%B8%ED%8B%B0%EC%8A%A4%ED%8A%B8/&quot;&gt;데이터 사이언티스트&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;2. 데이터 처리 기술 이해&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;/posts/etl%EA%B3%BC-ods-1/&quot;&gt;ETL과 ODS (1)&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;3. 데이터 분석 기획&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;/posts/%EB%B6%84%EC%84%9D-%EC%A3%BC%EC%A0%9C%EC%9D%98-4%EA%B0%80%EC%A7%80-%EC%9C%A0%ED%98%95/&quot;&gt;분석 주제의 4가지 유형&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/kdd-%EB%B6%84%EC%84%9D-%EB%B0%A9%EB%B2%95%EB%A1%A0/&quot;&gt;KDD 분석 방법론&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/%EB%B6%84%EC%84%9D%EA%B3%BC%EC%A0%9C%EB%B0%9C%EA%B5%B4/&quot;&gt;분석과제발굴&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;4. 데이터 분석&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;/posts/%EC%9E%90%EB%A3%8C%EC%9D%98-%EC%B2%99%EB%8F%84-%EC%88%98%EC%A4%80-scale-level/&quot;&gt;자료의 척도 수준(Scale level)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/%EC%9D%B4%EC%82%B0%ED%98%95%ED%99%95%EB%A5%A0%EB%B6%84%ED%8F%AC/&quot;&gt;이산형확률분포&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/%EC%97%B0%EC%86%8D%ED%99%95%EB%A5%A0%EB%B6%84%ED%8F%AC/&quot;&gt;연속확률분포&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/%EA%B2%B0%EC%B8%A1%EA%B0%92-%EC%B2%98%EB%A6%AC-%EB%B0%A9%EB%B2%95/&quot;&gt;결측값 처리 방법&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/%ED%91%9C%EB%B3%B8-%EC%B6%94%EC%B6%9C-%EB%B0%A9%EB%B2%95/&quot;&gt;표본 추출 방법&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A7%88%EC%9D%B4%EB%8B%9D/&quot;&gt;데이터마이닝&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/%ED%98%BC%EB%8F%99%ED%96%89%EB%A0%AC-confusion-matrix-%ED%8F%89%EA%B0%80-%EC%A7%80%ED%91%9C/&quot;&gt;혼동행렬(Confusion Matrix) 평가 지표&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/%EB%82%98%EC%9D%B4%EB%B8%8C-%EB%B2%A0%EC%9D%B4%EC%A6%88-%EB%B6%84%EB%A5%98/&quot;&gt;나이브 베이즈 분류&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/%EC%97%B0%EC%86%8D%ED%98%95%EB%B3%80%EC%88%98%EC%9D%98-%EA%B1%B0%EB%A6%AC%EC%B8%A1%EC%A0%95/&quot;&gt;연속형변수의 거리측정&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/untitled/&quot;&gt;Untitled&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;5. 데이터 시각화&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;/posts/1%EA%B3%BC%EB%AA%A9-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%9D%B4%ED%95%B4-%EC%95%95%EC%B6%95-%EC%9A%94%EC%95%BD/&quot;&gt;1과목 · 데이터 이해 — 압축 요약&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/2%EA%B3%BC%EB%AA%A9-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%B2%98%EB%A6%AC-%EA%B8%B0%EC%88%A0-%EC%9D%B4%ED%95%B4-%EC%95%95%EC%B6%95-%EC%9A%94%EC%95%BD/&quot;&gt;2과목 · 데이터 처리 기술 이해 — 압축 요약&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/3%EA%B3%BC%EB%AA%A9-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D-%EA%B8%B0%ED%9A%8D-%EC%95%95%EC%B6%95-%EC%9A%94%EC%95%BD/&quot;&gt;3과목 · 데이터 분석 기획 — 압축 요약&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/4%EA%B3%BC%EB%AA%A9-1-r-%EA%B8%B0%EC%B4%88%EC%99%80-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A7%88%ED%8A%B8-%ED%86%B5%EA%B3%84%EB%B6%84%EC%84%9D-%EC%95%95%EC%B6%95-%EC%9A%94%EC%95%BD/&quot;&gt;4과목-1 · R 기초와 데이터마트 · 통계분석 — 압축 요약&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/4%EA%B3%BC%EB%AA%A9-2-%EC%A0%95%ED%98%95-%EB%B9%84%EC%A0%95%ED%98%95-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A7%88%EC%9D%B4%EB%8B%9D-%EC%95%95%EC%B6%95-%EC%9A%94%EC%95%BD/&quot;&gt;4과목-2 · 정형 · 비정형 데이터마이닝 — 압축 요약&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/adp-5%EA%B3%BC%EB%AA%A9-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%8B%9C%EA%B0%81%ED%99%94-%EC%95%95%EC%B6%95-%EC%9A%94%EC%95%BD/&quot;&gt;ADP 5과목 데이터 시각화 — 압축 요약&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Hello Euphoria</title><link>https://fuwari.vercel.app/posts/hello-euphoria/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/hello-euphoria/</guid><description>First test post synced from Notion to verify the Fuwari + Notion pipeline.</description><pubDate>Wed, 22 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&amp;lt;!-- notion-managed: regenerated by scripts/sync-notion.mjs, do not edit --&amp;gt;&lt;/p&gt;
&lt;h2&gt;Welcome&lt;/h2&gt;
&lt;p&gt;This is a &lt;strong&gt;test post&lt;/strong&gt; written in Notion to verify that the sync pipeline works end to end.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bullet one&lt;/li&gt;
&lt;li&gt;Bullet two&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here is an inline image to test image rehosting:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/notion-images/hello-euphoria/img-2.jpg&quot; alt=&quot;sample&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This blockquote should survive the markdown conversion.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item></channel></rss>