原文地址:

https://plushunter.github.io/2018/02/26/%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86%E7%B3%BB%E5%88%97%EF%BC%887%EF%BC%89%EF%BC%9ATextCNN%E8%B0%83%E5%8F%82%E6%8A%80%E5%B7%A7/

对于文本分类或者其他任务,我们在尝试复杂模型之前都要针对任务使用常见的简单模型做个baseline。对于文本分类而言fasttext和textcnn通常都是一个非常好的baseline。特别是fastext,使用简单,而且还是一个很强的baseline。对于textCNN来说,需要调的超参比较多。转的这篇文章翻译了Textcnn调参的综述文章。

这篇文章翻译自A Sensitivity Analysis of (and Practitioners’ Guide to) Convolutional Neural Networks for Sentence Classification

近年来,卷积神经网络在句子分类任务上取得了显著的成绩(Kim, 2014;Kalchbrenner et al .,2014),然而,这些模型要求从业者指定精确的模型结构与模型参数,例如,选择滤波器大小、正则化参数等等。目前尚不清楚对于句子分类的任务,不同的参数设定会对模型性能造成什么样的影响。因此,在这里我们对单层卷积神经网络进行情感分析,探索不同的参数对模型性能的影响;我们的目标是找出对语句分类来说的重要因素和不重要因素。由于一层的CNN结构简单,实验的表现也很好(Kim, 2014),我们就着重使用这个模型来验证(而不同更复杂的模型),从我们广泛的实证结果中得到一些了实用的建议,这些结果对于那些有兴趣用CNN对句子分类的人来说很有用。我们的实验结果所证实的一个重要结论是,研究人员应该记录性能差异,因为这可能是由于随机初始化或推理产生的。

一、Introduction

在这个工作中,我们关注的是情感分类的重要任务。最近,研究表明,神经网络(CNNs)对这项任务的表现很好(Kim, 2014; Kalchbrenner et al., 2014; Wang et al., 2015; Goldberg, 2015; Iyyer et al., 2015)。这类模型利用词的分布式表示,首先将包含每个句子转换成一个向量,从而形成一个矩阵作为输入给CNN(图1)。实证结果令人印象深刻。这些模型不需要太复杂就能实现强大的结果:例如,Kim(2014)提出了一种直接的单层CNN架构,它可以在多个任务中实现一致的(或类似的)结果。因此,现在有了令人信服的支持,更倾向于使用CNN而不是稀疏线性模型来进行句子分类任务。然而,CNN的一个缺点是,它们要求从业者指定要使用的精确模型架构,并设置超参数。同样的,做出这样的决定似乎是一种黑箱操作,特别是因为在模型中有许多“自由参数”可以探索。这与广泛用于文本分类的线性模型形成了鲜明的对比,例如正则化的逻辑回归和线性支持向量机(SVMs) (Joachims, 1998)。这样的模型特征通常是通过对文本的稀疏表示而产生的,并且需要相对较少的调优:通常只需要设置正则化项的系数(即:模型偏差)。使用训练数据进行线性搜索来确定参数是设置超参数的方法。

最近关于CNN的句子分类的研究,已经提供了用于实现报告结果的设置。然而这些参数设定是通过并非是特定的调参过程。但实际上,搜索CNN的参数空间是极其昂贵的,至少有两个原因:(1)训练这些模型的速度相对较慢,即使使用gpu。例如,在SST-1数据集(Socher et al., 2013)中使用与(Kim, 2014)类似的配置,进行10倍交叉验证,需要1个小时。可能的模型架构和超参数空间是巨大的。例如,我们所讨论的简单的CNN架构,至少需要指定以下内容:输入的词向量表示;滤波器大小;特征图的数量;激活功能;池化策略;dropout比例(如果有的话);和l2范数的系数(如果有的话)。

实际上,对所有这些参数进行调优是不可行的,尤其是考虑到参数估计所需的运行时间。因此,我们的目的是要根据经验来确定那些需要花费精力进行调整的参数,以及那些在性能上无关紧要的,或者在特定的数据集上有“最佳”效果的参数。我们从前人对神经模型的经验分析中得到启发,该模型由Coates et al.(2011)和Breuel (Breuel, 2015)进行,研究了非监督特征学习效果的影响因素,以及随机梯度下降(SGD)超参数对训练的影响。在这里,我们考虑了模型结构的配置和单层CNNs的超参数值对句子分类任务的影响。我们报告了大量实验的结果,探索了不同的模型结构,运行了7个句子分类数据集。

