循环神经网络(RNN)入门详解:从基础到传统RNN

一、什么是RNN?

循环神经网络(Recurrent Neural Network, RNN) 是一类以序列数据为输入,通过内部循环结构捕捉序列之间关系特征的神经网络。与传统的前馈神经网络不同,RNN的隐层输出不仅取决于当前输入,还依赖于上一时刻的隐层状态,这使得它非常适合处理具有时间依赖或顺序依赖的数据,如自然语言文本、语音信号、时间序列等。

1.1 RNN的循环机制

RNN的核心在于“循环”。下图展示了将RNN按时间步展开后的结构:

  • 在每一个时间步 ( t ),RNN接收当前输入 ( x_t ) 和上一时间步的隐层输出 ( h_{t-1} )。
  • 两者经过拼接和线性变换,再通过激活函数(通常为tanh),得到当前时间步的隐层输出 ( h_t )。
  • ( h_t ) 既作为该时间步的输出,也作为下一时间步的输入的一部分。

这种结构使得RNN能够“记住”历史信息,从而对序列整体的语义进行建模。

1.2 RNN的作用与应用场景

由于RNN天然适合处理序列数据,它在自然语言处理(NLP)领域有着广泛的应用:

  • 文本分类:判断新闻类别、情感极性。
  • 意图识别:理解用户提问的意图(例如“What time is it?”)。
  • 机器翻译:将一种语言的序列转换为另一种语言的序列。
  • 语音识别:将音频信号转换为文字。

举例:当用户输入“What time is it?”时,RNN按顺序处理每个单词。第一个单词“What”产生输出 ( O1 ),然后“time”结合 ( O1 ) 产生 ( O2 ),依此类推。最终,根据最后一个隐层输出 ( O5 ) 解析出用户的意图——询问时间。

二、RNN模型的分类

RNN可以从两个角度进行分类:输入输出结构内部构造

2.1 按输入输出结构分类

类型特点典型应用
N vs N输入和输出序列等长生成合辙诗句、序列标注
N vs 1输入为序列,输出为单个值文本分类、情感分析
1 vs N输入为单个值,输出为序列图像描述生成(图片→文字)
N vs M(Seq2Seq)输入输出长度不限,包含编码器和解码器机器翻译、文本摘要
  • N vs N RNN:每个时间步都有一个输出,常用于输入输出长度一致的任务。
  • N vs 1 RNN:仅在最后一个时间步输出结果,通常接一个线性层和sigmoid/softmax。
  • 1 vs N RNN:将单个输入(如图片特征)重复作用于每个时间步,生成序列输出。
  • Seq2Seq架构:编码器将输入序列编码为上下文向量 ( c ),解码器根据 ( c ) 逐步生成输出序列。这是机器翻译等领域的主流模型。

2.2 按内部构造分类

  • 传统RNN
  • LSTM(长短时记忆网络)
  • GRU(门控循环单元)
  • Bi-LSTM / Bi-GRU(双向结构)

本文后续将重点介绍传统RNN,LSTM和GRU将在第二篇中详细解析。

三、传统RNN模型

3.1 内部结构与计算公式

传统RNN的单个时间步内部结构如下:

  • 输入:上一时间步隐层输出 ( h_{t-1} )、当前时间步输入 ( x_t )。
  • 将 ( [x_t, h_{t-1}] ) 拼接,通过一个全连接层,激活函数为 tanh,得到当前隐层输出 ( h_t )。
  • 计算公式:
    [
    h_t = \tanh(W \cdot [x_t, h_{t-1}] + b)
    ]

其中,tanh函数将输出值压缩到 ([-1, 1]) 之间,有助于调节网络中的数值。

3.2 PyTorch中的RNN实现

在PyTorch中,可以通过 torch.nn.RNN 直接调用传统RNN。

import torch
import torch.nn as nn

# 参数:input_size, hidden_size, num_layers
rnn = nn.RNN(input_size=5, hidden_size=6, num_layers=2)

# 输入张量形状:(seq_len, batch, input_size)
input = torch.randn(1, 3, 5)
# 初始隐层形状:(num_layers, batch, hidden_size)
h0 = torch.randn(2, 3, 6)

output, hn = rnn(input, h0)

print(output.shape)  # torch.Size([1, 3, 6])
print(hn.shape)      # torch.Size([2, 3, 6])

输出 output 包含每个时间步的隐层输出,hn 为最后一个时间步的隐层状态。

3.3 传统RNN的优势与缺点

优势

  • 结构简单,计算资源要求低。
  • 参数量少,在短序列任务上表现优异。

缺点

  • 在处理长序列时容易发生梯度消失梯度爆炸,导致模型难以学习长期依赖关系。
梯度消失与爆炸的原因

根据反向传播的链式法则,梯度中包含多个因子连乘:
[
D_n = \sigma’(z_1) w_1 \cdot \sigma’(z_2) w_2 \cdots \sigma’(z_n) w_n
]

  • 当 ( \sigma’(\cdot) \leq 0.25 ) 且 ( w < 1 ) 时,连乘结果趋近于0 → 梯度消失,参数无法更新。
  • 当 ( w > 1 ) 时,连乘结果可能指数级增长 → 梯度爆炸,参数更新过大,甚至出现NaN。

梯度消失/爆炸会严重阻碍模型训练,这也是后来LSTM和GRU被提出的重要原因。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值