信息在长短期记忆 (LSTM) 单元中于单个时间步内以特定的方式流动。这种流动对于理解LSTM如何有效地处理长序列上下文,以及如何弥补简单循环神经网络 (RNN) 的不足之处非常重要。在每个时间步 $t$,LSTM单元接收以下三个输入:当前输入向量 $x_t$。前一个隐藏状态 $h_{t-1}$。前一个细胞状态 $c_{t-1}$。这些输入与门和细胞状态交互,产生两个输出:新的隐藏状态 $h_t$。新的细胞状态 $c_t$。让我们按照数据路径进行说明:1. 遗忘门:决定舍弃什么第一步涉及遗忘门($f_t$)。它的作用是决定旧细胞状态 $c_{t-1}$ 的哪些部分不再相关并应被丢弃。它会查看前一个隐藏状态 $h_{t-1}$ 和当前输入 $x_t$。一个Sigmoid激活函数($\sigma$)会将细胞状态向量中每个数值的输出压缩到0和1之间。$$ f_t = \sigma(W_f [h_{t-1}, x_t] + b_f) $$这里,$[h_{t-1}, x_t]$ 表示这两个向量的拼接。$W_f$ 和 $b_f$ 分别是遗忘门的权重矩阵和偏置向量,它们在训练期间学习得到。输出为1表示“完全保留此信息”,而输出为0则表示“完全丢弃此信息”。这个门的输出 $f_t$ 随后与前一个细胞状态 $c_{t-1}$ 进行按元素相乘($\odot$)。2. 输入门:决定存储什么新信息接下来,单元需要确定当前输入 $x_t$ 和前一个隐藏状态 $h_{t-1}$ 的哪些新信息应该添加到细胞状态中。这涉及两部分:输入门层($i_t$): 另一个Sigmoid层决定我们将更新哪些值。 $$ i_t = \sigma(W_i [h_{t-1}, x_t] + b_i) $$候选值($\tilde{c}_t$): 一个$tanh$层创建一个新的候选值向量,这些值可能被添加到状态中。 $$ \tilde{c}t = \tanh(W_C [h{t-1}, x_t] + b_C) $$$W_i, b_i$ 和 $W_C, b_C$ 分别是这些层的权重和偏置。$tanh$ 函数的输出值在-1和1之间。3. 更新细胞状态:结合旧与新现在我们将旧的细胞状态 $c_{t-1}$ 更新为新的细胞状态 $c_t$。我们结合遗忘门和输入门的结果:首先,我们应用遗忘门的决定:$f_t \odot c_{t-1}$。这会丢弃标记为遗忘的信息。然后,我们确定要添加的新信息:$i_t \odot \tilde{c}_t$。这根据我们决定更新每个状态值的程度来缩放候选值。最后,我们将这两部分加在一起: $$ c_t = f_t \odot c_{t-1} + i_t \odot \tilde{c}_t $$这种加性交互与简单RNN中重复的矩阵乘法有显著的不同。它使得梯度在反向传播过程中能够更轻松地通过时间流动,从而减轻梯度消失问题。细胞状态就像一条传送带,传输信息,只伴随着微小的线性交互(与 $f_t$ 相乘和加上 $i_t \odot \tilde{c}_t$),使得在许多步骤中保持上下文变得更容易。4. 输出门:决定输出什么最后,我们需要决定隐藏状态 $h_t$(以及可能作为此时间步的输出)应该是什么。这个输出将是细胞状态 $c_t$ 的一个过滤版本。输出门层($o_t$): 一个Sigmoid层确定细胞状态的哪些部分将作为输出。 $$ o_t = \sigma(W_o [h_{t-1}, x_t] + b_o) $$过滤细胞状态: 我们将更新后的细胞状态 $c_t$ 通过$tanh$函数(将值压缩到-1和1之间),然后将其按元素与输出门 $o_t$ 的输出相乘: $$ h_t = o_t \odot \tanh(c_t) $$产生的 $h_t$ 是传递到下一个时间步的隐藏状态。如果需要用于预测,它也可以作为单元在时间步 $t$ 的输出。$W_o$ 和 $b_o$ 是输出门的权重和偏置。流程可视化以下图表说明了这些组件如何连接以及数据在单个时间步内如何通过LSTM单元流动:digraph G { rankdir=LR; node [shape=rect, style=filled, fontname="helvetica"]; edge [fontname="helvetica"]; subgraph cluster_inputs { label = "输入 (t-1, t)"; style=filled; color="#e9ecef"; // gray node [fillcolor="#dee2e6"]; // light gray xt [label="x_t"]; htm1 [label="h_{t-1}"]; ctm1 [label="c_{t-1}"]; } subgraph cluster_gates { label = "门与候选值"; style=filled; color="#a5d8ff"; // light blue node [fillcolor="#74c0fc", fontcolor="#ffffff"]; // blue ft [label="f_t = σ(...)"]; it [label="i_t = σ(...)"]; ctilde [label="~c_t = tanh(...)", fillcolor="#63e6be", fontcolor="#000000"]; // teal ot [label="o_t = σ(...)"]; } subgraph cluster_operations { label = "运算"; node [shape=circle, label="", width=0.25, height=0.25, style=filled]; mul_f_c [fillcolor="#be4bdb", label="⊙"]; // grape mul_i_c [fillcolor="#be4bdb", label="⊙"]; // grape add_c [fillcolor="#f06595", label="+"]; // pink tanh_c [label="tanh", shape=ellipse, style=filled, fillcolor="#63e6be", fontcolor="#000000"]; // teal mul_o_tanh [fillcolor="#be4bdb", label="⊙"]; // grape } subgraph cluster_outputs { label = "输出 (t)"; style=filled; color="#ffd8a8"; // light orange node [fillcolor="#ffe066"]; // yellow ct [label="c_t"]; ht [label="h_t"]; } // 连接 {xt, htm1} -> {ft, it, ctilde, ot} [style=dashed, arrowhead=none, color="#868e96"]; // 灰色虚线表示输入的使用 xt -> ft [label=" W_f, b_f", fontsize=10]; htm1 -> ft; xt -> it [label=" W_i, b_i", fontsize=10]; htm1 -> it; xt -> ctilde [label=" W_C, b_C", fontsize=10]; htm1 -> ctilde; xt -> ot [label=" W_o, b_o", fontsize=10]; htm1 -> ot; ft -> mul_f_c [penwidth=1.5]; ctm1 -> mul_f_c [penwidth=1.5]; it -> mul_i_c [penwidth=1.5]; ctilde -> mul_i_c [penwidth=1.5]; mul_f_c -> add_c [penwidth=1.5]; mul_i_c -> add_c [penwidth=1.5]; add_c -> ct [penwidth=2.0]; // 细胞状态主要更新路径 ct -> tanh_c [penwidth=1.5]; ot -> mul_o_tanh [penwidth=1.5]; tanh_c -> mul_o_tanh [penwidth=1.5]; mul_o_tanh -> ht [penwidth=2.0]; // 隐藏状态主要输出路径 // 传递箭头 ct -> ct [label="到 t+1", style=dashed, arrowhead=open, constraint=false, color="#fa5252", fontcolor="#fa5252"]; ht -> ht [label="到 t+1", style=dashed, arrowhead=open, constraint=false, color="#fa5252", fontcolor="#fa5252"]; // 布局提示(可选优化) {rank=same; xt; htm1; ctm1} {rank=same; ft; it; ctilde; ot} {rank=same; ct; ht} ctm1 -> add_c [style=invis, weight=0]; // 减少重叠 }该图说明了在单个时间步 $t$ 内,信息和计算在LSTM单元中的流动方式。输入 $x_t$、$h_{t-1}$、$c_{t-1}$ 经过遗忘门($f_t$)、输入门($i_t$)和输出门($o_t$)以及候选状态($\tilde{c}_t$)的处理,以计算新的细胞状态 $c_t$ 和隐藏状态 $h_t$。Sigmoid($\sigma$)和$tanh$激活函数控制着门控和状态更新。按元素相乘($\odot$)和加法(+)组合中间结果。红色虚线表示 $c_t$ 和 $h_t$ 传递到下一个时间步。通过精心调节在每个步骤中哪些信息被保留、丢弃、添加和输出,LSTM单元为梯度在训练期间更有效地流动创建了通道。细胞状态作为显式记忆通道,受门保护,使得网络能够在长时间内学习和记忆信息,这对处理复杂的序列建模任务非常重要。