二、背景和预备

深度学习方法已在机器学习中得到很好的应用(LeCun et al., 2015;Bengio,2009)。对于图像和语音处理任务来说,它们尤其成功(也很受欢迎)。然而,最近这些方法已经开始超越传统的自然语言处理(NLP)任务的线性模型(Goldberg, 2015),这个领域的大部分兴趣都集中在如何得到分布式的词语表达(Bengio et al., 2003;Mikolov et al., 2013)并共同将这种“内部”表征嵌入到分类模型中(Col lobert and Weston, 2008;Collobert et al .,2011)或句子建模(Kalchbrenner et al., 2014;Socher et al .,2013)。

在(Kalchbrenner et al., 2014)中,作者构建了一个包含多个卷积层的CNN架构。他们的模型使用了动态k-max池。他们的模型假定潜在的、密集的、低维度的词向量(在推理之前初始化为随机值)。

Kim(2014)定义了一个更简单的架构,在相同的数据集上实现了类似的结果(Kalchbrenner et al., 2014)。这个模型也将每个单词都表示为一个稠密的、低维的向量(Mikolov et al., 2013),他们使用预先训练的词向量,并考虑两种方法:静态和非静态。在前一种方法中,词向量被视为静态输入,而在后一种方法中,则动态调整为特定任务的词向量。

在其他地方,Johnson和Zhang(2014)引入了相似的模型,但改用了高维的one-hot向量表示。他们考虑了这一方法的两种变体,seq-CNN和bow-CNN。前者完全保留了顺序结构(以在非常高维的空间输入空间中操作的代价),而后者保留了一些序列,但在小区域内丢失了顺序。他们的重点是更长的文本的分类,而不是句子(当然,这个模型也可以用于句子的分类)。Kim的体系结构相对简单——这与Johnson和Zhang(2014)所提出的基本相同,模块化的词向量——再加上在多个数据集上观察到的强大的经验性能,使得这是一个很有吸引力的句子分类方法。然而,在实践中,我们需要做一些模型架构决策和设置各种超参数。目前,很少有经验数据可以指导此类决定;解决这一差距是我们的目标。

2.1 CNN

我们首先描述我们在本文中使用的相对简单的CNN架构。我们从一个标记化的句子开始,然后我们将它转换成一个句子矩阵,其中的行根据每个词得到的单词向量。例如,这些可能是谷歌word2vec (Mikolov et al., 2013)或GloVe(Pennington et al., 2014)模型的输出。我们用d表示向量的维数。如果给定句子的长度(即词汇数)是s,然后句子的维数矩阵s×d.接下来,我们可以有效地将句子矩阵作为一个“图像”,通过线性滤波器对它进行卷积操作。在NLP应用中,数据具有固有的顺序结构。直观上,因为行表示离散的符号(即单词),所以使用宽度等于向量的维数的滤波器是合理的。(比如d)。然后我们可以考虑只改变滤波器的“高度”,它指的是共同考虑的相邻行数(词向量)。从这一点开始,我们将把滤波器的高度称为滤波器的区域大小。

假设有一个滤波器的参数化权向量w∈Rh×dw∈Rh×d和区域大小hh;ww包含要估计的h·dh·d个参数。我们用A∈Rs×dA∈Rs×d表示句子矩阵,并使用A[i,j]A[i,j]代表从第ii行到第jj行的子矩阵。卷积算子的输出序列是通过对A的子矩阵进行重复的卷积操作而得到的:

oi=w·A[i:i+h−1] (1)oi=w·A[i:i+h−1] (1)

其中,i=1….s−h+1i=1….s−h+1,..表示子矩阵和滤波器的点积(先对对应元素做乘法,然后求和),输出序列的长度为s−h+1s−h+1。再加上一个偏置项bb以及激活函数ff得到对应的特征图c∈Rs−h+1c∈Rs−h+1:

ci=f(oi+b)ci=f(oi+b)

注意,我们可以使用多个滤波器来实现相同的区域大小,目标是每个滤波器从相同的区域学习互补的特性。也可以指定多个不同区域大小的过滤器(例如:“高度”)。

每个滤波器生成的特征图的维数,正好是句子长度和滤波区域大小的函数。然后,将一个池化函数应用到每个feature map中,以减少需要估计的参数的尺寸和数量。通常,池化操作为1-max池函数(Boureau et al.,2010b),它从每个feature map生成一个一维特性。或者,可以将池化操作修改为在特征映射中在相同大小的区域内对每个区域对应的显著特征进行编码。每个滤波器映射生成的输出可以被连接到一个“顶部”特征向量,在1-max池的情况下它的大小将独立于单个的句子长度。然后通过一个softmax函数来生成这个表示,以生成最终的分类。在这个softmax层,可以选择应用“dropout策略”(Hinton et al., 2012)作为正则化方法。这需要在向量中随机设置一些值为0。我们也可以选择施加l2范数约束,当它超过这个值时,将向量的l2范数线性扩展到一个指定的阈值。在训练过程中,最小化的目标是分类的交叉熵损失,估计的参数包括滤波器的权向量(s)、激活函数中的偏置项,以及softmax函数的权向量。请注意,我们可以选择固定词向量(我们将其称为“static”)或作为模型的附加参数,并在模型训练过程中调整(我们将把这种方法称为“non-static”)。我们探索了这两种变体。图1提供了一个简单的示意图,以说明刚刚描述的模型架构。

三、数据集

我们使用同样的7个数据集(Kim, 2014),简要总结如下:

  • MR:句子极性数据集(Pang and Lee, 2005)。
  • SST-1: Stanford Sentiment Treebank (Socher et al., 2013)。请注意,为了使输入表示在任务中一致,我们只对句子进行训练和测试。与之形成对比的是(Kim, 2014),在这篇文章中,作者对短语和句子进行了训练。
  • SST-2:从SST-1派生而来,但只对两个类进行解析。我们只对句子进行训练和测试,不包括短语。
  • Subj:主观性数据集(Pang and Lee, 2005)。
  • TREC:问题分类数据集(Li and Roth, 2002)。
  • CR:客户审核数据集(Hu and Liu, 2004)。
  • MPQA:观点极性数据集(Wiebe et al., 2005)

在表1中,我们报告了所有七个数据集的平均长度和标记化语句的最大长度。有关这些数据集的更多细节,请参考(Kim, 2014)。

四、baseline模型的性能

为了给CNN的结果提供一个参考点,我们首先报告了使用稀疏正则化SVM进行句子分类的性能。我们使用unigram和bigram特性,只对所有数据集保持最频繁的3万个特征。我们还想通过将信息直接嵌入到这些模型中,来探索实现的相对收益。为此,我们用平均的单词向量(从谷歌word2vec3或GloVe4)来计算这个表达式,并计算出包含句子的单词,类似于(Lai et al., 2015)中的方法。然后,我们使用RBF-kernel SVM作为在这个稠密特性空间中操作的分类器。我们还尝试将unigram, bi-gram和word2vec作为句子的特征,使用线性支持向量机作为分类器。我们通过嵌套的交叉折叠验证来优化正则化超参数,从而提高了精度。对所有的数据集都进行了十折交叉验证,结果如表2所示。为了保持一致性,我们对之前工作中描述的数据使用相同的预处理步骤(Kim, 2014)。从这些结果中可以立即发现的一件事是,将word2vec输出引入到特征向量中可以实现性能提升。

五、CNN情感分析

我们现在报告的结果来自于我们的主要分析工作,目的是使用CNNs对句子情感分析,作为一个具体的架构和超参数设置的功能。为此,我们以baseline配置(如下所述)作为起点,该配置在之前的工作(Kim, 2014)中表现得很好。然后,我们依次探讨了修改该baseline配置组件的效果,并保持其他设置不变。

我们用“静态”和“非静态”两种词向量来进行实验。在前一种情况下,在训练过程中,单词向量不会被更新,而在后一种情况下,向量会不断调整。非静态配置优于静态配置。因此,本文只报告非静态结果,尽管我们提供了附录中静态配置的结果。

5.1 Baseline 参数设置

我们现在考虑CNN的baseline模型配置的性能。具体来说,我们从之前工作中使用的模型架构和超参数开始(Kim, 2014)。为了将由于各种体系结构决策和超参数设置导致的性能差异置于环境中,必须严格评估参数估计过程中的差异。不幸的是,尽管有一个高度随机的推理过程,但大多数之前的工作并没有说明这样的差异。该方差可归因于随机梯度下降(SGD)、随机dropout和随机权值参数初始化的估计。我们表明,通过10倍交叉验证计算的平均性能在重复运行时表现出较高的方差。

