胶囊网络(Capsule Network)在文本分类的探索

文本建模方法大致可以分为两类:(1) 忽略词序、对文本进行浅层语义建模(代表模型包括LDA,Earth Mover’s distance等;(2)考虑词序、对文本进行深层语义建模(深度学习算法,代表模型包括LSTM,CNN等)。对于深度神经网络算法,空间模式(spatial patterns)汇总在较低层,有助于表示更高层的概念(concepts)。例如,CNN卷积特征检测器提取来自局部的序列窗口的模式,并使用max-pooling来选择最明显的特征。然后,CNN分层地提取不同层次的特征模式。然而,CNN在对空间信息进行建模时,需要对特征检测器进行复制,降低了模型的效率。正如(Sabour et al, 2017)所论证的那样,这类方法所需复制的特征检测器的个数或所需的有标签训练数据的数量随数据维度呈指数增长。另一方面,空间不敏感的方法不可避免地受限于对丰富的文本结构(比如保存单词的位置信息、语义信息、语法结构等)进行有效地编码,缺乏文本表达能力。

最近,Hinton老师等提出了胶囊网络(capsulenetwork), 用神经元向量代替传统神经网络的单个神经元节点,以dynamic routing的方式去训练这种全新的神经网络,有效地改善了上述两类方法的缺点。正如在人类的视觉系统的推理过程中,可以智能地对局部和整体(part-whole)的关系进行建模,自动地将学到的知识推广到不同的新场景中。

然后到目前为止,并没用工作将capsule network应用于自然语言处理中(e.g.,文本分类) 。我们针对capsule network在文本分类任务上的应用做了深入研究。对于传统的分类问题,capsule network取得了较好性能(我们在6个benchmarks上进行了实验,capsulenetwork在其中4个中取得了最好结果)。更重要的是,在多标签迁移的任务上(fromsingle-label to multi-label text classification),capsulenetwork的性能远远地超过了CNN和LSTM。我们的工作已经发表在arxiv上,论文名为Investigating Capsule Networks withDynamic Routing for Text Classification。更多细节可以参考链接:https://arxiv.org/pdf/1804.00538.pdf。我们会在论文发表后公开源码。

文本主要研究胶囊网络在文本分类任务上的应用,模型的结构图如下:

其中,连续两个卷积层采用动态路由替换池化操作。动态路由的具体细节如下:

在路由过程中,许多胶囊属于背景胶囊,它们和最终的类别胶囊没有关系,比如文本里的停用词、类别无关词等等。因此,我们提出三种策略有减少背景或者噪音胶囊对网络的影响。

  1. Orphan类别:在胶囊网络的最后一层,我们引入Orphan类别,它可以捕捉一些背景知识,比如停用词。在视觉任务加入Orphan类别效果比较有限,因为图片的背景在训练和测试集里往往是多变的。然而,在文本任务,停用词比较一致,比如谓词和代词等。
  2. Leaky-Softmax:除了在最后一层引入Orphan类别,中间的连续卷积层也需要引入去噪机制。对比Orphan类别,Leaky-Softmax是一种轻量的去燥方法,它不需要额外的参数和计算量。
  3. 路由参数修正:传统的路由参数,通常用均与分布进行初始化,忽略了下层胶囊的概率。相反,我们把下层胶囊的概率当成路由参数的先验,改进路由过程。

在ablation test中,我们对改进的路由和原始路由方法进行对比,如下:

此外,为了提升文本性能,我们引入了两种网络结构,具体如下:

数据集:为了验证模型的有效性,我们在6个文本数据集上做测试,细节如下:

在实验中,我们和一些效果较好的文本分类算法进行了对比。由于本文的重点是研究capsule network相对已有分类算法(e.g., LSTM, CNN)是否有提升,我们并没用与网络结构太过复杂的模型进行对比。实验结果如下:

此外,我们重点进行了多标签迁移实验。我们将Rueter-21578数据集中的单标签样本作为训练数据,分别在只包含多标签样本的测试数据集和标准测试数据集上进行测试。详细的数据统计以及实验结果如下图所示。从表中我们可以看出,当我们用单标签数据对模型进行训练,并在多标签数据上进行测试时,capsule network的性能远远高于LSTM、CNN等。

此外,我们还做了case study分析,发现路由参数可以表示胶囊的重要性,并对胶囊进行可视化(此处我们主要可视化3-gram的结果)。具体来说,我们删除卷积胶囊层,将primary capsule layer直接链接到fully-connectedcapsule layer,其中primary capsule 代表了N-gram短语在capsule里的形式,capsule之间的连接强度代表了每个primary capsule在本文类别中的重要性(比较类似并行注意力机制)。由图我们可以看出,对于Interest Rate类别,months-interbank-rate等3- grams其着重要作用。

致谢: 感谢jhui和苏剑林,他们的文章启发了我们的工作。感谢naturomics和gyang274的开源代码,让我们开发过程变得高效。

https://jhui.github.io/2017/11/14/Matrix-Capsules-with-EM-routing-Capsule-Network/

https://spaces.ac.cn/archives/4819

https://github.com/bojone/Capsule

https://github.com/naturomics/CapsNet-Tensorflow

原文发布于微信公众号 - 腾讯知文(tencent_wisdom)

原文发表时间:2018-04-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Phoenix的Android之旅

Java 集合 Vector

List有三种实现,ArrayList, LinkedList, Vector, 它们的区别在于, ArrayList是非线程安全的, Vector则是线程安全...

662
来自专栏后端之路

LinkedList源码解读

List中除了ArrayList我们最常用的就是LinkedList了。 LInkedList与ArrayList的最大区别在于元素的插入效率和随机访问效率 ...

19410
来自专栏刘君君

JDK8的HashMap源码学习笔记

3008
来自专栏Hongten

ArrayList VS Vector(ArrayList和Vector的区别)_面试的时候经常出现

1682
来自专栏学海无涯

Android开发之奇怪的Fragment

说起Android中的Fragment,在使用的时候稍加注意,就会发现存在以下两种: v4包中的兼容Fragment,android.support.v4.ap...

3155
来自专栏java闲聊

JDK1.8 ArrayList 源码解析

当运行 ArrayList<Integer> list = new ArrayList<>() ; ,因为它没有指定初始容量,所以它调用的是它的无参构造

1192
来自专栏MelonTeam专栏

ArrayList源码完全分析

导语: 这里分析的ArrayList是使用的JDK1.8里面的类,AndroidSDK里面的ArrayList基本和这个一样。 分析的方式是逐个API进行解析 ...

4479
来自专栏xingoo, 一个梦想做发明家的程序员

AOE关键路径

这个算法来求关键路径,其实就是利用拓扑排序,首先求出,每个节点最晚开始时间,再倒退求每个最早开始的时间。 从而算出活动最早开始的时间和最晚开始的时间,如果这两个...

2507
来自专栏计算机视觉与深度学习基础

Leetcode 114 Flatten Binary Tree to Linked List

Given a binary tree, flatten it to a linked list in-place. For example, Given...

1938
来自专栏xingoo, 一个梦想做发明家的程序员

Spark踩坑——java.lang.AbstractMethodError

百度了一下说是版本不一致导致的。于是重新检查各个jar包,发现spark-sql-kafka的版本是2.2,而spark的版本是2.3,修改spark-sql-...

1200

扫码关注云+社区