RNN
This file is for introduce RNN & LSTM & GRU
Introduction
在全连接神经网络中,我们知道它是由输入层到隐藏层最后到输出层所组成,层与层之间存在连接,但是每层内部的神经元节点之间没有连接,因此这就使得在面对序列任务时无法得到很好的结果。RNN(循环神经网络)在序列数据上的表现要好得多,主要因为RNN的当前输出与当前状态的输入和前一刻的输出有关。
Structure
首先,我们假设输入的序列为:
\[X = (x_{1},x_{2},x_{3})
\]
\(X\)可以看作句子,\(x_{1}\)可以看作组成句子的词向量。

在上图中\(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)
\]

对应第一层的输出为:
\[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)

浙公网安备 33010602011771号