循环神经网络RNN

一、为什么需要RNN

以往我们学习的全连接神经网络都是单独的取处理一个个的输入,前一个输入和后一个输入是完全没有关系的。但是,某些任务需要能够更好的处理序列的信息,即前面的输入和后面的输入是有关系的。

当我们在理解一句话意思时,孤立的理解这句话的每个词是不够的,我们需要处理这些词连接起来的整个序列; 当我们处理视频的时候,我们也不能只单独的去分析每一帧,而要分析这些帧连接起来的整个序列。

使用情景

RNN是在自然语言处理领域中最先被用起来的,比如,RNN可以为语言模型来建模。那么,什么是语言模型呢?

我们可以和电脑玩一个游戏,我们写出一个句子前面的一些词,然后,让电脑帮我们写下接下来的一个词。比如下面这句:

我昨天上学迟到了,老师批评了____。

我们给电脑展示了这句话前面这些词,然后,让电脑写下接下来的一个词。在这个例子中,接下来的这个词最有可能是『我』,而不太可能是『小明』,甚至是『吃饭』。

通俗理解

让电脑预测这句话后面该说什么,电脑会从到到尾分析这段话,分析的过程并不是独立的,而是通过神经网络来解析,并且前面的话语肯定会对后面的话语产生影响,最终生成我们想要的结果。这种类似的“前对后的影响”是RNN的核心所在


二、RNN结构

这是一个简单的循环神经网络结构图,由输入层、隐藏层、输出层构成。
在这里插入图片描述
这里我们去掉W的话就是一个简单的全连接神经网络模型

我们从下向上理解简单部分:

参数意义
X表示输入层的值
U输入层到隐藏层的权重矩阵
S它表示隐藏层的值
V隐藏层到输出层的权重矩阵
O表示输出层的值

W是什么?

W是一个权重矩阵,作用在隐藏层
循环神经网络的隐藏层的值s不仅仅取决于当前这次的输入x,还取决于上一次隐藏层的值s。
权重矩阵 W就是隐藏层上一次的值作为这一次的输入的权重


三、 一图以蔽之

在这里插入图片描述


四、一式以蔽之

在这里插入图片描述


五、代码实现

import torch
import torch.nn as nn
#一、实例化对象
'输入张量的维度(几列),隐藏层维度,隐藏层神经元数量,隐藏层层数'
rnn=nn.RNN(5,6,1)
#二、设定输入张量 x
'序列长度,批次样本数,输入张量维度'
x=torch.randn(1,3,5)
#三、初始化h0
'层数*网络方向数,批次的样本数,隐藏层的维度'
h0=torch.randn(1,3,6)
#四、输入放入rnn中得到结果
output,hn=rnn(x,h0)
print(output)
print(hn)

六、Encoder-Decoder

新的神经网络模型叫做 RNN编码-解码器 ,该模型包含两个RNN,分别位于编码器和解码器中,编码器中的RNN负责将变长的输入序列映射到一个固定长度的向量中,解码器中的RNN则负责将向量映射到一个变长的输出序列

"Elle aime la Chine."在法语里面是"她喜欢中国。“的意思,翻译为英文即为"She loves
China.”。在这里,它是一个翻译的seq2seq结构。

在这里插入图片描述

结构图

在这里插入图片描述

Encoder

编码器部分标注了隐藏层的状态,用 h t h_{t} ht表示,更新公式为:
h t = f ( h t − 1 , x t ) h_{t}=f(h_{t}-1,x_{t}) ht=f(ht1,xt)
说明了当前时刻的隐藏层状态 h t h_{t} ht是由上一时刻状态 h t − 1 h_{t-1} ht1合当前时刻的输入 x t x_{t} xt决定的

C C C是中间语义表示
可以是各个时刻隐层输出的汇总:
C = g ( h 1 , h 2 , h 3 . . . . . h T ) C=g(h_{1},h_{2},h_{3}.....h_{T}) C=g(h1,h2,h3.....hT)
也可以是最后一层的输出
C = h T C=h_{T} C=hT
由于编码器用的是RNN的结构,每一个循环中的信息都会流到下一个循环中,因此中间语义表示 C 理论上包含了输入序列的所有信息。

Decoder

解码过程合编码是倒序关系,由前推后,因此公式顺序也会发生变化,并不是类似输入推出隐藏层的状态。
以翻译例子为例:
在这里插入图片描述

七、LSTM模型

LSTM (Long Short-Term Memory)也称长短时记忆结构,它是传统RNN的变体,与经典RNN相比能够有效捕捉长序列之间的语义关联,缓解梯度消失爆炸现象.但是内部结构复杂,训练效率下降很多
同时LSTM的结构更复杂,它的核心结构可以分为四个部分去解析:
在这里插入图片描述

1、遗忘门

在这里插入图片描述

首先将当前时间步输入x(t)与上一个时间步隐含状态h(t-1)拼接,得到[x(t),
h(t-1)],然后通过一个全连接层做变换,最后通过sigmoid函数进行激活得到f(t),我们可以将f(t)看作是门值,好比一扇门开合的大小程度,门值都将作用在通过该扇门的张量,遗忘门门值将作用的上一层的细胞状态上,代表谢忘过去的多少信息。

之前的信息不一定对我们现在有用对于无效的信息我们对其遗忘

2、输入门

在这里插入图片描述

这里没有全连接层,只是将刚刚得到的遗忘门门值与上一个时间步得到的C(t-1)相乘,再加上输入门门值与当前时间步得到的未更新Ct相乘的结果.最终得到更新后的Ct作为下一个时间步输入的一部分.整个细胞状态更新过程就是对遗忘门和输入门的应用.

3、细胞状态

在这里插入图片描述

4、输出门

在这里插入图片描述

输出门部分的公式也是两个,第一个即是计算输出门的门值,它和遗忘门,输入门计算方式相同.第二个即是使用这个门值产生隐含状态h(t).他将作用在更新后的细胞状态C(t)上,并做tanh激活,最终得到h(t)作为下一时间步输入的一部分.整个输出门的过程,就是为了产生隐含状态h(t).

代码

在这里插入图片描述

import torch
import torch.nn as nn
'输入张量的维度(几列),隐藏层维度,隐藏层神经元数量,隐藏层层数'
#实例化对象
lstm=nn.LSTM(5,6,2)
#输入张量
'序列长度,批次样本数,输入张量维度'
input=torch.randn(1,3,5)
#初始化隐藏层张量 h0,细胞状态 c0
'层数*网络方向数,批次的样本数,隐藏层的维度'
h0=torch.randn(2,3,6)
c0=torch.randn(2,3,6)
#输入到LSTM中
output,(hn,cn)=lstm(input,(h0,c0))
print(output)
print(hn)
print(cn)

八、Bi-LSTM

将LSTM应用两次且方向不同,再将两次得到的结果拼接输出
在这里插入图片描述

九、GRU模型

综合了前两个模型的长处,是传统RNN的变体。同LSTM一样能有效捕捉长序列之间的语义关系,缓解梯度消失和梯度爆炸。同时计算结构要比LSTM更简单。
在这里插入图片描述
分为两个部分:重置门更新门
在这里插入图片描述

和之前分析过的LSTM中的门控一样,首先计算更新门和重置门的门值,分别是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).

代码

在这里插入图片描述

import torch
import torch.nn as nn
rnn=nn.GRU(5,6,2)
input=torch.randn(1,3,5)
h0=torch.randn(2,3,6)
output,hn=rnn(input,h0)
print(output)
print(h0)
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值