我们首先使用表3中描述的原始参数设置,并为每个数据集复制实验100次,其中每一个复制都是一个10倍的CV,并且复制的折叠是固定的。表3中的“ReLU”指的是整流线性单元(Maas et al., 2013),这是CNN常用的激活函数。我们记录每个重复试验的10折交叉验证的平均精度,并报告超过100次重复试验的平均值、最小值和最大值。我们对静态和非静态方法都这样做。这提供了一种我们可以观察到的不改变模型的方差的感觉。结果如表4所示。图2提供了在所有数据集上对这两种方法的100次重复的平均精度的密度图。为了清晰显示,我们排除了SST-1,因为在这个数据集上,精度明显降低(但是,结果可以在表中找到),由于我们对某些数据集进行了不同的分割和处理,正如前面所描述的那样,结果也与原来的不同。因为在这个工作中,我们只关心CNN的每个部分对性能的敏感性和影响,我们不太关心绝对的准确性,也不会比较我们在之前的作品中得到的结果。

在确定了CNNs的基准性能之后,我们现在考虑不同架构决策和超参数设置的影响。为此,我们保留所有其他的设置常量(如表3所示),并且只改变感兴趣的组件。对于我们所考虑的每一个配置,我们重复实验10次,每一次实验都是10折交叉验证。就像原始参数设置的100次重复试验一样,我们也报告了10次10折交叉验证试验的平均均值、最小均值和最大值。对于所有的实验,我们对数据使用与(Kim, 2014)相同的预处理步骤。类似地,我们使用ADADELTA更新规则 (Zeiler, 2012),并将minibatch大小设置为50。

5.2 word2vec

句子分类模型的一个很好的特性是,它以分布式的词语作为输入的形式开始,这是一种灵活的结构,它可以在不同的预先训练的词向量中交换。因此,我们首先探讨了CNNs对所使用的输入表示的句子分类的敏感性。特别地,我们用Glove表示替换谷歌word2vec。谷歌word2vec使用了一个局部上下文窗口模型,从谷歌新闻(Mikolov et al., 2013)中训练了1000亿单词,而GloVe则提出了一个模型,它利用了一个非常大的语料库(Pennington et al., 2014),利用全局单词的联合作用来统计数据。在本文中,我们使用了一个Glove版本,它是从一个包含8400亿个web数据标记的语料库中训练出来的,并且还有300个维度。我们保留所有其他设置与原始配置相同。我们的报告结果见表5。(请注意,我们还报告了SVM的结果,这些结果在表2中增加了平均Glove向量。)

作为获取对所有数据集最佳性能的潜在简单方法,我们还考虑了一种方法,该方法利用了这两种预先训练出来的表示方法。具体地说,我们将word2vec和Glove向量连接到每个单词,生成了600维的单词向量,我们将它们作为CNN的输入。预训练的向量可能并不总是适用于特定的单词(在word2vec或Glove中,或者两者都有);在这种情况下,我们随机初始化相应的子向量,如上所述。结果见表6。这里我们报告的结果只针对非静态变量,考虑到它的一般优势。

从这些结果中可以看出,使用Glove和word2vec时的相对性能取决于数据集,不幸的是,仅仅将这些表示连接起来并不一定有帮助。实际上,当面对一个新的数据集时,很可能需要使用训练数据来尝试不同的预先训练的单词向量。我们也尝试用长、稀疏的one-hot向量作为输入词表示(Johnson and Zhang, 2014)。在这个策略中,每个单词被编码成一个热矢量,它是一个稀疏的高维向量。在这种情况下,句子矩阵的宽度等于词汇量。在训练过程中,一个one-hot向量是固定的,因为这个方法就像它在一个预构建的字典中搜索每个单词一样。性能如表7所示。

将结果与word2vec和Glove的结果进行比较,我们可以看到在相同的CNN基本配置下,one-hot的性能比word2vec或Glove差。

我们不排除有特定配置的可能性,one-hot的CNN可能会比其他的输入表示的句子分类地更好。但我们这里的证据是,one-hot表示的CNN可能不适合句子分类。这可能是由于稀疏性;这些句子可能过于简短,不足以提供足够的信息来进行这种高维编码(而对于长文档来说,这可能不是一个问题)。

5.3 滤波器区域大小

我们首先将区域大小设为1来看看滤波器区域大小的效果,我们将这个区域的feature map的数量设置为100(与原来的配置一样)。我们考虑区域大小为1、3、5、7、10、15、20、25和30,并记录每个区域大小的10倍交叉验证的平均值、最小值和最大精度,并将结果显示在表8中。


