一、简述

        循环神经网络(RNN)是一种专门设计用于处理序列数据的深度学习模型。与传统的神经网络(如全连接网络或卷积神经网络)不同,RNN具有“记忆”能力,它能够利用其内部状态(或称为“隐藏状态”)来存储和利用序列中先前信息,从而影响对当前输入的处理和未来输出的预测。

序列数据:后面的数据跟前面的数据有关系

二、分类

  • 按照输入和输出的结构进行分类:

    • N vs N - RNN
    • N vs 1 - RNN
    • 1 vs N - RNN
    • N vs M - RNN
  • 按照RNN的内部构造进行分类:

    • 传统RNN
    • LSTM
    • GRU

三、结构

名称由来:将每个token循环在一个神经元里

展开:

  • 每次输入两个值:上一个时间步的隐藏状态h0、当前状态的输入值input。
  • 每次输出两个值:输出当前时间步的隐藏状态hn、当前时间步的预测结果output。
  • 当前时间步输入与上一个时间步的输出加权求和作为本次输入
  • h表示隐藏状态,具有记忆功能:每次学习到上一个神经元的结果、规律(上下文语意信息),保存序列数据中的历史信息,并将这些信息传递给下一个时间步

四、API

传统rnn的激活函数使用tanh

# input_size:输入数据的维度,一般设为词向量的维度
# hidden_size:隐藏层h的维度,也是当前层神经元的输出维度
# num_layers: 隐藏层h的层数,默认为1
RNN = nn.RNN(input_size, hidden_size,num_layers)

output, hn = RNN(input, h0)

1. input的表示形式为[seq_len, batch_size, input_size],

即[句子的长度,batch的大小,词向量的维度] = [词语个数,句子的个数,词向量的维度]

2. h0的表示形式为[num_layers, batch_size, hidden_size],即[隐藏层的层数,batch的大小,隐藏层h的维度],h0的所有参数由RNN和input决定,h0一般是全零初始化。

五、规律

形状上:

1. output输出与输入的形状中 只有维度改变,

2. hn的 torch.Size([1, 1, 8]) = h0的size,

输出层面:

1. 单层(重要):hn的输出 = 每个样本的最后一个token的输出

2. 多层(少见):hn的最后一个层的输出 = 每个样本的最后一个token的输出

拓展深层理解

  1. 一个一个送样本和一次性送一批样本给模型结果是一样的(原因:内部经过矩阵运算)
  2. 省略h0与不省略的结果是一样的 (默认全零初始化,一般建议加上便于理解)
  3. 设置nn.RNN(batch_first=True)时,只为使语句通顺,此时input的数据形状改变为=(batch_size,seq_len,input_size)

六、优缺点

  • 优点
    • 结构简单
    • 资源要求低
    • 短序列任务表现好
  • 缺点
    • 不适用长序列任务
      • tanh导数0-1,会梯度消失 连乘会爆炸,训练失败
    • 串行
      • 无法提速
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