<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 如何準備Keras中截斷反向傳播的序列預測 > 原文: [https://machinelearningmastery.com/truncated-backpropagation-through-time-in-keras/](https://machinelearningmastery.com/truncated-backpropagation-through-time-in-keras/) 循環神經網絡能夠在序列預測問題中學習跨越多個時間步的時間依賴性。 諸如長短期記憶或LSTM網絡的現代循環神經網絡使用稱為反向傳播時間的反向傳播算法的變體進行訓練。該算法已被進一步修改以提高具有非常長序列的序列預測問題的效率,并且被稱為截斷反向傳播。 使用Truncated Backpropagation Through Time訓練像LSTM這樣的循環神經網絡時的一個重要配置參數是決定使用多少次步進作為輸入。也就是說,如何將非常長的輸入序列分成子序列以獲得最佳表現。 在這篇文章中,您將發現6種不同的方法,您可以使用Keras在Python中使用截斷反向傳播通過時間來分割非常長的輸入序列以有效地訓練循環神經網絡。 閱讀這篇文章后,你會知道: * 通過時間截斷反向傳播是什么以及如何在Python深度學習庫Keras中實現它。 * 輸入時間步數的選擇究竟如何影響循環神經網絡中的學習。 * 您可以使用6種不同的技術來分割非常長的序列預測問題,以充分利用截斷反向傳播時間訓練算法。 讓我們開始吧。 ![How to Prepare Sequence Prediction for Truncated Backpropagation Through Time in Keras](img/19062a6278c876f6de2ae4a5c50f58d8.jpg) 如何準備Keras中截斷反向傳播的序列預測 照片由[Giò](https://www.flickr.com/photos/pixelspin/2267095483/),保留一些權利。 ## 通過時間截斷反向傳播 反向傳播是用于更新神經網絡中的權重的訓練算法,以便最小化預期輸出和給定輸入的預測輸出之間的誤差。 對于觀察之間存在順序依賴性的序列預測問題,使用循環神經網絡代替經典前饋神經網絡。使用Backpropagation算法的變體訓練循環神經網絡,該算法稱為Backpropagation Through Time,簡稱BPTT。 實際上,BPTT展開循環神經網絡并在整個輸入序列上向后傳播誤差,一次一個步驟。然后用累積的梯度更新權重。 對于輸入序列很長的問題,BPTT可能很難訓練復現神經網絡。除了速度之外,在很多時間步長上累積梯度會導致值縮小到零,或者最終溢出或爆炸的值增長。 BPTT的修改是限制在后向傳遞中使用的時間步數,并且實際上估計用于更新權重的梯度而不是完全計算它。 這種變化稱為截斷反向傳播時間或TBPTT。 TBPTT訓練算法有兩個參數: * **k1** :定義正向傳遞給網絡顯示的時間步數。 * **k2** :定義在向后傳球上估計梯度時要查看的時間步數。 因此,當考慮如何配置訓練算法時,我們可以使用符號TBPTT(k1,k2),其中k1 = k2 = n,其中n是經典非截斷BPTT的輸入序列長度。 ## TBPTT配置對RNN序列模型的影響 像LSTM這樣的現代循環神經網絡可以使用它們的內部狀態來記憶很長的輸入序列。如超過數千次的步驟。 這意味著TBPTT的配置不一定通過選擇時間步長來定義您正在優化的網絡內存。您可以選擇何時將網絡的內部狀態與用于更新網絡權重的機制分開重置。 相反,TBPTT參數的選擇會影響網絡如何估計用于更新權重的誤差梯度。更一般地,配置定義了可以考慮網絡來對序列問題建模的時間步數。 我們可以正式說明這樣的事情: ```py yhat(t) = f(X(t), X(t-1), X(t-2), ... X(t-n)) ``` 在那里是特定時間步長的輸出,f(...)是循環神經網絡近似的關系,而X(t)是特定時間步長的觀察。 它在概念上與在時間序列問題上訓練的多層感知器上的窗口大小相似(但在實踐中完全不同),或者與ARIMA等線性時間序列模型的p和q參數相似。 TBPTT定義了訓練期間模型輸入序列的范圍。 ## Keras實施TBPTT Keras深度學習庫提供了TBPTT的實現,用于訓練復現神經網絡。 實施比上面列出的一般版本更受限制。 具體地,k1和k2值彼此相等并固定。 * TBPTT(k1,k2),其中k1 = k2 這是通過訓練諸如長短期記憶網絡或LSTM之類的循環神經網絡所需的固定大小的三維輸入來實現的。 LSTM期望輸入數據具有尺寸:樣本,時間步和特征。 它是此輸入格式的第二個維度,即時間步長,用于定義用于序列預測問題的前向和后向傳遞的時間步數。 因此,在為Keras中的序列預測問題準備輸入數據時,必須仔細選擇指定的時間步數。 時間步的選擇將影響兩者: * 在前進過程中積累的內部狀態。 * 梯度估計用于更新后向傳遞的權重。 請注意,默認情況下,每次批量后都會重置網絡的內部狀態,但可以通過使用所謂的有狀態LSTM并手動調用重置操作來實現對內部狀態重置的更明確控制。 有關Keras中有狀態LSTM的更多信息,請參閱帖子: * [如何為LSTM播種狀態用于Python中的時間序列預測](http://machinelearningmastery.com/seed-state-lstms-time-series-forecasting-python/) * [使用Python進行時間序列預測的有狀態和無狀態LSTM](http://machinelearningmastery.com/stateful-stateless-lstm-time-series-forecasting-python/) * [用Keras理解Python中的有狀態LSTM循環神經網絡](http://machinelearningmastery.com/understanding-stateful-lstm-recurrent-neural-networks-python-keras/) ## 在Keras中準備TBPTT的序列數據 分解序列數據的方式將定義BPTT前向和后向傳遞中使用的時間步數。 因此,您必須仔細考慮如何準備訓練數據。 本節列出了您可以考慮的6種技術。 ### 1.使用數據原樣 如果每個序列中的時間步數是適度的,例如幾十或幾百步,則可以按原樣使用輸入序列。 已經提出TBPTT的實際限制為約200至400倍步。 如果序列數據小于或等于此范圍,則可以將序列觀察值重新整形為輸入數據的時間步長。 例如,如果您有一個包含25個時間步長的100個單變量序列的集合,則可以將其重新整形為100個樣本,25個時間步長和1個特征或[100,25,1]。 ### 2.樸素的數據拆分 如果您有很長的輸入序列,例如數千次步,您可能需要將長輸入序列分成多個連續的子序列。 這將需要在Keras中使用有狀態LSTM,以便在子序列的輸入上保持內部狀態,并且僅在真正更充分的輸入序列的末尾處重置。 例如,如果您有100個輸入序列的50,000個步驟,那么每個輸入序列可以分為100個子步驟,500個步驟。一個輸入序列將變為100個樣本,因此100個原始樣本將變為10,000。 Keras輸入的維數為10,000個樣本,500個步驟和1個特征或[10000,500,1]。需要注意保持每100個子序列的狀態,并在每100個樣本之后明確地或通過使用100的批量大小重置內部狀態。 將整個序列整齊地劃分為固定大小的子序列的劃分是優選的。全序列因子(子序列長度)的選擇是任意的,因此稱為“樸素數據分裂”。 將序列分成子序列不考慮關于用于估計用于更新權重的誤差梯度的合適數量的時間步的域信息。 ### 3.特定于域的數據拆分 可能很難知道提供錯誤梯度的有用估計所需的正確時間步數。 我們可以使用樸素的方法(上面)快速獲得模型,但模型可能遠未優化。 或者,我們可以使用特定于域的信息來估計在學習問題時與模型相關的時間步數。 例如,如果序列問題是回歸時間序列,則可能對自相關和部分自相關圖的檢查可以通知選擇時間步數。 如果序列問題是自然語言處理問題,可能輸入序列可以按句子分割然后填充到固定長度,或者根據域中的平均句子長度進行分割。 廣泛思考并考慮您可以使用哪些特定于您的域的知識將序列拆分為有意義的塊。 ### 4.系統數據拆分(例如網格搜索) 您可以系統地為序列預測問題評估一組不同的子序列長度,而不是猜測適當數量的時間步長。 您可以對每個子序列長度執行網格搜索,并采用導致平均表現最佳的模型的配置。 如果您正在考慮這種方法,請注意一些注意事項: * 從作為整個序列長度因子的子序列長度開始。 * 如果探索不是整個序列長度因子的子序列長度,則使用填充和掩蔽。 * 考慮使用稍微過度規定的網絡(更多的存儲單元和更多的訓練時期)來解決問題,以幫助排除網絡容量作為實驗的限制。 * 獲取每個不同配置的多次運行(例如30)的平均表現。 如果計算資源不是限制,則建議對不同時間步數進行系統調查。 ### 5.使用TBPTT嚴重依靠內部狀態(1,1) 您可以將序列預測問題重新表述為每個時間步一個輸入和一個輸出。 例如,如果您有100個50次步長的序列,則每個時間步長將成為新的樣本。 100個樣本將變為5,000。三維輸入將變為5,000個樣本,1個時間步長和1個特征,或[5000,1,1]。 同樣,這將要求在序列的每個時間步長內保留內部狀態,并在每個實際序列的末尾重置(50個樣本)。 這將把學習序列預測問題的負擔放在循環神經網絡的內部狀態上。根據問題的類型,它可能比網絡可以處理的更多,并且預測問題可能無法學習。 個人經驗表明,這種表述可能適用于需要記憶序列的預測問題,但是當結果是過去觀察的復雜函數時表現不佳。 ### 6.解耦前向和后向序列長度 Keras深度學習庫用于支持通過時間截斷反向傳播的前向和后向傳遞的解耦的時間步長數。 實質上,k1參數可以通過輸入序列上的時間步數來指定,而k2參數可以通過LSTM層上的“truncate_gradient”參數來指定。 這不再受支持,但有一些愿望將此功能重新添加到庫中。雖然有證據表明[出于效率原因](https://github.com/fchollet/keras/issues/954),[確切地說為什么它被移除](https://github.com/fchollet/keras/issues/4188)尚不清楚。 你可以在Keras探索這種方法。一些想法包括: * 安裝并使用支持“truncate_gradient”參數的舊版Keras庫(大約2015年)。 * 在Keras中擴展LSTM層實現以支持“truncate_gradient”類型行為。 也許有可用于Keras的第三方擴展支持此行為。 如果您發現任何問題,請在下面的評論中告訴我們。 ## 摘要 在這篇文章中,您了解了如何準備序列預測問題數據,以有效利用Python深度學習庫Keras中的截斷反向傳播時間訓練算法。 具體來說,你學到了: * 如何通過時間截斷反向傳播以及如何在Keras中實現它。 * 如何在TBPTT環境中使用非常長的輸入序列重新分析或分割數據。 * 如何系統地研究Keras中的不同TBPTT配置。 你有任何問題嗎? 在下面的評論中提出您的問題,我會盡力回答。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看