RNN 的隐藏状态如何初始化?
简化版
RNN 隐状态可初始化为零、可学习参数或由上下文网络生成。零初始化稳定且常用;可学习初态提供全局先验;流式/有上下文任务可传入前段状态,但必须防止跨样本串状态与无限反传。
详细版
-
LSTM 同时初始化 hidden h 和 cell c。
-
双向、多层状态形状包含方向数和层数。
-
批次重排时状态必须按同一索引重排。
-
跨片段复用状态通常需要 detach。
-
可学习初态要扩展到 batch,不能为每个样本意外共享可变存储。
完整版教学
一、初态定义序列在第一步之前知道什么
零状态表示没有额外历史,网络通过输入逐步建立记忆。
可学习状态为所有序列共享一个训练先验,而条件初态可携带用户或编码器上下文。
状态传递若越过不相关样本边界,会泄漏信息;若不断图,计算图跨 batch 延长会导致内存爆炸。
二、底层机制与公式
RNN state shape=(layers*directions,batch,hidden)
LSTM state=(h0,c0)
三、带数字的推演
2 层双向 LSTM,batch=32、hidden=128,h0 与 c0 形状均为 [4,32,128],不是 [2,32,128];遗漏方向维会直接 shape 错误。
四、方案对比
| 方案/对象 | 核心特点 | 代价或边界 |
|---|---|---|
| 零初始化 | 简单、无额外参数 | 无先验上下文 |
| 可学习初态 | 学习全局先验 | 所有样本共享偏置 |
| 条件/延续状态 | 利用历史 | 需隔离与生命周期管理 |
五、执行流程
根据层/方向创建状态 -> 与输入同 device/dtype -> 前向更新
-> 序列边界清零或按 key 取回 -> TBPTT 边界 detach
六、边界条件与工程代价
变长 batch 排序/反排序时,输入、长度、状态三者索引必须一致。
线上 stateful 服务要设置 TTL、会话 key 和并发锁,避免不同用户共享或旧状态长期残留。
记忆钩子:隐状态是序列开始前的记忆。
七、常见误区与追问
-
误区:LSTM 只需初始化 h。 还需要 cell state c。
-
追问:何时 detach 状态? 跨截断片段保留数值但不跨片段反传时。
-
误区:随机初始化推理状态能增加鲁棒性。 会引入不可控输出随机性。
-
追问:多层双向 shape 怎么算? 第一维是 layers×directions。
-
追问:流式状态如何隔离? 按会话键存取、设 TTL 并在新序列显式清零。
八、加强记忆
隐状态是序列开始前的记忆。
先算清层×方向×batch×hidden,再决定清零、学习还是跨片段传递,并管理断图与会话边界。