标准回答
两者都是在时间步之间传递的向量,但定位完全不同。
单元状态(Cell State, C_t)——长期记忆
- 它是贯穿整个序列的「主干通路」,只被门控做加性修改:
C_t = f_t * C_{t-1} + i_t * C̃_t。 - 由于更新是近似线性的加法(而非反复非线性变换),信息能在很多时间步上近乎无损地保留,因此承载长程依赖。
- 它是网络的内部状态,不直接作为输出,外部和输出层看不到它的原始值。
隐藏状态(Hidden State, h_t)——短期 / 工作记忆
- 它是当前时间步的输出:
h_t = o_t * tanh(C_t),即把细胞状态压缩到 -1~1 后,再由输出门决定暴露多少。 - 它是对外接口:既送给输出层产生预测,也作为下一时间步的输入(与 x_{t+1} 一起决定各门)。
- 它反映「当前这一步该关注 / 输出什么」,是从长期记忆中过滤出的短期工作记忆。
区别与联系
| 维度 | 单元状态 C_t | 隐藏状态 h_t |
|---|---|---|
| 角色 | 长期记忆主干 | 短期输出 / 工作记忆 |
| 传递 | 加性、近似线性、长程 | 经门控与 tanh 过滤 |
| 可见性 | 内部,不直接对外 | 对外:输出层 + 下一步输入 |
| 关系 | 信息来源 | 由 C 经输出门派生 |
一句话总结:C_t 是「记住了什么」,h_t 是「这一步要拿出来用什么」,h 由 C 过滤而来。
常见误区
⚠️ 常见踩坑
认为隐藏状态等于细胞状态,或以为两者地位对称可互换。实际上隐藏状态是细胞状态经输出门和 tanh 过滤后的「子集 / 投影」,信息量通常少于细胞状态;细胞状态才是长期信息的真正载体。另外,初始化时两者通常都置零,但在序列推进中它们的数值与作用并不相同。
追问
追问 1:为什么需要把两种状态分开,而不是只用一个状态?
因为长期保存信息和当前对外输出是两个有冲突的目标。如果只用一个状态,每一步都要被非线性激活和输出需求反复改写,长程信息很容易被冲刷掉。拆成细胞状态专门做近似线性的长期保存、隐藏状态专门做过滤后的短期输出,既能维持长期记忆,又能灵活控制每一步暴露什么。
追问 2:输出层和下一时间步用的是 h_t 还是 C_t?
都用 h_t。输出层基于 h_t 做预测,下一时间步也是把 h_t 与新输入 x_{t+1} 拼接后送入各门。C_t 只在 LSTM 单元内部沿时间传递、不直接对外。这也是为什么 h_t 被称作「对外接口」、C_t 被称作「内部记忆」。
追问 3:初始的 h_0 和 C_0 怎么设置?
最常见是都初始化为零向量。也可以将它们设为可学习参数,或在编码器-解码器结构里用编码器的最终状态来初始化解码器的 h_0、C_0,从而把上下文传入解码端。具体选择取决于任务和架构。
🔗 相似问题
同一考点的不同问法,面试官可能换着问,一起刷更稳
没找到想看的面试题?把你想看的告诉我们 →
延伸学习
按主题分类的相关资源,便于系统复习