RNN的基本内容

RNN的基本介绍

一RNN的基本内容

RNN的基本概念: 即循环神经网络,是一种神经网络结构模型。这种网络的本质特征是在处理单元之间既有内部的反馈连接又有前馈连接,即像人一样拥有记忆的能力。可以借此解决卷积神经网络,还是人工神经网络的前提假设:元素之间是相互独立的,输入与输出也是独立的问题。我们可以借此解决语义识别,语义分割等问题(RNN的主要用途是处理和预测序列数据)。

在这里插入图片描述
(x:输入(向量)
s:是一个向量,它表示隐藏层的值(这里隐藏层面画了一个节点,你也可以 想象这一层其实是多个节点,节点数与向量s的维度相同)
U:权重矩阵
o:输出(向量)
V:是隐藏层到输出层的权重矩阵。
w:权重矩阵)

如果上图带有W的那个带箭头的圈去掉,它就变成了最普通的全连接神经网络。
CNN简单的结构:
在这里插入图片描述
从上面两幅图我们可以发现CNN只有前馈连接而没有反馈连接,而RNN既有前馈连接也有反馈连接
两者的不同:
CNN:借助卷积核(kernel)提取特征后,送入后续网络(如全连接网络Dense)进行分类、目标检测等操作。CNN借助卷积核从空间维度提取信息,卷积核参数空间共享。

RNN:借助循环核(cell)提取特征后,送入后续网络进行预测等操作。RNN借助循环核从时间维度提取信息,循环核参数时间共享。( 循环核具有记忆力,通过不同时刻的参数共享,实现了对时间序列的信息提取。)
在这里插入图片描述
在这里,我们可以把左右两个隐藏层s给当成数字逻辑里面的现态次态,次态的状态由现态和输入决定。
在这里插入图片描述
Xt:表示t时刻的输入
ot:表示t时刻的输出
St:表示t时刻的记忆

由上图可知,循环神经网络就是借助循环核实现时间特征提取后把提取到的信息送入全连接网络,从而实现连续数据的预测和处理。
在这里插入图片描述
从图中可以发现,在RNN中,每个循环核构成一层循环计算层,循环计算层的层数是向输出方向增长的,也就是说,你的循环核越多,那么你的循环计算也就越多.但是循环核的上限我们是可以自己决定的。
RNN的基础:
**1、**St=f(U∗Xt+W∗St−1)
St表达式里面的f()是神经网络中的激活函数,也就是RNN的记忆功能。可以捕捉到之前时间点的信息,至于是多少个时间点的信息我们是可以自己设定的,如果我们把记忆的时间点的个数给限定了,输入和输出的xt,ot也指定的话,那么周围的带训练参数的维度就会被固定。
**2、*Ot=g(VSt)
两个重要函数中的权重矩阵(U、V、W)的计算:
前向连接时:记忆体内存储的状态信息ht在每个时刻都被刷新,而三个参数矩阵W、U、V是固定不变的。
反向连接时:三个参数矩阵W、U、V由梯度下降法(下降的比较快)更新(整个结构共享一组U,V,W)。
在这里插入图片描述
假设现在我们有一个词输入,我们需要先将它转化成一个计算机可读的一个向量,然后RNN在逐个处理向量序列。毕竟我们的语言计算机是不能直接识别的。
在这里插入图片描述
处理时,RNN 将先前隐藏状态传递给序列的下一步。 而隐藏状态充当了神经网络记忆,它包含相关网络之前所见过的数据的信息。
在这里插入图片描述
将输入和先前隐藏状态组合成向量, 该向量包含当前输入和先前输入的信息。 向量经过激活函数 tanh之后,输出的是新的隐藏状态或网络记忆。
在这里插入图片描述
激活函数 Tanh 用于帮助调节流经网络的值,并且 tanh 函数将数值始终限制在 -1 和 1 之间,从而调节了神经网络的输出。选用这个tanh函数可以有利于我们计算,反之我们过早的梯度爆炸。
在这里插入图片描述
由图可知,RNN在短跨度下的预测是比较准确的,但是一但跨度过长,我们的预测便会失真。因为在多向的反向传播会导致梯度消失和梯度爆炸的情况。我们可以使用梯度截断去解决梯度爆炸问题,但是无法轻易解决梯度消失问题。所以我们出现了RNN的变体LSTM和GRU。

RNN的变体–LSTM

