時間序列分析在各個領域都有廣泛的應用,從金融市場預測到天氣預報。傳統的時間序列模型,例如 ARIMA 和 Prophet,在處理特定型別的時間序列資料時表現良好,但在面對複雜的非線性關係和長期依賴性時,往往會遇到瓶頸。近年來,Transformer 模型因其在自然語言處理領域的卓越表現,開始被應用於時間序列分析,展現出巨大的潛力。然而,直接將 Transformer 模型應用於時間序列資料存在一些挑戰,例如何有效地處理時間序列資料的特性以及如何降低計算複雜度。為瞭解決這些問題,Time-LLM 框架應運而生,它提供了一種將大語言模型(LLM)重新程式設計以用於時間序列預測的有效方法。Time-LLM 的核心思想是將時間序列資料轉換為自然語言格式,然後利用預訓練好的 LLM 進行推理和預測。這種方法不僅可以利用 LLM 強大的表徵學習能力,還可以避免從頭訓練模型的巨大成本。Time-LLM 框架主要包含幾個關鍵步驟:首先,將時間序列資料進行分塊和嵌入處理,將其轉換為適合 LLM 處理的格式。接著,利用片段重新程式設計技術,將片段嵌入轉換為文字原型,使 LLM 能夠理解時間序列資料的含義。然後,透過多頭注意力機制捕捉時間序列資料中的長期依賴關係。最後,利用線性投影層將處理後的資料轉換為最終的預測結果。此外,Time-LLM 還引入了提示字首的概念,透過提供資料集背景、任務指令和輸入統計資訊等額外資訊,引導 LLM 更好地進行推理和預測。

使用 Transformer 進行時間序列分析

在時間序列分析領域中,Transformer 模型的應用已經成為一個重要的研究方向。然而,不同的架構在不同情境下有其特定的適用性和限制。以下是幾種常見的 Transformer 架構及其適用範圍。

反轉 Transformer 架構

反轉 Transformer 架構(Inverted Transformer)特別適合處理順序性資料,但在時間序列應用上仍然需要高度的超引數調整技巧。這種架構能夠有效地捕捉時間序列中的長期依賴關係,但需要大量的計算資源和專業知識來進行調整。

DLinear 架構

DLinear 模型在訓練過程中需要較少的特徵,並且在記憶體和計算需求上相對較低。這使得它成為資源受限情境下的理想選擇。然而,當資料中存在非線性關係時,DLinear 的表現可能不如其他模型。

NLinear 模型

NLinear 模型在處理穩定或非穩定資料時表現良好,但它無法捕捉資料中的複雜關係。這意味著在面對高度變異或結構複雜的時間序列時,NLinear 的效果可能會受到限制。

PatchTST 模型

PatchTST 模型能夠有效地捕捉資料中的依賴關係,但在預處理需求和 Patch 大小選擇上仍然存在挑戰。這些挑戰需要詳細的資料前處理和精確的引數調整來克服。

時間 LLM:重新程式設計大語言模型

概述

本章節將探討如何將原本設計用於自然語言處理(NLP)任務的大語言模型(LLM)重新程式設計以用於時間序列預測。時間 LLM 提供了一個框架,能夠將 NLP 模型應用於時間序列預測任務,而不需要修改模型本身。

重新程式設計 vs 微調

重新程式設計與微調是兩種將基礎模型應用於特定任務的方法,但它們在過程和目的上有所不同。

微調

微調是指在基礎模型上進行進一步訓練,而不是從頭開始訓練新模型。這種方法通常涉及將一些層冰結或使用不同的學習率來訓練模型。微調能夠使模型適應特定任務或領域,例如將 GPT-2 或 BERT 模型微調以進行情感分析。

重新程式設計

重新程式設計則是指使用一個基礎模型來處理完全不同領域的任務。這通常透過一個轉換層或對映層來實作,將不同領域的輸入轉換為模型能夠理解的格式。例如,將時間序列資料轉換為 NLP 資料。這種方法通常比微調更快且資源消耗較少,因為主要工作是轉換輸入而不是修改模型本身。

  graph TD
    A[Source Modality] --> B[Transformation Layer]
    B --> C[Target Modality]
    D[Fine-Tuning] --> E[Model Adjustment]
    F[Reprogramming] --> G[Input Transformation]

