Skip to content

PatchTST 调试形参

Abstract

这篇只做一件事:

保存当前用于学习 PatchTST 代码运行流程的最小 PyCharm 参数。

1. PyCharm 配置

Script path

text
D:\1sudyta\1ai-self\aistyle\TFB\scripts\run_benchmark.py

Working directory

text
D:\1sudyta\1ai-self\aistyle\TFB

Environment variables

text
KMP_DUPLICATE_LIB_OK=TRUE

2. Parameters

直接复制下面这一整行到 PyCharm 的 Parameters

text
--config-path rolling_forecast_config.json --data-name-list cif_2016_dataset_1.csv --model-name time_series_library.PatchTST --adapter transformer_adapter --model-hyper-params "{\"batch_size\":4,\"d_model\":32,\"d_ff\":128,\"e_layers\":1,\"factor\":3,\"horizon\":6,\"n_heads\":2,\"norm\":true,\"seq_len\":24,\"patch_len\":6,\"stride\":3,\"dropout\":0.0,\"lr\":0.0001,\"num_epochs\":1,\"num_workers\":0}" --strategy-args "{\"horizon\":6,\"tv_ratio\":0.8,\"train_ratio_in_tv\":0.75,\"stride\":6,\"num_rollings\":2}" --num-workers 1 --timeout 600 --save-path debug\cif1_PatchTST_rolling_min

2.1 VSCode 调试配置

VSCode 不把参数写成一整行,而是写进 .vscode/launch.jsonargs 数组。

先在 VSCode 里执行:

text
Ctrl+Shift+P
-> Python: Select Interpreter
-> 选择 D:\Anaconda\envs\tfb\python.exe

然后在仓库根目录创建或修改:

text
D:\1sudyta\1ai-self\aistyle\TFB\.vscode\launch.json

加入下面配置:

json
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "TFB PatchTST rolling debug",
      "type": "python",
      "request": "launch",
      "program": "${workspaceFolder}\\scripts\\run_benchmark.py",
      "cwd": "${workspaceFolder}",
      "console": "integratedTerminal",
      "env": {
        "KMP_DUPLICATE_LIB_OK": "TRUE"
      },
      "args": [
        "--config-path", "rolling_forecast_config.json",
        "--data-name-list", "cif_2016_dataset_1.csv",
        "--model-name", "time_series_library.PatchTST",
        "--adapter", "transformer_adapter",
        "--model-hyper-params", "{\"batch_size\":4,\"d_model\":32,\"d_ff\":128,\"e_layers\":1,\"factor\":3,\"horizon\":6,\"n_heads\":2,\"norm\":true,\"seq_len\":24,\"patch_len\":6,\"stride\":3,\"dropout\":0.0,\"lr\":0.0001,\"num_epochs\":1,\"num_workers\":0}",
        "--strategy-args", "{\"horizon\":6,\"tv_ratio\":0.8,\"train_ratio_in_tv\":0.75,\"stride\":6,\"num_rollings\":2}",
        "--num-workers", "1",
        "--timeout", "600",
        "--save-path", "debug\\cif1_PatchTST_rolling_min"
      ]
    }
  ]
}

关键区别:

text
PyCharm Parameters:
一整行字符串,JSON 需要用 \" 转义。

VSCode args:
一个参数一个数组元素,JSON 参数整体作为一个字符串元素。

3. 当前参数含义

数据与任务

  • --data-name-list cif_2016_dataset_1.csv
    • 使用一个很小的数据集,便于看清 PatchTST 的代码流。
  • --config-path rolling_forecast_config.json
    • 使用 rolling forecast 评测协议。
  • --strategy-args
    • horizon = 6
      • 每次预测未来 6 步。
    • tv_ratio = 0.8
      • 前 80% 作为 train/valid 区域。
    • train_ratio_in_tv = 0.75
      • train/valid 区域内部再切训练段。
    • stride = 6
      • rolling forecast 每次往后滚 6 步。
    • num_rollings = 2
      • 只滚 2 次,减少调试负担。

模型

  • --model-name time_series_library.PatchTST
    • 当前调试模型是 PatchTST。
  • --adapter transformer_adapter
    • 仍然走 TFB 的 transformer 统一 adapter。
  • seq_len = 24
    • 输入历史窗口长度。
  • horizon = 6
    • 会被 adapter/配置层转成 pred_len = 6
  • patch_len = 6
    • 每个 patch 覆盖 6 个时间步。
  • stride = 3
    • PatchTST 内部切 patch 的步长。
  • d_model = 32
    • patch embedding 后的隐藏维度。
  • n_heads = 2
    • attention head 数量。
  • e_layers = 1
    • encoder 层数。
  • d_ff = 128
    • encoder feed-forward 隐藏维度。
Warning

这里有两个 stride

  • model-hyper-params 里的 stride = 3
    • PatchTST 内部切 patch 的步长。
  • strategy-args 里的 stride = 6
    • rolling forecast 每次测试窗口往后移动的步长。

它们不是同一个东西。

4. 当前小例子的关键 shape

这个数据集通常是单变量,所以 C = 1

当前 batch 里大概率会看到:

text
x_enc:        (4, 24, 1)
permute 后:   (4, 1, 24)
patch 后:     (4, 8, 32)
encoder 后:   (4, 8, 32)
reshape 后:   (4, 1, 8, 32)
permute 后:   (4, 1, 32, 8)
head 后:      (4, 1, 6)
permute 后:   (4, 6, 1)

其中 patch 数:

text
patch_num = int((seq_len - patch_len) / stride + 2)
          = int((24 - 6) / 3 + 2)
          = 8

5. 断点顺序

第一轮只看代码流,先不要看论文。

  1. ts_benchmark/baselines/time_series_library/adapters_for_transformers.py
    • TransformerAdapter._process(...)
  2. ts_benchmark/baselines/time_series_library/models/PatchTST.py
    • forward(...)
  3. ts_benchmark/baselines/time_series_library/models/PatchTST.py
    • forecast(...)
  4. ts_benchmark/baselines/time_series_library/layers/Embed.py
    • PatchEmbedding.forward(...)
  5. ts_benchmark/baselines/time_series_library/layers/Transformer_EncDec.py
    • Encoder.forward(...)
  6. ts_benchmark/baselines/time_series_library/models/PatchTST.py
    • FlattenHead.forward(...)

6. 当前学习主线

text
run_benchmark
-> pipeline
-> eval_model
-> RollingForecast._eval_batch
-> forecast_fit
-> _process
-> PatchTST.forward
-> PatchTST.forecast
-> PatchEmbedding
-> Encoder
-> FlattenHead
-> output

这一轮的第一性:

先看清 PatchTST 怎样把一段时间序列切成 patch,再让每个变量独立经过 Transformer encoder,最后用 FlattenHead 预测未来窗口。

*记录并在线阅读我的笔记*