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