当前位置:   article > 正文

自然语言处理(NLP)入门(4)——传统RNN模型_rnn时间步压缩

rnn时间步压缩

RNN经典模型

  • 定义: 循环神经网络
    在这里插入图片描述

  • 结构: 输入层 —> 隐藏层—> 输出层

  • 时间步的概念: 单词在rnn中循环的过程, 一个样本中有多少个单词就循环多少次, 每次循环的过程可以看做是一个时间步, 上一个时间步是可以作为下一个时间步的输入, 进行信息提取.

    • 我 爱 北 京 天 安 门 字符级别
    • 我 爱 北京 天安门 词符级别
  • RNN的作用领域: 在序列问题上可以很好的解决业务逻辑, 文本分类, 意图识别, 机器翻译等任务.

  • RNN分类

    • 输入和输出分类
      • N vs N - RNN —> 常见场景: 简单诗句的生成
      • N vs 1 - RNN —> 常见场景: 意图识别的场景, 文本分类
      • 1 vs N - RNN —> 常用场景: 给图片配置描述语句
      • N vs M - RNN—> 常见场景: seq2seq任务类型
        • 结构: 编码器 —c-- 解码器 例子: 机器翻译
          • 欢迎 来 北京 Welcome to Beijing 3-3
    • 内部结构划分
      • RNN
      • LSTM
      • GRU
      • BI-LSTM
      • BI-GRU
  • RNN内部结构
    在这里插入图片描述

    • 需要将输入和隐层进行concat操作(融合) 经过tanh之后进行输出

    • tanh的作用(why):将数据调节到-1到1之间, 帮助调节流经网路的值

    • 如果实现RNN操作(how):

    -在这里插入图片描述

    '''
    第一个参数:input_size(输入张量x的维度)
    第二个参数:hidden_size(隐藏层的维度, 隐藏层的神经元个数)
    第三个参数:num_layer(隐藏层的数量)
    '''
    rnn = nn.RNN(5, 6, 2) #A
    '''
    第一个参数:sequence_length(输入序列的长度)
    第二个参数:batch_size(批次的样本数量)
    第三个参数:input_size(输入张量的维度)
    '''
    # 一个批次有三个样本(三个句子),每个样本中有两个字/词, 每个字/词被映射到5的维度
    input = torch.randn(2, 3, 5) #B
    '''
    第一个参数:num_layer * num_directions(层数*网络方向)
    第二个参数:batch_size(批次的样本数)
    第三个参数:hidden_size(隐藏层的维度, 隐藏层神经元的个数)
    '''
    h0 = torch.randn(2, 3, 6) #C
    output, hn = rnn(input, h0)
    print('output---',output)
    print('outputshape==',output.shape) #torch.Size([1, 3, 6])  1--》 seq_length 3 --batch_size 6 -- 隐藏层节点
    print('hn----',hn)
    print('hnshape===',hn.shape) # torch.Size([1, 3, 6])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • tanh的导数值域[0, 1] 如果w小于1 那么他们乘积小于1 w = w-lr△—> 梯度消失
    • tanh的导数值域[0, 1] 如果w比较大 那么他们乘积大于1 梯度非常大—. 梯度爆炸
    • 梯度消失和爆炸的危害: 导致模型训练失败.
  • LSTM内部结构[长短时记忆结构]

    • (What)结构: 遗忘门 输入门 输出门 细胞转态

    在这里插入图片描述

    遗忘门:

    在这里插入图片描述

    输入门:

    在这里插入图片描述

    细胞状态:

    在这里插入图片描述

    输出门:

    在这里插入图片描述

    • (how) pytorch编码:

      # '''
      # 第一个参数:input_size(输入张量x的维度)
      # 第二个参数:hidden_size(隐藏层的维度, 隐藏层的神经元个数)
      # 第三个参数:num_layer(隐藏层层数)
      # '''
      # lstm = nn.LSTM(5, 6, 2, batch_first=True) # bidirectional=True 设置双向
      lstm = nn.LSTM(5, 6, 2) # bidirectional=True 设置双向
      # '''
      # 第一个参数:sequence_length(输入序列的长度)
      # 第二个参数:batch_size(批次的样本数量)
      # 第三个参数:input_size(输入张量x的维度)
      # '''
      input = torch.randn(3, 5, 5)
      # '''
      # 第一个参数:num_layer * num_directions(隐藏层层数*方向数)
      # 第二个参数:batch_size(批次的样本数量)
      # 第三个参数:hidden_size(隐藏层的维度)
      # '''
      h0 = torch.randn(2, 3, 6)
      c0 = torch.randn(2, 3, 6)
      # # 将input1,  h0, c0输入到lstm中, 输出结果
      output, (hn, cn) = lstm(input, (h0, c0))
      # # print(output)
      print('lstmoutput===',output.shape)
      # # print(hn)
      print('lstmhn===',hn.shape)
      # # print(cn)
      print('lstmcn===',cn.shape)
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
    • lstm优势或劣势:

    • GRU内部结构[门控循环单元]

      • (What)结构: 更新门 重置门

        在这里插入图片描述

      • (how)代码实现同RNN和LSTM

      • 优势:

        • 有效缓解梯度消失和梯度爆炸, 计算复杂度比RNN大但是比LSTM要小
      • 缺点: 不能进行并行运算.

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号