MENU

循环神经网络

August 7, 2023 • Read: 74 • Deep Learning阅读设置

RNN

RNN循环神经网络,也称为RNNs,是一类能够在具有隐藏状态时,将之前的输出作为输入的神经网络。

传统RNN的网络架构

RNN通常如下所示:
2023-08-07T10:05:52.png
2023-08-07T10:10:18.png

对于每个时间步t,其激活即隐藏状态(activation)a和输出(output)y的表达式如下:
2023-08-07T10:14:05.png
W都是共享的参数,g是激活函数。
2023-08-07T10:30:03.png

具体可参照如下图,理解RNN中一个时间步的输出和隐藏状态:
2023-08-07T10:21:33.png

传统RNN的优缺点总结如下:

  • 优点:

    • 可以处理任意长度的输入
    • 模型大小不随输入的大小而增加
    • 计算考虑了历史信息
    • 权重是共享的
  • 缺点:

    • 计算速度慢
    • 难以获取很久之前的信息(时间步太长时,会损失一些历史信息)
    • 不能考虑当前状态的任何未来输入
      2023-08-07T10:25:44.png

RNNs的应用

RNN模型通常应用与NLP和语音识别领域,其不同应用总结如下表:
2023-08-07T10:27:18.png
2023-08-07T10:27:38.png
2023-08-07T10:27:57.png

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介绍

  • 将一个激活函数为tanhReLU的多层的RNN用于输入序列。
    对输入序列中的每个元素,每层的计算公式如下,具体如图所示。如果参数nonlinearity值为relu,则使用RELU作为激活函数。
    2023-08-07T11:54:38.png
  • 参数说明

    • input_size:输入x的特征数量。
    • hidden_size:隐藏状态h的特征数量。
    • num_layers:RNN层数。如,设置num_layers=2表示将两个RNNs叠加在一起组成一个叠加的RNN,其中第二层的RNN接收第一层RNN的输出为输入并计算最终结果。默认值为1。
    • nonlinearity:指定非线性函数的使用。可以为tanhrelu。默认值为tanh
    • bias:若为False,表示不使用偏置权重b_ihb_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)tensorinput可以是被填充的变长序列,具体参照官网。
    • 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_lennum_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)