数据增强是在机器学习的各个垂直领域广泛使用的一种做法,以帮助增加现有数据集中的数据样本。为什么你想在训练数据中增加样本,可能有多种原因。这可能是因为你收集的数据太少,无法开始训练一个好的ML模型,或者你看到了一些过拟合的证据。在这两种情况下,数据扩充可以帮助使用各种技术在现有的数据中引入多样性,并最终帮助我们的机器学习模型处理过拟合和在未见过的样本上进行良好的泛化。在这里,它也可以被认为是一个正则器。增强方法在计算机视觉领域相当流行,在NLP领域也越来越多。
在这篇博客中,我们将主要关注一些流行的技术和python库,这些技术和库可以在尝试增强文本数据时使用。
方法一
谈到在NLP中的简易数据增强技术所做的工作,作者提出了各种简单、直观和有效的功能,用于将给定的文本样本转换为其增强版本,特别是用于文本分类的案例。文本分类是将文本片段分类到预先定义的组中的任务。作者提出了4种功能,即SR (同义词替换)、RI (随机插入) 、RS (随机替换) 和 RD (随机删除)。下面提到了每个功能的细节。
同义词替换(SR)-- 随机选择一个非停止词,用其同义词替换。
注意:停止词是那些在所有文件中都有相同可能性出现的普通词。这些词本身并没有给相关的文本片段增加任何重要的分界信息。其中的一些例子是 "the"、"an"、"is "等。我们可以使用特定语言的单一通用停顿词列表来从给定的文本中删除它们,尽管一个常见的做法是通过从特定领域的语料库中挖掘常见的词来扩展通用列表。自然语言工具箱(NLTK)预装了一个停止用户列表,你可以把它作为一个起点。
随机插入(RI)--在文本中的随机位置插入一个随机选择的单词的同义词。
随机替换(RS)--随机交换文本中的任何两个词。
随机删除(RD)--从文本中随机删除一个词。
上述每个功能都可以做1次以上,但在选择时应考虑信息损失和样本总数之间的权衡。这种转换背后的直觉是为了模仿一般的写作行为和任何人类在写一篇文章时都会犯的错误。我还建议你通过论文或观看这个视频来了解所进行的实验的洞察力。你可以按照这个很棒的python库的例子,直接使用这些开箱即用的函数。该库还允许你在字符级别上进行这些操作,而不仅仅是单词。
除了上面提到的那些,还有一件事可以尝试做表面层次的转换,那就是使用预定义的地图,用正则表达式来扩展收缩。例如:Don't -> Do not, We'll -> We will, 等等。
方法二
逆向翻译也是实践中做文本扩充时经常使用的一种流行技术。鉴于这些天的翻译系统的概率行为,反译在生成原文的转述版本方面可以相当有效。释义是指保留原句原意的句子,同时也允许对内容进行重新措辞。例如--如果原句是 "每个人都经常去看电影",那么它的一个释义可以是*"每个人都*经常去看电影"。
回译的方法包括3个基本步骤。每一个步骤都在下面提到。
中级翻译--将文本从源语言翻译成目标语言。例如--英语到法语。
逆向翻译--将步骤1中的文本翻译回其源语言。
修剪- 删除回译,如果它与原文相同。
你可以使用任何现有的翻译模型来构建这个管道。通常情况下,正如在实践中所看到的那样,做超过1级的翻译可以得到相当好的释义。例如,按照流水线--英语到法语,法语到西班牙语,西班牙语到英语。下图说明了这个流程。但当然,这取决于手中的计算带宽。你可以按照这个很棒的python库的例子,直接使用这个功能的开箱即用。
方法三
随着最近变形金刚模型在自然语言处理方面的进展,这篇博客谈到了使用GPT-2模型进行文本数据扩充的 问题(请点击这里了解GTP-2的更多概况)。在一个非常高的水平上,该博客谈到了通过在输入的例子句子中加入类标签的前缀文本,对训练数据中的句子进行微调现有的GPT-2模型。然后,它对模型进行训练,使其在有类标签的情况下生成的序列的可能性最大化。添加类标签有助于模型理解训练数据中的各种类群。在推理过程中,只需向GPT-2模型提供类名作为提示,它就会生成与类名意图一致的句子。你可以在TextAugmentation-GPT2 Github上找到这方面的代码。另外,下面是上述模型*(如官方GitHub中所述*)在SPAM/HAM邮件分类任务上生成的一些例子。
SPAM: you have been awarded a £2000 cash prize. call 090663644177 or call 090530663647<|endoftext|>
SPAM: FREE Call Todays top players, the No1 players and their opponents and get their opinions on www.todaysplay.co.uk Todays Top Club players are in the draw for a chance to be awarded the £1000 prize. TodaysClub.com<|endoftext|>
HAM: I don't think so. You got anything else?<|endoftext|>
HAM: Ugh I don't want to go to school.. Cuz I can't go to exam..<|endoftext|>
GPT-2模型生成的合成例子
你可以用梯度笔记本来使用这个方法,方法是以 repo 作为工作空间 URL 来创建笔记本,在高级选项切换部分找到。
方法四
上述的一些方法如果盲目地进行,可能会导致标签和文本意图不匹配。例如,如果句子是 "我不喜欢这种食物",而标签是 "消极"。假设我们在做随机删词,结果 "不 "字被删除了,那么现在新的句子变成了 "我喜欢这种食物",标签是 "消极"。这是不对的!因此,时刻关注转换后的句子并对其进行相应的调整是很重要的。
因此,作者在《使用预训练的转化器模型进行数据增强》中指出了上述的局限性,并提出了一种技术来进行上下文增强,以保留标签和句子的意图。他们通过微调各种预训练的转化器模型,如BERT、GPT、Seq2SeqBART、T5,以及更多与类别标签信息相关的句子来做到这一点。他们尝试了它的两种变化,下面提到了这两种变化。
扩展--这涉及到在每个句子中预置类标签,并将类标签作为模型词汇的一部分,然后根据各自转化器模型的预定目标对其进行微调。
Prepend- 这涉及到向每个句子预置类标签,但不添加类标签作为模型词汇的一部分,然后根据各自转化器模型的预定目标进行微调。
他们发现,与作者尝试的其他方法相比,预训练的Seq2Seq模型表现良好。
结论
正如前面所讨论的,数据扩充是你在建立机器学习模型时应该采用的重要做法之一。在这篇博客中,我们看到了自然语言处理领域的各种数据增强技术,包括从上下文不敏感到敏感的转换,可以帮助更快地建立这些功能原型的python库,以及在玩各种转换选项时需要注意的事项。另外,需要注意的是,数据增强可能并不总是有助于提高模型的性能*(但这也是你无法保证机器学习中的任何实践)*,但肯定的是,可以尝试的东西和有它在手是一个好的做法。作为一个经验法则,尝试各种增强方法,看看哪种方法效果更好,并使用验证集来调整增强样本的数量以达到最佳效果,这总是好的。
希望你觉得这篇读后感有用。谢谢你