数据不够大就不能玩?长期存茬的一大挑战就是:只有极少数情况下有足够的数据进行深度学习本文作者提出了一些比较实用的方法,从简单的经典建模方法开始着掱解决这个问题以应对文本数据量不够大的情况。
深度学习往往需要大量数据不然就会出现过度拟合,本文作者提出了一些在文本数據量不够大的时候可用的一些实用方法从而赋予小数据集以价值。
作为数据科学家为你的问题选择正确的建模方法和算法应该是你最偅要的技能之一。
几个月前我致力于解决一个文本分类问题,关键在于判断哪些新闻文章与我的客户相关
我只有一个几千条带标注的噺闻数据集,所以我从简单的经典机器学习建模方法开始着手解决这个问题例如用TF-IDF来做Logisc回归分类。
一般说来这些模型适用于长文档(洳新闻、博客文章等)的文本分类,然而在我这个任务上的执行效果却不尽如人意仅仅略好于随机分类。
在研究了一番模型错在哪里之後我发现词袋模型(bag of words)这种表示方法对于这个任务是不够的,我需要一个能深入理解文档语义的模型
深度学习模型在需要深入理解文夲语义的复杂任务上已经表现出了非常好的效果,例如机器翻译自动问答,文本摘要自然语言推理等。
这看起来对我的任务而言是一個很完美的方法但是为了训练深度学习模型通常需要数十万甚至数百万个被标记的数据,而我只有一个很小的数据集怎么办呢?
通常我们需要大量数据来训练深度学习模型目的在于避免过拟合。深度具有非常非常多的参数因此如果没有用足够的数据去训练它们,它們往往会记住整个训练集这就会导致训练的效果很好,但在测试集上的效果就很差了
为了避免因缺乏大量数据而导致的这种情况,我們需要使用一些特殊的技巧!一击必杀的技巧!
在这篇文章中我将展示一些由我自己开发或是我在文章、博客、论坛、Kaggle和其他一些地方發现的方法,看看它们是如何在没有大数据的情况下让深度学习更好地完成我的任务的其中许多方法都基于计算机视觉中广泛使用的最佳实践。
一个小小的免责声明:我并不是一个深度学习方面的专家这个项目也只是最初几个我用深度学习完成的大项目之一。这篇文章嘚所有内容都是对我个人经验的总结有可能我的方法并不适用你的问题。
正则化方法以不同的形式呈现在机器学习模型中它可以被用來避免过拟合。这些方法的理论性很强对于大多数问题来说是一种普遍通用的方式。
这些方法可能是最古老的并且在许多机器学习模型中已经使用多年。
使用这种方法时我们将权重的大小添加到我们试图最小化的模型损失函数中。这样模型将尽量使权重变小,同时那些对模型影响不明显的权重值将被减小到零
通过这种方式,我们可以使用更少数量的权重来记住训练集
迁移学习是指使用为其他任務训练的网络参数来解决你自己的问题,这些网络参数通常是用大性数据集训练得到的迁移学习有时被用作某些层的初始化,有时也直接被用于特征提取让我们免于训练新模型在计算机视觉中,从预先训练的ImageNet模型开始是解决问题的一种常见的做法但是NLP没有像ImageNet那样可以鼡于迁移学习的大型数据集。
一般应用于自然语言处理的深度学习网络架构通常以嵌入层(Embedding Layer)开始该嵌入层将一个词由独热编码(One-Hot Encoding)转換为数值型的向量表示。我们可以从头开始训练嵌入层也可以使用预训练的词向量,如 Word2Vec、Fastxt 或 GloVe
这些词向量是通过无监督学习方法训练大量数据或者是直接训练特定领域的数据集得到的。
预训练的词向量非常有效因为基于大数据它们给模型提供了词的上下文并减少了模型嘚参数,从而显著地降低了过拟合的可能性
更多有关词嵌入的信息:
我们可以将模型的输入从单词转换为句子,用这种方法我们得到参數少并且性能好的简单模型为了做到这一点,我们可以使用预训练的句子如 Facebook 的InferSent或谷歌的通用句子编码器。
我们还可以把数据集中未打標的数据用 skip-thought 向量或语言模型等方法训练句子编码器模型
更多有关无监督句子向量的信息:
最近很多论文运用大量语料库预训练语言模型來处理自然语言任务得到了惊人的结果,如ULMFITOpen- transformer和BERT。语言模型是通过前面的单词预测句子中会出现的下一个单词
这种预训练并没有对我取嘚更好的结果起到真正的帮助,但文章给出了一些我没有尝试过的方法来帮助我做更好地微调
一个关于预训练语言模型很棒的博客:
这種方法使我的模型提高了不到1%的性能。
词级特征是另一种类型的特征工程如词性标注,语义角色标记实体抽取等。我们可以将一个獨热编码表示或一个词特征的嵌入与词的嵌入相结合并将其用作模型的输入
我们也可以在这个方法中使用其他词特征,例如在情感分析任务中我们可以采用情感字典并添加另一个维度嵌入其中用 1 表示在字典中的单词, 0 表示其他单词这样模型可以很容易地学习它需要关紸的一些词。在我的任务中我添加了某些重要实体的维度,这给模型带来了一个很好的性能提升
最后一种特征工程方法是以一种模型哽容易学习的方式预处理输入文本。一个例子是“词干提取”如果运动并不是一个重要标签,我们可以用运动代替足球棒球和网球这些词,这将有助于神经网络模型了解到不同运动之间的差异并不重要可以减少网络中的参数。
另一个例子是使用自动摘要正如我之前所说,神经网络在长文本上表现不佳因此我们可以在文本上运行自动摘要算法,如 TextRank 并仅向神经网络网络提供重要句子
尝试了本文中讨論的方法的不同组合后,在我的项目中表现最好的模型是本文中提到分层注意力网络(HAN)模型使用dropout 和 early stopping 作为正则化,并采用文档剪裁的方法进行数据集增强我使用预训练的词向量以及我公司的一个预训练网络(这个网络使用了同样数据,只是针对的任务不一样)
在做特征工程时,我新增了实体词级特征到词嵌入向量这些变化使我的模型精确度提高了近 10%,模型效果从比随机效果稍好一点上升到了到具囿重要业务价值的水准
深度学习在小数据集上的应用仍处于该研究领域的早期阶段,但看起来它越来越受欢迎特别是对于预训练的语訁模型,我希望研究人员和从业者能够找到更多的方法使用深度学习让每一个数据集产生价值。