1 TextCNN

TextCNN通过一维卷积来获取句子中n-gram的特征表示。TextCNN对文本浅层特征的抽取能力很强,在短文本领域如搜索、对话领域专注于意图分类时效果很好,应用广泛,且速度快,一般是首选;对长文本领域,TextCNN主要靠filter窗口抽取特征,在长距离建模方面能力受限,且对语序不敏感。

TextCNN/RCNN/LSTM/GRU

1.1 嵌入层(embedding layer)

textcnn使用预先训练好的词向量作embedding layer。对于数据集里的所有词,因为每个词都可以表征成一个向量,因此我们可以得到一个嵌入矩阵MM, MM里的每一行都是词向量。这个MM可以是静态(static)的,也就是固定不变。可以是非静态(non-static)的,也就是可以根据反向传播更新。

为什么采用不同大小的卷积核,不同的感受视野,卷积核的宽取词汇表的纬度,有利于语义的提取。

embedding layer分类:

  • CNN-rand

        作为一个基础模型,Embedding layer所有words被随机初始化,然后模型整体进行训练。

  • CNN-static

        模型使用预训练的word2vec初始化Embedding layer,对于那些在预训练的word2vec没有的单词,随机初始化。然后固定Embedding layer,fine-tune整个网络。

  • CNN-non-static

        同(2),只是训练的时候,Embedding layer跟随整个网络一起训练。

  • CNN-multichannel

        Embedding layer有两个channel,一个channel为static,一个为non-static。然后整个网络fine-tune时只有一个channel更新参数。两个channel都是使用预训练的word2vec初始化的。

1.2 Convolution Layer

文本卷积与图像卷积的不同之处在于只在文本序列的一个方向(垂直)做卷积,因此使用一维卷积

一维卷积带来的问题是需要设计通过不同 filter_size 的 filter 获取不同宽度的视野。

1.3 Pooling Layer

不同尺寸的卷积核得到的特征(feature map)大小也是不一样的,因此我们对每个feature map使用池化函数,使它们的维度相同。

1.3.1 One-Max Pooling

CNN中采用Max Pooling操作有几个好处:首先,这个操作可以保证特征的位置与旋转不变性,因为不论这个强特征在哪个位置出现,都会不考虑其出现位置而能把它提出来。但是对于NLP来说,这个特性其实并不一定是好事,因为在很多NLP的应用场合,特征的出现位置信息是很重要的,比如主语出现位置一般在句子头,宾语一般出现在句子尾等等。     其次,MaxPooling能减少模型参数数量,有利于减少模型过拟合问题。因为经过Pooling操作后,往往把2D或者1D的数组转换为单一数值,这样对于后续的Convolution层或者全联接隐层来说无疑单个Filter的参数或者隐层神经元个数就减少了。        再者,对于NLP任务来说,可以把变长的输入X整理成固定长度的输入。因为CNN最后往往会接全联接层,而其神经元个数是需要事先定好的,如果输入是不定长的那么很难设计网络结构。

        但是,CNN模型采取MaxPooling Over Time也有缺点:首先特征的位置信息在这一步骤完全丢失。在卷积层其实是保留了特征的位置信息的,但是通过取唯一的最大值,现在在Pooling层只知道这个最大值是多少,但是其出现位置信息并没有保留;另外一个明显的缺点是:有时候有些强特征会出现多次,出现次数越多说明这个特征越强,但是因为Max Pooling只保留一个最大值,就是说同一特征的强度信息丢失了。

1.3.2 Average Pooling

 

1.3.3 K-Max Pooling

取所有特征值中得分在Top –K的值,并(保序拼接)保留这些特征值原始的先后顺序(即多保留一些特征信息供后续阶段使用)

TextCNN/RCNN/LSTM/GRU

1.3.4 Dynamic Pooling之Chunk-MaxPooling

