Time-LLM框架深度解析:两大核心组件揭秘时序预测新范式

【免费下载链接】Time-LLM [ICLR 2024] Official implementation of " 🦙 Time-LLM: Time Series Forecasting by Reprogramming Large Language Models" 【免费下载链接】Time-LLM 项目地址: https://gitcode.com/gh_mirrors/ti/Time-LLM

Time-LLM是ICLR 2024收录的创新时序预测框架,通过重编程大型语言模型(LLM) 实现精准的时间序列预测。该框架突破传统时序模型局限,创新性地将文本预训练模型迁移至时序预测领域,核心在于两大革命性组件:Patch Reprogramming(补丁重编程) 与Text Prototypes(文本原型)。本文将深入剖析这两大组件的工作原理,揭示Time-LLM如何让LLM"理解"时间序列数据。

核心架构概览:LLM如何"读懂"时间序列?

Time-LLM的核心突破在于无需修改LLM权重,通过精巧的适配层将时序数据转化为模型可理解的"语言"。框架整体架构如图所示:

Time-LLM框架架构 图1:Time-LLM框架整体架构,展示了时序数据如何通过补丁重编程和文本原型转化为LLM可处理的输入

从架构图可见,Time-LLM主要包含三个流程:

  1. 数据预处理:将原始时序数据分割为重叠补丁(Patches)
  2. 双轨编码:通过补丁重编程层和文本提示生成器构建混合输入
  3. 预测输出:利用冻结的LLM主体进行特征提取,最终通过投影层输出预测结果

组件一:Patch Reprogramming——时序数据的"语言翻译器"

什么是补丁重编程?

补丁重编程是Time-LLM的核心创新点,其本质是将时序数据片段转化为LLM嵌入空间中近似文本语义的向量表示。在models/TimeLLM.py中,通过ReprogrammingLayer类实现这一功能:

class ReprogrammingLayer(nn.Module):
    def __init__(self, d_model, n_heads, d_keys=None, d_llm=None, attention_dropout=0.1):
        super(ReprogrammingLayer, self).__init__()
        self.query_projection = nn.Linear(d_model, d_keys * n_heads)
        self.key_projection = nn.Linear(d_llm, d_keys * n_heads)
        self.value_projection = nn.Linear(d_llm, d_keys * n_heads)
        # ...(省略部分代码)

    def reprogramming(self, target_embedding, source_embedding, value_embedding):
        # 计算时序补丁与文本原型的注意力分数
        scores = torch.einsum("blhe,she->bhls", target_embedding, source_embedding)
        # 通过注意力权重将文本原型映射到时序嵌入空间
        reprogramming_embedding = torch.einsum("bhls,she->blhe", A, value_embedding)
        return reprogramming_embedding

工作原理:三步完成时序-文本空间映射

  1. 补丁分割:使用layers/Embed.py中的PatchEmbedding类,将长时序序列分割为固定长度的重叠补丁(默认16个时间步,步长8)

  2. 跨模态注意力:通过多头注意力机制,计算时序补丁(Query)与文本原型(Key/Value)的相似度

  3. 动态映射:根据注意力权重将文本原型的语义特征"注入"到时序补丁中,生成LLM可理解的混合嵌入

补丁重编程详细流程 图2:补丁重编程与文本原型协同工作机制,(a)展示了文本原型到时序补丁的映射过程,(b)展示了两种前缀模式的输入构造方式

组件二:Text Prototypes——时序特征的"语义锚点"

文本原型的核心作用

文本原型是预定义的语义向量集合,代表时序数据中常见的特征模式(如趋势、周期、极值等)。在models/TimeLLM.py中,通过以下代码构建文本原型:

self.word_embeddings = self.llm_model.get_input_embeddings().weight
self.mapping_layer = nn.Linear(self.vocab_size, self.num_tokens)
source_embeddings = self.mapping_layer(self.word_embeddings.permute(1, 0)).permute(1, 0)

这段代码从LLM的词嵌入中学习一个映射矩阵,将整个词汇表压缩为1000个核心文本原型(num_tokens=1000),作为时序特征的"语义锚点"。

两大应用模式

  1. Patch-as-Prefix模式:将重编程后的时序补丁作为前缀输入LLM,适用于纯时序预测场景

  2. Prompt-as-Prefix模式:在时序补丁前添加任务描述和统计特征(如最大值、趋势方向),通过dataset/prompt_bank/中的模板生成自然语言提示,实现指令微调效果:

prompt_ = (
    f"<|start_prompt|>Dataset description: {self.description}"
    f"Task description: forecast the next {str(self.pred_len)} steps given the previous {str(self.seq_len)} steps information; "
    "Input statistics: "
    f"min value {min_values_str}, max value {max_values_str}, "
    f"median value {median_values_str}, "
    f"the trend of input is {'upward' if trends[b] > 0 else 'downward'}"
    f"<|<end_prompt>|>"
)

实战应用:如何快速部署Time-LLM?

环境准备

首先克隆项目仓库并安装依赖:

git clone https://gitcode.com/gh_mirrors/ti/Time-LLM
cd Time-LLM
pip install -r requirements.txt

一键运行预测

项目提供了针对不同数据集的脚本,位于scripts/目录下,例如运行ETTh1数据集预测:

bash scripts/TimeLLM_ETTh1.sh

脚本会自动加载预训练LLM(支持LLaMA、GPT2、BERT等),并应用本文介绍的两大核心组件完成时序预测任务。

总结:时序预测的范式转移

Time-LLM通过Patch Reprogramming和Text Prototypes两大组件,成功将LLM的语义理解能力迁移至时序预测领域,实现了:

  • 🌟 零修改适配:无需微调LLM权重,通过轻量级适配层实现跨模态迁移
  • 🚀 通用架构:支持多种LLM模型和时序数据集,scripts/目录下提供8种场景的配置文件
  • 📈 精度提升:在M4、ECL、Traffic等标准数据集上超越传统时序模型

这种"重编程"思路为其他领域的LLM迁移应用提供了重要参考,预示着跨模态学习的新方向。

【免费下载链接】Time-LLM [ICLR 2024] Official implementation of " 🦙 Time-LLM: Time Series Forecasting by Reprogramming Large Language Models" 【免费下载链接】Time-LLM 项目地址: https://gitcode.com/gh_mirrors/ti/Time-LLM

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