图3显示了每个区域大小和区域大小为3时的10次重复实验的平均精度之间的差异。因为我们只对精确的趋势感兴趣,因为我们改变了CNN的区域大小或其他组件(而不是每个任务的绝对性能),我们只显示了从任意baseline的精度变化(这里,一个区域大小为3)。我们遵循本公约的所有数据,以方便解释。

从图中可以看出,每个数据集都有自己的最佳滤波区域大小范围。实际上,这表明在指定范围内执行粗网格搜索;这里的数据表明,句子分类的合理范围可能是2到25。然而,对于包含较长句子的数据集,例如CR(最大语句长度为105),最优区域的大小可能更大。这也可能是由于在CR中,在更大的窗口下,更容易预测正面/负面的客户评论。

我们还探讨了合并多个不同的过滤器区域大小的效果,同时保持每个区域大小的feature map的数量为100。在这里,我们发现将几个过滤器与区域大小接近最佳的单一区域大小可以提高性能,但是在最优范围之外添加区域大小可能会损害性能。例如,从图3可以看出,MR数据集的最佳单个区域大小是7。因此,我们将几个不同的过滤器区域大小结合到这个最优范围内,并将其与在此范围之外使用区域大小的方法进行比较。从表9可以看出,使用(5,6,7)和(7,8,9)和(6,7,8,9)——靠近最佳单一区域大小的集合——产生最好的结果。当与(3,4,5)baseline设置比较时,差异尤其明显。注意,即使只使用单个良好的过滤器区域大小(这里为7),结果也比组合不同的大小(3、4、5)更好。最佳的组合是简单地使用许多特征映射(这里为400),以及所有区域大小等于7,即最好的区域大小。

但是,我们注意到在某些情况下(例如,对于TREC数据集),使用多个不同的,但接近最优的区域大小表现最好。我们在表6的TREC数据集上使用几个区域大小提供了另一个示例性经验结果。从单个区域大小的性能来看,我们发现TREC的最佳单过滤区域大小是3和5,因此我们研究这些值附近的区域大小,并将其与使用多个区域大小的值进行比较。

这里我们看到(3,3,3)和(3,3,3)比(2,3,4)和(3,4,5)更差。然而,结果仍然表明,在最优的最佳区域尺寸附近的区域大小的组合比在最优的单一区域大小下使用多个区域的大小要好得多。此外,我们再次看到一个良好的区域大小(3)超过了几个次优区域大小(7、8、9)和(14、15、16)。

根据这些观察,我们认为这建议先进行粗线通过一个过滤器搜索区域大小找到最好的考虑数据集的大小,然后探索附近的几个区域大小的组合这最好的尺寸,包括结合不同的区域大小和副本的最优尺寸。

5.4 特征图数量

我们再次保持其他配置不变,因此有3个过滤器区域大小:3、4和5。我们只更改每个相对于100的baseline的特征映射的数量。我们考虑大小10,50,100,200,400,600,1000,2000。报告结果如图4所示。

每个过滤器区域大小的“最佳”feature map数量取决于数据集。然而,增加超过600个feature map,充其量只能带来边际收益,而且往往会损害业绩(可能是由于过拟合)。另一个重要的事实是,当feature map的数量增加时,需要更长的时间来训练模型。实际上,这里的证据表明,搜索范围可能在100到600之间。注意,当一个人面临一个新的类似的句子分类问题时,这个范围只是提供一个可能的标准。当然,有可能在某些情况下,超过600个特征图是有益的,但这里的证据表明,花费精力去探索这一点可能是不值得的。

5.5 激活函数

我们考虑了卷积层的七个不同的激活函数,包括:ReLU(根据baseline配置),双曲正切(tanh), Sigmoid函数(Maas et al., 2013), SoftPlus函数(Dugas et al., 2001), Cube function (Chen and Manning, 2014)和tanh Cube function (Pei et al., 2015)。我们使用“Iden”来表示原本函数,这意味着不使用任何激活函数。表15展示了使用不同的激活函数在非静态CNN中实现的结果。在9个数据集中,最好的激活函数是Iden、ReLU和tanh。在只有一个数据集(MPQA)中,SoftPlus函数的性能超过了其他函数。Sigmoid、Cube和tanh数据集始终比其他激活函数执行得更糟糕。因此,我们在这里不报告结果。tanh函数的性能可能是由于它的零中心特性(与Sigmoid相比)。ReLU与Sigmoid相比具有非饱和形式的优点,并且已经观察到可以加速SGD的收敛(Krizhevsky等,2012)。一个有趣的结果是,不应用任何激活函数(Iden)有时会有所帮助。这表明在一些数据集上,一个线性变换足以捕获单词嵌入和输出标签之间的相关性。然而,如果存在多个隐藏层,则Iden可能比非线性激活函数更不合适。实际上,对于单层CNNs中激活函数的选择,我们的研究结果表明对ReLU和tanh进行了实验,也可能是Iden。

