时间序列反向传播算法bptt:back-propagationthroughtime
Lu=tltufrac {partiall } {partialu }=sum _ tfrac {partial _ t } { _ partialu } _ l=t _ lt
例如在t=4情况下,
l4u=l 4y4h 4ufrac {partiall _4} {partialu }=frac {partial _4} {frac {fraly _4}
whereH4=tanh(wH3ux
4 ) h_4 = tanh(Wh_3 + Ux_4) h4=tanh(Wh3+Ux4)注意到 h3也依赖U
∂ L t ∂ U = ∑ s = 0 t ∂ L t ∂ y t ∂ y t ∂ h t ∂ h t ∂ h s ∂ h s ∂ U frac{partial L_t}{partial U} = sum_{s=0}^tfrac{partial L_t}{partial y_t} frac{partial y_t}{partial h_t} frac{partial h_t}{partial h_s}frac{partial h_s}{partial U} ∂U∂Lt=∑s=0t∂yt∂Lt∂ht∂yt∂hs∂ht∂U∂hs
参数共享是双刃剑,网络预测时具有平稳性,但是梯度计算的时候会有依赖。
随着t和s的距离越来越大,梯度传播的计算,长时序的依赖不足。
∂ h t ∂ h s = ∂ h t ∂ h t − 1 ∂ h t − 1 ∂ h t − 2 . . . ∂ h s + 1 ∂ h s frac{partial h_t}{partial h_s} = frac{partial h_t}{partial h_{t-1}} frac{partial h_{t-1}}{partial h_{t-2}} ... frac{partial h_{s+1}}{partial h_{s}} ∂hs∂ht=∂ht−1∂ht∂ht−2∂ht−1...∂hs∂hs+1
BPTT 只在子序列的内部去做反向传播,只关心内部的计算。在实际的计算中,很少有人用 full BPTT,一般是使用 Truncated BPTT。