Skip to content

循环神经网络 ​

循环神经网络(Recurrent Neural Network, RNN)用于处理序列数据。它通过隐藏状态保存历史信息,因此适合文本、时间序列、语音等任务。

概念详解 ​

给定序列 x1,x2,⋯,xT,RNN 在每个时间步更新隐藏状态:

ht=ϕ(Wxxt+Whht−1+b)

输出为:

yt=Wyht+c

其中 ht 同时依赖当前输入 xt 和上一时刻状态 ht−1。

梯度传播推导 ​

损失对早期隐藏状态的梯度会经过多次连乘:

∂L∂ht=∂L∂hT∏k=t+1T∂hk∂hk−1

而:

∂hk∂hk−1=diag(ϕ′(ak))Wh

如果该矩阵范数长期小于 1,梯度会消失;长期大于 1,梯度会爆炸。这也是 LSTM、GRU 被提出的重要原因。

应用代码 ​

python
import torch
from torch import nn

class RNNClassifier(nn.Module):
    def __init__(self, input_dim=8, hidden_dim=16, num_classes=2):
        super().__init__()
        self.rnn = nn.RNN(input_dim, hidden_dim, batch_first=True)
        self.fc = nn.Linear(hidden_dim, num_classes)

    def forward(self, x):
        out, h = self.rnn(x)
        return self.fc(out[:, -1, :])

X = torch.randn(32, 10, 8)  # batch, seq_len, input_dim
y = torch.randint(0, 2, (32,))

model = RNNClassifier()
loss_fn = nn.CrossEntropyLoss()
optim = torch.optim.Adam(model.parameters(), lr=1e-3)

for _ in range(100):
    logits = model(X)
    loss = loss_fn(logits, y)
    optim.zero_grad()
    loss.backward()
    optim.step()

print(loss.item())

小结 ​

RNN 的关键是隐藏状态递推。它能自然处理序列,但长距离依赖困难,因此现代长序列任务更多使用 LSTM、GRU 或 Transformer。