王缘缘、周家乐、涂世文、夏雅薇编译

几千条文本库也能做机器学习!NLP小数据集训练指南

作为数据科学家,为你的问题选择正确的建模方法和算法应该是你最重要的技能之一。

几个月前,我致力于解决一个文本分类问题,关键在于判断哪些新闻文章与我的客户相关。

我只有一个几千条带标注的新闻数据集,所以我从简单的经典机器学习建模方法开始着手解决这个问题,例如用TF-IDF来做Logistic回归分类。

一般说来,这些模型适用于长文档(如新闻、博客文章等)的文本分类,然而在我这个任务上的执行效果却不尽如人意,仅仅略好于随机分类。

在研究了一番模型错在哪里之后,我发现词袋模型(bag of words)这种表示方法对于这个任务是不够的,我需要一个能深入理解文档语义的模型。

深度学习模型在需要深入理解文本语义的复杂任务上已经表现出了非常好的效果,例如机器翻译,自动问答,文本摘要,自然语言推理等。

这看起来对我的任务而言是一个很完美的方法,但是为了训练深度学习模型通常需要数十万甚至数百万个被标记的数据,而我只有一个很小的数据集。怎么办呢?

通常,我们需要大量数据来训练深度学习模型目的在于避免过拟合深度神经网络具有非常非常多的参数,因此如果没有用足够的数据去训练它们,它们往往会记住整个训练集,这就会导致训练的效果很好,但在测试集上的效果就很差了。

为了避免因缺乏大量数据而导致的这种情况,我们需要使用一些特殊的技巧!一击必杀的技巧!

在这篇文章中,我将展示一些由我自己开发或是我在文章、博客、论坛、Kaggle和其他一些地方发现的方法,看看它们是如何在没有大数据的情况下让深度学习更好地完成我的任务的。其中许多方法都基于计算机视觉中广泛使用的最佳实践。

一个小小的免责声明:我并不是一个深度学习方面的专家,这个项目也只是最初几个我用深度学习完成的大项目之一。这篇文章的所有内容都是对我个人经验的总结,有可能我的方法并不适用你的问题。

正则化

正则化方法以不同的形式呈现在机器学习模型中,它可以被用来避免过拟合。这些方法的理论性很强,对于大多数问题来说是一种普遍通用的方式。

L1和L2正则化

这些方法可能是最古老的,并且在许多机器学习模型中已经使用多年。

使用这种方法时,我们将权重的大小添加到我们试图最小化的模型损失函数中。这样,模型将尽量使权重变小,同时那些对模型影响不明显的权重值将被减小到零。

通过这种方式,我们可以使用更少数量的权重来记住训练集。

更多细节:

https://towardsdatascience.com/only-numpy-implementing-different-combination-of-l1-norm-l2-norm-l1-regularization-and-14b01a9773b

Dropout

Dropout是另一种较新的正则化方法。它具体的做法是在训练期间,神经网络中的每个节点(神经元)按照P的概率被丢弃(即权重被设置为零)。这样,网络就不会依赖于特定的神经元和他们之间的相互作用,而必须在不同的部分学习每一种模式。这就使得模型专注于学习那些更易于适用到新数据的重要模式。

Early stopping

Early stopping是一种简单的正则化方法,只需监控验证集性能,如果你发现验证集性能不再提高,就停止训练。这种方法在没有大数据的情况下非常重要,因为模型在5-10次甚至更少次数的迭代之后,通常就开始出现过拟合了。

减少参数的数量

如果你没有大型数据集,那你就应该谨慎设计网络中的层数和每层的神经元数量。 此外,向卷积层这样的特殊层比全连接层具有更少的参数,所以如果可能的话,使用它们会非常有用。

数据增强

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

这些变换对于图像类型的数据很有用,但不适用于文本,譬如翻转出像“狗爱我”这样无意义的句子,用它来训练模型的话将不会有什么效果。以下是一些针对文本的数据的增强方法:

同义词替换

在这种方法中,我们随机的选一些词并用它们的同义词来替换这些词,例如,我们将句子“我非常喜欢这部电影”改为“我非常喜欢这个影片”,这样句子仍具有相同的含义,很有可能具有相同的标签。但这种方法对我的任务来说没什么用,因为同义词具有非常相似的词向量,因此模型会将这两个句子当作相同的句子,而在实际上并没有对数据集进行扩充。

回译

在这个方法中,我们用机器翻译把一段英语翻译成另一种语言,然后再翻译回英语。这个方法已经成功的被用在Kaggle恶意评论分类竞赛中。

