「迷你教程」Keras中為截斷的BPTT進行序列預測

mr數據楊 發佈 2022-02-11T15:22:11+00:00

循環神經網絡能夠學習序列預測問題中跨多個時間步長的時間依賴性。現代循環神經網絡,如長短期記憶或 LSTM,網絡是用反向傳播算法的變體進行訓練的,稱為反向傳播時間。

循環神經網絡能夠學習序列預測問題中跨多個時間步長的時間依賴性。現代循環神經網絡,如長短期記憶或 LSTM,網絡是用反向傳播算法的變體進行訓練的,稱為反向傳播時間。該算法已被進一步修改,以提高非常長序列的序列預測問題的效率,稱為Truncated Backpropagation Through Time



使用截斷反向傳播訓練循環神經網絡(如 LSTM)時的一個重要配置參數是決定使用多少時間步作為輸入。也就是說,如何準確地將很長地輸入序列拆分為子序列以獲得最佳性能。

我們接下來使用 6 不同的方法,您可以拆分非常長的輸入序列,以使用 Keras 在 Python 中使用截斷反向傳播有效地訓練循環神經網絡。

通過時間截斷反向傳播

反向傳播是一種訓練算法,用於更新神經網絡中的權重,以最小化給定輸入的預期輸出和預測輸出之間的誤差。


對於觀察之間存在順序依賴性的序列預測問題,使用循環神經網絡代替經典的前饋神經網絡。循環神經網絡使用反向傳播算法的變體進行訓練,該算法稱為 Backpropagation Through Time,簡稱 BPTT。

實際上,BPTT 展開循環神經網絡,並在整個輸入序列上向後傳播錯誤,一次一個時間步。然後用累積的梯度更新權重。

BPTT 在輸入序列很長的問題上訓練循環神經網絡可能很慢。除了速度之外,在如此多的時間步長上累積梯度可能會導致值縮小到零,或者最終溢出或爆炸的值增長。

BPTT 第一個修改是限制反向傳播使用的時間步數,實際上估計用於更新權重的梯度而不是完全計算它。

BPTT訓練算法有兩個參數:

  • k1:定義在前向傳遞中向網絡顯示的時間步數。
  • k2:定義在估計反向傳播的梯度時要查看的時間步數。

因此,我們可以在考慮如何配置訓練算法時使用符號 BPTT(k1, k2),其中 k1 = k2 = n,其中 n 是經典非截斷 BPTT 的輸入序列長度。

BPTT 配置對 RNN 序列模型的影響,像 LSTM 這樣的現代循環神經網絡可以使用它們的內部狀態來記住很長的輸入序列,例如超過數千個時間步。

這意味著 BPTT 的配置不一定定義正在通過選擇時間步數優化的網絡的內存。可以選擇何時將網絡的內部狀態與用於更新網絡權重的機制分開重置。

相反,BPTT 參數的選擇會影響網絡如何估計用於更新權重的誤差梯度。更一般地說,配置定義了可以考慮網絡來模擬序列問題的時間步數。

我們可以將其正式表述為:

yhat(t) = f(X(t), X(t-1), X(t-2), ... X(t-n))

其中 yhat 是特定時間步長的輸出,f(...) 是循環神經網絡逼近的關係,X(t) 是特定時間步長的觀測值。

它與在時間序列問題上訓練的多層感知器上的窗口大小或線性時間序列模型(如 ARIMA)的 p 和 q 參數在概念上相似(但在實踐中完全不同)。BPTT 定義了模型在訓練期間輸入序列的範圍。

BPTT的Keras實現

Keras 深度學習庫提供了用於訓練循環神經網絡的 BPTT 實現。具體來說 k1 和 k2 彼此相等且固定。

  • BPTT(k1, k2),其中 k1 = k2

這是通過訓練循環神經網絡(如長短期記憶網絡或 LSTM)所需的固定大小的 3D 輸入來實現的。

LSTM 期望輸入數據具有以下維度:樣本、時間步長和特徵。

這是此輸入格式的第二個維度,時間步長定義了用於序列預測問題的前向和後向傳遞的時間步長數。

因此,在為 Keras 中的序列預測問題準備輸入數據時,必須仔細選擇指定的時間步數。

時間不長的選擇將影響兩者:

  • 前向傳遞期間累積的內部狀態。
  • 用於更新反向傳播權重的梯度估計。

注意,默認情況下,網絡的內部狀態會在每批後重置,但可以通過使用所謂的有限狀態 LSTM 並手動調用重置操作來實現對內部狀態何時重置得更明確的控制。

在 Keras 中為 BPTT 準備序列數據

分解序列數據的方式將定義 BPTT 向前和向後傳遞中使用的時間步數。

因此,必須仔細考慮如何準備訓練數據,列出了可以考慮的 6 種方法。

1. 按照原樣使用數據

如果每個序列中的時間步數不多,例如幾十或幾百個時間步長,可以按原樣使用的輸入序列。

已經建議了大約 200 到 400 個時間不長的 BPTT 的實際限制。如果序列數據小於或等於此範圍,可以將序列觀測值重塑為輸入數據的時間步長。

例如,如果有 25 個時間步長的 100 單變量序列的集合,則可以將其重構為 100 個樣本、25 個時間步長和 1 個特徵或 [100, 25, 1]。

2. 樸素的數據拆分

如果有很長的輸入序列,例如數千個時間步長,可能需要將長輸入序列分解為多個連續的子序列。


這將需要在 Keras 中使用有狀態的 LSTM,以便在子序列的輸入中保留內部狀態,並且僅在真正更完整的輸入序列的末尾重置。

例如,如果有 50,000 個時間不長的 100 如果輸入序列,那麼每個輸入序列可以分為 500 個時間不長的 100 個子序列。一個輸入序列將變成 100 個樣本,因此 100 個原始樣本將變成 10,000 個。Keras 的輸入維度為 10,000 個樣本、500 個時間步長和 1 個特徵或 [10000, 500, 1]。需要注意保存每 100 個子序列的狀態,並在每 100 個樣本後明確地或使用 100 的批量大小重置內部狀態。

將整個序列整齊地劃分為固定大小的子序列的拆分是首選。全序列的因子(子序列長度)的選擇是任意的,因此得名「naive data split」。

將序列拆分為子序列並沒有考慮有關合適數量的時間步長的域信息來估計用於更新權重的誤差梯度。

3. 特定領域的數據拆分

很難知道提供有用的誤差梯度估計所需的正確時間步數。


我們可以使用樸素的方法快速得到一個模型,但模型可能遠未優化。或者我們可以使用特定領域的信息來估計在學習問題時與模型相關的時間步數。

例如如果序列問題是回歸時間序列,也許對自相關和偏自相關圖的回顧可以告知時間步數的選擇。

如果序列問題是自然語言處理問題,也許可以將輸入序列按句子分割然後填充到固定長度,或者根據域中的平均句子長度進行分割。

廣泛思考並考慮可以使用哪些特定於的領域的知識將序列分成有意義的塊。

4. 系統數據拆分(例如網格搜索)

可以針對序列預測問題系統地評估一組不同的子序列長度,而不是猜測合適的時間步數。


可以對每個子序列長度執行網格搜索,並採用導致平均性能最佳模型的配置。

如果正在考慮使用這種方法,需要注意從作為完整序列長度因子的子序列長度開始。如果探索不是完整序列長度的因素的子序列長度,請使用填充和可能的掩碼。 考慮使用比解決問題所需的稍微過度規定的網絡(更多的記憶單元和更多的訓練時期),以幫助排除網絡容量限制的實驗。

取每種不同配置多次運行(例如 30 次)的平均性能。

如果計算資源不是限制,則建議對不同數量的時間步進行系統調查。

5. 使用 BPTT(1, 1) 嚴重依賴內部狀態

可以將序列預測問題重新表述為每個時間步長一個輸入和一個輸出。

例如,如果有 50 個時間步長的 100 個序列,則每個時間步長都將成為一個新樣本。100 個樣本將變成 5,000 個。三維輸入將變為 5,000 個樣本、1 個時間步長和 1 個特徵,或 [5000, 1, 1]。

同樣,這將需要在序列的每個時間步長內保留內部狀態,並在每個實際序列(50 個樣本)結束時重置。

這會將學習序列預測問題的負擔放在循環神經網絡的內部狀態上。根據問題的類型,它可能超出網絡的處理能力,預測問題可能無法學習。

個人經驗表明,這種公式可能適用於需要對序列進行記憶的預測問題,但當結果是過去觀察的複雜函數時表現不佳。

6.前向和後向序列長度

Keras 深度學習庫用於支持通過時間截斷反向傳播的前向和後向傳遞的解偶數量的時間步長。


本質上,k1 參數可以由輸入序列的時間步數指定,k2 參數可以由 LSTM 層上的 truncate_gradient 參數指定。

關鍵字: