循環神經網絡能夠學習序列預測問題中跨多個時間步長的時間依賴性。現代循環神經網絡,如長短期記憶或 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 參數指定。
#機器學習##python##資料分析##深度學習#