例如,如果我们把“I like this movie very much”翻译成俄语,就会得到“Мне очень нравится этот фильм”,当我们再译回英语就会得到“I really like this movie”。回译的方法不仅有类似同义词替换的能力,它还具有在保持原意的前提下增加或移除单词并重新组织句子的能力。

文档裁剪

新闻文章通常很长,在查看数据时,我发现对于分类来说并不需要整篇文章。 而且,我发现文章的主要想法通常会重复出现。

 这让我想到将文章裁剪为几个子文章来实现数据增强,这样我将获得更多的数据。开始的时候我尝试从文档中抽取几个句子并创建10个新文档。这些新创建的文档句子间没有逻辑关系,所以用它们训练得到的分类器性能很差。第二次,我尝试将每篇文章分成若干段,每段由文章中五个连续的句子组成。这个方法就运行得非常好,让分类器的性能提升很大。

生成对抗网络

GAN是深度学习领域中最令人兴奋的最新进展之一,它们通常用来生成新的图像。下面这篇博客解释了如何使用GAN进行图像数据的数据增强,但它的一些方法或许也可以适用于文本数据。

博客链接:https://towardsdatascience.com/generative-adversarial-networks-for-data-augmentation-experiment-design-2873d586eb59

迁移学习

迁移学习是指使用为其他任务训练的网络参数来解决你自己的问题,这些网络参数通常是用大性数据集训练得到的。迁移学习有时被用作某些层的初始化,有时也直接被用于特征提取让我们免于训练新模型。在计算机视觉中,从预先训练的ImageNet模型开始是解决问题的一种常见的做法,但是NLP没有像ImageNet那样可以用于迁移学习的大型数据集。

预训练的词向量

一般应用于自然语言处理深度学习网络架构通常以嵌入层(Embedding Layer)开始,该嵌入层将一个词由独热编码(One-Hot Encoding)转换为数值型的向量表示。我们可以从头开始训练嵌入层,也可以使用预训练的词向量,如 Word2Vec、FastText 或 GloVe

这些词向量是通过无监督学习方法训练大量数据或者是直接训练特定领域的数据集得到的。

预训练的词向量非常有效,因为基于大数据它们给模型提供了词的上下文并减少了模型的参数,从而显著地降低了过拟合的可能性。

更多有关词嵌入的信息:https://www.springboard.com/blog/introduction-word-embeddings/

预训练的句向量

我们可以将模型的输入从单词转换为句子,用这种方法我们得到参数少并且性能好的简单模型。为了做到这一点,我们可以使用预训练的句子编码器,如 Facebook 的InferSent或谷歌的通用句子编码器。

我们还可以把数据集中未打标的数据用 skip-thought 向量或语言模型等方法训练句子编码器模型。

更多有关无监督句子向量的信息:https://blog.myyellowroad.com/unsupervised-sentence-representation-with-deep-learning-104b90079a93

预训练的语言模型

最近很多论文运用大量语料库预训练语言模型来处理自然语言任务得到了惊人的结果,如ULMFIT,Open-AI transformer和BERT语言模型是通过前面的单词预测句子中会出现的下一个单词。

这种预训练并没有对我取得更好的结果起到真正的帮助,但文章给出了一些我没有尝试过的方法来帮助我做更好地微调。

一个关于预训练语言模型很棒的博客:http://ruder.io/nlp-imagenet/

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

如果掌握大量无标签数据,我们可以使用无监督的方法如自动编码器或掩码语言模型去训练模型,这样仅仅依靠文本本身就可以做到。

对我来说另一个更好的选择是使用自监督模型。自监督模型可以在没有人工标注的情况下自动提取标签。Deepmoji项目是一个很好的例子。

在Deepmoji项目中,作者们训练了一个预测推文中表情符号的模型,在模型表现良好的情况下,他们使用网络预先训练了一个推文者的情绪分析模型来获取表情符号预测模型的状态。

表情符号预测和情绪分析显然非常相关,因此它作为预训练任务表现得非常好。自监督在新闻数据中的运用包括预测标题,报刊,评论数量,转发数量等。自监督是一种非常好的预训练方法,但通常很难分辨出代理标签与真实标签的关联。

使用现成的网络进行预训练

在很多公司中,大部分用于不同任务的机器学习模型都建立在相同的数据集或类似的数据集上。例如推文,我们可以预测其主题、观点、转发数量等。最好通过已经成熟应用的网络预先训练你的网络。对我的任务而言,应用这个方法确实可以提高性能。

特征工程

我知道深度学习“杀死”了特征工程,再谈特征工程已经有点过时了。但是当你没有大量数据时,通过特征工程帮助网络学习复杂模式可以大大提高性能。例如,在我对新闻文章的分类过程中,作者、报刊、评论数、标签以及更多特征可以帮助预测标签。

