Pytorch实现基本循环神经网络RNN (3)

淩亂°似流年 2022-10-31 00:53 327阅读 0赞

1.47.Pytorch实现基本循环神经网络RNN (3)

Recurrent Neural networks(Rumelhart, 1986)主要用来处理序列型数据,具有对以往数据的记忆功能。下图所示,输入为input和一个状态Hidden0, 输出为output和hidden1.
在这里插入图片描述
一般地,对输入到RNN进行处理的第t个数据,也就是第t时刻,输出的隐藏状态可以表示为:
在这里插入图片描述
在RNN对序列数据进行处理时,采用参数共享机制,即权重是相同的。RNN有很多变体,上述的是最简单的一种形式,中间也可以输入y(t)。标准RNN如下:
在这里插入图片描述
对时刻t,更新的方程为:
在这里插入图片描述
在实际中使用nn.RNN()模式即可实现标准RNN的调用,下面通过讲解函数中的参数来具体讲解RNN的实用。nn.RNA有如下参数:
input_size:输入x 的特征数量
hidden_size:隐藏状态h 的特征数量
num_layers:网络层数,默认为1层。若2层,两个RNN单元进行堆叠,第2个RNN单元将第1个RNN单元的h 作为输入。
nonlinearity:实用tanh或ReLU,默认是tanh
bias:False代表不使用偏置b i h b_{ih}bih和b h h b_{hh}bhh,默认为True。
batch_first:决定输入数据的维度顺序。默认输入是(seq,batch,feature),分别是RNN序列长度,批量数,特征维度。True表示(batch,seq,feature).
dropout:接收一个0~1的数值,会在网络除最后一层之外的其他输出层加上dropout层,默认为0
bidirectional:如果是True,表示双向的RNN。

维度流程详解:
在这里插入图片描述

  1. >>> import torch.nn as nn
  2. >>> rnn = nn.RNN(10, 20, 2)
  3. >>> input = torch.randn(5, 3, 10)
  4. >>> h0 = torch.randn(2, 3, 20) # h0不初始化则全部为0
  5. >>> output, hn = rnn(input, h0)

建立了一个堆叠2层的RNN,可通过如下的属性获得权重和偏置参数:
RNN.weight_ih_l[k]:表示第k kk层的input-hidden权重。如果k = 0 k=0k=0,表示第0层维度为(hidden_size,input_size),其他层的维度为(hidden_size,num_directions*hidden_size),接收第k − 1 k-1k−1层传来的hidden特征。
RNN.weight_hh_l[k]: 表示第k kk层的hidden-hidden权重,维度是(hidden_size,hidden_size),接收第t − 1 t-1t−1时刻第k kk层的hidden特征。
RNN.bias_ih_l[k]: 表示第k kk层的input-hidden的偏置,维度为(hidden_size)
RNN.bias_hh_l[k]: 表示第k kk层的hidden-hidden的偏置,维度为(hidden_size)

  1. >>> rnn.weight_ih_l0.size()
  2. torch.Size([20, 10])
  3. >>> rnn.weight_ih_l1.size()
  4. torch.Size([20, 20])
  5. >>> rnn.weight_hh_l0.size()
  6. torch.Size([20, 20])
  7. >>> rnn.weight_hh_l1.size()
  8. torch.Size([20, 20])

如果误差为负对数似然,则误差为:
在这里插入图片描述

RNN的缺点:
根据前面的介绍可以了解RNN对以往数据的具有记忆性,但是存在的问题就是具有遗忘性,总是更加清楚地记得最近处理的记忆而遗忘之前发生的事情,只能很好地解决短时依赖的问题。因为梯度在反向传播的时候, 初始阶段的数据产生的梯度会由于指数级的相乘而很小。

发表评论

表情:
评论列表 (有 0 条评论,327人围观)

还没有评论,来说两句吧...

相关阅读

    相关 循环神经网络RNN

    对于人类而言,以前见过的事物会在脑海中留下记忆,虽然随后记忆会慢慢消失,但是每当经过提醒,人们往往可以重拾记忆。在神经网络中也是一样,之前介绍的CNN模型都是与时间序列无关的模