TIME-LLM 详解:如何用大语言模型预测时间序列?


之前投了一篇IJCAI做位置点预测的LLM,里面涉及了很多地理位置信息与LLMtoken对齐,但是没有考虑很多时间信息,只是简单的把签到时间通过文本输入给LLM。最近可能需要再之前的基础上作进一步对时间信息的利用,这里先来看一下这篇论文 TIME-LLM,作者也再github上公开了 代码,并做一下详细的论文学习。

在这里插入图片描述

1. 背景

1.1 时间序列预测

时间序列建模是现实世界中广泛存在的一类关键问题。无论是在能源调度、电力负载预测、天气变化分析,还是在用户行为建模、库存管理和交通流量调度等应用场景中,核心任务往往都围绕着“根据过去的时序数据,预测未来的状态或趋势”。这些问题本质上具有高度相似的结构:输入是一段多变量、按时间排序的观测序列,输出是未来一段时间内的预测值。这类任务不仅具备强烈的实用价值,也长期作为机器学习和深度学习模型演进的试验场。

我在之前的研究中接触过 POI(Point of Interest)推荐任务,本质上是一种用户位置行为预测问题。用户在不同时间到达不同地理位置的签到记录,构成了一个典型的带有时间戳的行为序列。每个用户的签到轨迹可以建模为一个按时间排序的离散事件序列,这些序列不仅反映用户的行为习惯,还包含着地理-时间相关性、周期性出行模式等时序信号。从这个角度看,POI 推荐也可以被归类为一种“个体级别的时间序列建模任务”。然而,在我实际处理该任务时,发现现有模型往往面临两个主要限制:其一,每个任务都需要单独设计模型结构或特征工程;其二,用户行为数据天然稀疏,长尾用户数据较少,训练困难。(但POI任务是又不是连续型的数值,这里可能还有待思考)

这两个问题恰恰也是整个时间序列建模领域面临的共性挑战。传统的时间序列预测方法——无论是统计模型如 ARIMA,还是基于深度学习的 LSTM、GRU、TCN 等结构——往往都具有明显的“任务特定性”。也就是说,每一个应用场景都需要重新设计模型结构、选择合适的超参数、针对性地进行训练,这种高度特化的范式大大限制了模型的通用性与扩展性。同时,许多现实数据(特别是在用户行为类任务中)往往存在数据稀疏问题,无法支持从零开始训练复杂神经网络模型,从而导致预测性能受限。

与此同时,近年来预训练大语言模型(LLMs)的飞跃式发展在自然语言处理(NLP)和计算机视觉(CV)领域带来了革命性的变化。模型如 GPT-3、GPT-4、LLaMA 展现出强大的泛化能力:它们通过大规模预训练,学会了理解复杂的序列结构、执行多样化任务,并能在 few-shot 甚至 zero-shot 设置下取得令人惊讶的效果。更关键的是,LLMs 天生具备对复杂上下文进行建模和推理的能力,能够在面对非结构化、长距离依赖的输入时仍保持良好的表现。这一特性激发了一个重要的研究问题:是否可以将 LLMs 从语言建模领域迁移到时间序列预测任务中?是否可以通过某种方式“激活” LLM 内部已有的泛化知识,使其胜任结构完全不同的连续数值预测任务?

这正是 TIME-LLM 这篇论文试图回答的问题。作者认为,尽管语言模型最初是为处理离散的语言 token 而设计的,但其强大的模式识别与推理能力如果能够被“重编程”,完全有可能用于时间序列建模中。TIME-LLM 提出的解决方案并不是对 LLM 本体进行结构修改或微调,而是通过一种轻量的输入转换机制(Patch Reprogramming),将原始时间序列转换为“语言风格”的表示,同时通过 Prompt-as-Prefix 技术加入自然语言提示,引导模型将其解释为预测类任务。这样,冻结的 LLM 就能够在无需大量数据或模型调整的前提下,完成复杂的时间序列预测工作。这种方法特别适合解决数据稀疏、任务多样、要求高泛化能力的时间序列问题。

1.2 三类范式

在这里插入图片描述

