1. 先回顾 LSTM 的完整公式

一个时间步的 LSTM 公式是:

f_t = \sigma(W_f [h_{t-1}, x_t] + b_f)

i_t = \sigma(W_i [h_{t-1}, x_t] + b_i)

\tilde{C}_t = \tanh(W_C [h_{t-1}, x_t] + b_C)

C_t = f_t \odot C_{t-1} + i_t \odot \tilde{C}_t

o_t = \sigma(W_o [h_{t-1}, x_t] + b_o)

h_t = o_t \odot \tanh(C_t)

这一讲我们只看一维情况,这样最容易理解。

2. 假设当前输入非常简单

假设现在是第 t 个时间步。

上一时刻的长期记忆是:

C_{t-1} = 0.8

上一时刻的隐藏状态是:

h_{t-1} = 0.5

当前输入是:

x_t = 0.6

为了简化,我们不展开权重矩阵计算,直接假设三个门和候选记忆已经算出来了:

f_t = 0.9

i_t = 0.4

\tilde{C}_t = 0.7

o_t = 0.8

现在我们要计算:

C_t

和:

h_t

3. 第一步:理解遗忘门

遗忘门:

f_t = 0.9

说明上一时刻的旧记忆要保留 90%。

旧记忆是:

C_{t-1} = 0.8

所以保留下来的旧记忆是:

f_t \odot C_{t-1} = 0.9 \times 0.8 = 0.72

含义是:

上一时刻 0.8 的长期记忆,有 0.72 被保留下来了。

也就是说,这个时间步并没有大幅忘记历史信息。

4. 第二步:理解输入门

输入门:

i_t = 0.4

说明当前新信息只写入 40%。

候选记忆是:

\tilde{C}_t = 0.7

所以写入的新记忆是:

i_t \odot \tilde{C}_t = 0.4 \times 0.7 = 0.28

含义是:

当前输入产生的新信息是 0.7,但模型只认为其中 40% 值得写入长期记忆。

所以最终写进去的是 0.28。

5. 第三步:更新长期记忆

长期记忆更新公式是:

C_t = f_t \odot C_{t-1} + i_t \odot \tilde{C}_t

代入数值:

C_t = 0.9 \times 0.8 + 0.4 \times 0.7

C_t = 0.72 + 0.28

C_t = 1.00

所以当前长期记忆变成:

C_t = 1.00

这个结果说明:

旧记忆被大部分保留,新信息也被部分写入,
所以当前长期记忆增强了。

6. 第四步:计算隐藏状态

输出门:

o_t = 0.8

说明长期记忆中有 80% 可以输出为当前隐藏状态。

隐藏状态公式:

h_t = o_t \odot \tanh(C_t)

代入:

h_t = 0.8 \times \tanh(1.00)

因为:

\tanh(1.00) \approx 0.7616

所以:

h_t = 0.8 \times 0.7616

h_t \approx 0.6093

最终:

h_t \approx 0.6093

7. 这一步到底发生了什么?

我们来总结一下。

上一时刻:

C_{t-1} = 0.8

当前新信息:

\tilde{C}_t = 0.7

模型的选择是:

f_t = 0.9

i_t = 0.4

o_t = 0.8

所以它的行为是:

旧记忆保留很多;
新信息写入一部分;
最后把大部分长期记忆输出出去。

这就体现了 LSTM 的本质:

不是所有旧信息都保留,
也不是所有新信息都写入,
而是通过门控机制进行选择。

8. 换一个例子:模型想忘记旧信息

假设:

C_{t-1} = 0.8

但是这次遗忘门变成:

f_t = 0.1

输入门变成:

i_t = 0.9

候选记忆:

\tilde{C}_t = -0.6

则:

C_t = 0.1 \times 0.8 + 0.9 \times (-0.6)

C_t = 0.08 - 0.54

C_t = -0.46

这说明:

模型几乎忘掉了旧记忆,并写入了新的负向信息。

在情感分析中,这可能对应一个转折场景。

例如前面是:

这部电影开头不错

后面出现:

但是结尾非常糟糕

此时模型可能会降低前面正面记忆的影响,写入负面信息。

9. 用情感分析理解手算过程

句子:

这家餐厅虽然服务一般,但是味道很好。

可以简单理解为:

时间步 LSTM 可能做什么
t1 这家餐厅 记录主题
t2 虽然 记录“后面可能有转折”
t3 服务一般 写入一点负面信息
t4 但是 准备调整前面信息
t5 味道很好 写入强正面信息
t6 最终输出 判断整体偏正面

在这个过程中:

遗忘门负责降低“不重要或被转折削弱的信息”;
输入门负责写入当前更关键的信息;
输出门负责把最终有用的信息输出给分类器。

10. 多维向量情况下也是一样

刚才我们为了简单,用的是一维数值。

真实模型里,C_th_tf_ti_to_t 都是向量。

例如:

C_{t-1} = [0.8, -0.2, 0.5]

f_t = [0.9, 0.1, 0.6]

那么:

f_t \odot C_{t-1}=[0.9 \times 0.8,\ 0.1 \times (-0.2),\ 0.6 \times 0.5]=[0.72,\ -0.02,\ 0.30]

也就是说:

每一个维度都有自己的保留比例。

这非常重要。

LSTM 不是整体决定“全记住”或“全忘掉”,而是:

对记忆向量的每个维度分别控制。

11. LSTM 的门控到底是怎么学出来的?

前面我们直接给了:

f_t = 0.9

i_t = 0.4

o_t = 0.8

但真实训练中,这些值不是人工设置的,而是通过参数学习出来的。

例如遗忘门:

f_t = \sigma(W_f [h_{t-1}, x_t] + b_f)

这里的:

W_fb_f 是可学习参数。

训练时,模型根据损失函数反向传播,不断调整这些参数。

最终模型会自己学会:

什么时候该忘,
什么时候该记,
什么时候该输出。

12. 从计算图角度理解 LSTM

LSTM 的核心路径是:

C_{t-1}C_tC_{t+1}C_{t+2}

这条路径比普通 RNN 的隐藏状态递推更加稳定。

普通 RNN 是:

h_t = \tanh(W_x x_t + W_h h_{t-1} + b)

每一步都要经过非线性变换。

LSTM 的记忆更新是:

C_t = f_t \odot C_{t-1} + i_t \odot \tilde{C}_t

它有一条比较直接的加法路径。

所以信息更容易跨越多个时间步传递下去。

这也是 LSTM 缓解梯度消失的重要原因。

13. 你可以把 LSTM 当成“可学习的信息筛选器”

到这里,你应该建立一个非常重要的直觉:

LSTM 不是简单地记住全部历史,
而是学习如何筛选历史。

它每一步都在做三件事:

1. 旧信息哪些要留下?
2. 当前信息哪些要写入?
3. 当前状态哪些要输出?

对应就是:

遗忘门、输入门、输出门。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