傳統的 RNN、LSTM 和 GRU 等模型在處理長時間序列預測時,常會遇到梯度消失/爆炸和計算效率低落等問題。Transformer 模型憑藉其平行計算能力和長距離依賴捕捉能力,成為更佳的選擇。然而,標準 Transformer 模型仍面臨記憶體瓶頸和推理速度的挑戰。Informer 模型針對這些問題,提出了 ProbSparse 注意力機制、生成式解碼器和多種嵌入技術。ProbSparse 注意力機制有效降低了計算複雜度,而生成式解碼器則能一次性生成長序列輸出,避免了逐步預測的誤差累積。此外,自迴歸特徵嵌入、視窗相對位置嵌入和絕對位置嵌入則進一步提升了模型對時間序列資料的處理能力。為更深入理解 Vanilla Transformer 的應用,文章提供了 Python 程式碼範例,演示瞭如何使用 NeuralForecast 函式庫構建、訓練和評估模型,並利用圖表展示預測結果。除了標準 Transformer,文章也介紹了倒置 Transformer (iTransformer) 的概念,它將注意力機制應用於反轉維度,更有效地捕捉多變數之間的相關性,為時間序列預測提供了新的思路。
長時間序列預測中的轉換器模型
在處理長時間序列預測時,傳統的迴圈神經網路(RNN)、長短期記憶網路(LSTM)和門控迴圈單元(GRU)往往面臨記憶瓶頸和速度問題。轉換器模型(Transformers)因其平行處理能力和捕捉長距離依賴性的優勢,成為了一種替代方案。然而,標準的轉換器模型在處理長序列時仍然存在一些挑戰,這些挑戰主要包括記憶瓶頸和推理速度的問題。
轉換器模型的技術挑戰
標準的轉換器模型在處理長時間序列時會遇到以下幾個主要問題:
記憶瓶頸: 將多個編碼器/解碼器層疊加會使總記憶使用量呈現 O(J • L²) 的增長,這限制了模型在接收長序列輸入時的可擴充套件性。
推理速度減慢: 動態解碼的標準轉換器模型使得逐步推理過程與 RNN、LSTM 或 GRU 等傳統序列基礎模型一樣緩慢。
Informer 模型的技術概覽
Informer 模型是一種特別設計用來高效處理長輸入序列並捕捉複雜模式的神經網路架構。其核心特點包括 ProbSparse 注意力、生成式建模和自注意力機制。這些特點有助於緩解傳統轉換器模型中的一些問題。
Informer 的關鍵特點
完整注意力機制: 這種機制具有 O(L²) 的時間和記憶複雜度,對於長序列來說計算成本較高。
編碼器-解碼器結構: 使用多頭注意力機制,這是 Vaswani 等人在 2017 年提出的。
MLP 多步解碼器: 這個解碼器能夠在單次前向傳播中預測長時間序列,而不需要逐步進行。
ProbSparse 注意力機制
ProbSparse 注意力機制是 Informer 模型的一個重要創新。它透過選擇一組查詢來計算注意力分數,從而減少了注意力計算的數量,提高了計算效率。這種機制有助於模型在保持高效計算的同時學習到輸入序列中不同部分之間的關係。
Pseudo Code for ProbSparse Self-Attention
Require: Tensor Q ∈ Rmx d, K ∈ Rnx d, V ∈ Rnx d
Q, K, V: Query, key, and value matrices, respectively
1: print set hyperparameter c, u = c * ln(m) and U = m * ln(n)
2: randomly select U dot-product pairs from K as K'
3: set the sample score S = QK^T
4: compute the measurement M = max(S) — mean(S) by row
5: set Top-rz queries under M as Q'
6: set Si = softmax(Q'K^T/√d) • V
7: set So = mean(V)
8: set S = {Si, So} by their original rows accordingly
內容解密:
- 設定超引數:首先設定兩個超引數
c和u,其中u是透過c * ln(m)和m * ln(n)派生出來的。 - 隨機選擇 dot-product pairs:從
K中隨機選擇U個 dot-product pairs 作為K'。 - 計算樣本分數:計算查詢矩陣
Q與鍵矩陣K'的樣本分數S。 - 計算衡量值:對每一行計算衡量值
M,這是最大值減去平均值。 - 選擇顯著查詢:選擇顯著查詢作為
Q'。 - 計算注意力權重:使用 softmax 函式計算注意力權重並乘以值矩陣
V。 - 計算均值值:計算均值值
So。 - 組合結果:將
Si和So按照原始行索引組合起來。
生成式解碼器
生成式解碼器能夠在一次前向傳播中生成長序列輸出,避免了推理過程中的累積錯誤擴散問題。
轉換器模型的嵌入技術
轉換器模型使用三種嵌入技術來提升其對時間序列資料的處理能力:
自迴歸特徵嵌入: 透過卷積網路獲得自迴歸特徵。
視窗相對位置嵌入: 使用調和函式來捕捉序列中的週期性模式和相對位置關係。
絕對位置嵌入: 在嵌入中直接包含日曆特徵,以增強時間序列模型的效能。
Vanilla Transformer 的實際應用
讓我們透過具體的程式碼實作來理解 Vanilla Transformer 模型的應用。首先,我們需要匯入必要的模組和資料集。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from neuralforecast import NeuralForecast
from neuralforecast.models import MLP, VanillaTransformer
from neuralforecast.losses.pytorch import MQLoss, DistributionLoss, MAE
from neuralforecast.tsdataset import TimeSeriesDataset
from sklearn.metrics import mean_squared_error, mean_absolute_percentage_error, r2_score
from neuralforecast.utils import AirPassengersDF as Y_df
# 資料集載入與處理
print(Y_df)
Y_train_df = Y_df[Y_df.ds <= '1959-12-31']
Y_test_df = Y_df[Y_df.ds > '1959-12-31']
內容解密:
- 匯入必要模組:首先匯入所需的 Python 函式庫和類別。
- 資料集載入與處理:從 neuralforecast.utils 中載入資料集,並將最後一年的資料作為測試集,剩餘資料作為訓練集。
構建與訓練 Vanilla Transformer 模型
接下來我們構建並訓練 Vanilla Transformer 模型。這裡我們需要理解一些關鍵引數:
# 構建與訓練 VanillaTransformer 模型
h = 12 # 預測未來 12 個月份的乘客人數
input_size = -1 # 預設使用所有歷史資料進行訓練,但可以根據需求設定最大序列長度
hidden_size = 64 # 嵌入和編碼器的單位數
model = NeuralForecast(models=[VanillaTransformer(h=h, input_size=input_size, hidden_size=hidden_size)],
freq='M')
model.fit(df_train=Y_train_df)
# 預測並評估模型效能
preds = model.predict(df_test=Y_test_df)
內容解密:
- 設定引數:設定預測未來多少月份 (
h)、訓練時使用的歷史資料 (input_size) 和嵌入及編碼器單位 (hidden_size)。 - 構建與訓練模型:使用 NeuralForecast 構建 Vanilla Transformer 模型並進行訓練。
- 預測與評估:對測試集進行預測並評估模型效能。
時間序列預測中的Transformer
在時間序列預測中,Transformer模型因其強大的特徵提取能力和長期依賴性捕捉能力,成為近年來的熱門選擇。本文將探討如何使用Transformer模型進行時間序列預測,並介紹其實際應用案例。
模型引數與組態
在開始訓練模型之前,首先需要了解一些關鍵引數的組態。這些引數包括:
conv_hidden_size:卷積編碼器的通道數。n_heads:多頭注意力機制的頭數。scaler_type:時間輸入標準化的型別。learning_rate:學習率,範圍在(0, 1)之間。max_steps:最大訓練步數。val_check_steps:每次驗證損失檢查之間的訓練步數。early_stop_patience_steps:早停前的驗證迭代次數。futr_exog_list,hist_exog_list,stat_exog_list:未來、歷史和靜態外生變數的輸入引數。
以下是一個具體的模型組態示例:
horizon = 12
model = VanillaTransformer(
h=horizon,
input_size=12,
hidden_size=16,
conv_hidden_size=32,
n_head=2,
loss=MAE(),
scaler_type='robust',
learning_rate=1e-3,
max_steps=500,
val_check_steps=50,
early_stop_patience_steps=2
)
nf = NeuralForecast(
models=[model],
freq='M'
)
內容解密:
在這段程式碼中,我們定義了一個VanillaTransformer模型,並設定了各種引數。這些引數控制了模型的結構和訓練過程。例如,conv_hidden_size決定了卷積層的複雜度,而n_heads則決定了多頭注意力機制的平行處理能力。學習率、max_steps和驗證步數等引數則影響了模型的訓練效率和穩定性。
模型訓練與預測
接下來,我們將使用訓練資料來訓練模型,並使用時間交叉驗證來評估模型效能。具體步驟如下:
nf.fit(df=Y_train_df, val_size=12)
forecasts = nf.predict()
內容解密:
這段程式碼展示瞭如何使用NeuralForecast類別進行模型訓練和預測。首先,我們呼叫了fit方法來訓練模型,並設定驗證集大小為12。然後,我們使用predict方法生成預測結果。這些結果包含了未來12個時段(月份)的預測值。
模型評估與視覺化
為了評估模型的效能,我們可以計算多種錯誤指標,並將實際值與預測值進行視覺化對比。
錯誤指標計算
calculate_error_metrics(Y_test_df[['y']], forecasts['VanillaTransformer'])
內容解密:
這段程式碼計算了多種錯誤指標,包括均方誤差(MSE)、均方根誤差(RMSE)、平均絕對百分比誤差(MAPE)以及R²和調整後R²值。這些指標幫助我們全面評估模型的預測準確性。
視覺化對比
Y_train_df.set_index('ds', inplace=True)
forecasts.set_index('ds', inplace=True)
Y_test_df.set_index('ds', inplace=True)
plt.figure(figsize=(20, 3))
y_past = Y_train_df["y"]
y_pred = forecasts['VanillaTransformer']
y_test = Y_test_df["y"]
plt.plot(y_past, label="過去時間序列值")
plt.plot(forecasts, label="預測")
plt.plot(y_test, label="實際時間序列值")
plt.title('AirPassengers 預測', fontsize=10)
plt.ylabel('每月乘客數', fontsize=10)
plt.xlabel('時間戳 [t]', fontsize=10)
plt.legend();
內容解密:
這段程式碼展示瞭如何將實際值與預測值進行視覺化對比。我們將過去、預測和實際時間序列值分別繪製在同一個圖表中,以直觀展示模型的預測效果。
倒置Transformers
近年來,線性預測模型的流行挑戰了根據Transformer架構進行時間序列預測的興趣。然而,倒置Transformers(iTransformers)提供了一種新的思路來改進傳統Transformer架構。
iTransformers技術概述
iTransformers保留了原始Transformer架構,但將注意力機制和前向網路應用於反轉維度上。具體而言,它將每個時間點的多變數表示轉換為變數代幣,並利用注意力機制捕捉多變數相關性。
次段落標題
此圖示展示了傳統Transformer和iTransformer之間的比較:
內容解密:
此圖示展示了傳統Transformer和iTransformer之間的架構差異。傳統Transformer將時間點嵌入為時序代幣,並利用注意力機制捕捉時序依賴性。而iTransformer則將每個變數獨立嵌入為代幣,並利用自注意力機制捕捉多變數相關性。
次段落標題
iTransformers結構如下:
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title Transformer 模型應用於長時間序列預測的技術解析
package "機器學習流程" {
package "資料處理" {
component [資料收集] as collect
component [資料清洗] as clean
component [特徵工程] as feature
}
package "模型訓練" {
component [模型選擇] as select
component [超參數調優] as tune
component [交叉驗證] as cv
}
package "評估部署" {
component [模型評估] as eval
component [模型部署] as deploy
component [監控維護] as monitor
}
}
collect --> clean : 原始資料
clean --> feature : 乾淨資料
feature --> select : 特徵向量
select --> tune : 基礎模型
tune --> cv : 最佳參數
cv --> eval : 訓練模型
eval --> deploy : 驗證模型
deploy --> monitor : 生產模型
note right of feature
特徵工程包含:
- 特徵選擇
- 特徵轉換
- 降維處理
end note
note right of eval
評估指標:
- 準確率/召回率
- F1 Score
- AUC-ROC
end note
@enduml內容解密:
此圖示展示了iTransformers的結構流程。原始系列首先被獨立嵌入為變數代幣,然後透過自注意力機制捕捉多變數相關性,最後透過前向網路學習非線性關係。
iTransformers實戰
接下來,我們將具體實作iTransformers模型。首先需要匯入必要的函式庫:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
內容解密:
這段程式碼匯入了Numpy、Pandas和Matplotlib等常用函式庫,這些函式庫將用於資料處理和視覺化。
總結來說,透過上述步驟和分析,我們可以看到Transformer及其變種iTransformer在時間序列預測中的強大應用能力。透過合理組態引數、進行詳細評估及視覺化對比,我們能夠更好地理解和改進模型效能。