RNN循环神经网络
如图所示为RNN的简单网络示意图,
![]() | ![]() |
图中展示了RNN中基础的链接结构,针对t时刻的隐状态,可以有下面公司进行计算:
其中, 是t时刻的隐藏状态,
是t时刻的输入,
表示激活函数
pytorch实现方式
nn.RNN(input_size, hidden_size, num_layers=1, nonlinearity=tanh, bias=True, batch_first=False, dropout=0, bidirectional=False)
参数解释如下:
- input_size:即输入特征的维度, 一般rnn中输入的是词向量,那么 input_size 就等于一个词向量的维度。
- hidden_size:即隐藏层神经元个数,或者也叫输出的维度(因为rnn输出为各个时间步上的隐藏状态)。
- num_layers:即网络的层数。
- nonlinearity:即激活函数。 Can be either
'tanh'
or'relu'
. Default:'tanh'
- bias:即是否使用偏置,If
False
, then the layer does not use bias weightsb_ih
andb_hh
. Default:True
, - batch_first:If
True
, then the input and output tensors are provided as(batch, seq, feature)
. Default:False
,即输入数据的形式,默认是 False,如果设置成True,则格式为(seq(num_step), batch, input_dim),也就是将序列长度放在第一位,batch 放在第二位。 - dropout:If non-zero, introduces a
Dropout
layer on the outputs of each RNN layer except the last layer, with dropout probability equal to :attr:dropout
. Default: 0,即是否应用dropout, 默认不使用,如若使用将其设置成一个0-1的数字即可。 - birdirectional:If
True
, becomes a bidirectional RNN. Default:False
,是否使用双向的 rnn,默认是 False。
实例解析:
构建一层的RNN网络
# 表示feature_len=100, hidden_len=20, 层数=1
rnn = nn.RNN(input_size=100,hidden_size=20,num_layers=1)
params=rnn._parameters
print(params.keys())
输出结果
odict_keys(['weight_ih_l0', 'weight_hh_l0', 'bias_ih_l0', 'bias_hh_l0'])
'weight_ih_l0'的形状 ——[20, 100] 'bias_ih_l0'的形状——[20]
'weight_hh_l0'的形状 ——[20, 20] 'bias_hh_l0'的形状——[20]
矩阵相乘将大小为100的输入向量变为大小为20的向量
构建多层的RNN网络
rnn = nn.RNN(input_size=100,hidden_size=20,num_layers=2)
params=rnn._parameters
print(params.keys())
输出结果
odict_keys(['weight_ih_l0', 'weight_hh_l0', 'bias_ih_l0', 'bias_hh_l0', 'weight_ih_l1', 'weight_hh_l1', 'bias_ih_l1', 'bias_hh_l1'])
'weight_ih_l0'的形状 ——[20, 100] 'bias_ih_l0'的形状——[20]
'weight_hh_l0'的形状 ——[20, 20] 'bias_hh_l0'的形状——[20]
'weight_ih_l1'的形状 ——[20, 20] 'bias_ih_l1'的形状——[20]
'weight_hh_l1'的形状 ——[20, 20] 'bias_hh_l1'的形状——[20]
第二层RNN单元以第一层输出为输入,大小均为[20,20],可以看出向量形状的变化是在第一层就完成的