在深入介绍 LLM 所带来的机遇之前,作者通过如图所示的对比图(Figure 1),非常清晰地将时间序列建模方法划分为三类范式:任务特定学习(Task-Specific Learning)、模型微调(Model Fine-Tuning)和模型重编程(Model Reprogramming)。图 1(a) 所示的传统方法中,针对目标任务(如时间序列预测)往往从头构建模型,这些模型完全依赖目标模态的数据进行训练,虽然在特定任务上能取得不错的效果,但缺乏跨任务迁移能力,也很难复用已有知识。图 1(b) 展示的是近年来较为常见的“预训练+微调”范式,即通过在源任务上进行大规模预训练,再为目标任务设计适配模块进行微调,这类方法虽然提升了模型泛化能力,但仍需对模型本体进行修改和再训练,成本不低(我之前的POI推荐LLM可以说就是这种范式)。而 TIME-LLM 所代表的新方法如图 1© 所示,通过一种“重编程”方式实现范式转变:保持语言模型本体冻结不变,仅通过输入转换与提示引导,就能让模型完成跨模态的迁移。这种方式不仅轻量(lightweight),而且有效(highly effective),还能利用语言模型原有的上下文理解能力(contextual bootstrapping)完成复杂的时序推理任务。更重要的是,它还具备“跨模态能力”(cross-modality):将原本属于数值型时间序列任务,映射到语言模型能理解的表示空间中进行处理。这张图本质上传达了作者的核心理念:我们不必再为每个时间序列任务重新发明轮子,而是可以通过模型重编程,让 LLM 成为一个通用的预测引擎。

1.3 贡献

总的来说,TIME-LLM 所针对的问题切中当前时间序列建模领域的核心痛点,同时又巧妙地借助了大型语言模型在预训练、推理和泛化方面的优势。文章最核心的贡献在于提出了一种全新的“模型重编程”范式,它突破了传统模型必须针对每个任务重新设计架构的限制,而是通过对输入数据进行格式转换和提示引导,在不改变 LLM 主体结构的前提下,将时间序列预测转化为语言建模任务中的“伪语言任务”。

  • 具体而言,作者首先引入了“重编程”的概念,证明了只要进行适当的数据模态对齐,时间序列预测本质上也可以被语言模型处理;
  • 其次,他们设计了 TIME-LLM 框架,将时间序列数据转换为文本原型(text prototype)表示,并结合领域提示(如任务描述、统计信息)提升 LLM 对时序概念的理解能力,从而实现语言与时间模态的深度融合;
  • 最后,通过在多个主流预测任务上的实证研究,作者展示了 TIME-LLM 在 few-shot 和 zero-shot 场景下不仅超越了现有最先进模型,同时也保持了极高的训练与计算效率,凸显了该方法在实际应用中的可部署性和泛化能力。可以说,这项研究为释放大语言模型在时间序列领域的潜在价值迈出了坚实的一步,也为构建统一的多模态预测系统提供了重要启示。

2. 方法

2.1 问题定义

TIME-LLM 所解决的核心问题是如何在不微调语言模型本体的前提下,利用其强大的预训练能力完成通用的时间序列预测任务。我们将整个问题建模为一个典型的监督学习任务,其输入是一段历史的多变量时间序列,输出为未来一段时间的预测值。具体而言,给定一个输入矩阵 X ∈ R N × T \mathbf{X} \in \mathbb{R}^{N \times T} XRN×T,表示一个长度为 T T T 的时间序列,其中包含 N N N 个不同的一维变量(如温度、电量、访问量等),模型的目标是学习一个映射函数 f ( ⋅ ) f(\cdot) f(),将历史观测序列 X \mathbf{X} X 映射为未来 H H H 个时间步上的预测值 Y ^ ∈ R N × H \hat{\mathbf{Y}} \in \mathbb{R}^{N \times H} Y^RN×H。换言之,模型需要在冻结的大语言模型 f f f 的基础上,完成如下预测任务:
Y ^ = f ( X ) \hat{\mathbf{Y}} = f(\mathbf{X}) Y^=f(X)
为了训练模型,作者采用了标准的平均平方误差(Mean Squared Error, MSE)作为损失函数,用于衡量预测值 Y ^ \hat{\mathbf{Y}} Y^ 与真实值 Y \mathbf{Y} Y 之间的偏差。具体的优化目标如下:

min ⁡ 1 H ∑ h = 1 H ∣ Y ^ h − Y h ∣ F 2 \min \frac{1}{H} \sum_{h=1}^{H} \left| \hat{\mathbf{Y}}_h - \mathbf{Y}_h \right|_F^2 minH1h=1H Y^hYh F2

其中, Y ^ h ∈ R N \hat{\mathbf{Y}}_h \in \mathbb{R}^N Y^hRN 表示第 h h h 个时间步上的预测向量, Y h \mathbf{Y}_h Yh 是对应的真实值, ∣ ⋅ ∣ F |\cdot|_F F 表示 Frobenius 范数,即所有变量误差平方的总和。该损失函数确保模型在所有变量和时间步上尽可能减少预测误差。

此外,TIME-LLM 所提出的方法架构由三大组件构成:(1)输入转换(Input Transformation),用于将原始时间序列转化为语言模型能理解的表示形式;(2)冻结的大语言模型(Frozen LLM),作为语义推理引擎,不参与训练;(3)输出映射层(Output Projection),将语言模型的嵌入输出还原为具体的数值预测结果。整个模型仅训练极少量的输入转换和输出投影参数,从而保证了轻量性、高效率与跨任务的适应能力。

2.2 TIME-LLM 模型结构

在这里插入图片描述

图 2 展示了 TIME-LLM 的整体架构。它以预训练大语言模型为核心,在无需微调主干模型参数的前提下,通过重编程输入结构与引导提示,实现了对时间序列任务的强适应能力。我们接下来按照图中标注的五个流程步骤,逐步揭示 TIME-LLM 是如何处理时间序列数据并完成预测的。

① Instance Norm + Patching:时间序列预处理与切片(Input Embedding)

第一步,TIME-LLM 接收原始的多变量时间序列输入,并对其进行标准化处理。具体地,每条时间序列通道都会通过 Instance Normalization(如 RevIN) 被归一化到均值为 0、标准差为 1,以缓解跨样本的分布漂移问题。接着,归一化后的时间序列被滑动窗口切分为若干长度为 L p L_p Lp 的 patch(即时间片段),窗口滑动步长为 S S S,最终形成一组 patch 序列。

这些 patch 会被一个简单的线性层嵌入为低维表示,从而得到嵌入矩阵 X ^ P ( i ) ∈ R P × d m \hat{\mathbf{X}}_P^{(i)} \in \mathbb{R}^{P \times d_m} X^P(i)RP×dm,每一行相当于一个伪 token。这一步构成了 Input Embedding 模块的主要内容,是连接原始时间序列与语言模型输入空间之间的关键桥梁。

② Patch Embedder:补丁嵌入的语义重构(Patch Reprogramming)

在获得了初始的 patch 嵌入之后,第二步进入了 Patch Reprogramming 阶段。由于语言模型只能理解“语言式的嵌入表示”,所以我们不能直接把 patch 向量输入语言模型,而必须将其“伪装”为语言 token。

为此,作者引入了一组可学习的文本原型向量(Text Prototypes),这些向量取自预训练语言模型的词嵌入矩阵中的语义子集,构成一个新的 prototype space。通过一个多头交叉注意力模块(Cross-Attention),每个 patch 嵌入会被重编程为对原型集合的语义加权组合,从而输出新的 patch 表示 O ( i ) ∈ R P × D \mathbf{O}^{(i)} \in \mathbb{R}^{P \times D} O(i)RP×D,其维度正好匹配语言模型所要求的 token 嵌入维度。这一阶段实现了时间模态向语言模态的对齐,是整个框架中的核心设计之一。

③ Prompt-as-Prefix:提示前缀引导模型推理(Prompt-as-Prefix)

在完成 patch 嵌入重编程之后,TIME-LLM 并不会直接将其输入语言模型,而是先在前面拼接上一段自然语言提示(Prompt),即 Prompt-as-Prefix。

这一提示部分由三个要素组成:

  • Dataset Context:提供数据的背景知识与常识性描述(例如电力负载在白天上升);
  • Task Instruction:明确告诉模型当前任务目标,如“预测未来 H 步的值”;
  • Input Statistics:列举输入时间序列的统计特征,例如最大值、趋势方向、滞后信息等。

