实战经验分享-少量数据NLP场景下进行深度学习训练的建议

实战经验分享-少量数据NLP场景下进行深度学习训练的建议插图

    作为数据科学家,最重要的技能之一应该是为你的问题选择正确的建模技术和算法。 几个月前,我试图解决文本分类问题,即分类哪些新闻文章与我的客户相关。

    我只有几千个带标记的例子,所以我开始使用简单的经典机器学习建模方法,如基于TF-IDF上的Logistic回归。 这些模型通常适用于长文档(如新闻文章)的文本分类,在此任务上的执行效果略好于随机。

    在调查了我的模型的错误之后,我发现一堆单词表示对于这个任务是不够的,我需要一个模型,它将使用对文档的更深层次的语义理解。

    深度学习模型在复杂任务上表现出非常好的表现,这些任务需要深入理解翻译,问答,摘要,自然语言推理等文本。所以这似乎是一种很好的方法,但深度学习通常需要数十万甚至数百万的带标记的训练数据,而我只有一个小得多的数据集。

    通常,我们需要大数据集进行深度学习以避免过拟合。 深度神经网络具有许多参数,因此通常如果它们没有足够的数据学习,它们往往会记住训练集并且在测试集上表现不佳。 为了避免没有大数据的这种现象,我们需要使用一些特殊技术。

    在这篇文章中,我将展示我在文章,博客,论坛,Kaggle和更多资源上发现的一些方法,或者由我自己开发的一些技术,以便在没有大数据的情况下更好地完成我的任务。 其中许多方法都基于计算机视觉中广泛使用的技术。


正则

    正则化方法是在机器学习模型内部以不同方式使用的方法,以避免过拟合,这些方法具有强大的理论背景并且对于大多数问题都通用。


