RNN 是 Recurrent Neural Network,即循环神经网络。它在处理当前输入时同时使用上一时间步的隐藏状态,因此能够表达顺序依赖;这种“记忆”是有限维数值状态,不是完整保存历史文本的小本子。

隐藏状态怎样把前后连接起来

以单层、单向、tanh 激活为例,可简写为:

h_t = tanh(W_x x_t + W_h h_(t-1) + b)

x_t 是当前输入向量,h_(t-1) 是前一步状态,h_t 是新状态;同一层的权重在时间步之间共享。真实实现可能把输入和状态偏置分开,矩阵乘法写法也随向量约定不同。

PyTorch RNN 文档 给出相应计算与等价循环。看到一个词之后更新状态,再继续读下一个词,是方便入门的类比;它不保证网络能正确理解全部语义。

输入、每步输出与最后状态不同

以下是 PyTorch 单向 RNN 的形状教学代码,需要已安装相应依赖;随机输入没有业务含义,也不是训练或准确率实验:

import torch
from torch import nn

rnn = nn.RNN(
    input_size=3,
    hidden_size=5,
    num_layers=1,
    batch_first=True,
)
x = torch.randn(2, 4, 3)
h0 = torch.zeros(1, 2, 5)
output, hn = rnn(x, h0)

assert output.shape == (2, 4, 5)
assert hn.shape == (1, 2, 5)

这里有两个样本、每个四个时间步、每步三个输入特征。output 保留各时间步输出,hn 保留最后隐藏状态。batch_first=True 改变输入和输出的维度顺序,并不会把 hn 也变成 batch 在第一维。

分类任务可以使用最后状态,也可以组合多个时间步的输出;有填充的变长序列要处理真实长度,不能把最后一个填充值对应的状态误当成有效结尾。

顺序依赖,不等于所有地方都不能并行

同一条标准递推链的后一步依赖前一步,但批次中的不同样本与矩阵内部计算仍可并行。RNN 可用于文本、语音和一般时间序列,不仅是自然语言。

CNN 也能处理序列;局部卷积、堆叠与感受野决定它能看到的范围,不是“只能看到句子最后几个字”。不同结构应按任务、延迟和信息可用性比较,而不是简单套“眼睛”和“记忆”的类比。

长期依赖与信息泄漏要分开检查

反复更新隐藏状态,早期信息可能难以稳定保留;训练还涉及梯度消失或爆炸。LSTM、GRU 用门控机制处理部分问题,但不是无限记忆保证。

双向 RNN 会利用两个方向的信息,离线标注可以使用完整序列,实时预测却不能偷看未来。跨独立样本沿用状态也可能造成数据混杂,训练与评估应明确何时重置。网络结构本身不提供任何精度或长期依赖效果的保证。