把某个Filter对应的Convolution层的所有特征向量进行分段,切割成若干段后,在每个分段里面各自取得一个最大特征值,比如将某个Filter的特征向量切成3个Chunk,那么就在每个Chunk里面取一个最大值,于是获得3个特征值。因为是先划分Chunk再分别取Max值的,所以保留了比较粗粒度的模糊的位置信息;当然,如果多次出现强特征,则也可以捕获特征强度。至于这个Chunk怎么划分,可以有不同的做法,比如可以事先设定好段落个数,这是一种静态划分Chunk的思路;也可以根据输入的不同动态地划分Chunk间的边界位置,可以称之为动态Chunk-Max方法。

 

2 TextRNN

尽管TextCNN能够在很多任务里面能有不错的表现,但CNN有个最大问题是固定 filter_size 的视野,一方面无法建模更长的序列信息,另一方面 filter_size 的超参调节也很繁琐。

 

 

3 TextRCNN

首先先解释一下为啥叫做 RCNN:一般的 CNN 网络,都是卷积层 + 池化层。这里是将卷积层换成了双向 RNN,所以结果是,两向 RNN + 池化层。

参考 https://blog.csdn.net/Kaiyuan_sjtu/article/details/84536256

https://zhuanlan.zhihu.com/p/42201550

3.1 模型框架

TextCNN/RCNN/LSTM/GRU

3.2 框架训练过程

3.2.1 Word Representation Learning

为了更准确地表达单词的意思,作者使用了单词本身和其上下文来表示这个词。在论文中,使用双向循环结构来实现。使用Cl(Wi)来定义词Wi左边的文本,Cr(Wi)来定义词右边文本。这里Cl(Wi)和Cr(Wi)是长度为|c|的稠密向量。从框架结构图中左边一块的箭头指向可以发现Cl(Wi)和Cr(Wi)的计算公式如下:

TextCNN/RCNN/LSTM/GRU

以“A sunset stroll along the South Bank affords an array of stunning vantage points” 这句话为例分析,结合上图,Cl(W7)表示了“Bank”这个词左侧的上下文语义信息(即“stroll along the South ”),同理,Cr(W7)表示了“Bank”这个词右侧的上下文语义信息(即“ affords an array ...”)。据此,我们就可以定义单词Wi的向量表示:

TextCNN/RCNN/LSTM/GRU

循环结构可以在文本的向前扫描时获取所有的Cl,在反向扫描时获取所有的Cr。时间复杂度为O(n)。当我们获得了单词Wi的表示Xi后,我们将一个线性变换与tanh**函数一起应用到Xi,并将结果传递到下一层。

TextCNN/RCNN/LSTM/GRU

y是一个潜在的语义向量,每一个语义因素都将被分析,以确定代表文本的最有用的因素。

3.2.2 Text Representation Learning

上面部分是单词的表示,那么怎么来提取文本的特征表示呢?作者在这里使用了CNN,当前面所有的单词表示y都计算出来以后,接上一个max-pooling层

TextCNN/RCNN/LSTM/GRU

这里的max函数是一个按元素max的函数,也就是说,前一步单词表达得到的y是一个n维向量,这一步y的第k个元素是上一步y的所有向量的第k个元素的最大值。池化层将不同长度的文本转换为固定长度的向量。通过使用池化层,我们可以在整个文本中捕获信息。还有其他类型的池层,比如平均池层(Collobert et al. 2011)。我们这里不使用平均池,因为这里只有几个单词和它们的组合对于捕获文档的含义非常有用。在文档中,最大池化层试图找到最重要的潜在语义因素。

模型的最后一部分是输出层:

TextCNN/RCNN/LSTM/GRU

最后对y应用softmax得到概率:

TextCNN/RCNN/LSTM/GRU

3 LSTM

3.1 LSTM模型结构

 

 

4 GRU

 

 

References

https://blog.csdn.net/pipisorry/article/details/85076712

【论文复现】使用RCNN进行文本分类

 

相关文章:

  • 2021-09-17
  • 2021-04-13
  • 2021-11-20
  • 2021-06-10
猜你喜欢
  • 2021-05-19
  • 2021-12-21
  • 2019-02-04
  • 2021-11-23
相关资源
相似解决方案