L1和L2正则化

    这些方法可能是最古老的,并且在许多机器学习模型中使用多年。 在这种方法中,我们将权重大小添加到我们试图最小化的模型的损失函数中。 这样,模型将尝试使权重变小,并且对模型没有帮助的权重将显着减小到零,并且不会影响模型。 这样,我们可以使用更少数量的权重来模拟训练集。 有关更多说明,请阅读这个帖子(https://towardsdatascience.com/only-numpy-implementing-different-combination-of-l1-norm-l2-norm-l1-regularization-and-14b01a9773b)。

实战经验分享-少量数据NLP场景下进行深度学习训练的建议插图1


Dropout

    Dropout是另一种较新的正则化方法,它表明在训练期间,神经网络中的每个节点(神经元)都有可能被丢弃(权重将被设置为零),这种方式,网络不能依赖于特定的神经元或神经元的相互作用,必须学习网络不同部分的每个模式。 这使得模型专注于可以inference到新数据的重要模式。


提早停止(Early Stopping)

    Early Stopping是一种简单的正则化方法,只需监控验证集的性能,如果你发现验证性能不再提高,请停止训练。 这种方法在没有大数据的情况下非常重要,因为模型在5-10个epochs之后甚至更早的时候往往会过拟合。

实战经验分享-少量数据NLP场景下进行深度学习训练的建议插图2

     

少量参数

    如果你没有大数据集,则应该非常小心每层中的层数和神经元数量。 此外,像卷积层这样的特殊layer比全连接的layer具有更少的参数,因此更适合。


     

数据扩充

(Data Augmentation)

    数据扩充是一种通过以标签不变的方式更改训练数据来创建更多训练数据的方法。 在计算机视觉中,许多图像变换用于增强数据集,如翻转,裁剪,缩放,旋转等。

实战经验分享-少量数据NLP场景下进行深度学习训练的建议插图3

图像数据扩充示例

    这些转换对于图像数据很有用,但不适用于文本,例如翻转像“dog love me”这样的句子不是一个有效的句子,使用它会使模型学习垃圾数据。 以下是一些文本数据扩充方法。


同义词替换

    在这种方法中,我们用他们的同义词替换我们文本中的随机单词,例如,我们将句子“I like this movie very much”更改为“I love this movies very much”,它仍具有相同的含义,相同的标签。 这种方法对我的任务来说不起作用,因为同义词具有非常相似的单词向量(上下文语境相似),因此模型将两个句子看作几乎相同的句子而不是扩充。


Back Translation

    在这种方法中,将我们的文本使用机器翻译技术翻译成一个中间语言,然后将其反向翻译回英语。 该方法在Kaggle toxic评论挑战中成功使用。 例如,如果我们将“I like this movie very much”翻译成俄语,我们会得到“Мнео чень нравится этот фильм”,当我们翻译成英文时,我们得到“I really like this movie ”。反向翻译方法为我们提供了同义词替换,就像第一种方法一样,但它也可以添加或删除单词并解释句子,同时保留相同的含义。


Document Cropping(裁剪)

    新闻文章通常很长,在查看数据时,我看到我不需要所有文章来分类文档。 而且,我看到文章的主要思想通常会重复好几次。 这让我想到将文章裁剪为几个子文档作为数据扩充,这样我将获得更多的数据。 首先,我尝试从文档中抽取几个句子并创建10个新文档。 这创建了没有句子之间逻辑关系的文档,所以我得到了一个糟糕的分类器。 我的第二次尝试是将每篇文章分成5个连续句子。 这种方法运行得非常好,给了我很好的性能提升。


生成对抗性网络

    GAN是数据科学中最令人兴奋的最新进展之一,它们通常用作图像创建的生成模型。本文(https://towardsdatascience.com/generative-adversarial-networks-for-data-augmentation-experiment-design-2873d586eb59)解释了如何使用GAN进行图像数据的数据扩充,但它也可以用于文本。

     

迁移学习

    转移学习是指使用来自网络的权重,这些网络是针对你的问题通过另一个问题(通常是大数据集)进行训练的。 迁移学习有时被用作某些层的权重初始化,有时也被用作我们不再训练的特征提取器。 在计算机视觉中,从预先训练的Imagenet模型开始是解决问题的一种非常常见的做法,但是NLP没有像Imagenet那样可以用于迁移学习的非常大的数据集。

实战经验分享-少量数据NLP场景下进行深度学习训练的建议插图4

     

预先训练的单词向量

    NLP深度学习架构通常以Embedding层开始,该embedding层将一个one-hot 编码字转换为数字矢量表示。 我们可以从头开始训练embedding层,但我们也可以使用预训练的单词向量,如Word2Vec,FastText或Glove,这些单词向量使用无监督学习方法通过训练大量数据学习到的。 预训练的单词向量非常有效,因为它们为基于大量数据的单词提供模型上下文,并减少模型的参数数量,从而显着降低过拟合的可能性。

实战经验分享-少量数据NLP场景下进行深度学习训练的建议插图5

     

预先训练的句子向量

    我们可以将模型的输入从单词更改为句子,这样我们可以使用较小的模型,其中参数数量较少,仍然具有足够的表达能力。 为了做到这一点,我们可以使用Facebook等预先训练好的句子编码器   InferSent  (https://github.com/facebookresearch/InferSent)或谷歌   通用句码编码器(https://tfhub.dev/google/universal-sentence-encoder/1) 。 我们还可以使用skip-thought向量或语言模型等方法训练来自我们域的未标记数据的句子编码器。 


预先训练的语言模型

    最近的论文如   ULMFIT (https://arxiv.org/abs/1801.06146),   Open-AI Transformer (https://blog.openai.com/language-unsupervised/),和   BERT(https://arxiv.org/abs/1810.04805v1)通过在非常大的语料库中预训练语言模型,获得了许多NLP任务的惊人结果。 语言模型是使用前面的单词预测句子中的下一个单词的任务。 对我来说,这种预训练并没有真正帮助获得更好的结果,但文章已经展示了一些方法来帮助我更好地微调模型,我还没有尝试过。关于预训练语言模型的精彩博客可以参考这里(http://ruder.io/nlp-imagenet/)。


无监督或自监督学习的预训练

    如果我们有一个来自我们域的未标记数据的大型数据集,我们可以使用无监督的方法,如自动编码器或masked语言模型,仅使用文本本身预训练的模型。 对我来说更好的另一个选择是使用自监督学习。 自监督学习模型是在没有人类注释的情况下自动提取标签的模型。 一个很好的例子是Deepmoji项目。 在Deepmoji中,作者训练了一个模型,用于从推文中预测表情符号,在表情符号预测中获得良好结果之后,他们使用他们的网络预训练了一个获得最新结果的高音扬声器情绪分析模型。 表情符号预测和情绪分析显然非常相关,因此它作为预训练任务表现得非常好。 新闻数据的自监督学习任务可以预测标题,报纸,评论数量,转发数量等。 自监督学习可以是一种非常好的预训练方式,但通常很难分辨出哪个代理标签将与你的真实标签相关联。


基于多任务一起进行预训练

    在许多公司中,许多机器学习模型建立在相同的数据集或不同任务的类似数据集上。 例如,对于tweets,我们可以预测其主题,情绪,转发数量等。 使用已经在使用的网络预先训练你的网络可能是最好的事情,对于我的任务,它可以提高性能。


特征工程

    我知道深度学习“killed”特征工程,这样做有点过时了。 但是,当你没有大数据时,帮助网络通过特征工程学习复杂模式可以大大提高性能。 例如,在我对新闻文章的分类中,作者,报纸,评论,标签和更多功能的数量可以帮助预测我们的标签。


多模式(multimodal)架构

    我们可以使用多模式架构将文档级功能组合到我们的模型中。 在multimodal中,我们构建了两个不同的网络,一个用于文本,一个用于特征,合并它们的输出层(没有softmax)并添加更多层。 这些模型很难训练,因为这些特征通常比文本具有更强的信号,因此网络主要学习特征效果。这种方法使我的表现提高了不到1%。

实战经验分享-少量数据NLP场景下进行深度学习训练的建议插图6


word level features

    另一种类型的特征工程是word level features,如词性标注,语义角色标记,实体提取等。 我们可以将一个one-hot 编码表示或单词特征的embedding与单词的embedding相结合,并将其用作模型的输入。 我们也可以在这个方法中使用其他单词特征,例如在情感分析任务中我们可以采用情感字典并为embedding添加另一个维度,其中1表示我们在字典中的单词,0表示其他单词,这样模型可以很容易地学习它需要关注的一些词。 在我的任务中,我添加了某些重要实体的维度,这给了我一个很好的性能提升。


预处理作为特征工程

    最后一种特征工程方法是以一种模型更容易学习的方式预处理输入文本。 一个例子是特殊的“stemming”,如果体育对我们的标签不重要,我们可以改变足球,棒球和网球这个词为运动,这将有助于网络了解体育之间的差异并不重要,可以减少数量网络中的参数。 另一个例子是使用自动摘要。 正如我之前所说,神经网络在长文本上表现不佳,因此我们可以在文本上运行自动汇总算法,如“文本排名”,并仅向网络提供重要句子。


我的模特

    在我的例子中,在尝试了我在本文中讨论的方法的不同组合之后,最好的模型一种Hierarchical Attention Network(https://www.cs.cmu.edu/~hovy/papers/16HLT-hierarchical-attention-networks.pdf),采用了dropout和early stopping作为正则,通过document cropping进行数据扩充。 我使用预先训练过的单词向量和预训练和公司的另一个任务(基于相同的数据集)一起训练模型。 作为特征工程,我在单词embedding中添加了word-level的实体特征。 基本模型的这些变化使我的精确度提高了近10%,这使得我的模型从性能稍微好一点到具有重要业务应用的模型。

    小数据的深度学习作为一个研究领域仍处于早期阶段,但它看起来越来越受欢迎,尤其是预训练的语言模型,我希望研究人员和从业者能找到更多的方法,使深度学习对每个数据集都有价值。 。

实战经验分享-少量数据NLP场景下进行深度学习训练的建议插图7
扫描下方二维码可以订阅哦!
实战经验分享-少量数据NLP场景下进行深度学习训练的建议插图8
实战经验分享-少量数据NLP场景下进行深度学习训练的建议插图9

DeepLearning_NLP

实战经验分享-少量数据NLP场景下进行深度学习训练的建议插图10

实战经验分享-少量数据NLP场景下进行深度学习训练的建议插图11

深度学习与NLP

实战经验分享-少量数据NLP场景下进行深度学习训练的建议插图10

       商务合作请联系微信号:lqfarmerlq

    发送中

    点赞