lstm bptt推导

深蓝 nlp 180429这个有详细的讲解

 

转载于:https://www.cnblogs.com/www-caiyin-com/p/10264336.html

<think>我们正在推导BPTT(BackpropagationThroughTime)算法中的梯度计算,特别是链式法则的应用。BPTT是循环神经网络(RNN)中用于计算梯度的算法,因为RNN在处理序列数据时,参数在时间步之间共享,所以梯度计算需要考虑所有时间步。根据引用[2][3],我们有一个RNN的基本结构。设时间步t的输入为$x_t$,隐藏状态为$h_t$,输出为$\hat{y}_t$。隐藏状态的计算公式为:$$h_t=\tanh(Uh_{t-1}+Wx_t)$$其中$U$是隐藏状态到隐藏状态的权重矩阵,$W$是输入到隐藏状态的权重矩阵。输出层计算为:$$z_t=Vh_t$$$$\hat{y}_t=\text{softmax}(z_t)$$损失函数通常为交叉熵损失。对于整个序列,总损失是各时间步损失之:$$E=\sum_{t=1}^TE_t,\quadE_t=-y_t^T\log(\hat{y}_t)$$我们的目标是计算总损失$E$关于参数$U,W,V$的梯度。由于参数在时间步之间共享,我们需要将每个时间步的梯度累加起来。在BPTT中,我们从最后一个时间步$T$开始反向计算梯度。关键点在于,由于$h_t$依赖于$h_{t-1}$,因此$h_t$的梯度不仅来自当前时间步的损失,还来自下一个时间步(即$t+1$)的梯度。这就是链式法则的应用。定义$t$时刻隐藏状态的梯度为:$$\delta_t=\frac{\partialE}{\partialh_t}$$注意,这里$E$是总损失,所以$\delta_t$包含了从$t$时刻开始到序列结束的所有损失对$h_t$的梯度。根据链式法则,$\delta_t$由两部分组成:1.来自当前时间步$t$的输出层(即$Vh_t$)的梯度。2.来自下一个时间步$t+1$的隐藏状态$h_{t+1}$的梯度,因为$h_t$是$h_{t+1}$的输入(通过$U$)。因此,我们可以写出:$$\delta_t=\frac{\partialE_t}{\partialh_t}+\frac{\partialE_{t+1:T}}{\partialh_t}$$其中$E_{t+1:T}$表示从$t+1$时刻到$T$时刻的总损失。具体分解:1.当前时间步$t$:损失$E_t$通过$z_t$(即$Vh_t$)对$h_t$的梯度:$\frac{\partialE_t}{\partialh_t}=V^T\frac{\partialE_t}{\partialz_t}$。2.下一时间步$t+1$:由于$h_{t+1}=\tanh(Uh_t+Wx_{t+1})$,所以$h_t$会影响到$h_{t+1}$,进而影响到$E_{t+1:T}$。因此,这部分梯度为:$\frac{\partialh_{t+1}}{\partialh_t}\cdot\frac{\partialE_{t+1:T}}{\partialh_{t+1}}=\frac{\partialh_{t+1}}{\partialh_t}\delta_{t+1}$。所以,$\delta_t$的递推公式为:$$\delta_t=V^T\frac{\partialE_t}{\partialz_t}+\left(\frac{\partialh_{t+1}}{\partialh_t}\right)^T\delta_{t+1}$$注意:这里我们假设时间步$t+1$存在,对于最后一个时间步$T$,没有来自$T+1$的梯度,所以$\delta_T=V^T\frac{\partialE_T}{\partialz_T}$。现在,我们需要计算$\frac{\partialh_{t+1}}{\partialh_t}$。由$h_{t+1}=\tanh(s_{t+1})$,其中$s_{t+1}=Uh_t+Wx_{t+1}$,所以:$$\frac{\partialh_{t+1}}{\partialh_t}=\text{diag}(\tanh'(s_{t+1}))\cdotU$$其中$\tanh'$是$\tanh$函数的导数,$\text{diag}$表示对角矩阵(因为对向量的每个元素求导)。因此,递推公式变为:$$\delta_t=V^T\frac{\partialE_t}{\partialz_t}+U^T\left(\text{diag}(\tanh'(s_{t+1}))\delta_{t+1}\right)$$有了$\delta_t$,我们就可以计算参数梯度:1.对于$V$:由于$V$只通过$z_t$影响当前时间步的损失$E_t$,所以梯度为:$$\frac{\partialE}{\partialV}=\sum_{t=1}^T\frac{\partialE_t}{\partialV}=\sum_{t=1}^T\frac{\partialE_t}{\partialz_t}h_t^T$$2.对于$U$:$U$出现在每个时间步的$s_t$中,而$s_t$影响$h_t$,进而影响后续所有时间步。因此,我们需要从$t=1$到$T$累加梯度:$$\frac{\partialE}{\partialU}=\sum_{t=1}^T\frac{\partialE}{\partials_t}\frac{\partials_t}{\partialU}=\sum_{t=1}^T\text{diag}(\tanh'(s_t))\delta_t\cdoth_{t-1}^T$$其中,$\frac{\partials_t}{\partialU}=h_{t-1}^T$(注意这里涉及到矩阵求导,实际是外积形式)。3.对于$W$:类似$U$,$W$也出现在每个时间步的$s_t$中:$$\frac{\partialE}{\partialW}=\sum_{t=1}^T\frac{\partialE}{\partials_t}\frac{\partials_t}{\partialW}=\sum_{t=1}^T\text{diag}(\tanh'(s_t))\delta_t\cdotx_t^T$$注意:在计算$U$$W$的梯度时,我们使用了$\frac{\partialE}{\partials_t}$,而$\frac{\partialE}{\partials_t}=\text{diag}(\tanh'(s_t))\delta_t$,这是因为$h_t=\tanh(s_t)$,所以由链式法则:$$\frac{\partialE}{\partials_t}=\frac{\partialE}{\partialh_t}\frac{\partialh_t}{\partials_t}=\delta_t\cdot\text{diag}(\tanh'(s_t))$$以上推导中,我们使用了链式法则沿着时间轴反向传播,因此称为BPTT。总结BPTT中链式法则的应用:1.定义隐藏状态的梯度$\delta_t$,它从未来($t+1$到$T$)当前($t$)两个方向传递梯度。2.通过递推关系计算$\delta_t$,从而避免重复计算。3.参数梯度通过累加所有时间步的贡献得到。注意:由于RNN存在梯度消失或爆炸问题,实际中可能会使用截断BPTT(TruncatedBPTT)或更复杂的结构(如LSTM、GRU)来缓解。参考文献:[^1]:RNNBPTT算法推导[^2]:RNNBPTT算法详细推导[^3]:随时间反向传播算法(BPTT)笔记[^4]:循环神经网络(RNN)原理及BPTT算法</think>### BPTT算法梯度计算中的链式法则推导 在循环神经网络(RNN)的反向传播随时间算法(BPTT)中,链式法则是梯度计算的核心。以下是关键推导步骤(以隐藏状态梯度 $\delta_t$ 为例): #### 1. **定义基本结构** RNN 的前向计算为: $$ \begin{aligned} s_t &= U h_{t-1} + W x_t \\ h_t &= \tanh(s_t) \\ z_t &= V h_t \\ \hat{y}_t &= \text{softmax}(z_t) \end{aligned} $$ 总损失 $E = \sum_{t=1}^T E_t$,其中 $E_t = -y_t^T \log(\hat{y}_t)$[^3][^4]。 #### 2. **隐藏状态梯度 $\delta_t$ 的链式法则** 定义 $t$ 时刻隐藏状态的梯度: $$\delta_t = \frac{\partial E}{\partial h_t}$$ 该梯度受两部分影响: - **当前时刻输出损失**:$E_t$ 通过 $z_t$ 影响 $h_t$ - **下一时刻隐藏状态**:$h_t$ 通过 $s_{t+1}$ 影响后续损失 $E_{t+1:T}$ 因此链式法则展开为: $$\delta_t = \underbrace{\frac{\partial E_t}{\partial h_t}}_{\text{当前输出梯度}} + \underbrace{\frac{\partial E_{t+1:T}}{\partial h_t}}_{\text{未来时间步梯度}}$$ #### 3. **分量分解** **a) 当前输出梯度分量**: $$\frac{\partial E_t}{\partial h_t} = \frac{\partial E_t}{\partial z_t} \frac{\partial z_t}{\partial h_t} = V^T \cdot \frac{\partial E_t}{\partial z_t}$$ 其中 $\frac{\partial E_t}{\partial z_t}$ 是输出层 softmax 的梯度[^3]。 **b) 未来时间步梯度分量**: $$\frac{\partial E_{t+1:T}}{\partial h_t} = \frac{\partial s_{t+1}}{\partial h_t} \frac{\partial h_{t+1}}{\partial s_{t+1}} \frac{\partial E_{t+1:T}}{\partial h_{t+1}} = U^T \cdot \text{diag}(\tanh'(s_{t+1})) \cdot \delta_{t+1}$$ 此处应用三重链式法则: 1. $h_t \to s_{t+1}$:$\partial s_{t+1}/\partial h_t = U$ 2. $s_{t+1} \to h_{t+1}$:$\partial h_{t+1}/\partial s_{t+1} = \tanh'(s_{t+1})$ 3. $h_{t+1} \to E$:$\partial E/\partial h_{t+1} = \delta_{t+1}$[^2][^3] #### 4. **完整梯度递推式** 合并分量得到: $$\delta_t = V^T \frac{\partial E_t}{\partial z_t} + U^T \left( \text{diag}(\tanh'(s_{t+1})) \delta_{t+1} \right)$$ 边界条件:$\delta_T = V^T \frac{\partial E_T}{\partial z_T}$(无未来时间步)[^2][^3]。 #### 5. **参数梯度计算** 通过 $\delta_t$ 计算参数梯度: - **$V$ 的梯度**(无时间依赖): $$\frac{\partial E}{\partial V} = \sum_{t=1}^T \frac{\partial E_t}{\partial z_t} h_t^T$$ - **$U$ $W$ 的梯度**(需沿时间传播): $$\frac{\partial E}{\partial U} = \sum_{t=1}^T \text{diag}(\tanh'(s_t)) \delta_t \cdot h_{t-1}^T$$ $$\frac{\partial E}{\partial W} = \sum_{t=1}^T \text{diag}(\tanh'(s_t)) \delta_t \cdot x_t^T$$ 此处 $\delta_t$ 已包含所有未来时间步的梯度贡献[^2][^4]。 --- ### 关键点总结 1. **时间依赖处理**:$\delta_t$ 同时依赖当前输出 ($\partial E_t/\partial z_t$) 未来状态 ($\delta_{t+1}$) 2. **梯度传播路径**:通过 $\frac{\partial h_{t+1}}{\partial h_t} = U^T \tanh'(s_{t+1})$ 实现时间反向传播 3. **链式法则嵌套**:参数梯度计算需沿 $E \to h_t \to s_t \to \{U, W\}$ 路径展开 此推导解释了RNN中梯度如何通过时间反向传播并累积参数更新量[^1][^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值