Home - Rvosuke/TLLM GitHub Wiki
Time-LLM: 基于大语言模型的时间序列预测框架
本文档详细介绍了Time-LLM项目的架构、原理和使用方法,旨在帮助初学者理解项目内容并能够运行相关实验。
目录
项目概述
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是本项目的核心模型,它将时间序列数据与预训练语言模型结合,具体工作原理如下:
-
数据准备阶段:
- 对输入时间序列进行标准化处理
- 计算统计特征(最小值、最大值、中值等)和时间特征(趋势、延迟等)
-
特征提取阶段:
- 使用补丁嵌入(Patch Embedding)将时间序列转换为适合语言模型处理的表示
- 构建包含数据统计信息的提示(Prompt),引导语言模型理解时间序列特性
-
语言模型处理阶段:
- 将时间序列特征和提示嵌入送入预训练语言模型(BERT/GPT2/LLAMA)
- 通过重编程层(Reprogramming Layer)使语言模型适应时间序列任务
-
预测阶段:
- 使用FlattenHead进行最终的时间序列预测
- 将预测结果反标准化为原始尺度
TimeLLM模型的创新之处在于它利用了大语言模型的强大特征提取能力,同时通过精心设计的提示和重编程机制,使语言模型能够理解和处理时间序列数据的特性。
数据集说明
项目使用的是5G网络流量数据集,包含以下几种类型:
-
Number类数据:
- cell_2_beam_19: 小区2波束19的数值型数据
- cell_2_beam_27: 小区2波束27的数值型数据
-
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
这个脚本会自动执行:
- 长期预测训练(80%训练数据)
- 长期预测训练(20%训练数据)
- 短期预测训练(80%训练数据)
- 短期预测训练(20%训练数据)
- 针对每个训练模型的鲁棒性测试
运行所有实验
可以使用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/
目录下,按数据类型和实验类型组织。每个实验会生成:
- 训练日志(*.log):记录训练过程中的损失变化
- 模型检查点(*.ckpt):保存训练好的模型权重
- 鲁棒性测试结果:包含不同噪声水平和缺失率下的性能评估
- 可视化结果:如有启用可视化,会生成预测结果的图形表示
指标解读
主要评估指标包括:
- 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
脚本进行预处理,最后修改实验脚本以使用新数据。