RNN 循环 NN 神经网络 基本结构类型

本文深入探讨了循环神经网络(RNN)的基本原理及其多种变种,包括标准型、输出循环型、有向图型、上下文型、双向型、编码解码型及深度型等,并解释了它们各自的特点和应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基础理解

不同于卷积网络专门处理网格化数据,循环神经网络主要处理序列数据。比如一个句子:‘I went to Nepal in 2009’。每个word可以为序列的一个x。由于序列的长短不同,如果对每个x都单独设置一个参数,那么当出现更长的序列时模型就无法处理,没有对应的权重参数。而且对于序列‘I went to Nepal in 2009.’和’In 2009, I went to Nepal.'我们希望模型不管时间2009出现在序列的哪个位置都能处理,如果单独设置参数由于序列时间2009处在序列的不同位置,权重参数也不好对不同位置进行处理。因此出现了共享参数的方法,使得模型可以处理不同长度序列并可泛化。一种简单方法是在一维时间序列上使用卷积操作,但该方法比较浅层。
这里写图片描述
这里写图片描述
如上图,这是循环神经网络的简单形式。在不同时间段函数f的参数都相同,那我们不管在哪个时间t处将序列中的x时间2009输入,都会在原有状态h上新添加一个与x相关的相同输入。可以这样理解:
这里写图片描述
上图’a b c’和‘a c b’序列虽然排序不同,但最终产生的向量大小却是相同,在一定程度上表示’a b c’和‘a c b’二者含义近似。
因此循环神经网络具有以下优点:
1、不管序列长短(指所有x个数总和),都能具有相同的输入大小x(指单独x输入),只是在每输入一个x后状态就从上一个状态转移到下一个状态(每个x的特征向量组合)。而且将任意长度序列映射到固定长度特征向量,其信息是由一定损失的。
2、每个时间步使用相同转移函数f,参数共享,且能处理序列的乱序。
个人理解,其实不管卷积网络还是神经网络,本质是都是对原始数据集分布进行特征映射,将原始比较乱的数据分布,根据标记映射到另一个比较易于区分的分布上。从而实现可分性。
类似模型公式如下:
这里写图片描述
这里写图片描述

标准型

这里写图片描述
W V U为权重,o为输出,y为标记,x为输入,h为隐藏层状态。L为输入o与y的损失函数。上图每步都有输出o,且隐藏单元之间存在循环链接。
这里写图片描述
上图循环链接是从输出o到隐藏层h。没有上面的h到h模型强大。o作为输出,除非维度很高,否则会损失一部分h的信息。没有直接的循环链接,而只是间接的将h信息传递到下一层。但其易于训练,可以并行化训练。

这里写图片描述
上模型只有一个固定长度的向量输出。而不像前面输出与输入序列相同长度输出序列。

输出循环型

这里写图片描述
就是将输出作为循环链接。由于时间步的解耦,可以并行训练,使用导师驱动过程进行训练。
上图训练时标记y作为循环链接输入,测试时使用输出o作为循环链接输入。

有向图型

没有x输入,只有y序列
这里写图片描述
这里写图片描述

上下文型

依我理解,此处上下文指的是输出序列的上下文信息
这里写图片描述
上图主要用于图注,也就是x为图像,y为词序。通过输入图像x产生输出词序列。
将x作为一个额外输入方法:
1、作为初始状态h0
2、每个时间步输入一次
3、结合两种方式
这里写图片描述
在前面的基础上,添加一个输出y到h的链接。表明在给定x的序列后相同长度y序列上的分布建模。

双向型

这里写图片描述
h状态不仅依赖过去信息,还依赖未来与之有关的敏感信息。常用于手写识别和语音识别。

编码解码型

将输入序列x映射成不等长输出序列y。常用于语音识别,机器翻译,问答系统等。
这里写图片描述
C为上下文变量,编码器将输入序列编码成一个摘要C(其是就是将输入序列映射到了向量C上),再由解码器根据变量C输出输出序列。注意C的维度大小代表能够包含的信息量。
经典seq2seq模型:
在这里插入图片描述

深度型

这里写图片描述
浅变换一般指MLP的单层(一个放射变换+一个非线性变化)。深度型增加模型深度,但增加深度有可能会因优化困难而影响模型效果。
图中第一个方法是增加循化组数量。第二个中空白圆圈表示增加更深的MLP层。第三个引入跳跃连接来缓解深度路径延长问题。

递归型

这里写图片描述
不再构造成RNN的链状结构,而是深的树状结构。一定程度避免长期依赖问题。对于固定长度L的序列,将深度由L低至logL。可用于学习推论。

### RNN循环神经网络结构详解 #### 1. 基本概念 RNN(Recurrent Neural Network),即循环神经网络,是一种用于处理序列数据的神经网络模型。与传统的前馈神经网络不同的是,RNN具有内部状态(memory),可以记住之前的信息并应用于当前的任务中[^1]。 #### 2. 结构特点 RNN的核心特点是它能够在时间维度上共享参数,并通过反馈连接来传递信息。这种设计使得RNN非常适合于处理诸如语音识别、自然语言处理等涉及时间序列的数据集。具体来说: - **输入层到隐藏层**:每次接收一个新的输入向量$x_t$时,不仅会考虑这个新的输入,还会结合之前的隐藏状态$h_{t-1}$一起作为当前时刻$t$下的新隐藏状态$h_t$的一部分。 - **隐藏层更新机制**:隐藏单元的状态更新遵循如下公式\[ h_t = \sigma(W_{hh}h_{t-1} + W_{xh}x_t+b_h)\][^1],其中$\sigma$表示激活函数(比如`tanh`或ReLU),而$W_{hh}, W_{xh}$分别是权重矩阵,$b_h$为偏置项。 - **输出层生成**:对于某些特定的应用场景下,可能还需要从最终形成的隐藏状态$h_T$(假设整个序列长度为T)去预测目标值$y$;此时可以通过线性变换加上softmax之类的操作完成分类任务或其他类型的回归分析工作。 #### 3. PyTorch中的实现方式 在PyTorch框架里创建一个简单的单层双向RNN只需要几行代码就可以轻松搞定。下面给出一段具体的实例化过程以及如何定义输入尺寸、隐含层数目等相关超参设置的方法[^2]: ```python import torch.nn as nn class SimpleRNN(nn.Module): def __init__(self, input_dim=10, hidden_dim=20, layer_num=2): super(SimpleRNN, self).__init__() # 定义rnn模块 self.rnn = nn.RNN(input_size=input_dim, hidden_size=hidden_dim, num_layers=layer_num) def forward(self, x): out, _ = self.rnn(x) return out[-1] ``` 上述代码片段展示了怎样利用PyTorch内置API快速搭建起基础版别的RNN架构。这里需要注意一点就是,在实际应用过程中我们通常会对最后一个时间步产生的特征做进一步加工处理以便更好地服务于下游任务需求。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值