BiTCN:基于卷積網(wǎng)絡(luò)的多元時(shí)間序列預(yù)測(cè)
共 6457字,需瀏覽 13分鐘
·
2024-05-18 17:04
來(lái)源:DeepHub IMBA 本文約3300字,建議閱讀10分鐘
本文將介紹了BiTCN模型,通過(guò)利用兩個(gè)時(shí)間卷積網(wǎng)絡(luò)(TCN),該模型可以編碼過(guò)去和未來(lái)的協(xié)變量,同時(shí)保持計(jì)算效率。
在時(shí)間序列預(yù)測(cè)領(lǐng)域中,模型的體系結(jié)構(gòu)通常依賴(lài)于多層感知器(MLP)或Transformer體系結(jié)構(gòu)。
基于mlp的模型,如N-HiTS, TiDE和TSMixer,可以在保持快速訓(xùn)練的同時(shí)獲得非常好的預(yù)測(cè)性能?;赥ransformer的模型,如PatchTST和ittransformer也取得了很好的性能,但需要更多的內(nèi)存和時(shí)間來(lái)訓(xùn)練。
有一種架構(gòu)在預(yù)測(cè)中仍未得到充分利用:卷積神經(jīng)網(wǎng)絡(luò)(CNN)。CNN已經(jīng)應(yīng)用于計(jì)算機(jī)視覺(jué),但它們?cè)陬A(yù)測(cè)方面的應(yīng)用仍然很少,只有TimesNet算是最近的例子。但是CNN已經(jīng)被證明在處理序列數(shù)據(jù)方面是有效的,并且它們的架構(gòu)允許并行計(jì)算,這可以大大加快訓(xùn)練速度。
在本文中,我們將詳細(xì)介紹了BiTCN,這是2023年3月在《Parameter-efficient deep probabilistic forecasting》一文中提出的模型。通過(guò)利用兩個(gè)時(shí)間卷積網(wǎng)絡(luò)(TCN),該模型可以編碼過(guò)去和未來(lái)的協(xié)變量,同時(shí)保持計(jì)算效率。
BiTCN
BiTCN使用了兩個(gè)時(shí)間卷積網(wǎng)絡(luò),因此被稱(chēng)為BiTCN。一個(gè)TCN負(fù)責(zé)編碼未來(lái)的協(xié)變量,而另一個(gè)負(fù)責(zé)編碼過(guò)去的協(xié)變量和序列的歷史值。這樣模型可以從數(shù)據(jù)中學(xué)習(xí)時(shí)間信息,并且卷積的使用保持了計(jì)算效率。
讓我們仔細(xì)看看它的架構(gòu),BiTCN的體系結(jié)構(gòu)由許多臨時(shí)塊組成,其中每個(gè)塊由:
一個(gè)擴(kuò)張卷積,一個(gè)GELU激活函數(shù),然后是dropout ,最后緊接著一個(gè)全連接的層。
上圖中可以看到每個(gè)時(shí)態(tài)塊產(chǎn)生一個(gè)輸出o,最終的預(yù)測(cè)是將每個(gè)塊的所有輸出疊加在N層中得到的。
雖然dropout層和全連接層是神經(jīng)網(wǎng)絡(luò)中常見(jiàn)的組件,所以我們?cè)敿?xì)地?cái)U(kuò)張卷積和GELU激活函數(shù)。
擴(kuò)張卷積
為了更好地理解擴(kuò)展卷積的目的,我們回顧一下默認(rèn)卷積是如何工作的。
在上圖中,我們可以看到一維輸入的典型卷積。輸入序列左填充零,以確保輸出長(zhǎng)度相同。
如果核大小為3,步幅為1,,則輸出張量的長(zhǎng)度也為4。
可以看到,輸出的每個(gè)元素都依賴(lài)于三個(gè)輸入值。也就是說(shuō)輸出取決于索引處的值和前兩個(gè)值。
這就是我們所說(shuō)的感受野。因?yàn)槲覀冋谔幚頃r(shí)間序列數(shù)據(jù),所以增加接受域?qū)⑹怯幸娴?,這樣輸出的計(jì)算可以著眼于更長(zhǎng)的歷史。
我們可以簡(jiǎn)單的增加核的大小,或者堆疊更多的卷積層。但增加內(nèi)核大小并不是最好的選擇,因?yàn)榭赡軙?huì)丟失信息,并且模型可能無(wú)法學(xué)習(xí)數(shù)據(jù)中的有用關(guān)系。那么疊加更多的卷積如何呢?
可以看到,通過(guò)使用核大小為3的卷積操作堆疊兩個(gè)卷積,輸出的最后一個(gè)元素現(xiàn)在依賴(lài)于輸入的五個(gè)元素,感受野從3個(gè)增加到5個(gè)。
但是以這種方式增加接受野將導(dǎo)致非常深的網(wǎng)絡(luò),所以就出現(xiàn)了使用擴(kuò)展卷積,它可以在增加感受野,同時(shí)避免向模型添加太多層。
在上圖中,我們可以看到運(yùn)行擴(kuò)展卷積的結(jié)果。每?jī)蓚€(gè)元素都會(huì)生成一個(gè)輸出。因此可以看到,我們現(xiàn)在有5個(gè)感受野,而不需要堆疊卷積。
為了進(jìn)一步增加接受野,我們使用膨脹基數(shù)(通常設(shè)置為2)堆疊許多稀釋的核。這意味著第一層將是21膨脹的核,然后是22膨脹的內(nèi)核,然后是23,以此類(lèi)推。
這樣模型可以考慮更長(zhǎng)的輸入序列來(lái)生成輸出。通過(guò)使用膨脹基數(shù)可以保持合理的層數(shù)。
GELU激活函數(shù)
許多深度學(xué)習(xí)架構(gòu)采用了ReLU激活函數(shù)。
可以看到ReLU只是取0和輸入之間的最大值。也就是說(shuō)如果輸入為正,則返回輸入。如果輸入為負(fù),則返回零。
雖然ReLU有助于緩解梯度消失的問(wèn)題,但它也會(huì)產(chǎn)生所謂的“Dying ReLU”問(wèn)題。當(dāng)網(wǎng)絡(luò)中的某些神經(jīng)元只輸出0時(shí),就會(huì)發(fā)生這種情況,這意味著它們不再對(duì)模型的學(xué)習(xí)做出貢獻(xiàn)。為了應(yīng)對(duì)這種情況,可以使用GELU。
有了這個(gè)函數(shù),當(dāng)輸入小于零時(shí),激活函數(shù)允許小的負(fù)值。
這樣神經(jīng)元就不太可能消亡,因?yàn)榉橇阒悼梢杂秘?fù)輸入返回。為反向傳播提供了更豐富的梯度,并且我們可以保持模型能力的完整性。
BiTCN完整架構(gòu)
現(xiàn)在我們了解了BiTCN中臨時(shí)塊的內(nèi)部工作原理,讓我們看看它是如何在模型中組合在一起的。
在上圖中可以看到滯后值在通過(guò)密集層和時(shí)間塊堆棧之前與所有過(guò)去的協(xié)變量組合在一起。
我們還看到分類(lèi)協(xié)變量首先被嵌入,然后再與其他協(xié)變量組合。這里過(guò)去和未來(lái)的協(xié)變量都組合在一起,如下所示。輸出則是來(lái)自滯后值和協(xié)變量的信息的組合,如下所示。
上圖額藍(lán)點(diǎn)表示輸入序列,黃點(diǎn)表示輸出序列,紅點(diǎn)表示未來(lái)協(xié)變量。我們可以看到具有擴(kuò)展卷積的前瞻性時(shí)間塊如何通過(guò)處理來(lái)自未來(lái)協(xié)變量的信息來(lái)幫助告知輸出。
最后,BiTCN使用學(xué)生t分布來(lái)構(gòu)建預(yù)測(cè)周?chē)闹眯艆^(qū)間。
使用BiTCN進(jìn)行預(yù)測(cè)
下面我們將BiTCN與N-HiTS和PatchTST一起應(yīng)用于長(zhǎng)期預(yù)測(cè)任務(wù)。
我們用它來(lái)預(yù)測(cè)一個(gè)博客網(wǎng)站的每日瀏覽量。該數(shù)據(jù)集包含每日瀏覽量,以及外生特征,如新文章發(fā)表日期的指標(biāo),以及美國(guó)假期的指標(biāo)。
我們使用庫(kù)neuralforecast,因?yàn)檫@是唯一一個(gè)提供支持外生特性的BiTCN的即用型實(shí)現(xiàn)的庫(kù)。本文的代碼和數(shù)據(jù)都會(huì)在最后提供。
import pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom neuralforecast.core import NeuralForecastfrom neuralforecast.models import NHITS, PatchTST, BiTCN
將數(shù)據(jù)讀入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'])
可以先看看數(shù)據(jù):
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()
我們可以清楚地看到每周的季節(jié)性,工作日的訪(fǎng)問(wèn)量比周末要多。
訪(fǎng)問(wèn)高峰通常伴隨著新文章的發(fā)布(用紅點(diǎn)表示),因?yàn)樾聝?nèi)容通常會(huì)帶來(lái)更多的流量。最后還可以看到美國(guó)的節(jié)假日(用綠色十字標(biāo)記)通常意味著流量較低。
所以我們可以確定,這是一個(gè)受外生特征影響明顯的數(shù)據(jù),它可以成為BiTCN的一個(gè)很好的用例。
數(shù)據(jù)處理
我們將數(shù)據(jù)分成訓(xùn)練集和測(cè)試集。我們保留最后28個(gè)條目進(jìn)行測(cè)試。
train = df[:-28] test = df[-28:]
然后,我們創(chuàng)建一個(gè)DataFrame,其中包含預(yù)測(cè)范圍的日期,以及外生變量的未來(lái)值。
提供外生變量的未來(lái)值是有意義的,因?yàn)槲磥?lái)的美國(guó)假期日期是提前知道的,并且文章的發(fā)布也是可以有計(jì)劃的。
future_df = test.drop(['y'], axis=1)
建模
我們?cè)谶@個(gè)項(xiàng)目中使用了N-HiTS(基于mlp), BiTCN(基于cnn)和PatchTST(基于transformer)。
N-HiTS和BiTCN都支持外生特征建模,但PatchTST不支持。
這個(gè)實(shí)驗(yàn)的步長(zhǎng)被設(shè)置為28,因?yàn)檫@覆蓋了我們測(cè)試集的整個(gè)長(zhǎng)度。
= len(test)= [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)]
然后,我們簡(jiǎn)單地在訓(xùn)練集上擬合我們的模型。
nf = NeuralForecast(models=models, freq='D')nf.fit(df=train)
使用外生特征的未來(lái)值來(lái)生成預(yù)測(cè)。
preds_df = nf.predict(futr_df=future_df)
評(píng)估模型
首先將預(yù)測(cè)值和實(shí)際值連接到一個(gè)DataFrame中。
test_df = pd.merge(test, preds_df, 'left', 'ds')
根據(jù)實(shí)際值繪制預(yù)測(cè)圖,結(jié)果如下圖所示。
在上圖中,我們可以看到所有模型似乎都過(guò)度預(yù)測(cè)了實(shí)際流量。讓用MAE和sMAPE來(lái)看看模型的實(shí)際對(duì)比:
from utilsforecast.losses import mae, smapefrom utilsforecast.evaluation import evaluateevaluation = 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實(shí)現(xiàn)了最好的性能,因?yàn)樵撃P偷腗AE和sMAPE是最低的。
雖然這個(gè)實(shí)驗(yàn)本身并不是BiTCN的穩(wěn)健基準(zhǔn),但是可以證明它在具有外生特征的預(yù)測(cè)環(huán)境中取得了最佳結(jié)果。
總結(jié)
BiTCN模型利用兩個(gè)時(shí)間卷積網(wǎng)絡(luò)對(duì)協(xié)變量的過(guò)去值和未來(lái)值進(jìn)行編碼,以實(shí)現(xiàn)有效的多變量時(shí)間序列預(yù)測(cè)。
在我們的小實(shí)驗(yàn)中,BiTCN取得了最好的性能,卷積神經(jīng)網(wǎng)絡(luò)在時(shí)間序列領(lǐng)域的成功應(yīng)用很有趣,因?yàn)榇蠖鄶?shù)模型都是基于mlp或基于transformer的。
最后本文的代碼:
https://github.com/marcopeix/time-series-analysis/blob/master/bitcn_blog.ipynb
作者:Marco Peixeiro
編輯:黃繼彥
