↑↑↑关注后"星标"kaggle竞赛宝典
kaggle竞赛宝典 量化时序宝库模型-TimesFM
量化时序宝库模型-TimesFM
今天我们介绍一个时间序列预测里面非常强大的一个模型,TimesFM。
TimesFM架构
Patching
TimesFM这个模型在处理时间序列数据时做了类似的事情,称为“patching”。它不是一次性处理整个序列,而是将数据分成更小、更易管理的部分,称为patching。这种方法不仅加快了模型的处理速度,还帮助它关注数据中的小趋势和细节。相反,将patch长度延长以匹配上下文长度会使训练方式偏离仅解码器的训练及其相关效率。
Decoder 结构
TimesFM是基于仅Decoder模式进行训练的。给定一系列输入patches,下一patch的预测是历史所有过去patch的进行建模优化预测得到的。类似于大型语言模型,这可以在整个上下文窗口中并行完成,自然而然地在观察到不同数量的输入patch后,自动启用未来的预测。
生成更长的预测输出
在LLM中,输出通常是以自回归的方式生成的,一次生成一个标记。然而,研究表明,对于长时间预测,一次性预测整个时间段的准确性可能优于多步自回归解码。
当时间段的长度事先未知时,比如在零样本预测中,这种直接预测的方法会面临挑战。为了解决这个问题,作者建议采取一种折衷方案,即在预测时使用比输入块更长的输出块。例如,如果输入块的长度是32,而输出块的长度是128,那么模型的训练方式如下:它使用前32个时间点预测接下来的128个时间步,使用前64个时间点预测时间步65到192,使用前96个时间点预测时间步97到224,以此类推。
在推理过程中,如果模型接收到一个长度为256的新时间序列,并需要预测接下来的256个时间步,它会首先预测时间步257到384。然后,它会将最初的256长度输入与生成的输出结合,用来预测时间步385到512。相比之下,一个输出块长度与输入块长度相等为32的模型需要8个自回归步骤才能完成同样的任务,而在所提的方法中只需要2个步骤。这之间有个权衡。如果输出patch的长度太长,就会很难处理比输出patch长度短的时间序列,比如预训练数据中的月度或年度时间序列。
TimesFM框架组成
输入
时间序列经过预处理,将输入分成连续的不重叠的块。
这些块通过残差块处理,转换成大小为 model_dim 的向量。
输入到变换器时,提供一个二进制掩码。这个二进制掩码用来表示相应的数据点是应该被考虑(0)还是被忽略(1)。
残差块本质上是一个多层感知器(MLP),具有一个隐藏层和一个跳跃连接。
Transformer模块
直接采用了堆叠Transformer的方法,涉及到堆叠多个Transformer,每层主要由两个组成部分构成:多头自注意机制和前馈神经网络。
上述的TimesFM架构接收一个特定长度的输入时间序列,并将其分解成输入patch。然后,每个path通过一个残差块处理成一个向量,这个残差块在模型定义中被定义,以匹配transformer的模型维度。接着,这个向量会与位置编码相加。带有位置编码的向量被输入到堆叠的变换器层中。
SA(Self-Attention),具体来说是多头因果注意力,而FFN指的是变换器中的全连接层。输出标记通过一个残差块映射到大小为output_patch_len的输出,这个输出构成了模型迄今为止看到的最后一个输入path之后的时间窗口的预测。
输出层
输出层的任务是将输出标记映射到预测值。该模型以仅解码器的模式进行训练,这意味着每个输出标记应该预测最后一个输入片段之后的时间序列部分。需要注意的是,与许多其他时间序列预测模型不同,这里的输入片段长度并不需要与输出片段长度相等。这意味着模型可以根据输入片段的信息预测时间序列的更大部分。
代码
!pip install timesfm #You might need to restart the kernal to have this installed in your w
# Initialize the TimesFM model with specified parameters
tfm = timesfm.TimesFm(
context_len=128, # Length of the context window for the model
horizon_len=24, # Forecasting horizon length
input_patch_len=32, # Length of input patches
output_patch_len=128, # Length of output patches
num_layers=20,
model_dims=1280,
)
# Load the pretrained model checkpoint
tfm.load_from_checkpoint(repo_id="google/timesfm-1.0-200m")
# Generate forecasts using the TimesFM model on the given DataFrame
timesfm_forecast = tfm.forecast_on_df(
inputs=train_df, # Input DataFrame containing the time-series data for training
freq="MS", # Frequency of the time-series data (e.g., monthly start)
value_name="y", # Name of the column containing the values to be forecasted
num_jobs=-1, # Number of parallel jobs to use for forecasting (-1 uses all available cores)
)
timesfm_forecast = timesfm_forecast[["ds","timesfm"]]
实验
从上面的实验中,我们发现AutoDebias的效果远超其它的方法。
小结
TimesFM是一种可靠的时间序列基础模型方法。TimesFM 采用了仅解码器的 transformer 架构,这与许多现有时间序列模型中使用的典型编码器-解码器框架形成对比。这样的设计选择简化了模型,同时在预测任务中保持了高性能。
从上述的实验结果可以看出,TimesFM 在这个实验用例中表现得更出色,在与另一个成功的时间序列基础模型 TimeGPT 比较时也展现了较大的优势;
参考文献
A decoder-only foundation model for time-series forecasting. arXiv preprint arXiv:2310.10688. TimesFM HuggingFace Page— https://huggingface.co/google/timesfm-1.0-200m TimesFM — Google’s Foundational Model for Time Series Forecasting!