批量大小與更新網絡權重時要考慮的培訓樣本數量有關。所以,在一個前饋網絡,讓我們說你要基於在時間計算從一個字的梯度,以更新您的網絡的權重,你的batch_size = 1 由於梯度從單一樣本計算,這在計算上是非常低廉。另一方面,這也是非常不穩定的訓練。
要了解在培訓這樣的前饋網絡期間發生了什麼, 我會告訴你這個very nice visual example of single_batch versus mini_batch to single_sample training。
但是,您想了解您的num_steps變量會發生什麼情況。這與你的batch_size不一樣。正如您可能已經注意到的,到目前爲止,我已經提到了前饋網絡。在一個前饋網絡中,輸出從網絡輸入確定和輸入 - 輸出關係是通過所學習的網絡關係映射:
hidden_activations(T)= F(輸入(t))的
輸出(T)= G(hidden_activations(T))= G(F(輸入(T)))
大小的batch_size,你的損失函數的梯度相對於每個的的訓練過程後計算網絡參數並更新您的權重。
在迴歸神經網絡(RNN),然而,網絡功能一點點不同的:
hidden_activations(T)= F(輸入(T),hidden_activations(T-1))
輸出(T)= G(hidden_activations(T))= G(F(輸入(T),hidden_activations(T-1)))
= G(F(輸入(T)中,f(輸入(T-1),hidden_activations(T-2))))= G(F(INP(T)中,f(INP(T-1),...,F(INP(T = 0),hidden_initial_state) )))
正如你可能從命名意義上推測的那樣,網絡保留了其先前狀態的記憶,並且神經元激活現在也依賴於以前的網絡狀態,並且通過對網絡所發現的所有狀態進行擴展進來。大多數RNN採用遺忘因子來更加重視更近期的網絡狀態,但這不僅僅是您的問題。
然後,你可能會猜測,這是計算非常,非常昂貴相對於網絡參數來計算損失函數的梯度,如果你要考慮反向傳播通過自創立網絡的所有狀態,有整潔的小技巧來加速您的計算:用歷史網絡狀態的子集近似您的漸變num_steps。
如果這個概念性討論還不夠清晰,你也可以看一下more mathematical description of the above。
不是計算所有狀態,我們可以計算所有狀態的一個子集,這意味着我們只需要最後一個「num_steps」存儲器。爲了實現,每個內存都是一個數組。所以在這種情況下,我們需要一個「num_steps」x「每個內存大小」的矩陣。我的理解是正確的嗎? – derek
我仍然感到困惑,每個批次的訓練樣例究竟如何工作。假設我們在一批中有5個訓練樣例。這是否意味着每個訓練示例將被饋送到隱藏的神經元細胞中,因此RNN中總共有5個細胞? – derek
假設您的數據大小爲100,批量大小爲5,以便在每個紀元期間進行20次網絡參數更新。它首先傳播前5個訓練示例,根據您提供的優化方法更新其參數,然後採用下一個5,直到它完全傳遞數據。 num_steps決定了您展開的單元格數量,從而決定了梯度計算中使用的數據量。由於每個單元/層共享參數,這不會導致要優化的參數增加,但它可以實現上下文學習,這就是爲什麼您首先需要RNN。 – Uvar