RNN

This file is for introduce RNN & LSTM & GRU

Introduction

在全连接神经网络中,我们知道它是由输入层到隐藏层最后到输出层所组成,层与层之间存在连接,但是每层内部的神经元节点之间没有连接,因此这就使得在面对序列任务时无法得到很好的结果。RNN(循环神经网络)在序列数据上的表现要好得多,主要因为RNN的当前输出与当前状态的输入和前一刻的输出有关。

Structure

首先,我们假设输入的序列为:

\[X = (x_{1},x_{2},x_{3}) \]

\(X\)可以看作句子,\(x_{1}\)可以看作组成句子的词向量。

RNN1
在上图中\(h_{i}\)是在RNN中引入的隐藏状态,可以利用它对序列数据提取特征。
在我们已知输入\(x_{1}\)和初始状态\(h_{0}\)的情况下,可以得到\(h_{1}\)为:

\[h_{1} = f(Ux_{1}+Wh_{0}+b) \]

后续状态的计算相同,因此可以得到后续状态计算的方式为:

\[h_{i} = f(Ux_{i}+Wh_{i-1}+b) \]

RNN2
对应第一层的输出为:

\[y_{1} = Softmax(Vh_{1} + c) \]

所以后续每个节点的输出为:

\[y_{i} = Softmax(Vh_{i} + c) \]

综合起来表示如下:

\[h_{t}=tanh(W_{ih}x_{t}+b_{ih}+W_{hh}h_{t-1}+b_{hh}) \]

在RNN中常用的激活函数为\(Tanh\)(双曲正切):

\[tanh(x)=\frac{e^{2x}-1}{e^{2x+1}} \]

\(Tanh\)\(Sigmod\)的关系如下:

\[\sigma(x)=\frac{1}{1+e^{-x}}=\frac{tanh(\frac{x}{2})+1}{2} \]

Problem

Implement

class RNN:
    def step(self, x, hidden):
        hidden = np.tanh(np.dot(self.W_hh, hidden) + np.dot(self.W_xh, x))
        return hidden

Pytorch

pytorch中RNN网路层参数说明:

  • input_size:输入的特征数量
  • batch_first:默认 False
  • hidden_size:隐藏状态的特征数量
  • num_layers: 默认为1,RNN的层数
  • nonlinearity:默认为\(tanh\)
  • bias:偏置,默认为True
  • dropout:默认False,如果为True那么输入要为\((batch,seq,feature)\)
  • bidirectional:默认为1,为2表示双向RNN
    RNN的输入如下:
  • input:对于非batch数据输入张量为\((L,H_{in})\);对于batch数据,\(batch_first=False\)时输入张量的形状为\((L,N,H_{in})\)\(batch_first=True\)时输入张量的形状为\((N,L,H_{in})\)
  • \(h_0\):默认初始化为0,对于非batch数据的形状为\((D*num_layers,H_{out})\),对于batch数据的形状为\((D*num_layers,N,H_{out})\)

N:batch大小
L:序列长度
D: 默认为1,如果双向RNN则为2
\(H_{in}\):input_size
\(H_{out}\):hidden_size
RNN的输出如下:

  • output:对于非batch数据输出张量为\((L,D*H_{out})\),对于batch数据,\(batch_first=False\)时输出为\((L,N,D*H_{out})\),\(batch_first=True\)时输出为\((N,L,D*H_{out})\)
  • \(h_{n}\):非batch输入的输出为\((D*num_layers,H_out)\),batch输入的输出为\((D*num_layers,N,H_{out})\)其中包含了最后的隐藏状态
import torch

rnn = torch.nn.RNN(10,20,2)
inputs = torch.randn(5,3,10)
h0 = torch.randn(2,3,20)
output, hn = rnn(inputs, h0)
posted @ 2022-04-12 21:39  AyanamiRay  阅读(308)  评论(0)    收藏  举报