如何利用Transformer建立時間序列預測模型

我最近讀了一篇非常有趣的論文,叫做

Deep Transformer Models for Time Series Forecasting: The Influenza Prevalence Case

。我認為這可能是一個有趣的專案,他的實現是從頭開始的,並且可以幫助你瞭解更多關於時間序列預測。

預測的任務

在時間序列預測中,目標是預測給定歷史值的時間序列的未來值。時間序列預測任務的一些例子是:

預測流感流行病例:時間序列預測的深度變形模型:流感流行病例

能源生產預測:能源消耗預測使用堆疊非引數貝葉斯方法

天氣預報:MetNet:一個用於降水預報的神經天氣模型

例如,我們可以將一個城市的能源消耗指標儲存幾個月,然後訓練一個模型,該模型將能夠預測該城市未來的能源消耗。這可以用來估計能源需求,因此能源公司可以使用這個模型來估計任何給定時間需要生產的能源的最佳值。

如何利用Transformer建立時間序列預測模型

模型

我們將使用的模型是一個編碼器-解碼器的Transformer,其中編碼器部分將時間序列的歷史作為輸入,而解碼器部分以自迴歸的方式預測未來的值。

解碼器使用注意力機制與編碼器連線。透過這種方式,解碼器可以學習在做出預測之前“關注”時間序列歷史值中最有用的部分。

解碼器使用了掩蔽的自注意力,這樣網路就不會在訓練期間獲取未來的值,不會導致資訊的洩露。

編碼器:

如何利用Transformer建立時間序列預測模型

解碼器:

如何利用Transformer建立時間序列預測模型

全部模型:

如何利用Transformer建立時間序列預測模型

這個架構可以透過以下方式使用PyTorch構建:

encoder_layer = nn。TransformerEncoderLayer(

d_model=channels,

nhead=8,

dropout=self。dropout,

dim_feedforward=4 * channels,

decoder_layer = nn。TransformerDecoderLayer(

d_model=channels,

nhead=8,

dropout=self。dropout,

dim_feedforward=4 * channels,

self。encoder = torch。nn。TransformerEncoder(encoder_layer, num_layers=8)

self。decoder = torch。nn。TransformerDecoder(decoder_layer, num_layers=8)

資料

每當我實現一種新方法時,我喜歡首先在合成數據上嘗試它,以便更容易理解和除錯。這降低了資料的複雜性,並將重點更多地放在實現/演算法上。

我編寫了一個小指令碼,可以生成具有不同週期、偏移量和模式的時間序列。

def generate_time_series(dataframe):

clip_val = random。uniform(0。3, 1)

period = random。choice(periods)

phase = random。randint(-1000, 1000)

dataframe[“views”] = dataframe。apply(

lambda x: np。clip(

np。cos(x[“index”] * 2 * np。pi / period + phase), -clip_val, clip_val

* x[“amplitude”]

+ x[“offset”],

axis=1,

) + np。random。normal(

0, dataframe[“amplitude”]。abs()。max() / 10, size=(dataframe。shape[0],)

return dataframe

如何利用Transformer建立時間序列預測模型

如何利用Transformer建立時間序列預測模型

如何利用Transformer建立時間序列預測模型

如何利用Transformer建立時間序列預測模型

然後,該模型將一次性對所有這些時間序列進行訓練:

如何利用Transformer建立時間序列預測模型

結果

我們現在使用這個模型來預測這些時間序列的未來值。但是結果有些複雜:

預測未擬合的樣例

如何利用Transformer建立時間序列預測模型

如何利用Transformer建立時間序列預測模型

擬合樣例:

如何利用Transformer建立時間序列預測模型

如何利用Transformer建立時間序列預測模型

如何利用Transformer建立時間序列預測模型

如何利用Transformer建立時間序列預測模型

結果並不像我預期的那麼好,特別是考慮到對合成資料做出好的預測通常很容易,但它們仍然令人鼓舞。

模型的預測有些不一致,對一些壞例子的振幅有輕微的過高估計。在好的例子中,預測與地面事實非常吻合,排除了噪聲。

我可能需要除錯我的程式碼多一點,並在我可以預期獲得更好的結果之前最佳化超引數的工作。

總結

Transformers是目前在機器學習應用中非常流行的模型,所以它們將被用於時間序列預測是很自然的。但是Transformers應該不是你在處理時間序列時的第一個首選方法,但是可以做為嘗試來進行測試。

提到的論文 arxiv:2001。08317

作者:Youness Mansar

相關文章