zoukankan      html  css  js  c++  java
  • NLP经典模型入门-TextRNN与TextRCNN

    前言:笔者之前是cv方向,因为工作原因需要学习NLP相关的模型,因此特意梳理一下关于NLP的几个经典模型,由于有基础,这一系列不会关注基础内容或者公式推导,而是更侧重对整体原理的理解。顺便推荐两个很不错的github项目——开箱即用的中文教程以及算法更全但是有些跑不通的英文教程

    一. RNN与LSTM

    RNN

    CNN与RNN的对比如上图所示,最大的区别是RNN的神经元之间彼此是关联的,因此RNN特别适合做序列模型。

    RNN的中间层每个神经元的计算公式如下所示:

    LSTM

    上面的公式中,激活函数一般使用sigmoid或者tanh。这就导致,在水平方向上,也很容易出现梯度弥散,而且后面的序列比较难获取前面序列的信息,因此出现了LSTM。LSTM是长短期记忆网络,核心就在于有上下两条之路。下路更关注短序列之间的信息传递,上路则更关注把信息传递得更长,LSTM的网络结构如下所示:

    LSTM的最小单元构成图和具体公式如下:


    x号是LSTM特有的门机制,它有两个输入,一个输入是原始信息,另一个输入则一般经过激活函数被约束到0~1之间、可以看做一个开关。两者相乘,原始信息会按照开关大小进行保留。先看(C_{t-1})经过的路线:

    • 最左面的x号,长时间记忆有多少保留了下来,开关多少由当前输入计算得来
    • 中间的+号,长时间记忆会把当前输入的信息添加进来,这里当前输入会自己同时产生原始信息并做开关,有点类似self-attention的做法
    • 最右面的x号,融合后的长时间记忆做开关,决定当前输入有多少流入下一层

    Bi-LSTM

    如上图所示。其实就是把序列正着来一遍然后反着来一遍,然后相同位置的输入拿出来直接连接在一起作为当前位置神经元的最终输出。可以更好地捕捉上下文信息。同理,RNN也可以搞双向,本质上只是模块不同,一个是LSTM模块另一个是RNN块。LSTM更先进一些。

    LSTM在Pytorch中可以直接使用:

    # define
    self.lstm = nn.LSTM(config.embed, config.hidden_size, config.num_layers,
    bidirectional=True, batch_first=True, dropout=config.dropout)
    ## num_layers: 若干个lstm堆叠
    ## hidden_size:中间隐藏的特征数量
    
    # use
    out, _ = self.lstm(embed)
    

    二. TextRNN与TextRCNN

    • TextRNN比较简单,一般在embedding后,接若干个lstm后直接接fc,然后计算损失函数即可。可以加入cat操作连缀embed和feature,具体操作间RCNN
    out = self.embedding(x)  # [batch_size, seq_len, embeding]
    out, _ = self.lstm(out)
    out = self.fc(out[:, -1, :])  # 句子最后时刻的 hidden state
    
    • TextRCNN的一个核心思想是引入最大池化层,模仿CNN的那种效果,并且使用双向的RNN(这里直接用更好的LSTM替代了)
    embed = self.embedding(x)  # [batch_size, seq_len, embeding]
    out, _ = self.lstm(embed)
    out = torch.cat((embed, out), 2) # seq_len固定,连缀特征长度
    out = F.relu(out)
    out = out.permute(0, 2, 1)
    out = self.maxpool(out).squeeze() # 此处seq_len会消失
    out = self.fc(out)
    
  • 相关阅读:
    fopen C++
    Jungle Roads(最小生成树+并查集)
    Magic Number(dp)
    error: macro names must be identifiers
    <errors>'MessageBoxA' : function does not take 1 parameter
    归并排序模板
    MFC程序出现“Debug Assertion Failed! File:afx.inl Line:177”错误
    构造函数初始化列表
    (Codeforces Round #136 (Div. 2))A. Little Elephant and Function(递归分析,简单)
    Argus(ZOJ Problem Set 2212)(优先队列)
  • 原文地址:https://www.cnblogs.com/lity/p/13454881.html
Copyright © 2011-2022 走看看