心法利器[53] | 数据增强的现实应用思考

心法利器

本栏目主要和大家一起讨论近期自己学习的心得和体会,与大家一起成长。具体介绍:仓颉专项:飞机大炮我都会,利器心法我还有。

近期,我再次总结了我的历史文章,累积起来有50w字,百余篇文章了,有兴趣可以拿来看看,获取方式:七夕清流,百余篇累计50w字文章合集发布。

往期回顾

  • 心法利器[48] | 开放域文本分类技术思考

  • 心法利器[49] | 数据分布的含义理解

  • 心法利器[50] | 测试集构造思考

  • 心法利器[51] | 长短句语义相似问题探索

  • 心法利器[52] | 口语化句子解析问题

其实自己写过一些数据增强的文章,也谈过自己的一些思考(NLP.TM[32] | 浅谈文本增强技术)。但是在现实场景中,自己使用的时候多半感觉不太顺手,不过最近的一次经历,让我对数据增强这件事情有了一些新的理解,可能是炒旧饭,自己或多或少有提到过,但是这个旧饭有一些自己更加细化的理解吧,所以重新聊一次。

另外,最后我也把最近遇到的问题和解决手段做一个讲解,让大家更好理解和吸收,我自己总结下来其实觉得收获挺大的。

先出结论和方法论

有关数据增强,希望大家能认清这几个关键点。

首先,数据增强不是数据增多,数量增加本身不会为效果带来正面收益,极端的说,如果增加数据有用,你直接多训几个epoch不就好了对吧。

数据增强更像是一种扩增数据多样性的手段,让模型更加见多识广,理解更多内容,使他更不容易因为“没见过”这种类型的问题而误判或乱判。

但是简单的数据增强是无方向的,如果能够找到并有针对性地进行增强,是否能让效果的提升变得更加高效明确。

数据增强非数据增多

很多在科普数据增强的文章中会聊到,数据不足的可以通过数据增强扩增数据,很容易误导初学者以为数据不够的时候就用数据增强增加一些数据,模型效果就有提升了,但实际上并非如此,我在之前的文章里面或多或少有提到过,数据不足或者样本不均衡导致的效果不足背后,原因很多,片面、粗暴地上数据增强并不一定就能解决数据不足的问题,具体可以看看这几篇:

  • 心法利器[45] | 模型需要的信息提供够了吗

  • 心法利器[44] | 样本不均衡之我见

这依旧是一个结论或者是一个结论的解释,我给大家一个理解的方式。数据扩增后,如果数据本身的分布和信息没有发生很大改变,在训练的视角下,其实就和多训练几次,或者是损失函数对特定类样本的权重产生变化而已,大家都知道,在同等收敛的情况下,增加数据量和多迭代几次其实没有本质差别,所以大家不要简单地以为数据少,所以要多,要具体看这个少是怎么少,缺什么,去补充才是合适的。

数据增强与多样性

NLP场景的数据增强,相信大家都应该知道回译、随机删除、随机增加、同义词替换等基本操作,甚至有一些用生成模型,甚至风格迁移之类的,其本质都是在给数据增添多样性,这种多样性其实很大程度对模型是有益处的,在有限的数据下,增强出一些说法,让模型知道这些新的说法其实也是属于这个类,模型的稳定性也就提升了,这个无可厚非,这也是很多试验下模型效果真的有提升的本质。

然而同样需要知道的是,上面的提升是有条件的,如果数据已经足够丰富,模型其实也能足够学到这些信息的话,或者是数据极度匮乏,或者信息本就不足,数据增强也无法弥补这个问题,那其实增强的效果当然就没有了,甚至可能负向。

定向的增强

如果,我们能知道用当前数据让模型学习,会导致模型出现了特定的问题, 而同时让数据增强能尽可能定向地解决这种问题,那这个效果优化就会变得非常高效了。这里需要的几个条件:

  • 了解模型目前存在的固有问题,即存在某个已知且比较明显的缺陷。

  • 这个缺陷是可以通过数据来解决的,例如增加特定的数据。

  • 这种数据可以通过增强的方式来进行处理而批量增加。

能满足几个条件,这套完整的特定问题解决的方法论也就完成了。

为了让大家更好理解,我给大家举一个最近遇到的问题的例子吧。

例子

最近自己在做的时候就遇到这个问题并且很大程度上就解决了,这里介词给大家分享一下,总结下来个人觉得收获挺大的。

问题场景是文本二分类,经过case发现,模型似乎对口语化的句子分类效果并不好,极端的其实遇到了口语化句子就会分为负类,模型有如此大的把握出错,其实这种问题很可能就是出在数据上,句子中的某些特征让模型坚信这个特征就出现应该是负类,因为模型学的数据其实就是这样的,例如一些词汇,“刚才”、“现在”、“到底”之类的,在负样本里很多,正样本里很少,那模型理解这种词出现在负样本中概率大,那反过来句子里出现这些词汇,大概率就是负类了。

当然,比较简单的方式就是找出这种词,然后直接在数据集里面加上对应的一些数据在正类里,其实就能缓解,这种思路其实就是构造对抗样本了,也非常常用。但是一单问题锁定到口语化这个层面了,这种词汇就会很多那构造起来的成本会很高(如果就一两个,其实这样做更推荐的),所以我们就要考虑更加批量化的方法。

这里我想到的方案是,找一批闲聊风格的句子,这个相信大家要找也不会很难,网上能找得到,也能通过现有的query进行挖掘吧,既然正样本没有口语化,我就用口语化但是意义不太明确的句子拼接上已有的正样本,构造这样的句子,就能让模型知道,即使句子中有口语化说法,也可能是正类,同时,为了让样本更多样性,我用了随机调换词汇顺序的策略再多增加了一些。

结果是,增强后的模型比原来的模型,正类召回率提升显著,而准确率也有小幅提升,很大程度说明这个策略生效了,而且比较稳定。

回头其实可以看到几个操作细节:

  • 这里通篇没有提到少数据的问题,是的,数据量上,训练样本非常多,从数量上我并不需要增加。

  • 但是数据内缺少信息,缺少的是正类口语化的信息,这个缺少让模型预测出现了偏移,有关数据提供信息的问题,这个我写过一篇文章来聊:。

  • 数据增强的方式我没有无差别使用,我只用了拼接和交换,类似删除之类的并没有使用,原因很简单,现在情况并不需要,没病别随便开药。

反思

这里可以看到的是,对模型和数据的缺点能有足够的把握时,能很精准地找到解决问题并能通过数据而非模型的方式快速解决,并且效果显著,回头看这里需要这几种能力:

  • 能找到模型的问题的能力。这里重要的一条是case分析,前面我是花了很多时间来给大家讲这个case分析的,最后一篇文章在这:心法利器[40] | bad case治疗术:解决篇,有着一连4篇的传送门。

  • 能从数据中提炼出问题,知道扩充什么样的数据就能解决,这里其实蕴含了不小的数据操纵能力。

  • 对方案的把控能力,不无脑堆,而是对症下药,前面2条讲的是理解症,这条则对应下药的能力。

最后再次强调,数据增强不是增多,数据少不见得增强就能解决(我在前不久的文章有谈到这个问题,可以看看这篇),数据增强也可以解决数据很多的时候的问题,关键是自己需不需要,需要的时候要有合适的方式来使用,所谓大师,不只是啥招都会,而是会在遇到问题的时候能知道出什么招能解决问题,我也在朝着这个方向努力哈哈,共勉。

心法利器[53] | 数据增强的现实应用思考_第1张图片

你可能感兴趣的:(机器学习,人工智能,java,python,深度学习)