这些文本内容会被语言模型的 Tokenizer 和 Embedding 模块处理,转化为嵌入向量,与后续 patch embedding 串联形成完整的模型输入序列。Prompt 不直接参与预测输出,而是作为上下文语境,帮助语言模型更好地理解输入数据的结构与任务目标。它是激活 LLM 推理能力的关键增强机制。

④ LLM Processing:冻结语言模型的上下文处理

拼接好的序列(Prompt + Patch)会被送入冻结的大语言模型(如 LLaMA),进行完整的上下文处理与语义建模。由于语言模型本身拥有强大的跨 token 推理与长期依赖建模能力,它可以在没有微调的情况下,仅依赖提示语境与 patch 表达,完成对时间序列动态变化的理解。这一阶段模型权重完全冻结,不进行任何反向传播,仅依靠前向推理完成信息加工。

⑤ Output Projection:预测结果生成(Output Projection)

最后一步是从语言模型输出序列中提取 patch 部分的表示,并通过一个线性层进行投影,得到实际的预测值 Y ^ ∈ R N × H \hat{\mathbf{Y}} \in \mathbb{R}^{N \times H} Y^RN×H。这一步被称为 Output Projection,也是 TIME-LLM 完成预测任务的最终阶段。

需要注意的是,预测值并不是语言模型“生成”的,而是从其中间 token 表示中提取并回归出来的。这种方式避免了传统语言模型在处理数字生成时存在的 token 拆解、数值不稳定等问题,提高了预测的精度与稳定性。

2.3 Input Embedding

在 TIME-LLM 中,模型接收到的原始输入是一个 N N N 维的多变量时间序列 X ∈ R N × T \mathbf{X} \in \mathbb{R}^{N \times T} XRN×T,其中 N N N 表示变量数量(例如多个传感器通道), T T T 表示时间序列的长度。为了增强模型对不同变量特征的感知能力,首先对每个变量通道 X ( i ) ∈ R 1 × T \mathbf{X}^{(i)} \in \mathbb{R}^{1 \times T} X(i)R1×T 进行归一化处理,具体采用 Reversible Instance Normalization(RevIN)方法,该方法能有效缓解不同样本之间的分布漂移问题,使每个通道的均值为 0,标准差为 1。完成归一化后,模型将 X ( i ) \mathbf{X}^{(i)} X(i) 按照滑动窗口的方式划分为一系列长度为 L p L_p Lp 的 patch,用于后续嵌入处理。patch 的滑动步长设置为 S S S,最终可以得到的 patch 数量为 P = ⌊ T − L p S ⌋ + 2 P = \left\lfloor \frac{T - L_p}{S} \right\rfloor + 2 P=STLp+2,其中向下取整符号 ⌊ ⋅ ⌋ \lfloor \cdot \rfloor 表示为满足覆盖的最大切分次数,额外的 + 2 +2 +2 则用于确保在序列首尾两端额外补充边界 patch。划分完成后,得到的 patch 表示为 X P ( i ) ∈ R P × L p \mathbf{X}_P^{(i)} \in \mathbb{R}^{P \times L_p} XP(i)RP×Lp,每一行是一个时间片段。随后,作者使用一个简单的线性投影层对每个 patch 进行嵌入,得到 X ^ P ( i ) ∈ R P × d m \hat{\mathbf{X}}_P^{(i)} \in \mathbb{R}^{P \times d_m} X^P(i)RP×dm,其中 d m d_m dm 是 patch 嵌入后的维度。这一步的设计动机主要有两个:一是通过将局部时间片段聚合为 patch,更好地保留了局部语义信息,便于捕捉短期趋势和模式;二是通过 patch 化和嵌入操作将原始连续数据转换为 token-like 嵌入,减小了后续模型的计算负担,也为语言模型理解时间序列数据提供了统一的输入格式。