5.6 池化


接下来我们研究了池化策略和池化区域大小的影响。我们将过滤器区域大小和特征映射的数量固定在baseline配置中,从而只改变池策略或池区域大小。在baseline参数设定中,我们对所有的feature map都使用了最大池化。得到长度为1的特征向量。但是,也可以在较小的相同大小的局部区域上执行池化操作,而不是在整个feature map (Boureau et al., 2011)上执行。feature map上的每个小区域都经过池化操作生成单个数字,并且这些数字可以连接成一个feature map对应的特征向量。下面的步骤与1-max池相同:我们将所有的特征向量连接在一起,形成分类层的单个特征向量。我们试验了大小为3、10、20和30的局部区域,并发现1-max池比所有局部最大池配置的性能好。所有的数据集都呈现了这个结果。我们还考虑了类似于k-max池化的策略(Kalchbrenner et al., 2014),其中从整个feature map中提取了最大的k个值,并保留了这些值的相对顺序。我们对k进行了探索,发现1-max池的性能最好,始终优于k-max池。

接下来,我们考虑取区域的平均值,而不是区域的最大值(Boureau等人,2010a)。我们保留了其余的参数。我们尝试了区域大小为 的局部平均池化。我们发现,至少在CR和TREC数据集上,平均池化比最大池化的性能差(很多)。由于在平均池下观察到的性能和运行时间非常慢,所以我们没有对所有数据集进行完整的实验。我们对池化策略的分析表明,1-max池化对句子分类任务的效果总是优于其他策略。这可能是因为预测上下文的位置无关紧要,而句子中的某些n-grams可以比共同考虑的整个句子更具预测性。

5.7 正则化

CNNs的两种常见正则化策略是dropout和l2范数。我们在这里探讨这些效应。从输入到倒数第一层应用Dropout。我们试验了从0.0到0.9的dropout比率,并根据baseline配置将l2范数约束固定到3。非静态CNN的结果如图5所示,0.5指定为baseline。我们也展示了当我们去掉了dropout和l2范数约束时(即不执行正则化时)的准确性,表示为None。另外,我们还考虑了l2正则对权重向量的影响,这些权重向量参数化了softmax函数。回想一下,当一个权重向量的l2范数超过这个阈值时,它是线性伸缩的,因此较小的c意味着更强的正则化。像dropout,这个策略只适用于倒数第一层。我们在图8中显示了不同c对非静态CNN的相对影响,我们将dropout率固定在0.5;3是这里的baseline模型的正则化参数,(再一次地,任意地)。

从图7和图8可以看出,根据数据集,非零的dropout比率可以帮助(尽管非常少)从0.1到0.5。但是,施加l2正则约束通常不会很大地提高性能(除了Opi),甚至对至少一个数据集(CR)的性能产生负面影响。我们还研究了在增加feature map的数量时dropout比率效应。我们将每个过滤器大小的feature map的数量从100增加到500,并将max l2正则约束设置为3。dropout比率的影响如图7所示。我们看到,drouout比率的影响几乎和特征图的数量是100的时候一样,而且没有多大帮助。但是我们观察到,对于数据集SST-1来说,当它是0.7时,dropout比率实际上是有帮助的。从图4可以看出,当feature map的数量大于100时,可能由于过拟合而影响了性能,所以在这个情况下dropout将会减轻这种影响。

我们也尝试了只在卷积层上应用“dropout”,但仍然将分类层的最大标准约束设置为3,使所有其他设置完全相同。这意味着我们在训练时随机将句子矩阵的元素设置为0,然后在测试时将p与句子矩阵相乘。从图8中可以看出,dropout比率对卷积层的影响如图8所示。我们再次看到,在卷积层上运用dropout帮助很小,而且很大的dropout率极大地伤害了性能。

总之,与现有的一些文献(Srivastava et al., 2014)相反,我们发现dropout对CNN的表现没有什么好处。我们将这一现象归因于一层CNN的参数数量比多层深度学习模型要小。另一种可能的解释是,使用词嵌入有助于防止过拟合(与基于单词的编码相比)。然而,我们并不是主张完全放弃正则化。实际上,我们建议将dropout率设置为一个小的值(0 -0.5),并使用一个相对较大的max正则约束,同时增加feature maps的数量,以查看更多的特性是否会有所帮助。当进一步增加feature map的数量似乎会降低性能时,增加dropout比率可能是值得的。

