LSTM单时间步实现疑问:遗忘门等机制计算实例求解
首先澄清你的核心误解:遗忘门(以及其他门)的输出并不是非0即1的硬开关,而是0到1之间的连续值。参考资料里提到的0或1通常是示意图的简化表示(用来直观展示“完全遗忘”或“完全保留”的极端情况),但实际LSTM的门控是软控制——输出值代表“保留/遗忘的比例”,比如0.7就表示保留70%的对应状态信息,遗忘30%。你的遗忘门计算是完全正确的,下面我们结合你给定的数值,完整走一遍LSTM单时间步的计算流程。
给定参数回顾
我们用你提供的输入和简化假设:
- t-1时刻隐藏状态:
htminus1 = np.array([0, 0.5, 0.1, 0.2, 0.6]) - t时刻输入:
xt = np.array([-0.1, 0.3, 0.1, -0.25, 0.1]) - 所有门的权重矩阵均为单位矩阵,偏置项全为0(即线性变换结果直接为
htminus1 + xt)
1. 遗忘门(ft)计算
遗忘门的作用是控制上一时刻细胞状态(Ct-1)的保留比例,公式为:
$$f_t = \sigma(W_f \cdot [h_{t-1}; x_t] + b_f)$$
由于权重是单位矩阵、偏置为0,线性变换结果为htminus1 + xt:
z_f = htminus1 + xt # 结果:[-0.1, 0.8, 0.2, -0.05, 0.7] ft = 1 / (1 + np.exp(-z_f))
计算结果和你得到的一致:ft = array([0.47502081, 0.68997448, 0.549834 , 0.4875026 , 0.66818777])
每个值代表对应维度上保留Ct-1信息的比例(比如第一个维度保留47.5%,遗忘52.5%)。
2. 输入门(it)计算
输入门控制新候选值($\tilde{C}t$)的加入比例,公式为:
$$i_t = \sigma(W_i \cdot [h{t-1}; x_t] + b_i)$$
同样基于简化假设,线性变换结果也是htminus1 + xt,因此输入门的结果和遗忘门完全相同:it = array([0.47502081, 0.68997448, 0.549834 , 0.4875026 , 0.66818777])
3. 新候选值向量($\tilde{C}_t$)计算
候选值是当前输入和隐藏状态提取的新信息,公式为:
$$\tilde{C}t = \tanh(W_c \cdot [h{t-1}; x_t] + b_c)$$
线性变换结果还是htminus1 + xt,应用tanh激活(输出范围-1到1):
z_c = htminus1 + xt # 同z_f c_tilde = np.tanh(z_c)
计算结果:c_tilde = array([-0.09966799, 0.66403677, 0.19737532, -0.04997917, 0.60436778])
4. 当前细胞状态(Ct)计算
细胞状态是LSTM的“记忆核心”,更新规则是:用遗忘门过滤旧记忆,加上输入门控制的新候选值:
$$C_t = f_t \odot C_{t-1} + i_t \odot \tilde{C}t$$
这里我们假设初始细胞状态$C{t-1}$为全0(常见的初始化方式),因此:
ct = ft * np.zeros_like(htminus1) + it * c_tilde
计算结果(保留4位小数):ct = array([-0.0473, 0.4582, 0.1085, -0.0244, 0.4038])
5. 输出门(ot)与当前隐藏状态(ht)计算
输出门控制细胞状态有多少要输出到隐藏状态,公式为:
$$o_t = \sigma(W_o \cdot [h_{t-1}; x_t] + b_o)$$
同样基于简化假设,输出门结果和ft、it一致:ot = array([0.47502081, 0.68997448, 0.549834 , 0.4875026 , 0.66818777])
最后,隐藏状态是输出门与细胞状态的tanh结果的乘积:
$$h_t = o_t \odot \tanh(C_t)$$
计算步骤:
tanh_ct = np.tanh(ct) ht = ot * tanh_ct
结果(保留4位小数):ht = array([-0.0225, 0.2962, 0.0594, -0.0119, 0.2544])
关键总结
- 门控层的sigmoid输出是连续的比例值,而非0/1硬开关,这是LSTM实现精细记忆控制的核心设计。
- 你最初的遗忘门计算是完全正确的,参考资料中的0/1只是简化演示,不是实际计算结果。
内容的提问来源于stack exchange,提问作者Ling Guo




