1. 从CNN到RNN:为什么我们需要序列模型
作为一名NLP方向的本科生,我在学习过程中发现很多教材都是直接抛出RNN的概念,却很少解释为什么我们需要这个结构。让我们从最基础的CNN开始,逐步理解RNN的诞生背景。
1.1 CNN的局限性
CNN在图像处理领域表现出色,这主要得益于它的两个核心特性:
- 局部感受野:通过卷积核在图像上滑动,每个神经元只与输入数据的一个局部区域连接
- 参数共享:同一个卷积核在整个图像上使用,大大减少了参数量
典型的CNN处理流程如下:
code复制输入图像 → 卷积层 → 池化层 → 卷积层 → 池化层 → 全连接层 → 输出
但在处理序列数据时,CNN会遇到三个主要问题:
- 固定长度输入:CNN通常需要固定尺寸的输入,而序列数据(如文本)长度变化很大
- 位置敏感性:CNN对绝对位置敏感,而语言中的语义往往与相对位置关系更大
- 长距离依赖:卷积核的感受野有限,难以捕捉序列中相距较远的元素间的关系
举个例子:"我不喜欢这部电影,因为它太____"和"我喜欢这部电影,因为它太____"。要预测空白处的词,模型需要记住开头的否定或肯定词,而CNN很难建立这种长距离依赖。
1.2 RNN的核心思想
RNN的突破性在于引入了"记忆"的概念。想象你在读一本小说:
- 读到第1章时,你记下主要人物和背景
- 读到第2章时,你会参考第1章的记忆来理解新内容
- 读到第10章时,你仍然保留着前面章节的关键信息
RNN通过隐藏状态(hidden state)实现这种记忆机制。数学表达为:
code复制h_t = f(W_{xh}x_t + W_{hh}h_{t-1} + b_h)
其中:
h_t是当前时刻的隐藏状态x_t是当前输入W_{xh}和W_{hh}是权重矩阵f是非线性激活函数(通常为tanh)
这种结构使得RNN可以处理任意长度的序列,并在理论上能够记住任意远的历史信息。
注意:虽然理论上RNN可以记住长期依赖,但实际训练中会遇到梯度消失问题,导致它更擅长捕捉短期模式。这也是LSTM被提出的原因。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. RNN的实践挑战与变体
2.1 经典RNN的缺陷
在