六、结论

我们对CNNs的句子分类进行了广泛的实验分析。我们总结了我们的主要发现,并从这些实际的指导中总结出了研究人员和实践者在现实场景中使用和部署cnn的方法。

6.1 主要实证结果的总结

  • 以前的工作往往只报告模型实现的数据集的平均性能。但是,这种忽略方差完全是由于随机推理过程所使用的。这可以是相当大的:保持所有的常数(包括折叠),因此方差是完全由随机推理过程决定的,我们发现,平均精度(通过10倍交叉验证计算)的范围可以达到1.5个点。在irony数据集上,AUC的范围甚至更大,达到3.4分(见表3)。在将来的工作中应该进行更多的复制,并且应该报告范围/方差,以防止可能的关于相对模型性能的错误结论。我们发现,即使将它们调到手边的任务,输入词向量表示(例如,在word2vec和Glove之间)的选择对性能有影响,但是不同的表示对不同的任务有更好的表现。至少对于句子分类来说,两者似乎都比直接使用one-hot向量要好。

  • 然而,我们注意到:(1)如果有一个足够大量的训练数据,结果可能就不是这样,以及(2)与这里的简单版本相比,最近由约翰逊和张提出的semi-supervised CNN模型(Johnson and Zhang, 2015)可能提高性能(Johnson and Zhang, 2014)。

  • 过滤区域的大小对性能有很大的影响,应该进行调整。

  • feature map的数量也可以在性能上扮演重要的角色,增加feature map的数量会增加模型的训练时间。

  • 1-max池一致优于其他池化策略。

  • 正则化对模型的性能影响较小。

6.2对从业人员的具体建议

根据我们的经验结果,我们提供了关于CNN架构和超参数的指南,为那些希望在句子分类任务中部署cnnn的从业者提供参考。

  • 考虑从表2中描述的基本配置开始,使用非静态word2vec或Golve,而不是one-hot矢量。但是,如果训练数据集的大小是非常大的,那么使用one-hot向量来探索可能是值得的。或者,如果一个人能够访问大量未标记的域内数据(Johnson和Zhang, 2015),也可能是一个选项。

  • 通过对单个过滤器区域大小的线性搜索来找到“最佳”的单一区域大小。一个合理的范围可能1至10。然而,对于像CR这样的长句的数据集,可能值得探索更大的过滤器区域大小。一旦确定了这一“最佳”区域大小,就可能值得探索将多个过滤器组合在一起,使用区域大小接近这个最佳大小的区域,因为根据经验,多个“好”区域大小总是优于仅使用单一最佳区域大小。

  • 将每个过滤器区域的特征映射的数量从100个更改为600个,并且在这个过程中,使用一个小的dropout比率(0 -0.5)和一个大的max正则约束。注意,增加feature map的数量会增加运行时间,因此需要权衡考虑。还要注意发现的最佳值是否在距离边界附近(Bengio, 2012)。如果最好的值接近600,那么尝试更大的值可能是值得的。

  • 如果可能,考虑不同的激活函数:ReLU和tanh是最好的整体候选。对于我们的一层CNN来说,完全没有激活函数是值得的。

  • 使用1-max池;似乎没有必要花费资源来评估替代战略。

  • 关于正则化:当增加feature map的数量开始减少性能时,试着施加更强的正则化,例如,dropout比率大于0.5。

  • 在评估模型的性能(或其特定配置)时,必须考虑方差。因此,应该重复交叉折叠验证过程,并考虑方差和范围。

当然,以上建议仅适用于包含有相似属性的句子的数据集。也许有一些与我们的发现背道而驰的例子。尽管如此,我们相信这些建议可能会为研究人员或实践者提供一个合理的起点,他们希望将简单的一层CNN应用到现实世界的句子分类任务中。我们强调,我们选择了这个简单的单层CNN,根据观察到的强大的经验性能,它将它定位为一个新的baseline模型,类似于词袋SVM和逻辑回归。因此,在实施更复杂的模型之前,应该考虑这种方法。

