RNN
RNN
,循环神经网络
,也称为RNNs
,是一类能够在具有隐藏状态时,将之前的输出作为输入的神经网络。
传统RNN的网络架构
RNN通常如下所示:
对于每个时间步t,其激活即隐藏状态(activation)a
和输出(output)y
的表达式如下:W
都是共享的参数,g
是激活函数。
具体可参照如下图,理解RNN中一个时间步的输出和隐藏状态:
传统RNN的优缺点总结如下:
优点:
- 可以处理任意长度的输入
- 模型大小不随输入的大小而增加
- 计算考虑了历史信息
- 权重是共享的
缺点:
- 计算速度慢
- 难以获取很久之前的信息(时间步太长时,会损失一些历史信息)
- 不能考虑当前状态的任何未来输入
RNNs的应用
RNN模型通常应用与NLP和语音识别领域,其不同应用总结如下表:
RNN PyTorch
- 官方文档:
https://pytorch.org/docs/stable/generated/torch.nn.RNN.html?highlight=rnn#torch.nn.RNN
- 中文文档:
https://pytorch-cn.readthedocs.io/zh/latest/package_references/torch-nn/#class-torchnnrnn-args-kwargssource
PyTorch-RNN介绍
- 将一个激活函数为
tanh
或ReLU
的多层的RNN
用于输入序列。
对输入序列中的每个元素,每层的计算公式如下,具体如图所示。如果参数nonlinearity
值为relu
,则使用RELU
作为激活函数。 参数说明
input_size
:输入x
的特征数量。hidden_size
:隐藏状态h
的特征数量。num_layers
:RNN层数。如,设置num_layers=2
表示将两个RNNs叠加在一起组成一个叠加的RNN,其中第二层的RNN接收第一层RNN的输出为输入并计算最终结果。默认值为1。nonlinearity
:指定非线性函数的使用。可以为tanh
或relu
。默认值为tanh
。bias
:若为False
,表示不使用偏置权重b_ih
和b_hh
。默认值为True
。batch_first
:若为True
,那么输入Tensor
的shape应该为(batch_size, seq_len, feature)
,输出也是这样。否则,shape应该为(seq_len, batch_size, feature)
。默认值为False
。dropout
:如果值为非0,那么除最后一层外,其他层的输出都会套上一个dropout
层,其dropout probability
即dropout率等于dropout
的值。默认值为0。bidirectional
:若为True
,则变为一个双向RNN。默认值为False
。
RNN的输入
(input, h_0)
input
:当batch_first=False
时,对于非batch输入,为shape为(seq_len, H_in)
的tensor
,对于batch输入,则为shape为(seq_len, batch_size, H_in)
的tensor
。input
可以是被填充的变长序列,具体参照官网。h_0
:初始隐藏状态。当batch_first=False
时,对于非batch输入,为shape为(num_directions*num_layers, H_out)
的tensor
,对于batch输入,则为shape为(num_directions*num_layers, batch, H_out)
。对于双向RNN,num_directions=2,否则值始终为1。
RNN的输出
(output, h_n)
output
:当batch_first=False
时,对于非batch输入,为shape为(seq_len, num_directions*H_out)
的tensor
,对于batch输入,则为shape为(seq_len, batch_size, num_directions*H_out)
的tensor
。如果输入是被填充过的序列,则输出也是被填充过的序列。h_n
:最后一层隐藏状态。对于非batch输入,为shape为(num_directions*num_layers, H_out)
的tensor
,对于batch输入,则为shape为( num_directions*num_layers, batch_size, H_out)
的tensor
一个时间步的输出为一个,就是竖直方向的,RNN的输出是包含所有时间步的输出,因此RNN的输出涉及seq_len
及num_layers
,因为每个时间步都有一个输出,且每个时间步的输出与层数有关。
一个时间步的每层都有一个隐藏状态,且会被下一个时间步接收,RNN输出的隐藏状态就是最后一个时间步的隐藏状态,因此只涉及层数num_layers
,而不涉及seq_len
。
RNN模型参数
weight_ih_l[k]
:第k
层的input-hidden
的可学习权重,当k=0时,其shape为(hidden_size, input_size)
,其他时候,shape为(hidden_size, num_directions*hidden_size)
。weight_hh_l[k]
:第k
层的hidden-hidden
的可学习权重,其shape为(hidden_size, hidden_size)
。bias_ih_l[k]
:第k
层的input-hidden
的可学习偏置,其shape为(hidden_size)
。bias_hh_l[k]
:第k
层的hidden-hidden
的可学习偏置,其shape为(hidden_size)
。
PyTorch的RNN没有为RNN的输出进行处理,即没有设置激活函数进行激活,没有相关的参数。
注意点
- 对于双向RNN,其前向和反向的方向值分别为0和1。例如,分割输出层的表示:
output.view(seq_len, batch, num_directions, hidden_size)
。
- 对于双向RNN,其前向和反向的方向值分别为0和1。例如,分割输出层的表示: