Pokemogo 2018-10-25
点击上方关注,All in AI中国
作者:yonatan hadar
数据科学家最重要的技能之一应该是为其问题选择正确的建模技术和算法。几个月前,我试图解决文本分类问题,即对与我的客户相关的新闻文章进行分类。
我只有几千个标记的例子,所以我开始使用简单的经典机器学习建模方法,如TF-IDF上的逻辑回归。这些模型通常适用于长文档(如新闻文章)的文本进行分类,在此任务上的执行效果略好于随机模型。
在调查了模型的错误之后,我发现单词表述包对于这个任务是不够的,我需要一个使用对文档的更深层次的语义理解模型。
深度学习模型在需要深入理解文本的复杂任务上表现出非常好的性能,如翻译、问题回答、总结、自然语言推理等,所以这似乎是一种很好的方法,但深度学习通常需要数十万个甚至数百万个训练标记的数据点,我只有一个规模小得多的数据集。
通常,我们需要大数据集进行深度学习以避免过度拟合。深度神经网络具有许多参数,因此通常如果它们没有足够的数据,它们往往会记住训练集,并且在测试集上表现不佳。为了避免没有大数据的这种现象,我们需要使用特殊技术。
在这篇文章中,我将展示一些我在文章、博客、论坛、Kaggle以及更多资源上找到的方法,以便在没有大数据的情况下更好地完成我的任务。其中许多方法都基于计算机视觉中广泛使用的最佳实践。
在此给同一个免责声明:我不是一个深度学习专家,这个项目是我第一个深度学习的大项目之一。这篇文章的所有内容都是基于我的经验,可能会对你的问题有不同的看法。
正则化
正则化方法是在机器学习模型内部以不同方式使用的方法,以避免过度拟合,这些方法具有强大的理论背景并且对于大多数问题以通用方式工作。
(1)L1和L2正则化
这些方法可能是很古老的,并且在许多机器学习模型中使用多年。在这种方法中,我们将权重大小添加到我们试图最小化的模型的损失函数中。这样,模型将尝试使权重变小,并且对模型没有帮助的权重将显着减小到零,并且不会影响模型。这样,我们可以使用更少数量的权重来模拟训练集。有关更多说明,您可以阅读这篇文章。
(2)Dropout
Dropout是另一种较新的正则化方法,它表明在训练期间,神经网络中的每个节点(神经元)都将被丢弃(权重将被设置为零),这种方式,网络不能依赖于特定的神经元或神经元的相互作用,必须学习网络不同部分的每个模式。这使得模型专注于推广到新数据的重要模式。
(3)早期停止
早期停止是一种简单的正则化方法,只需监控验证集性能,如果你发现验证性能不断提高,请停止训练。这种方法在没有大数据的情况下非常重要,因为模型往往在5-10个时期之后甚至更早的时候开始过度拟合。
(4)参数数量少
如果你没有大型数据集,则应该非常小心每层中的层数和神经元数量。此外,像卷积层这样的特殊图层比完全连接的图层具有更少的参数,因此在它们适合你的问题时使用它们非常有用。
数据增强(Data Augmentation)
数据增强(Data Augmentation)是一种通过以标签不变的方式更改训练数据来创建更多训练数据的方法。在计算机视觉中,许多图像变换用于增强数据集,如翻转、裁剪、缩放、旋转等。
图像数据增强示例
这些转换对于图像数据很有用,但不适用于文本,例如翻转像"狗爱我(dogs love I)"这样的句子不是一个有效的句子,使用它会使模型学习垃圾。以下是一些文本数据增强方法:
(1)同义词替换
在这种方法中,我们将文本中的随机单词替换为它们的同义词,例如,我们将句子"I like this movie very much"更改为"I love this film very much",它仍具有相同的含义,可能相同标签。这种方法不适合我,因为同义词具有非常相似的单词向量,因此模型将两个句子看作几乎相同的句子而不是扩充。
(2)回译(Back translation)
在这种方法中,我们采用我们的文本,将其翻译成具有机器翻译的中间语言,然后将其翻译回英语。该方法在Kaggle毒性挑战中成功使用。例如,如果我们将"我非常喜欢这部电影"翻译成俄语,我们会得到"Мне очень нравится этот фильм",当我们翻译成英文时,我们得到"我真的很喜欢这部电影"。反向翻译方法为我们提供了同义词替换,就像第一种方法一样,但它也可以添加或删除单词并解释句子,同时保留相同的含义。
(3)文档剪辑
新闻文章很长,在查看数据时,我看到不需要所有文章来分类文档。而且,我看到文章的主要想法通常会返回几次。这让我想到将文章剪辑为几个子文档作为数据增强,这样我将获得更多的数据。首先,我尝试从文档中抽取几个句子并创建10个新文档。这创建了没有句子之间逻辑关系的文档,所以我得到了一个糟糕的分类器。我的第二次尝试是将每篇文章分成5个连续句子。这种方法运行得非常好,给了我很好的性能提升。
(4)生成对抗性网络
生成对抗性网络(GAN)是数据科学中最令人兴奋的最新进展之一,它们通常用作图像创建的生成模型。这篇博客文章解释了如何使用生成对抗性网络(GAN)进行图像数据的数据增强,但它也可能用于文本。
迁移学习
迁移学习是指使用来自网络的权重,这些网络是针对你的问题通过另一个问题(通常是大数据集)进行训练的。迁移学习有时被用作某些层的权重初始化,有时也被用作我们不再训练的特征提取器。在计算机视觉中,从预先训练的Imagenet模型开始是解决问题的一种非常普遍的做法,但是自然语言处理(NLP)没有像Imagenet那样可以用于转移学习的非常大的数据集。
(1)预先训练的单词向量
自然语言处理(NLP)深度学习架构通常以嵌入层开始,该嵌入层将一个热编码字转换为数字向量表示。我们可以从头开始训练嵌入层,但我们也可以使用预训练的单词向量,如Word2Vec,FastText或Glove,这些单词向量使用无监督学习方法训练大量数据或训练我们域中的数据。预训练的单词向量非常有效,因为它们为基于大量数据的单词提供模型场景,并减少模型的参数数量,从而显著降低过度拟合的可能性。你可以在此处阅读有关单词嵌入的更多信息。
(2)预先训练的语言模型
最近的论文如ULMFIT,Open-AI变换器和BERT通过在规模非常大的语料库中预训练语言模型,为许多自然语言处理(NLP)任务获得了惊人的结果。语言模型是使用前面的单词预测句子中的下一个单词的任务。对我来说,这种预训练并没有真正帮助获得更好的结果,但文章已经展示了一些方法来帮助我更好地微调,我还没有尝试过。这是一个关于预训练语言模型的很好的博客。
http://ruder.io/nlp-imagenet/
(3)无监督或自我监督学习的预训练
如果我们有一个来自我们域的未标记数据的大型数据集,我们可以使用一种无监督的方法,如自动编码器或掩码语言模型,仅使用文本本身预训练我们的模型。对我来说更好的另一个选择是使用自我监督。自我监督模型是在没有工作人员注释的情况下自动提取标签的模型。一个很好的例子是Deepmoji项目。在Deepmoji中,作者训练了一个模型,用于从推文中预测表情符号,在表情符号预测中获得良好结果之后,他们使用他们的网络预先培训了一个获得最新结果的推特情感分析模型。表情符号预测和情绪分析显然非常相关,因此它作为预训练任务表现得非常好。新闻数据的自我监督任务可以预测新闻标题、报纸、评论数量、转发数量等。自我监督可以是一种非常好的预训方法,但通常很难分辨出哪个代理标签将与你的真实标签相关联。
(4)与其他公司网络一起进行预培训
在许多公司中,许多机器学习模型建立在相同的数据集或不同任务的类似数据集上。例如,对于推文,我们可以预测其主题、情绪、转发数量等。使用已经在使用的网络预先训练你的网络可能是最好的事情,对于我的任务,它可以提高性能。
特征工程
我知道深度学习"杀死"了特征工程,这样做有点过时了。但是,当你没有大数据时,帮助网络通过特征工程学习复杂模式可以大大提高性能。例如,在我对新闻文章的分类中,作者、报纸、评论、标签和更多特征的数量可以帮助预测我们的标签。
(1)多模式架构
我们可以使用多模式架构将文档级特征组合到我们的模型中。在多模式中,我们构建了两个不同的网络,一个用于文本,一个用于特征,合并它们的输出层(没有softmax)并添加更多的层。这些模型很难训练,因为这些特征通常比文本具有更强的信号,因此网络主要学习特征效果。这是关于多模式网络的伟大的Keras教程。这种方法使我的表现提高了不到1%。
https://becominghuman.ai/neural-networks-for-algorithmic-trading-multimodal-and-multitask-deep-learning-5498e0098caf
(2)单词级特征
另一种类型的特征工程是单词级功能,如词性标注、语义角色标记、实体提取等。我们可以将一个热编码表示或单词特征的嵌入与单词的嵌入相结合,并将其用作模型的输入。我们也可以在这个方法中使用其他单词特征,例如在情感分析任务中我们可以采用情绪字典并为嵌入添加另一个维度,其中1表示我们在字典中的单词,0表示其他单词,这样模型可以很容易地学习它需要关注的一些词。在我的任务中,我添加了某些重要实体的维度,这给了我一个很好的性能提升。
(3)预处理作为特征工程
最后一种特征工程方法是对输入文本进行预处理,以使模型更容易学习。一个例子是特殊的"阻止",如果体育运动对我们的标签不重要,我们可以改变足球、棒球和网球这个词为运动(sport),这将有助于网络了解运动之间的差异并不重要,可以减少数量网络中的参数。另一个例子是使用自动摘要。正如我之前所说的,神经网络在长文本上表现不佳,因此我们可以在文本上运行自动汇总算法,如"文本排名", 并且只给网络提供重要的句子。
我的模型
在我的例子中,在尝试了我在本文中讨论的方法的不同组合之后,最好的模型是本文中的分层注意网络,具有Dropout和早期停止作为正规化和文档剪辑作为数据增强。我使用预先训练过的单词向量和预训练来完成我的公司为同一数据为该客户所做的另一项任务。作为特征工程,我在单词嵌入中添加了单词级别特征。基本模型的这些变化使我的精确度提高了近10%,这使得我的模型从随机性稍微好一点到具有重要业务影响的模型。
https://www.cs.cmu.edu/~hovy/papers/16HLT-hierarchical-attention-networks.pdf
使用小数据的深度学习作为一个研究领域仍处于早期阶段,但是它看起来越来越流行,尤其是使用预先训练的语言模型,我希望研究人员和实践者能够找到更多的方法,使深度学习对每个数据集都有价值。