值得注意的是,TIME-LLM 在划分时间序列片段时并未采用简单的等间距切分策略(即直接按块划分 T / L p T / L_p T/Lp,而是引入了滑动窗口机制,并使用滑动步长 S S S 来控制 patch 的生成方式。若使用 T / L p T / L_p T/Lp 这种非重叠划分方法,每个 patch 之间没有任何交集,容易造成序列局部特征被割裂,尤其在边界区域更容易丢失重要信息。而通过引入滑动步长 S S S,每个 patch 可以和前一个 patch 存在一定程度的重叠(当 S < L p S < L_p S<Lp 时),从而提高模型对局部趋势和短期动态的感知能力。这种“滑动窗口 + 局部感受野”的机制更接近于语言模型处理文本时的“token 上下文窗口”,能够保留更丰富的语义连续性。同时,设置合理的 S S S 也能在覆盖更多时间片的同时控制 patch 数量,从而在建模表达力与计算效率之间取得良好平衡。因此,TIME-LLM 通过 ⌊ T − L p S ⌋ + 2 \left\lfloor \frac{T - L_p}{S} \right\rfloor + 2 STLp+2 来计算最终 patch 数量,不仅覆盖了主要序列区域,还适当补充了两端边界 patch,以防信息截断,确保时间序列能够被充分且连续地建模。(感觉有点像RAG中文档分块时类似,让前后的文档有一定的重合部分。)

2.4 Patch Reprogramming

在这里插入图片描述

在 TIME-LLM 中,Patch Reprogramming 模块承担着关键的跨模态桥梁作用,其核心目标是将时间序列的 patch 嵌入 X ^ P ( i ) ∈ R P × d m \hat{\mathbf{X}}_P^{(i)} \in \mathbb{R}^{P \times d_m} X^P(i)RP×dm 转换为语言模型可接受的 token 嵌入形式 O ( i ) ∈ R P × D \mathbf{O}^{(i)} \in \mathbb{R}^{P \times D} O(i)RP×D,以实现从时间模态到语言模态的对齐。图中左侧展示了该模块的整体操作流程。首先,时间序列被划分为多个局部片段 patch,并通过 Patch Embedder(图中②)投影为低维嵌入表示。为了进一步将这些 patch 嵌入“语言化”,模型引入了一组被称为 Text Prototypes 的语义表示,用作 cross-attention 模块中的 key 和 value,以指导 patch 的语义重编程。

这些 Text Prototypes 的来源是语言模型中已训练好的词嵌入矩阵 E ∈ R V × D \mathbf{E} \in \mathbb{R}^{V \times D} ERV×D,其中 V V V 是词表大小, D D D 是嵌入维度。作者并未直接使用 E \mathbf{E} E 中所有词嵌入,而是将其输入到一个线性变换层中,生成一个压缩后的 prototype 表达空间 E ’ ∈ R V ’ × D \mathbf{E}’ \in \mathbb{R}^{V’ \times D} ERV×D,其中 V ’ ≪ V V’ \ll V VV

具体怎么从 E \mathbf{E} E E ’ \mathbf{E}’ E 论文中没有写清楚,可能得看看代码。

但是我猜想:

  • 第一步(选择原型 token):

从预训练词嵌入 E ∈ R V × D \mathbf{E} \in \mathbb{R}^{V \times D} ERV×D选出 V ’ V’ V 个 prototype token,构成:

E proto ∈ R V ’ × D \mathbf{E}_{\text{proto}} \in \mathbb{R}^{V’ \times D} EprotoRV×D

这一步是基于 token index 的选取,可以是手工指定(如 “up”, “down”)或某种预定义方式选出的前 V ’ V’ V 个词。

  • 第二步(线性映射):

然后对这些原型向量做线性变换(这个也不确定对不对,因为好像选出 V ’ V’ V 个 prototype token,本身它们的embedding维度不需要通过线性映射层了?):

E ’ = E proto ⋅ W , W ∈ R D × D \mathbf{E}’ = \mathbf{E}_{\text{proto}} \cdot \mathbf{W}, \quad \mathbf{W} \in \mathbb{R}^{D \times D} E=EprotoW,WRD×D

这样我们得到的最终原型嵌入 E ’ ∈ R V ’ × D \mathbf{E}’ \in \mathbb{R}^{V’ \times D} ERV×D,维度与语言模型输入一致,可以作为 attention 的 key 和 value 使用。

作者在论文中没有明确指出 V ’ V’ V 行是如何从 E \mathbf{E} E 中选择的(例如是否选取了具体语义词项),我们可以从图 3(a) 的可视化中合理推测,原型嵌入可能与一些通用趋势性语言单元有关,如 “up”、“down”、“steady”、“short” 等,这些语义单位更容易映射到时间序列中的动态模式。因此,Text Prototypes 可被理解为 E \mathbf{E} E 在语义空间中的一个低秩投影子集,经过线性转换以适应时间序列的 patch 表达,便于后续通过多头交叉注意力机制实现有效的模态融合。

图右所示结构进一步辅助理解这一过程:词表嵌入(如“early”、“steady”、“short”)通过线性层后变为一组原型(三角形表示),随后 patch 嵌入与这些原型之间通过 attention 建立联系,最终输出与语言模型 token 嵌入格式一致的重编程表示 O ( i ) \mathbf{O}^{(i)} O(i),完成从时间片段到语言 token 的语义对齐。

在图右侧,我们可以直观地看到这一结构:左边灰色区域是原始词表 vocabulary,右边是 prototype 空间 E ’ E’ E,它由多个代表性 token 嵌入压缩生成,每个原型(如蓝色三角形)代表一种语义组合模式。通过 attention 机制,每个时间片 patch(黄色块)都会与这些语义原型建立语义关联,从而形成 patch 的“语言化语义解释”。

具体实现中,Patch 嵌入作为 query,原型向量作为 key 和 value,输入到多头交叉注意力模块(图中③)。对于每个 attention head k ∈ 1 , … , K k \in {1, \dots, K} k1,,K,我们首先通过线性变换生成查询矩阵:

Q k ( i ) = X ^ P ( i ) W k Q , W k Q ∈ R d m × d \mathbf{Q}_k^{(i)} = \hat{\mathbf{X}}_P^{(i)} \mathbf{W}_k^Q, \quad \mathbf{W}_k^Q \in \mathbb{R}^{d_m \times d} Qk(i)=X^P(i)WkQ,WkQRdm×d

同时,原型向量通过线性投影得到:

K k ( i ) = E ’ W k K , V k ( i ) = E ’ W k V , W k K , W k V ∈ R D × d \mathbf{K}_k^{(i)} = \mathbf{E}’ \mathbf{W}_k^K, \quad \mathbf{V}_k^{(i)} = \mathbf{E}’ \mathbf{W}_k^V, \quad \mathbf{W}_k^K, \mathbf{W}_k^V \in \mathbb{R}^{D \times d} Kk(i)=EWkK,Vk(i)=EWkV,WkK,WkVRD×d

随后使用标准的 attention 机制对 patch 与 prototype 之间的语义对齐程度进行加权求和,得到每个 head 的输出:

Z k ( i ) = A t t e n t i o n ( Q k ( i ) , K k ( i ) , V k ( i ) ) = S o f t m a x ( Q k ( i ) ( K k ( i ) ) ⊤ d ) V k ( i ) \mathbf{Z}_k^{(i)} = \mathrm{Attention}(\mathbf{Q}_k^{(i)}, \mathbf{K}_k^{(i)}, \mathbf{V}_k^{(i)}) = \mathrm{Softmax} \left( \frac{\mathbf{Q}_k^{(i)} (\mathbf{K}_k^{(i)})^\top}{\sqrt{d}} \right) \mathbf{V}_k^{(i)} Zk(i)=Attention(Qk(i),Kk(i),Vk(i))=Softmax(d Qk(i)(Kk(i)))Vk(i)

K K K 个 head 的输出拼接后,得到融合表示 Z ( i ) ∈ R P × d m \mathbf{Z}^{(i)} \in \mathbb{R}^{P \times d_m} Z(i)RP×dm,最后通过一个线性投影层将其转换为语言模型输入所需的嵌入维度 D D D

O ( i ) = L i n e a r ( Z ( i ) ) ∈ R P × D \mathbf{O}^{(i)} = \mathrm{Linear}(\mathbf{Z}^{(i)}) \in \mathbb{R}^{P \times D} O(i)=Linear(Z(i))RP×D

如图右所示,最终每个 patch(黄色框)都与若干 prototype 建立了语义映射关系,例如 Patch 1 被解释为“steady up”,Patch 2 被解释为“short down”,Patch 5 被理解为“long then down”,这些信息并不需要显式语言表达,而是通过原型聚合实现。这种设计不仅保留了 patch 的局部模式信息,还巧妙地嵌入了语言模型可理解的语义提示,使 LLM 能在冻结参数的情况下,实现对时间序列的深层语义推理。

2.5 Prompt-as-Prefix

在这里插入图片描述

在 TIME-LLM 中,除了通过原型对 patch 表示进行语义对齐外,作者还引入了一种称为 Prompt-as-Prefix 的机制,用于进一步提升 LLM 对时间序列任务的理解能力。该机制的核心思想是:通过构造具有结构化信息的自然语言 prompt,将额外的上下文作为前缀插入至语言模型的输入序列前端,从而引导模型更有效地处理后续的 patch 嵌入信息。与传统的 instruction prompting 不同,这里的 prompt 不仅用于激活模型行为,更直接参与了 reprogrammed patch 的变换过程,实质上是语言先验与时间模式融合的接口层。

如图所示(左侧),这部分由一个冻结的语言模型嵌入器(Pre-trained LLM Embedder)负责处理 prompt 的嵌入,生成与 reprogrammed patch 一起拼接的 token 序列,共同作为最终输入喂入语言模型主体。而在图右的实例中,作者以电力变压器温度预测任务为例,展示了完整的 prompt 构造格式,它主要由三部分组成:

  1. Domain Prompt:用于提供背景知识(如用电高峰通常出现在中午,变压器负荷随之显著增加),增强模型的领域感知;
  2. Instruction Prompt:指明任务目标,例如“根据前 T T T 步的输入,预测接下来的 H H H 步”,为模型提供任务导向;
  3. Input Statistics Prompt:展示序列的全局统计特征,如最小值、最大值、中位数、趋势方向(upward/downward)以及显著滞后特征(lag values),帮助模型把握时序结构的整体特征分布。

这一系列 prompt 被组织成一段具备层次和语义结构的自然语言文本,如图右所示,实际包含如:

[Domain]: We usually observe that electricity consumption peaks at noon...
[Instruction]: Predict the next <H> steps given the previous <T> steps...
[Statistics]: The input has a minimum of <min_val> ...

该 prompt 在经过预训练语言模型的 tokenizer 和嵌入模块后,成为 token 级表示并插入至序列最前端,如图中编号④所示。最终,这些前缀嵌入与来自时间序列的 patch 表达 O ( i ) \mathbf{O}^{(i)} O(i) 一起构成模型完整输入,使得 LLM 在处理 patch 时不仅接收到局部 patch 的动态信息,也获得了对任务背景与统计语境的全局理解。

在这里插入图片描述

作者尝试了两种不同的策略:Patch-as-PrefixPrompt-as-Prefix,并在图中进行了清晰对比(见上图)。左侧所示的 Patch-as-Prefix 尝试直接将时间序列的预测目标以自然语言形式(如 “the next value is 0.6”)拼接到输入序列中,期望 LLM 能像处理自然语言那样预测数值。然而,这种做法在实际应用中面临诸多挑战:首先,LLMs 通常难以精准处理浮点数值(如 0.61),因为 tokenization 会将其拆成多个字符级 token(如 “0”、”.”、“6”、“1”),使得模型的表示效率和预测稳定性显著下降;其次,不同模型对数字的编码方式各异,往往需要为每个模型定制精细的 post-processing;此外,这种方式还高度依赖语言模型内部的语言建模头(LM Head),而这在非语言任务中是多余的。

相比之下,右侧展示的 Prompt-as-Prefix 是 TIME-LLM 的最终采用方案,它巧妙地规避了上述问题。该策略不再让 LLM 直接“说出预测值”,而是将任务相关的高层语义信息作为输入前缀,以 natural language prompt 的形式添加到序列前部,引导模型对 patch 表达进行更准确的理解。Prompt 的构成结构化而清晰,通常包含三个关键组成部分:(1)数据上下文描述,提供任务领域的背景知识,例如“电力负荷通常在中午达到峰值”;(2)任务指令,明确告知模型目标,例如“预测接下来的 H H H 步”;(3)输入统计特征,包含例如最小值、最大值、中位数、趋势方向、主要滞后项等信息。这些 prompt 在图中以 “ + ” 形式展示,经由预训练语言模型的 tokenizer 和 embedder 转化为 token 嵌入,与 reprogrammed patches 拼接后一并输入主干 LLM 模型。

Prompt-as-Prefix 的优势在于,它将任务建模逻辑完全“语言化”,但避免了对数值 token 的处理负担,保留了语言模型在多任务迁移、上下文建模方面的能力。这一策略也展现出更强的通用性和扩展性,在 few-shot 和 zero-shot 设置下的性能表现显著优于 Patch-as-Prefix。总结来看,Prompt-as-Prefix 并不是让 LLM 预测出语言,而是利用语言来指挥 patch 的语义变换,从而让 LLM 更擅长处理“语言化”的时序任务。

2.6 Output Projection

在这里插入图片描述

在前述步骤完成后,TIME-LLM 便进入整体架构的最后一环:Output Projection,如图中编号⑤所示。经过语言模型主体(Frozen Pre-trained LLM Body)编码后,输入序列中的 patch 表达和 prompt 表达已经被混合建模并嵌入为上下文相关的 token 表示。由于模型的最终目标是对时间序列进行预测,因此我们需要从模型输出中提取 patch 所对应的部分,并将其还原为连续的时间值序列。这个过程,就是 Output Projection 所完成的关键任务。

具体来说,模型在接收完整输入序列后(包括 Prompt 和 Patch Embeddings),会输出一个 token 表达序列 H ∈ R ( L + P ) × D \mathbf{H} \in \mathbb{R}^{(L+P) \times D} HR(L+P)×D,其中 L L L 是 prompt token 的数量, P P P 是 patch token 的数量, D D D 是模型隐藏层维度。由于我们只关注 patch 的预测值,因此第一步是去除前缀 prompt 部分,仅保留后续 P P P 个 patch 表达 O ( i ) ∈ R P × D \mathbf{O}^{(i)} \in \mathbb{R}^{P \times D} O(i)RP×D

随后,作者采用一个非常轻量的投影头(Projection Head),如图左所示,对输出 patch 表达进行两步处理:(1)首先将多个 patch 表达进行展平(flatten),构成一个整体的全局表示;(2)然后通过一个线性映射层将该表示映射为最终的预测结果 Y ^ ( i ) ∈ R 1 × H \hat{\mathbf{Y}}^{(i)} \in \mathbb{R}^{1 \times H} Y^(i)R1×H,即 H H H 个未来时间步的数值预测。

这种设计有两个显著优势:一是无需修改语言模型主体结构,仅通过一个线性头即可实现预测;二是输入与输出之间仍维持 token-to-token 的一一对应关系,保持了 LLM 架构的自然流畅性。这一策略也正是 TIME-LLM 能够在保持 backbone 冻结状态下依然取得良好预测效果的关键之一。

在传统的大语言模型(如 GPT)中,输出通常是通过自回归方式逐个生成 token,直到生成特定的结束符(如 [EOS])或达到最大长度为止,适用于生成自然语言文本的任务。然而 TIME-LLM 并不采用这种“让模型说出预测值”的方式,而是将语言模型作为一个上下文理解器使用。在 TIME-LLM 中,模型的输出不是一串文本,而是 patch token 在经过 LLM 编码后的上下文相关表示(即 hidden states)。这些表示会在最后通过一个线性投影头进行转换,直接映射为我们关心的预测数值。具体地,作者从 LLM 的输出中提取出 reprogrammed patch 部分的 token 表达 O ( i ) ∈ R P × D \mathbf{O}^{(i)} \in \mathbb{R}^{P \times D} O(i)RP×D,将其展平后送入一个训练好的线性层,生成固定长度为 H H H 的预测结果 Y ^ ( i ) ∈ R 1 × H \hat{\mathbf{Y}}^{(i)} \in \mathbb{R}^{1 \times H} Y^(i)R1×H。这种设计彻底避免了浮点数 token 化、多步生成、结束符控制等问题,使得 LLM 能在冻结参数的情况下,完成高质量、高效率的时间序列预测。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值