RNN概述

1. RNN简介

1.1 什么是RNN?

循环神经网络(Recurrent Neural Network, RNN)是一类专门处理序列数据的神经网络。与传统的前馈神经网络(Feedforward Neural Network)不同,RNN通过引入循环结构,使其能够记住之前的输入信息,从而在处理时间序列或序列数据时具有“记忆”能力。RNN特别适合处理以下场景:

  • 自然语言处理(NLP):如机器翻译、文本生成、情感分析。
  • 时间序列分析:如股票价格预测、语音信号处理。
  • 视频序列分析:如动作识别。

1.2 为什么需要RNN?

传统的前馈神经网络假设输入数据是独立同分布的,无法捕捉数据之间的时序依赖关系。例如,在句子“我爱学习人工智能”中,“人工智能”依赖于前文“学习”的语义。RNN通过在时间步之间共享权重,解决了序列数据的建模问题。


2. RNN的核心结构与原理

2.1 RNN的基本结构

RNN的核心是一个循环单元,它在每个时间步(time step)接收当前输入 x t x_t xt 和上一时间步的隐藏状态 h t − 1 h_{t-1} ht1,并输出当前时间步的隐藏状态 h t h_t ht。其结构可以用以下公式描述:

h t = σ ( W x h x t + W h h h t − 1 + b h ) h_t = \sigma(W_{xh}x_t + W_{hh}h_{t-1} + b_h) ht=σ(Wxhxt+Whhht1+bh)

o t = W h o h t + b o o_t = W_{ho}h_t + b_o ot=Whoht+bo

其中:

  • x t x_t xt:时间步 t t t 的输入向量。
  • h t h_t ht:时间步 t t t 的隐藏状态(包含“记忆”)。
  • h t − 1 h_{t-1} ht1:上一时间步的隐藏状态。
  • W x h W_{xh} Wxh W h h W_{hh} Whh W h o W_{ho} Who:权重矩阵,分别对应输入到隐藏、隐藏到隐藏、隐藏到输出的权重。
  • b h b_h bh b o b_o bo:偏置项。
  • σ \sigma σ:激活函数,通常是tanh或ReLU,用于引入非线性。
  • o t o_t ot:时间步 t t t 的输出(可选,视任务而定)。

RNN的循环结构使得权重 W h h W_{hh} Whh 在所有时间步中共享,这既是其强大之处(捕捉时序依赖),也是其局限性(梯度消失/爆炸)。

2.2 RNN的展开

为了理解RNN的计算过程,可以将其按时间步展开,如下图所示(文字描述):

  • 时间步 t = 1 t=1 t=1:输入 x 1 x_1 x1,初始隐藏状态 h 0 h_0 h0(通常初始化为零向量),计算 h 1 h_1 h1
  • 时间步 t = 2 t=2 t=2:输入 x 2 x_2 x2,结合 h 1 h_1 h1,计算 h 2 h_2 h2
  • 以此类推,直到时间步 t = T t=T t=T

展开后,RNN可以看作一个深层网络,其中每一层对应一个时间步。这种展开形式便于理解RNN的训练过程(反向传播)。

2.3 前向传播

RNN的前向传播过程可以总结为:

  1. 对于每个时间步 t t t,根据输入 x t x_t xt 和上一时间步的隐藏状态 h t − 1 h_{t-1} ht1,计算当前隐藏状态 h t h_t ht
  2. (可选)根据任务需求,基于 h t h_t ht 计算输出 o
### 双向RNN概述 双向循环神经网络(Bidirectional Recurrent Neural Network, Bi-RNN)是一种特殊的RNN结构,它能够同时处理序列数据的前向和后向信息。这种设计使得模型可以更好地捕捉到时间序列中的长期依赖关系以及上下文信息[^2]。 在传统的单向RNN中,信息仅沿一个方向流动——从前向后;而在双向RNN里,则引入了另一个反向传播路径来补充正向的信息传递过程。因此,在任意时刻t处的状态不仅取决于过去的历史状态,还关联着未来可能发生的事件,从而提高了预测准确性并增强了表达能力[^1]。 具体来说,对于给定输入序列$x_1,x_2,\dots ,x_T$: - 正向部分按照正常顺序依次读取各个元素; - 而逆向组件则相反地从最后一个元素开始逐一向回扫描整个序列直到第一个位置为止。 最终得到的结果是由这两个不同视角下的隐含表示拼接而成的新特征向量$h_t=[\overrightarrow{h}_t;\overleftarrow{h}_t]$作为当前节点$t$的真实输出[^3]。 ### 实现方式 以PyTorch框架为例展示如何构建一个简单的双向LSTM用于文本分类任务: ```python import torch.nn as nn class TextClassifier(nn.Module): def __init__(self, vocab_size, embed_dim, hidden_dim, output_dim, n_layers, bidirectional=True): super().__init__() self.embedding = nn.Embedding(vocab_size, embed_dim) self.rnn = nn.LSTM(embed_dim, hidden_dim, num_layers=n_layers, bidirectional=bidirectional, dropout=0.5 if n_layers>1 else 0.) self.fc = nn.Linear(hidden_dim * (2 if bidirectional else 1), output_dim) def forward(self, text): embedded = self.embedding(text) outputs, _ = self.rnn(embedded) predictions = self.fc(outputs[-1,:,:]) return predictions ``` 上述代码片段定义了一个名为`TextClassifier` 的类继承自 `nn.Module`. 这个类包含了三个主要组成部分:词嵌入层(`Embedding`)、双向 LSTM 层 (`LSTM`, 设置参数 `bidirectional=True`) 和全连接线性变换(`Linear`). 当调用该对象实例化后的模型进行推理时,会先通过词嵌入获取句子中每个单词对应的低维稠密向量形式; 接下来送入双向LSTM单元做进一步加工提取高层次语义特性; 最终经由线性映射转换为目标类别概率分布.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱看烟花的码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值