多模式体系结构

我们可以用多模式体系结构将文档级特征组合到我们的模型中。在多模式体系结构中,我们构建了两个不同的网络,一个用于文本,一个用于特征,合并它们的输出层(无 softmax)并添加更多层。这些模型很难训练,因为这些特征通常比文本具有更强的信号,因此网络主要受特征的影响。

关于多模式网络很棒的Keras教程:https://medium.com/m/global-identity?redirectUrl=https://becominghuman.ai/neural-networks-for-algorithmic-trading-multimodal-and-multitask-deep-learning-5498e0098caf

这种方法使我的模型提高了不到1%的性能。 词级特征

词级特征是另一种类型的特征工程,如词性标注,语义角色标记,实体抽取等。我们可以将一个独热编码表示或一个词特征的嵌入与词的嵌入相结合并将其用作模型的输入。

我们也可以在这个方法中使用其他词特征,例如在情感分析任务中我们可以采用情感字典并添加另一个维度嵌入其中,用 1 表示在字典中的单词, 0 表示其他单词,这样模型可以很容易地学习它需要关注的一些词。在我的任务中,我添加了某些重要实体的维度,这给模型带来了一个很好的性能提升。

特征工程预处理

最后一种特征工程方法是以一种模型更容易学习的方式预处理输入文本。一个例子是“词干提取”,如果运动并不是一个重要标签,我们可以用运动代替足球,棒球和网球这些词,这将有助于神经网络模型了解到不同运动之间的差异并不重要,可以减少网络中的参数

另一个例子是使用自动摘要。正如我之前所说,神经网络在长文本上表现不佳,因此我们可以在文本上运行自动摘要算法,如 TextRank 并仅向神经网络网络提供重要句子。

我的模型

尝试了本文中讨论的方法的不同组合后,在我的项目中表现最好的模型是本文中提到分层注意力网络(HAN),模型使用dropout 和 early stopping 作为正则化,并采用文档剪裁的方法进行数据集增强。我使用预训练的词向量以及我公司的一个预训练网络(这个网络使用了同样数据,只是针对的任务不一样)。

在做特征工程时,我新增了实体词级特征到词嵌入向量。这些变化使我的模型精确度提高了近 10%,模型效果从比随机效果稍好一点上升到了到具有重要业务价值的水准。

深度学习在小数据集上的应用仍处于该研究领域的早期阶段,但看起来它越来越受欢迎,特别是对于预训练的语言模型,我希望研究人员和从业者能够找到更多的方法使用深度学习,让每一个数据集产生价值。

相关报道:https://towardsdatascience.com/lessons-learned-from-applying-deep-learning-for-nlp-without-big-data-d470db4f27bf

大数据文摘
大数据文摘

秉承“普及数据思维,传播数据文化,助⼒产业发展”的企业⽂化,我们专注于数据领域的资讯、案例、技术,形成了“媒体+教育+⼈才服务”的良性⽣态,致⼒于打造精准数据科学社区。

工程小数据集NLP机器学习
4
相关数据
深度学习技术

深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法,至今已有数种深度学习框架,如卷积神经网络和深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。

自动编码器技术

自动编码器是用于无监督学习高效编码的人工神经网络。 自动编码器的目的是学习一组数据的表示(编码),通常用于降维。 最近,自动编码器已经越来越广泛地用于生成模型的训练。

基于Transformer 的双向编码器表征技术

BERT是谷歌发布的基于双向 Transformer的大规模预训练语言模型,该预训练模型能高效抽取文本信息并应用于各种NLP任务,并刷新了 11 项 NLP 任务的当前最优性能记录。BERT的全称是基于Transformer的双向编码器表征,其中“双向”表示模型在处理某一个词时,它能同时利用前面的词和后面的词两部分信息。

权重技术

线性模型中特征的系数,或深度网络中的边。训练线性模型的目标是确定每个特征的理想权重。如果权重为 0,则相应的特征对模型来说没有任何贡献。

机器学习技术

机器学习是人工智能的一个分支,是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。

Dropout技术

神经网络训练中防止过拟合的一种技术

GloVe技术

Stanford开发的用于词向量表示的一个库/工具

数据集增强技术

数据集增强是应用各种领域特定变换来综合扩展训练集的实践,是监督式学习的标准工具。

词嵌入技术

词嵌入是自然语言处理(NLP)中语言模型与表征学习技术的统称。概念上而言,它是指把一个维数为所有词的数量的高维空间嵌入到一个维数低得多的连续向量空间中,每个单词或词组被映射为实数域上的向量。

