LSTM 中 Dropout 应该加在哪里?
简化版
LSTM Dropout 可施加在层间输出、输入/输出或循环连接;框架内置 dropout 常只作用于多层 LSTM 的层间,不会自动屏蔽同层 recurrent state。变分 dropout 在时间维共享 mask,可减少逐步噪声。
详细版
-
单层 LSTM 设置内置 dropout 往往不起作用。
-
普通逐时刻 mask 会干扰长期记忆。
-
recurrent dropout 与层间 dropout 语义不同。
-
训练态启用随机 mask,评估态关闭;常见 inverted dropout 已在训练时除以保留率,评估时无需再次缩放。
-
padding 位置虽被 mask,仍应避免无效计算影响状态。
完整版教学
一、Dropout 放在哪里决定它破坏哪条信息路径
层间 dropout 正则化不同层的表示,不直接切断同一层记忆循环;循环 dropout 会影响隐藏状态跨时间传播,强度过大更易丢长期信息。
时间锁定 mask 在整段序列复用同一屏蔽模式,使被保留的通道可以连续传递,而不是每一步随机断线。
因此同一个 dropout 概率放在不同连接上会产生不同归纳偏置,评估时必须同时说明层数、mask 粒度和作用位置。
二、底层机制与公式
standard: m_t~Bernoulli(1-p) each step
locked: m~Bernoulli(1-p), use same m for all t
三、带数字的推演
两层 LSTM、p=0.3 时,常见框架仅在第 1 层输出送往第 2 层前丢弃 30%;若只有 1 层,没有层间连接,配置可能完全不生效。
四、方案对比
| 方案/对象 | 核心特点 | 代价或边界 |
|---|---|---|
| 层间 dropout | 框架常内置 | 单层无效 |
| Locked/variational | 时间共享 mask | 需自定义/确认实现 |
| Recurrent dropout | 正则隐藏循环 | 可能损害长依赖 |
五、执行流程
确认框架语义 -> 选择输入/层间/循环位置 -> 训练启用 mask
-> 验证切 eval -> 消融 p 与层数 -> 检查长期依赖指标
六、边界条件与工程代价
cuDNN 优化路径可能不支持某些自定义 recurrent dropout,速度会明显下降。
MC Dropout 推理可估不确定性,但必须有意开启 dropout,并通常保持 BN 等其他层在 eval。
记忆钩子:LSTM Dropout 先问“丢在哪里”:输入、层间还是循环。
七、常见误区与追问
-
误区:给单层 LSTM 设置 dropout 就一定生效。 许多实现只对层间连接生效。
-
追问:为何共享时间 mask? 避免每步随机切断不同记忆通道。
-
误区:recurrent dropout 越大越防过拟合。 可能直接破坏长期状态传播。
-
追问:eval 模式发生什么? 停止随机屏蔽;若采用主流 inverted dropout,训练时已经完成期望缩放,eval 不再额外乘保留率。
-
追问:如何确认具体语义? 查框架文档并用固定输入比较 train/eval 与单层行为。
八、加强记忆
LSTM Dropout 先问“丢在哪里”:输入、层间还是循环。
再问 mask 是否跨时间共享;只报一个 p 没有说明完整机制。