深度学习干货铺Computer Science

炼丹笔记三:数据增强

2019-02-16  本文已影响400人  会写代码的好厨师

欢迎大家关注微信公众号:baihuaML白话机器学习

码字不易,如转载请私信我!!原文链接:https://zhuanlan.zhihu.com/p/56139575

在这里,我们一起分享AI的故事。

您可以在后台留言,关于机器学习、深度学习的问题,我们会选择其中的优质问题进行回答!

本期的问题:

能不能谈一谈数据增强问题?

深度学习像是在炼丹,但实际上也是有一些区别的。在深度学习中,我们可能会有海量的数据,但是数据增强依然是不可避免的。

什么是数据增强(data augmentation)?

数据增强是扩充数据样本规模的一种有效地方法。深度学习是基于大数据的一种方法,我们当前希望数据的规模越大、质量越高越好。模型才能够有着更好的泛化能力,然而实际采集数据的时候,往往很难覆盖掉全部的场景,比如:对于光照条件,在采集图像数据时,我们很难控制光线的比例,因此在训练模型的时候,就需要加入光照变化方面的数据增强。再有一方面就是数据的获取也需要大量的成本,如果能够自动化的生成各种训练数据,就能做到更好的开源节流。

如何进行数据增强?

数据增强可以分为两类,一类是离线增强,一类是在线增强。

离线增强 : 直接对数据集进行处理,数据的数目会变成增强因子 x 原数据集的数目 ,这种方法常常用于数据集很小的时候

在线增强 : 这种增强的方法用于,获得 batch 数据之后,然后对这个 batch 的数据进行增强,如旋转、平移、翻折等相应的变化,由于有些数据集不能接受线性级别的增长,这种方法长用于大的数据集,很多机器学习框架已经支持了这种数据增强方式,并且可以使用 GPU 优化计算。

我们具体来看一下在不同领域,有哪些常见的数据增强的方法。

先聊聊图像中的数据增强问题:

如何对图像数据进行有效的数据增强?

空间几何变换:翻转(水平和垂直)、随机裁剪、旋转、放射变换、视觉变换(四点透视变换)、分段放射

像素颜色变换类:噪声(高斯、椒盐)、CoarseDropout(在面积大小可选定、位置随机的矩形区域上丢失信息实现转换,所有通道的信息丢失产生黑色矩形块,部分通道的信息丢失产生彩色噪声)、SimplexNoiseAlpha(产生连续单一噪声的掩模后,将掩模与原图像混合)、FrequencyNoiseAlpha(在频域中用随机指数对噪声映射进行加权,再转换到空间域。在不同图像中,随着指数值逐渐增大,依次出现平滑的大斑点、多云模式、重复出现的小斑块)

模糊类:高斯模糊、ElasticTransformation

HSV对比度变换

RGB颜色扰动

随机擦除

超像素法

转化法

边界检测

Grayscale

锐化与浮雕

多样本合成:SMOTE、SamplePairing、Mixup

具体解释,可参考博客:技术综述】 一文道尽深度学习中的数据增强方法(上)https://www.jianshu.com/p/99450dbdadcf

在使用图像数据进行数据增强的时候需要注意哪些问题?

首先需要注意的一点是,引入数据增强并不一定会带来模型性能上的提升,尤其是在数据增强的时候,需要考虑如何设置恰当的增强比例因子。实际上,只有当我们增强后的样本,理论上和我们的实际业务场景最接近的时候,才会达到性能最好。也就是所谓的训练集和测试集样本分布一致的时候。 因此,在进行增强的时候不要盲目增强,需要看一下看数据集增强之后的效果如何?

如何查看数据增强后的效果?对于离线数据,保存图片以后就能够看到,但是对于在线的数据,则需要借助工具了。这一点tensorflow做的就很好,可以直接使用tensorboard来进行实时训练图片查看。

数据增强后的效果:

再来看看文本中的数据增强问题

NLP中小的扰动可能会对含义造成比较大的影响,比如:去掉或改变某个词,会导致整个句子的含义或情感发生巨大偏差。

如何文本数据进行数据增强?

随机drop和shuffle

drop:对于标题和描述中的字或词,随机的进行删除,用空格代替。另一种是 shuffle, 即打乱词序。

对于"如何评价 2017 知乎看山杯机器学习比赛?" 这个问题,使用 drop 对词层面进行处理之后,可能变成"如何 2017 看山杯机器学习 “. 如果使用 shuffle 进行处理,数据就 可能变成"2017 机器学习?如何比赛知乎评价看山杯”。 数据 增强对于提升训练数据量,抑制模型过拟合等十分有效.code:https://github.com/dupanfei1/deeplearning-util/blob/master/nlp/augment.py

同义词替换

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

回译

在这个方法中,我们用机器翻译把一段英语翻译成另一种语言,然后再翻译回英语。这个方法已经成功的被用在Kaggle恶意评论分类竞赛中。反向翻译是NLP在机器翻译中经常使用的一个数据增强的方法。。其本质就是快速产生一些不那么准确的翻译结果达到增加数据的目的。

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

回译可使用python translate包和textblob包(少量翻译),或者使用百度翻译或谷歌翻译的api通过python实现。

参考:https://github.com/dupanfei1/deeplearning-util/tree/master/nlp

文档裁剪

新闻文章通常很长,在查看数据时,对于分类来说并不需要整篇文章。 文章的主要想法通常会重复出现。将文章裁剪为几个子文章来实现数据增强,这样将获得更多的数据。

生成对抗网络

GAN是深度学习领域中最令人兴奋的最新进展之一,它们通常用来生成新的图像,但它的一些方法或许也可以适用于文本数据。

预训练模型

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

预先训练的词向量

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

预先训练的句子向量

我们可以将模型的输入从单词更改为句子,这样我们可以使用较少的模型,其中参数数量较少,仍然具有足够的表达能力。为了做到这一点,我们可以使用预先训练好的句子编码器,如Facebook的InferSent或谷歌的通用句子编码器。我们还可以使用跳过思维向量或语言模型等方法训练未标记数据的句子编码器。

预先训练的语言模型

最近的论文如ULMFIT、Open-AI变换器和BERT通过在非常大的语料库中预训练语言模型,为许多NLP任务获得了惊人的结果。语言模型是使用前面的单词预测句子中的下一个单词的任务。对我来说,这种预训练并没有真正帮助获得更好的结果,但文章已经展示了一些方法来帮助我更好地微调,我还没有尝试过。 

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

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

推荐阅读:【NLP's ImageNet moment has arrived】http://ruder.io/nlp-imagenet/


欢迎加入深度学习、机器学习技术研讨群!

745224003

欢迎关注我们的微信公众号:baihuaML,白话机器学习

关注知乎“会写代码的好厨师”

参考文献

【1】手把手教你数据不足时如何做深度学习NLP - 阿里云官方博客的个人空间 - 开源中国

【2】数据增强初探 - 混沌战神阿瑞斯 - 博客园

【3】NLP数据增强方法 - Adupanfei的博客 - CSDN博客

【4】【技术综述】 一文道尽深度学习中的数据增强方法(上)

上一篇下一篇

猜你喜欢

热点阅读