参数技术

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

数据科学技术

数据科学,又称资料科学,是一门利用数据学习知识的学科,其目标是通过从数据中提取出有价值的部分来生产数据产品。它结合了诸多领域中的理论和技术,包括应用数学、统计、模式识别、机器学习、数据可视化、数据仓库以及高性能计算。数据科学通过运用各种相关的数据来帮助非专业人士理解问题。

文本分类技术

该技术可被用于理解、组织和分类结构化或非结构化文本文档。文本挖掘所使用的模型有词袋(BOW)模型、语言模型(ngram)和主题模型。隐马尔可夫模型通常用于词性标注(POS)。其涵盖的主要任务有句法分析、情绪分析和垃圾信息检测。

损失函数技术

在数学优化,统计学,计量经济学,决策理论,机器学习和计算神经科学等领域,损失函数或成本函数是将一或多个变量的一个事件或值映射为可以直观地表示某种与之相关“成本”的实数的函数。

词性标注技术

词性标注是指为分词结果中的每个单词标注一个正确的词性的程序,也即确定每个词是名词、动词、形容词或其他词性的过程。

验证集技术

验证数据集是用于调整分类器超参数(即模型结构)的一组数据集,它有时也被称为开发集(dev set)。

计算机视觉技术

计算机视觉(CV)是指机器感知环境的能力。这一技术类别中的经典任务有图像形成、图像处理、图像提取和图像的三维推理。目标识别和面部识别也是很重要的研究领域。

机器翻译技术

机器翻译(MT)是利用机器的力量「自动将一种自然语言(源语言)的文本翻译成另一种语言(目标语言)」。机器翻译方法通常可分成三大类:基于规则的机器翻译(RBMT)、统计机器翻译(SMT)和神经机器翻译(NMT)。

神经网络技术

(人工)神经网络是一种起源于 20 世纪 50 年代的监督式机器学习模型,那时候研究者构想了「感知器(perceptron)」的想法。这一领域的研究者通常被称为「联结主义者(Connectionist)」,因为这种模型模拟了人脑的功能。神经网络模型通常是通过反向传播算法应用梯度下降训练的。目前神经网络有两大主要类型,它们都是前馈神经网络:卷积神经网络(CNN)和循环神经网络(RNN),其中 RNN 又包含长短期记忆(LSTM)、门控循环单元(GRU)等等。深度学习是一种主要应用于神经网络帮助其取得更好结果的技术。尽管神经网络主要用于监督学习,但也有一些为无监督学习设计的变体,比如自动编码器和生成对抗网络(GAN)。

词袋模型技术

词袋模型(英语:Bag-of-words model)是个在自然语言处理和信息检索(IR)下被简化的表达模型。此模型下,像是句子或是文件这样的文字可以用一个袋子装着这些词的方式表现,这种表现方式不考虑文法以及词的顺序。最近词袋模型也被应用在电脑视觉领域。

特征工程技术

特征工程是利用数据所在领域的相关知识来构建特征,使得机器学习算法发挥其最佳的过程。它是机器学习中的一个基本应用,实现难度大且代价高。采用自动特征工程方法可以省去采用人工特征工程的需求。Andrew Ng 说“挖掘特征是困难、费时且需要专业知识的事,应用机器学习其实基本上是在做特征工程。”

反比文档频数权重评价方法技术

tf-idf(英语:term frequency–inverse document frequency)是一种用于信息检索与文本挖掘的常用加权技术。tf-idf是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。tf-idf加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量或评级。除了tf-idf以外,互联网上的搜索引擎还会使用基于链接分析的评级方法,以确定文件在搜索结果中出现的顺序。

监督学习技术

监督式学习(Supervised learning),是机器学习中的一个方法,可以由标记好的训练集中学到或建立一个模式(函数 / learning model),并依此模式推测新的实例。训练集是由一系列的训练范例组成,每个训练范例则由输入对象(通常是向量)和预期输出所组成。函数的输出可以是一个连续的值(称为回归分析),或是预测一个分类标签(称作分类)。

语料库技术

语料库一词在语言学上意指大量的文本,通常经过整理,具有既定格式与标记;事实上,语料库英文 "text corpus" 的涵意即为"body of text"。

逻辑技术

人工智能领域用逻辑来理解智能推理问题;它可以提供用于分析编程语言的技术,也可用作分析、表征知识或编程的工具。目前人们常用的逻辑分支有命题逻辑(Propositional Logic )以及一阶逻辑(FOL)等谓词逻辑。

大数据技术技术

大数据,又称为巨量资料,指的是传统数据处理应用软件不足以处理它们的大或复杂的数据集的术语。