此圖示解說

  • Source Modality:原始領域
  • Transformation Layer:轉換層
  • Target Modality:目標領域
  • Fine-Tuning:微調過程
  • Model Adjustment:模型調整
  • Reprogramming:重新程式設計過程
  • Input Transformation:輸入轉換

技術概述

Time-LLM 框架透過將時間序列資料轉換為自然語言格式,然後將其輸入到基礎模型中進行預測。輸出結果再被解碼回時間序列格式。

  graph TD
    A[Time Series Data] --> B[Natural Language Transformation]
    B --> C[NLP Model]
    C --> D[Time Series Forecast]

此圖示解說

  • Time Series Data:時間序列資料
  • Natural Language Transformation:自然語言轉換層
  • NLP Model:NLP 模型
  • Time Series Forecast:時間序列預測

技術實施細節

以下是 Time-LLM 框架的一個簡單實作範例:

import numpy as np

def time_series_to_text(time_series):
    """Convert time series data to natural language format."""
    text_data = []
    for value in time_series:
        text_data.append(f"Value: {value}")
    return " ".join(text_data)

def text_to_time_series(text_data):
    """Convert natural language text back to time series format."""
    values = text_data.split()
    return [float(value.split(": ")[1]) for value in values if value.startswith("Value")]

# 假設我們有一個時間序列資料
time_series = np.array([1, 2, 3, 4, 5])

# 轉換為自然語言格式
text_data = time_series_to_text(time_series)
print("Text Data:", text_data)

# 假設我們有一個 NLP 模型來處理這些文字資料並產生預測
# 在這裡我們假設 NLP 模型傳回的是相同格式的文字資料
predicted_text = text_data  # 假設預測結果與輸入相同

# 轉換回時間序列格式
predicted_time_series = text_to_time_series(predicted_text)
print("Predicted Time Series:", predicted_time_series)

內容解密:

上述 Python 段落展示瞭如何將時間序列資料轉換為自然語言格式,並再轉換回來。具體步驟如下:

  • time_series_to_text 函式:這個函式將一維陣列形式的時間序列資料轉換成文字格式,每個元素都被表示為「Value: X」。
  • text_to_time_series 函式:這個函式將文字格式還原回原本的一維陣列形式。
  • time_series:假設我們有一段簡單的時間序列資料。
  • text_data:將 time_series 轉換成文字形式。
  • predicted_text:假設我們有一個 NLP 模型來處理這些文字資料並產生預測結果。
  • predicted_time_series:最終從文字形式還原回原本的一維陣列形式。

時間序列大語言模型(Time-LLM):重新程式設計大語言模型

時間序列資料處理

在處理時間序列資料時,首先將輸入的時間序列轉換為令牌,然後進行嵌入操作。這個過程包括兩個主要步驟:分塊(patching)和自定義嵌入層。分塊是指將時間序列分割成多個重疊或不重疊的片段,每個片段的長度為 Lp。這樣的分塊有助於保留區域性語義資訊,因為它考慮的是一組時間步驟而不是單個時間步驟。

透過這種方法,我們能夠生成一個緊湊的輸入令牌序列,從而大大降低了重新程式設計層的計算複雜度。這些片段嵌入在接下來的步驟中被用來進行片段重新程式設計。

片段重新程式設計

片段重新程式設計是將片段嵌入轉換為文字原型的過程。這一步是關鍵,因為它使得訓練於自然語言上的基礎模型能夠理解時間序列資料。這裡使用了一些領域適應技術,如噪聲學習。噪聲學習是指在不重新訓練模型的情況下,學習一個小的噪聲(擾動),並將其應用於輸入片段嵌入,從而生成基礎模型可以理解的輸出。

領域適應挑戰

雖然領域適應技術在同一領域內(如從白天拍攝的影像到夜間拍攝的影像)有效,但文字和數字屬於完全不同的領域。為瞭解決這個問題,片段重新程式設計層利用了基礎模型中已經預訓練好的詞嵌入。