****LSTM:长短时记忆神经网络
LSTM与RNN有啥不一样呢?
对于特定时刻t,隐藏层输出St的计算方式不同。LSTM网络的训练的思路与RNN类似,仅前向传播关系式不同而已。并且在对LSTM网络进行训练时,cell state c[0]和hidden state s[0]都是随机初始化得到的。
在这里插入图片描述
上面是LSTM的原理图
LSTM 的核心概念在于细胞状态以及“门”结构。细胞状态相当于信息传输的路径,让信息能在序列连中传递下去。可以将其看作网络的“记忆”。理论上讲,细胞状态能够将序列处理过程中的相关信息一直传递下去。因此,即使是较早时间步长的信息也能携带到较后时间步长的细胞中来,这克服了短时记忆的影响。信息的添加和移除我们通过“门”结构来实现,“门”结构在训练过程中会去学习该保存或遗忘哪些信息。
遗忘门:
在这里插入图片描述
功能:决定应丢弃或保留哪些信息。(准确说是确定前一个步长中哪些相关的信息需要被保留)
前一个隐藏状态的信息和当前输入的信息同时传递到 sigmoid 函数中去,输出值介于 0 和 1 之间,越接近 0 意味着越应该丢弃,越接近 1 意味着越应该保留。
sigmoid函数
在这里插入图片描述
由图可知sigmoid函数的值为[0,1],则我们把上一个隐藏状态和现在的输入信息相互结合传递到sigmoid函数中,我们根据sigmoid函数的输出值来确定这些信息是否应该保留。
输入门:
在这里插入图片描述
作用:输入门用于更新细胞状态。首先将前一层隐藏状态的信息和当前输入的信息传递到 sigmoid 函数中去。将值调整到 0~1 之间来决定要更新哪些信息。0 表示不重要,1 表示重要,在将前一层隐藏状态的信息和当前输入的信息传递到 tanh 函数中去,创造一个新的侯选值向量。最后将 sigmoid 的输出值与 tanh 的输出值相乘,sigmoid 的输出值将决定 tanh 的输出值中哪些信息是重要且需要保留下来的。(sigmoid和tanh函数具体在上面有所解释)
细胞状态:
在这里插入图片描述
首先将前一层的细胞状态与遗忘向量逐点相乘。如果它乘以接近 0 的值,意味着在新的细胞状态中,这些信息是需要丢弃掉的。然后再将该值与输入门的输出值逐点相加,将神经网络发现的新信息更新到细胞状态中去。至此,就得到了更新后的细胞状态。
并且我们从这里可以看出输入门决定了多少信息会存进细胞状态之中进行计算。
输出门:
在这里插入图片描述
用来确定下一个隐藏状态的值,隐藏状态包含了先前输入的信息。首先,我们将前一个隐藏状态和当前输入传递到 sigmoid 函数中,然后将新得到的细胞状态传递给 tanh 函数。最后将 tanh 的输出与 sigmoid 的输出相乘,以确定隐藏状态应携带的信息。再将隐藏状态作为当前细胞的输出,把新的细胞状态和新的隐藏状态传递到下一个时间步长中去。
上述就是LSTM的简单说明。

GRU

在这里插入图片描述
首先计算更新门和重置门的门值, 分别是z(t)和r(t), 计算方法就是使用X(t)与h(t-1)拼接进行线性变换, 再经过sigmoid激活. 之后重置门门值作用在了h(t-1)上, 代表控制上一时间步传来的信息有多少可以被利用. 接着就是使用这个重置后的h(t-1)进行基本的RNN计算, 即与x(t)拼接进行线性变化, 经过tanh激活, 得到新的h(t). 最后更新门的门值会作用在新的h(t),而1-门值会作用在h(t-1)上, 随后将两者的结果相加, 得到最终的隐含状态输出h(t), 这个过程意味着更新门有能力保留之前的结果, 当门值趋于1时, 输出就是新的h(t), 而当门值趋于0时, 输出就是上一时间步的h(t-1).
综上,LSTM和GRU两个是RNN的两个变体,他们分别采取了一些新的包装和函数的应用来增强了原始RNN的记忆功能,但是他们对数据的处理各有千秋,我们在应用时我们可以根据自己数据所需来进行选择。
(以上图片来自于知乎上的一篇文章和一些CSDN大佬的文章!)

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RNN (循环神经网络)是一种常用的神经网络模型,用于处理具有时间序列的数据。在PyTorch中,可以使用RNN模块来构建和训练RNN模型。通过引用和的内容,我们可以得出使用PyTorch调用RNN的代码示例。 在PyTorch中,我们可以定义一个名为RNN的类,继承自nn.Module。在RNN类的初始化方法中,我们可以指定输入的特征数量(input_size)、输出的特征数量(output_size)、隐藏层的特征数量(hidden_dim)和循环层数(n_layers)。然后,在初始化方法中,我们可以创建一个nn.RNN对象,该对象具有指定的输入特征数量、隐藏层特征数量和循环层数。接下来,我们可以定义一个全连接层(nn.Linear)用于将隐藏层的输出转化为最终的输出结果。 在RNN类中,还需要定义一个forward方法,用于定义模型的前向传播过程。在该方法中,我们接收输入(x)和隐藏层参数(hidden)。通过调用self.rnn(x, hidden)可以得到RNN的输出(r_out)和最后一个隐藏层状态(hidden)。然后,我们将r_out的维度转换为合适的形状,并通过全连接层(self.fc)将其转化为最终的输出结果。最后,我们返回输出结果和隐藏层参数。 通过这样的代码实现,我们可以使用PyTorch调用RNN模型进行训练和预测。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [RNN基本原理+pytorch代码](https://blog.csdn.net/qq_36760793/article/details/126817853)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值