前言 本文將詳細介紹了BiTCN,這是2023年3月在《Parameter-efficient deep probabilistic forecasting》一文中提出的模型。透過利用兩個時間卷積網路(TCN),該模型可以編碼過去和未來的協變數,同時保持計算效率。
作者:Marco Peixeiro
本文轉載自Deephub Imba
僅用於學術分享,若侵權請聯絡刪除
歡迎關注公眾號CV技術指南,專注於計算機視覺的技術總結、最新技術跟蹤、經典論文解讀、CV招聘資訊。
CV方向的準研究生們,未來三年如何度過?
招聘高光譜影像、語義分割、diffusion等方向論文指導老師
在時間序列預測領域中,模型的體系結構通常依賴於多層感知器(MLP)或Transformer體系結構。
基於mlp的模型,如N-HiTS, TiDE和TSMixer,可以在保持快速訓練的同時獲得非常好的預測效能。基於Transformer的模型,如PatchTST和ittransformer也取得了很好的效能,但需要更多的記憶體和時間來訓練。
有一種架構在預測中仍未得到充分利用:卷積神經網路(CNN)。CNN已經應用於計算機視覺,但它們在預測方面的應用仍然很少,只有TimesNet算是最近的例子。但是CNN已經被證明在處理序列資料方面是有效的,並且它們的架構允許平行計算,這可以大大加快訓練速度。
BiTCN
BiTCN使用了兩個時間卷積網路,因此被稱為BiTCN。一個TCN負責編碼未來的協變數,而另一個負責編碼過去的協變數和序列的歷史值。這樣模型可以從資料中學習時間資訊,並且卷積的使用保持了計算效率。
讓我們仔細看看它的架構,BiTCN的體系結構由許多臨時塊組成,其中每個塊由:
一個擴張卷積,一個GELU啟用函式,然後是dropout ,最後緊接著一個全連線的層
上圖中可以看到每個時態塊產生一個輸出o,最終的預測是將每個塊的所有輸出疊加在N層中得到的。
雖然dropout層和全連線層是神經網路中常見的元件,所以我們詳細地擴張卷積和GELU啟用函式。
擴張卷積
為了更好地理解擴充套件卷積的目的,我們回顧一下預設卷積是如何工作的。
在上圖中,我們可以看到一維輸入的典型卷積。輸入序列左填充零,以確保輸出長度相同。
如果核大小為3,步幅為1,,則輸出張量的長度也為4。
可以看到,輸出的每個元素都依賴於三個輸入值。也就是說輸出取決於索引處的值和前兩個值。
這就是我們所說的感受野。因為我們正在處理時間序列資料,所以增加接受域將是有益的,這樣輸出的計算可以著眼於更長的歷史。
我們可以簡單的增加核的大小,或者堆疊更多的卷積層。但增加核心大小並不是最好的選擇,因為可能會丟失資訊,並且模型可能無法學習資料中的有用關係。那麼疊加更多的卷積如何呢?
可以看到,透過使用核大小為3的卷積操作堆疊兩個卷積,輸出的最後一個元素現在依賴於輸入的五個元素,感受野從3個增加到5個。
但是以這種方式增加接受野將導致非常深的網路,所以就出現了使用擴充套件卷積,它可以在增加感受野,同時避免向模型新增太多層
在上圖中,我們可以看到執行擴充套件卷積的結果。每兩個元素都會生成一個輸出。因此可以看到,我們現在有5個感受野,而不需要堆疊卷積。
為了進一步增加接受野,我們使用膨脹基數(通常設定為2)堆疊許多稀釋的核。這意味著第一層將是2¹膨脹的核,然後是2²膨脹的核心,然後是2³,以此類推。
這樣模型可以考慮更長的輸入序列來生成輸出。透過使用膨脹基數可以保持合理的層數。
GELU啟用函式
許多深度學習架構採用了ReLU啟用函式。
可以看到ReLU只是取0和輸入之間的最大值。也就是說如果輸入為正,則返回輸入。如果輸入為負,則返回零。
雖然ReLU有助於緩解梯度消失的問題,但它也會產生所謂的“Dying ReLU”問題。當網路中的某些神經元只輸出0時,就會發生這種情況,這意味著它們不再對模型的學習做出貢獻。為了應對這種情況,可以使用GELU。
有了這個函式,當輸入小於零時,啟用函式允許小的負值。
這樣神經元就不太可能消亡,因為非零值可以用負輸入返回。為反向傳播提供了更豐富的梯度,並且我們可以保持模型能力的完整性。
BiTCN完整架構
現在我們瞭解了BiTCN中臨時塊的內部工作原理,讓我們看看它是如何在模型中組合在一起的。
在上圖中可以看到滯後值在透過密集層和時間塊堆疊之前與所有過去的協變數組合在一起。
我們還看到分類協變數首先被嵌入,然後再與其他協變數組合。這裡過去和未來的協變數都組合在一起,如下所示。輸出則是來自滯後值和協變數的資訊的組合,如下所示。
上圖額藍點表示輸入序列,黃點表示輸出序列,紅點表示未來協變數。我們可以看到具有擴充套件卷積的前瞻性時間塊如何透過處理來自未來協變數的資訊來幫助告知輸出。
最後,BiTCN使用學生t分佈來構建預測周圍的置信區間。
使用BiTCN進行預測
下面我們將BiTCN與N-HiTS和PatchTST一起應用於長期預測任務。
我們用它來預測一個部落格網站的每日瀏覽量。該資料集包含每日瀏覽量,以及外生特徵,如新文章發表日期的指標,以及美國假期的指標。
我們使用庫neuralforecast,因為這是唯一一個提供支援外生特性的BiTCN的即用型實現的庫。本文的程式碼和資料都會在最後提供。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from neuralforecast.core import NeuralForecast
from neuralforecast.models import NHITS, PatchTST, BiTCN
將資料讀入DataFrame。
df = pd.read_csv('https://raw.githubusercontent.com/marcopeix/time-series-analysis/master/data/medium_views_published_holidays.csv')
df['ds'] = pd.to_datetime(df['ds'])
可以先看看資料
published_dates = df[df['published'] == 1]
holidays = df[df['is_holiday'] == 1]
fig, ax = plt.subplots(figsize=(12,8))
ax.plot(df['ds'], df['y'])
ax.scatter(published_dates['ds'], published_dates['y'], marker='o', color='red', label='New article')
ax.scatter(holidays['ds'], holidays['y'], marker='x', color='green', label='US holiday')
ax.set_xlabel('Day')
ax.set_ylabel('Total views')
ax.legend(loc='best')
fig.autofmt_xdate()
plt.tight_layout()
我們可以清楚地看到每週的季節性,工作日的訪問量比周末要多。
訪問高峰通常伴隨著新文章的釋出(用紅點表示),因為新內容通常會帶來更多的流量。最後還可以看到美國的節假日(用綠色十字標記)通常意味著流量較低。
所以我們可以確定,這是一個受外生特徵影響明顯的資料,它可以成為BiTCN的一個很好的用例。
資料處理
我們將資料分成訓練集和測試集。我們保留最後28個條目進行測試。
train = df[:-28]
test = df[-28:]
然後,我們建立一個DataFrame,其中包含預測範圍的日期,以及外生變數的未來值。
提供外生變數的未來值是有意義的,因為未來的美國假期日期是提前知道的,並且文章的釋出也是可以有計劃的。
future_df = test.drop(['y'], axis=1)
建模
我們在這個專案中使用了N-HiTS(基於mlp), BiTCN(基於cnn)和PatchTST(基於transformer)。
N-HiTS和BiTCN都支援外生特徵建模,但PatchTST不支援。
這個實驗的步長被設定為28,因為這覆蓋了我們測試集的整個長度。
horizon = len(test)
models = [
NHITS(
h=horizon,
input_size = 5*horizon,
futr_exog_list=['published', 'is_holiday'],
hist_exog_list=['published', 'is_holiday'],
scaler_type='robust'),
BiTCN(
h=horizon,
input_size=5*horizon,
futr_exog_list=['published', 'is_holiday'],
hist_exog_list=['published', 'is_holiday'],
scaler_type='robust'),
PatchTST(
h=horizon,
input_size=2*horizon,
encoder_layers=3,
hidden_size=128,
linear_hidden_size=128,
patch_len=4,
stride=1,
revin=True,
max_steps=1000
)
]
然後,我們簡單地在訓練集上擬合我們的模型。
nf = NeuralForecast(models=models, freq='D')
nf.fit(df=train)
使用外生特徵的未來值來生成預測。
preds_df = nf.predict(futr_df=future_df)
評估模型
首先將預測值和實際值連線到一個DataFrame中。
test_df = pd.merge(test, preds_df, 'left', 'ds')
根據實際值繪製預測圖,結果如下圖所示。
在上圖中,我們可以看到所有模型似乎都過度預測了實際流量。讓用MAE和sMAPE來看看模型的實際對比
from utilsforecast.losses import mae, smape
from utilsforecast.evaluation import evaluate
evaluation = evaluate(
test_df,
metrics=[mae, smape],
models=["NHITS", "BiTCN", "PatchTST"],
target_col="y",
)
evaluation = evaluation.drop(['unique_id'], axis=1)
evaluation = evaluation.set_index('metric')
evaluation.style.highlight_min(color='blue', axis=1)
可以看到BiTCN實現了最好的效能,因為該模型的MAE和sMAPE是最低的。
雖然這個實驗本身並不是BiTCN的穩健基準,但是可以證明它在具有外生特徵的預測環境中取得了最佳結果。
總結
BiTCN模型利用兩個時間卷積網路對協變數的過去值和未來值進行編碼,以實現有效的多變數時間序列預測。
在我們的小實驗中,BiTCN取得了最好的效能,卷積神經網路在時間序列領域的成功應用很有趣,因為大多數模型都是基於mlp或基於transformer的。
BiTCN:Parameter-efficient deep probabilistic forecasting
https://www.sciencedirect.com/science/article/pii/S0169207021001850
最後本文的程式碼:
https://github.com/marcopeix/time-series-analysis/blob/master/bitcn_blog.ipynb
歡迎關注公眾號CV技術指南,專注於計算機視覺的技術總結、最新技術跟蹤、經典論文解讀、CV招聘資訊。
計算機視覺入門1v3輔導班
【技術文件】《從零搭建pytorch模型教程》122頁PDF下載
QQ交流群:470899183。群內有大佬負責解答大家的日常學習、科研、程式碼問題。
其它文章
分享一個CV知識庫,上千篇文章、專欄,CV所有資料都在這了
明年畢業,還不知道怎麼做畢設的請抓緊機會了
LSKA注意力 | 重新思考和設計大卷積核注意力,效能優於ConvNeXt、SWin、RepLKNet以及VAN
CVPR 2023 | TinyMIM:微軟亞洲研究院用知識蒸餾改進小型ViT
ICCV2023|漲點神器!目標檢測蒸餾學習新方法,浙大、海康威視等提出
ICCV 2023 Oral | 突破性影像融合與分割研究:全時多模態基準與多互動特徵學習
聽我說,Transformer它就是個支援向量機
HDRUNet | 深圳先進院董超團隊提出帶降噪與反量化功能的單幀HDR重建演算法
南科大提出ORCTrack | 解決DeepSORT等跟蹤方法的遮擋問題,即插即用真的很香
1800億引數,世界頂級開源大模型Falcon官宣!碾壓LLaMA 2,效能直逼GPT-4
SAM-Med2D:打破自然影像與醫學影像的領域鴻溝,醫療版 SAM 開源了!
GhostSR|針對影像超分的特徵冗餘,華為諾亞&北大聯合提出GhostSR
Meta推出畫素級動作追蹤模型,簡易版線上可玩 | GitHub 1.4K星
CSUNet | 完美縫合Transformer和CNN,效能達到UNet家族的巔峰!
AI最全資料彙總 | 基礎入門、技術前沿、工業應用、部署框架、實戰教程學習
計算機視覺入門1v3輔導班
計算機視覺交流群