[转] TextCNN调参技巧的更多相关文章

  1. Deep learning网络调参技巧

    参数初始化 下面几种方式,随便选一个,结果基本都差不多.但是一定要做.否则可能会减慢收敛速度,影响收敛结果,甚至造成Nan等一系列问题.n_in为网络的输入大小,n_out为网络的输出大小,n为n_i ...

  2. [调参]CV炼丹技巧/经验

    转自:https://www.zhihu.com/question/25097993 我和@杨军类似, 也是半路出家. 现在的工作内容主要就是使用CNN做CV任务. 干调参这种活也有两年时间了. 我的 ...

  3. 01.CNN调参

    转载:调参是个头疼的事情,Yann LeCun.Yoshua Bengio和Geoffrey Hinton这些大牛为什么能够跳出各种牛逼的网络? 下面一些推荐的书和文章:调参资料总结Neural Ne ...

  4. xgboost&lightgbm调参指南

    本文重点阐述了xgboost和lightgbm的主要参数和调参技巧,其理论部分可见集成学习,以下内容主要来自xgboost和LightGBM的官方文档. xgboost Xgboost参数主要分为三大 ...

  5. 听说你不会调参?TextCNN的优化经验Tricks汇总

    前言:本篇是TextCNN系列的第三篇,分享TextCNN的优化经验 前两篇可见: 文本分类算法TextCNN原理详解(一) TextCNN代码详解(附测试数据集以及GitHub 地址)(二) 调优模 ...

  6. GBDT调参总结

    一.GBDT类库弱学习器参数 二.回归 数据集:已知用户的30个特征,预测用户的信用值 from sklearn.ensemble import GradientBoostingRegressor f ...

  7. Python中Gradient Boosting Machine(GBM)调参方法详解

    原文地址:Complete Guide to Parameter Tuning in Gradient Boosting (GBM) in Python by Aarshay Jain 原文翻译与校对 ...

  8. 【新人赛】阿里云恶意程序检测 -- 实践记录10.27 - TF-IDF模型调参 / 数据可视化

    TF-IDF模型调参 1. 调TfidfVectorizer的参数 ngram_range, min_df, max_df: 上一篇博客调了ngram_range这个参数,得出了ngram_range ...

  9. scikit-learn随机森林调参小结

    在Bagging与随机森林算法原理小结中,我们对随机森林(Random Forest, 以下简称RF)的原理做了总结.本文就从实践的角度对RF做一个总结.重点讲述scikit-learn中RF的调参注 ...

随机推荐

  1. 史上最全最详细JNDI数据源配置说明

    转: 史上最全最详细JNDI数据源配置说明 2017年08月05日 17:12:08 万米高空 阅读数 23983   版权声明:本文为博主原创文章,转载请注明出处,尊重劳动成果,谢谢~ https: ...

  2. Python实现计算圆周率π的值到任意位的方法示例

    Python实现计算圆周率π的值到任意位的方法示例 本文实例讲述了Python实现计算圆周率π的值到任意位的方法.分享给大家供大家参考,具体如下: 一.需求分析 输入想要计算到小数点后的位数,计算圆周 ...

  3. k8s local volume 和host path volume的区别

    k8s提供多种volume接口,其中local 和host path是容易混淆的两个接口.下面这篇文章解释了两者的区别: https://groups.google.com/forum/#!topic ...

  4. python3速查参考- python基础 3 -> -> while循环实例 + Continue && break的应用 + 列表的初步学习

    while语句的应用 实例如下: """ 述求:用户登录系统,最多只能登录三次 第三次失败后,程序终止 """ user_table = { ...

  5. 【Web】如何注释?

    HTML 形式:<!-- 注释内容 --> 实例: <!-- <p>这是第一段</p> --> CSS 形式:/* 注释内容 */ 实例: /* 选中i ...

  6. 【AMAD】django-social-auth -- 让django使用社交网络oauth鉴权变得极为轻松!

    简介 个人评分 简介 django-social-auth1集成的Oauth API包括: Google OpenID Google Oauth Google Oauth2 Yahoo OpenID ...

  7. pubwin扫描安装

    1,注意顺序 先安装一代 FS533 2,在安装精伦 3,在重新注册 PUBWIN 如果还不行一般是注册商没给注册好

  8. 什么是JWT(Json Web Token)

    什么是 JWT (Json Web Token) 用户认证是计算机安全领域一个永恒的热点话题. JWT 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519). 该to ...

  9. airflow_failover启动scheduler

    参考: https://github.com/teamclairvoyant/airflow-scheduler-failover-controller 1.stop failover2.stop s ...

  10. 【Python】【demo实验22】【练习实例】【猴子吃桃问题】

    原题: 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个.以后每天早上都吃了前一天剩下的一半零一个.到第10天早上想再吃时,见只 ...