一、从一次深夜调试说起
上周在部署一个实时传感器序列预测模型时,遇到了诡异的现象:模型在测试集上表现良好,上线后前几分钟预测准确,随后输出逐渐变成无意义的常数值。打开调试器追踪隐藏状态,发现随着时间步增加,隐藏状态的数值不断膨胀直至溢出。同事看了一眼说:“梯度爆炸了,老RNN的经典病。”
这个问题让我决定重新梳理RNN及其改进方案LSTM的核心机制。很多教程把LSTM当作黑盒魔法介绍,但真正要解决实际问题,必须理解每个门控背后的物理意义。
二、RNN:朴素的序列记忆者
RNN的核心思想极其直观——让网络具备“记忆”:
class NaiveRNNCell:
def __init__(self, input_size, hidden_size):
# 注意:这里W_hh和W_xh的初始化要用Xavier或He方法
# 我早期用正态分布初始化栽过跟头,训练直接发散
self.W_hh = np.random.randn(hidden_size, hidden_size) * 0.01
self.W_xh = np.random.randn(input_size, hidden_size) * 0.01
self.bias = np.zeros(hidden_size)
def forward(self, x, h_prev):
# 关键公式:h_t = tanh(W_hh * h_{t-1} + W_xh * x_t + b)
1788



被折叠的 条评论
为什么被折叠?