此外,由於源令牌的相關性資訊缺失,導致所有可能的詞嵌入被考慮進來,這會產生一個非常大的共域。為瞭解決這個問題,我們使用了一個線性分類別器(如邏輯迴歸或線性 SVC)來選擇與任務相關的一小部分詞嵌入。

語言提示(Prompt)

在處理完成後,生成的預測結果會透過投影層進行處理以生成最終預測。此外,我們可以透過新增提示字首來增強 LLM 的推理能力。這些提示字首包括資料集背景、任務指令和輸入統計資訊。例如:

以下是關於輸入時間序列的資訊:
[BEGIN DATA]
***
[Domain]: 我們通常觀察到電力消費在中午達到高峰,變壓器負載顯著增加。
***
[Instruction]: 根據之前 <T> 步驟資訊預測下一步。
***
[Statistics]: 輸入最小值為 x ,最大值為 y ,中位數為 z 。總體趨勢為 u 。前五個滯後值為 a, b, c, d, e 。
^[END DATA]

透過這些提示,我們能夠引導 LLM 更好地進行預測。

此圖示

graph TD
    A[輸入時間序列] --> B[令牌化]
    B --> C[分塊與嵌入]
    C --> D[片段重新程式設計]
    D --> E[多頭注意力機制]
    E --> F[線性投影]
    F --> G[LLM推理與預測]

此圖示展示了 Time-LLM 的整體架構。首先,輸入時間序列被轉換為令牌並進行分塊與嵌入處理。接著,這些片段嵌入被重新程式設計為文字原型。透過多頭注意力機制進行處理後,資料被投影到基礎模型可接受的格式。最後,LLM 根據提示字首進行推理並生成預測結果。

內容解密:

  1. 輸入時間序列:時間序列資料被當作模型的初始輸入。
  2. 令牌化:將連續的時間序列資料轉換為離散的令牌。
  3. 分塊與嵌入:將令牌進一步分割成片段並生成嵌入表示。
  4. 片段重新程式設計:將片段嵌入轉換為文字原型以便基礎模型理解。
  5. 多頭注意力機制:處理不同片段間的關聯性和依賴性。
  6. 線性投影:將處理後的資料轉換為基礎模型可接受的格式。
  7. LLM 推理與預測:根據提示字首進行推理並生成最終預測結果。

提示字首設計

提示字首由三個主要部分組成:

  1. 資料集背景:提供有關輸入時間序列的基本資訊。
  2. 任務指令:指導基礎模型如何轉換片段嵌入以完成特定任務。
  3. 輸入統計資訊:包含趨勢和滯後值等統計資訊以幫助模式識別和推理。

需要注意的是

透過這些步驟,Time-LLM 能夠有效地將時間序列資料轉換為自然語言形式,並利用大語言模型進行推理和預測。這種方法不僅提高了模型的推理能力,還減少了計算複雜度和資源消耗。

以下是 Time-LLM 的完整流程圖:

graph TD
    A[輸入時間序列] --> B[RevIN 正規化]
    B --> C[分塊處理]
    C --> D[片段嵌入生成]
    D --> E[片段重新程式設計]
    E --> F[多頭注意力機制]
    F --> G[線性投影]
    G --> H[新增提示字首]
    H --> I[LLM 推理與預測]

內容解密:

  1. RevIN 正規化:對輸入時間序列進行可逆正規化處理。
  2. 分塊處理:將正規化後的時間序列分割成多個片段。
  3. 片段嵌入生成:對每個片段生成對應的嵌入表示。
  4. 片段重新程式設計:將片段嵌入轉換為文字原型以便基礎模型理解。
  5. 多頭注意力機制:處理不同片段間的關聯性和依賴性。
  6. 線性投影:將處理後的資料轉換為基礎模型可接受的格式。
  7. 新增提示字首:引導 LLM 根據特定背景和統計資訊進行推理。
  8. LLM 推理與預測:最終生成預測結果。

玄貓認為透過 Time-LLM 的架構設計以及詳細解析程式碼與設計邏輯之方式可以讓讀者深刻理解其運作原理及應用場景。