LSTM反向传递算法
时间: 2024-12-29 19:24:07 浏览: 10
### LSTM 反向传播算法原理
#### 1. LSTM 单元结构回顾
长短期记忆(LSTM)网络是一种特殊的循环神经网络(RNN),能够学习长期依赖关系。其核心在于设计了一种带有门控机制的记忆细胞,使得信息可以在长时间内保持不变或按需更新和遗忘。
一个标准的LSTM单元由输入门、忘记门、输出门以及候选状态四部分组成[^3]。这些组件共同决定了当前时刻的状态如何被更新,并最终影响下一个时间步的行为。
#### 2. 正向传播过程概述
在正向传播过程中,对于每一个时间步 t ,给定上一时刻隐藏层 h_(t−1) 和当前时刻输入 x_t ,通过一系列线性和非线性变换来计算新的内部状态 c̃ _t (也称为候选状态), 更新后的内存 cell 状态c_t, 并生成本时刻的隐含表示h_t 。具体来说:
- 输入门 i_t 控制哪些新信息应该写入cell 中;
- 遗忘门 f_t 决定了之前保存的信息有多少会被保留下来;
- 输出门 o_t 则用于调节从cell读取出来的信息量大小。
上述操作可以通过如下公式表达:
\[i_{t}=\sigma\left(W_{i}\left[h_{t-1}, x_{t}\right]+b_i \right)\]
\[f_{t}=\sigma\left(W_f\left[h_{t-1}, x_{t}\right]+ b_f\right)\]
\[o_{t}= \sigma\left(W_o\left[h_{t-1}, x_{t}\right]+ b_o\right)\]
\[c̃_t= tanh\left(W_c\left[h_{t-1}, x_{t}\right]+ b_c\right)\]
\[c_t=f_t * c_{t-1}+i_t*c̃_t\]
\[h_t=o_t*tanh(c_t)\][^1]
其中 W 表示权重矩阵,b 是偏置项,\(\sigma\)代表sigmoid激活函数,tanh则是双曲正切激活函数.
#### 3. 反向传播中的梯度流动分析
当涉及到反向传播时,LSTM 的目标是在最小化损失函数的同时调整参数W和b .为了做到这一点,需要计算关于各参数的部分导数也就是所谓的“梯度”。由于RNN存在时间上的展开特性,因此这里的梯度不仅取决于同一时间内的数据流还涉及到了过去多个时间点的影响。
特别值得注意的是,在LSTM中某些变量会在不同时间步之间共享相同的副本并参与多次运算。例如,c_t会影响后续所有的时间步直到序列结束;同样地,h_t也会作为下一刻的输入参与到下一轮迭代当中去。这就意味着任何发生在未来的变化都可能反过来作用于现在甚至更早之前的节点之上形成复杂的反馈环路[^4].
考虑到以上因素,我们可以得出结论说:\(δc_t\)将会受到来自两个方向的作用力:一是直接来自于同一步骤下的\(δh_t\);二是间接经由未来的\(δc_{t+k}(k>0)\).同样的道理适用于其他几个重要组成部分比如 \(δi_t, δf_t, δo_t\)等等它们各自都会接收到来自至少两处地方传来的信号从而完成整个链路上误差的有效传递.
具体的数学形式可以写作:
\[\delta c_t = \delta h_t*o_t*(1-tanh²(c_t)) + \delta c_{t+1}*f_{t+1}\]
\[\delta i_t=(\delta c_t*\tilde{c}_t)*(i_t*(1-i_t))\]
\[\delta f_t=(\delta c_t*c_{t-1})*(f_t*(1-f_t))\]
\[\delta o_t=(\delta h_t*tanh(c_t))*(o_t*(1-o_t))\]
\[\delta \tilde{c}_t=(\delta c_t*i_t)*(1-\tilde{c}_t^{2})\]
最后再利用链式法则将所有的局部敏感度汇总起来得到全局范围内的参数更新规则即可实现有效的训练目的.
```python
def lstm_backward(d_next, cache):
"""
Implements the backward pass for an LSTM over an entire sequence of data.
Inputs:
d_next - A tuple containing derivatives from next layer or time step,
including dh_next and dc_next which are derivative w.r.t hidden state
and cell state respectively at current timestep.
cache – Cache object storing intermediate values computed during forward pass
Returns:
dx - Gradient with respect to inputs x
dh_prev - Gradient with respect to previous hidden states h_{t-1}
dc_prev - Gradient with respect to previous cell states c_{t-1}
dWx - Gradient with respect to input-to-hidden weights matrix W_x
dWh - Gradient with respect to hidden-to-hidden weights matrix W_h
db - Gradient with respect to biases vector b
Note that this function assumes you have already implemented a single-step version called 'lstm_step_backward'.
"""
# Unpack cached variables used within each time step's computation
...
# Initialize gradients as zeros arrays shaped like their respective parameters
...
# Loop backwards through all timestamps starting from T down to 1
for t in reversed(range(T)):
# Retrieve relevant quantities stored inside `cache` corresponding to timestamp t
...
# Call helper method performing backpropagation across one individual LSTM unit
dx[:, :, t], dh_prev, dc_prev, dWx_temp, dWh_temp, db_temp \
= lstm_step_backward((dh[:, :, t] + dh_prev, dc_prev), caches[t])
# Accumulate contributions made by every single instance into overall parameter updates
dWx += dWx_temp
dWh += dWh_temp
db += db_temp
return dx, dh_prev, dc_prev, dWx, dWh, db
```
阅读全文