迁移学习技术

迁移学习是一种机器学习方法,就是把为任务 A 开发的模型作为初始点,重新使用在为任务 B 开发模型的过程中。迁移学习是通过从已学习的相关任务中转移知识来改进学习的新任务,虽然大多数机器学习算法都是为了解决单个任务而设计的,但是促进迁移学习的算法的开发是机器学习社区持续关注的话题。 迁移学习对人类来说很常见,例如,我们可能会发现学习识别苹果可能有助于识别梨,或者学习弹奏电子琴可能有助于学习钢琴。

过拟合技术

过拟合是指为了得到一致假设而使假设变得过度严格。避免过拟合是分类器设计中的一个核心任务。通常采用增大数据量和测试样本集的方法对分类器性能进行评价。

神经元技术

(人工)神经元是一个类比于生物神经元的数学计算模型,是神经网络的基本组成单元。 对于生物神经网络,每个神经元与其他神经元相连,当它“兴奋”时会向相连的神经元发送化学物质,从而改变这些神经元的电位;神经元的“兴奋”由其电位决定,当它的电位超过一个“阈值”(threshold)便会被激活,亦即“兴奋”。 目前最常见的神经元模型是基于1943年 Warren McCulloch 和 Walter Pitts提出的“M-P 神经元模型”。 在这个模型中,神经元通过带权重的连接接处理来自n个其他神经元的输入信号,其总输入值将与神经元的阈值进行比较,最后通过“激活函数”(activation function)产生神经元的输出。

正则化技术

当模型的复杂度增大时,训练误差会逐渐减小并趋向于0;而测试误差会先减小,达到最小值后又增大。当选择的模型复杂度过大时,过拟合现象就会发生。这样,在学习时就要防止过拟合。进行最优模型的选择,即选择复杂度适当的模型,以达到使测试误差最小的学习目的。

自然语言处理技术

自然语言处理(英语:natural language processing,缩写作 NLP)是人工智能和语言学领域的分支学科。此领域探讨如何处理及运用自然语言;自然语言认知则是指让电脑“懂”人类的语言。自然语言生成系统把计算机数据转化为自然语言。自然语言理解系统把自然语言转化为计算机程序更易于处理的形式。

自动摘要技术

生成对抗网络技术

生成对抗网络是一种无监督学习方法,是一种通过用对抗网络来训练生成模型的架构。它由两个网络组成:用来拟合数据分布的生成网络G,和用来判断输入是否“真实”的判别网络D。在训练过程中,生成网络-G通过接受一个随机的噪声来尽量模仿训练集中的真实图片去“欺骗”D,而D则尽可能的分辨真实数据和生成网络的输出,从而形成两个网络的博弈过程。理想的情况下,博弈的结果会得到一个可以“以假乱真”的生成模型。

词干提取技术

在词法学和信息检索里,词干提取是去除词缀得到词根的过程─—得到单词最一般的写法。对于一个词的形态词根,词干并不需要完全相同;相关的词映射到同一个词干一般能得到满意的结果,即使该词干不是词的有效根。从1968年开始在计算机科学领域出现了词干提取的相应算法。很多搜索引擎在处理词汇时,对同义词采用相同的词干作为查询拓展,该过程叫做归并。

独热编码技术

独热编码是将分类变量转换为可提供给机器学习算法更好地进行预测的形式的过程。 一种稀疏向量,其中:一个元素设为 1;所有其他元素均设为 0。 one-hot 编码常用于表示拥有有限个可能值的字符串或标识符。例如,假设某个指定的植物学数据集记录了 15000 个不同的物种,其中每个物种都用独一无二的字符串标识符来表示。在特征工程过程中,您可能需要将这些字符串标识符编码为 one-hot 向量,向量的大小为 15000。

图网技术

ImageNet 是一个计算机视觉系统识别项目, 是目前世界上图像识别最大的数据库。

深度神经网络技术

深度神经网络(DNN)是深度学习的一种框架,它是一种具备至少一个隐层的神经网络。与浅层神经网络类似,深度神经网络也能够为复杂非线性系统提供建模,但多出的层次为模型提供了更高的抽象层次,因而提高了模型的能力。

语言模型技术

语言模型经常使用在许多自然语言处理方面的应用,如语音识别,机器翻译,词性标注,句法分析和资讯检索。由于字词与句子都是任意组合的长度,因此在训练过的语言模型中会出现未曾出现的字串(资料稀疏的问题),也使得在语料库中估算字串的机率变得很困难,这也是要使用近似的平滑n元语法(N-gram)模型之原因。

推荐文章
暂无评论
暂无评论~