Home - Rvosuke/TLLM GitHub Wiki

Time-LLM: 基于大语言模型的时间序列预测框架

本文档详细介绍了Time-LLM项目的架构、原理和使用方法,旨在帮助初学者理解项目内容并能够运行相关实验。

目录

  1. 项目概述
  2. 项目架构
  3. 核心模型
  4. 数据集说明
  5. 实验任务
  6. 使用指南
  7. 常见问题解答

项目概述

Time-LLM是一个结合大语言模型(LLM)能力进行时间序列预测的创新框架。该框架通过巧妙地将时间序列数据与预训练语言模型相结合,利用语言模型强大的特征提取和上下文理解能力,提高时间序列预测的精度和鲁棒性。

本项目专注于5G网络流量数据的预测任务,包括对不同小区(Cell)和波束(Beam)组合下的网络流量指标(Number和Throughput)进行短期和长期预测,同时还包含了迁移学习、噪声鲁棒性测试和缺失数据处理等高级功能。

主要特点

  • 结合LLM能力:利用BERT、GPT2或LLAMA等大型语言模型的强大特征提取能力
  • 多任务支持:支持短期预测和长期预测任务
  • 高鲁棒性:通过专门的鲁棒性测试评估模型对噪声和缺失数据的抵抗力
  • 迁移学习:能够从一个场景(如特定小区和波束组合)学习并迁移到另一个场景
  • 并行加速:支持DeepSpeed和Accelerate进行分布式训练加速

项目架构

本项目的代码结构清晰,主要包含以下几个部分:

  • models/: 包含核心模型实现,如TimeLLM、Autoformer、DLinear等
  • layers/: 各种网络层的实现,如嵌入层、注意力机制等
  • data_provider/: 数据加载和处理模块
  • scripts/: 各种运行脚本,用于不同实验场景
  • utils/: 工具函数,包括评估指标、数据处理工具等
  • results/: 保存实验结果和模型检查点
  • dataset/: 包含原始数据和处理后的数据

核心模型

TimeLLM模型

TimeLLM是本项目的核心模型,它将时间序列数据与预训练语言模型结合,具体工作原理如下:

  1. 数据准备阶段

    • 对输入时间序列进行标准化处理
    • 计算统计特征(最小值、最大值、中值等)和时间特征(趋势、延迟等)
  2. 特征提取阶段

    • 使用补丁嵌入(Patch Embedding)将时间序列转换为适合语言模型处理的表示
    • 构建包含数据统计信息的提示(Prompt),引导语言模型理解时间序列特性
  3. 语言模型处理阶段

    • 将时间序列特征和提示嵌入送入预训练语言模型(BERT/GPT2/LLAMA)
    • 通过重编程层(Reprogramming Layer)使语言模型适应时间序列任务
  4. 预测阶段

    • 使用FlattenHead进行最终的时间序列预测
    • 将预测结果反标准化为原始尺度

TimeLLM模型的创新之处在于它利用了大语言模型的强大特征提取能力,同时通过精心设计的提示和重编程机制,使语言模型能够理解和处理时间序列数据的特性。

数据集说明

项目使用的是5G网络流量数据集,包含以下几种类型:

  1. Number类数据

    • cell_2_beam_19: 小区2波束19的数值型数据
    • cell_2_beam_27: 小区2波束27的数值型数据
  2. Throughput(thp)类数据

    • cell_0_beam_1: 小区0波束1的吞吐量数据
    • cell_2_beam_0: 小区2波束0的吞吐量数据

每个数据集包含24小时的时间序列数据,以小时为单位记录相应的网络流量指标。

数据预处理

数据在使用前经过了预处理,主要包括:

  • 时间特征提取
  • 数据标准化
  • 缺失值处理
  • 序列切分(用于训练和测试)

预处理后的数据保存在dataset/processed/目录下。

实验任务

本项目包含多种实验任务:

1. 长短期预测

  • 短期预测(Short-term Forecast):预测未来短期(如6个时间步)的时间序列值
  • 长期预测(Long-term Forecast):预测未来较长期(如24个时间步)的时间序列值

每种预测任务都可以配置不同的训练数据比例(如80%或20%),以评估模型在不同数据可用性条件下的性能。

2. 鲁棒性测试

  • 噪声鲁棒性测试:评估模型在输入数据包含不同程度噪声下的预测性能
  • 缺失数据测试:评估模型处理输入序列中不同比例缺失数据的能力

3. 迁移学习

评估模型从一个场景(如某特定小区和波束组合)学习并应用到另一个场景的能力:

  • Throughput数据迁移:从cell_2_beam_0迁移到cell_0_beam_1
  • Number数据迁移:从cell_2_beam_19迁移到cell_2_beam_27

使用指南

环境设置

项目依赖可通过requirements.txt安装:

pip install -r requirements.txt

运行单个实验

以运行针对cell_2_beam_19的Number数据的实验为例:

bash scripts/TimeLLM_5GTraffic_num_C2B19.sh

这个脚本会自动执行:

  1. 长期预测训练(80%训练数据)
  2. 长期预测训练(20%训练数据)
  3. 短期预测训练(80%训练数据)
  4. 短期预测训练(20%训练数据)
  5. 针对每个训练模型的鲁棒性测试

运行所有实验

可以使用run_all.sh脚本运行所有预定义的实验:

bash run_all.sh

这将依次执行所有脚本中定义的实验任务。

自定义实验

如果需要自定义实验,可以修改现有脚本或创建新脚本。关键参数说明:

  • task_name: 任务类型,如long_term_forecast或short_term_forecast
  • is_training: 是否进行训练(1)或仅测试(0)
  • data_path: 数据文件路径
  • model: 选择模型(TimeLLM、Autoformer或DLinear)
  • seq_len: 输入序列长度
  • pred_len: 预测序列长度
  • train_rate: 训练数据比例

结果分析

实验结果保存在results/目录下,按数据类型和实验类型组织。每个实验会生成:

  1. 训练日志(*.log):记录训练过程中的损失变化
  2. 模型检查点(*.ckpt):保存训练好的模型权重
  3. 鲁棒性测试结果:包含不同噪声水平和缺失率下的性能评估
  4. 可视化结果:如有启用可视化,会生成预测结果的图形表示

指标解读

主要评估指标包括:

  • MSE(均方误差):评估预测值与真实值的平方差
  • MAE(平均绝对误差):评估预测值与真实值的绝对差

值越小表示预测性能越好。

常见问题解答

Q: 如何选择合适的预训练语言模型?
A: 可以通过--llm_model参数指定使用的语言模型,目前支持BERT、GPT2和LLAMA。一般而言,较大的模型如LLAMA可能性能更好,但也需要更多计算资源。

Q: 如何调整模型以获得更好的性能?
A: 关键参数包括学习率(--learning_rate)、批量大小(--batch_size)和模型维度(--d_model--d_ff)等。可以从默认参数开始,然后根据验证集性能进行调整。

Q: 如何处理OutOfMemory错误?
A: 可以尝试减小批量大小、减少模型层数(--llm_layers)或使用混合精度训练(--mixed_precision bf16)。

Q: 训练时间过长怎么办?
A: 可以减少训练轮数(--train_epochs)、使用较小的语言模型或增加并行处理数量(--num_processes)。

Q: 如何添加新的数据集?
A: 将新数据集放入dataset/raw/目录,然后使用scripts/preprocess.py脚本进行预处理,最后修改实验脚本以使用新数据。