部分内容引用自CSDN和知乎
1.什么是数据增强
数据增强包含一系列用来生成新训练样本的技术,这些技术是通过对原始数据采用随机抖动和扰乱而类标签未变化来实现。我们应用数据增强的目标是增加模型的泛化性。鉴于我们的网络持续不断看到新的、稍微修改过的输入数据点,它能够学习更多鲁棒性。在测试时,我们不会应用数据增强来评估我们训练过的网络。在大多数情况下,你将看到测试准确性的提高,仅以轻微降低训练准确性为代价。
图1:左: 一个250个样本数据点严格服从正态分布。右: 添加了一些随机扰乱到此分布。这种数据增强能增加我们网络的泛化性。
让我们先考虑图1左图的均值为零、方差为1的标准正态分布。在这个数据上训练一个机器学习模型可能导致我们严格模型化那个分布。当然,在实际应用中,数据很少会服从如此整齐的分布。
相反,为了增加我们的分类器的泛化性,我们可能先沿着分布通过添加一些来自于随机分布的值来随机化扰动点(右图)。我们的图一直服从一个近似的正态分布,但是它和左图相比,不是一个完美的分布。一个依赖这个数据训练的模型,对于那些不被包含在训练集中的样本数据点更具有泛化性。
数据增强也叫数据扩增,意思是在不实质性的增加数据的情况下,让有限的数据产生等价于更多数据的价值。
比如上图,第1列是原图,后面3列是对第1列作一些随机的裁剪、旋转操作得来。
每张图对于网络来说都是不同的输入,加上原图就将数据扩充到原来的10倍。假如我们输入网络的图片的分辨率大小是256×256,若采用随机裁剪成224×224的方式,那么一张图最多可以产生32×32张不同的图,数据量扩充将近1000倍。虽然许多的图相似度太高,实际的效果并不等价,但仅仅是这样简单的一个操作,效果已经非凡了。
如果再辅助其他的数据增强方法,将获得更好的多样性,这就是数据增强的本质。
数据增强可以分为,有监督的数据增强和无监督的数据增强方法。其中有监督的数据增强又可以分为单样本数据增强和多样本数据增强方法,无监督的数据增强分为生成新的数据和学习增强策略两个方向。
2.有监督的数据增强
有监督数据增强,即采用预设的数据变换规则,在已有数据的基础上进行数据的扩增,包含单样本数据增强和多样本数据增强,其中单样本又包括几何操作类,颜色变换类。2.1. 单样本数据增强所谓单样本数据增强,即增强一个样本的时候,全部围绕着该样本本身进行操作,包括几何变换类,颜色变换类等。
(1) 几何变换类几何变换类即对图像进行几何变换,包括翻转,旋转,裁剪,变形,缩放等各类操作,下面展示其中的若干个操作。
①水平翻转和垂直翻转
②水平翻转和垂直翻转
翻转操作和旋转操作,对于那些对方向不敏感的任务,比如图像分类,都是很常见的操作,在caffe等框架中翻转对应的就是mirror操作。翻转和旋转不改变图像的大小,而裁剪会改变图像的大小。通常在训练的时候会采用随机裁剪的方法,在测试的时候选择裁剪中间部分或者不裁剪。值得注意的是,在一些竞赛中进行模型测试时,一般都是裁剪输入的多个版本然后将结果进行融合,对预测的改进效果非常明显。以上操作都不会产生失真,而缩放变形则是失真的。很多的时候,网络的训练输入大小是固定的,但是数据集中的图像却大小不一,此时就可以选择上面的裁剪成固定大小输入或者缩放到网络的输入大小的方案,后者就会产生失真,通常效果比前者差。
(2) 颜色变换类
上面的几何变换类操作,没有改变图像本身的内容,它可能是选择了图像的一部分或者对像素进行了重分布。如果要改变图像本身的内容,就属于颜色变换类的数据增强了,常见的包括**噪声、模糊、颜色变换、擦除、填充等等。
基于噪声的数据增强就是在原来的图片的基础上,随机叠加一些噪声,最常见的做法就是[高斯噪声]更复杂一点的就是在面积大小可选定、位置随机的矩形区域上丢弃像素产生黑色矩形块,从而产生一些彩色噪声,以Coarse Dropout方法为代表,甚至还可以对图片上随机选取一块区域并擦除图像信息。
2.2. 多样本数据增强
不同于单样本数据增强,多样本数据增强方法利用多个样本来产生新的样本,下面介绍几种方法。
(1) SMOTE[1]
SMOTE即Synthetic Minority Over-sampling Technique方法,它是通过人工合成新样本来处理样本不平衡问题,从而提升分类器。
类不平衡现象是很常见的,它指的是数据集中各类别数量不近似相等。如果样本类别之间相差很大,会影响分类器的分类效果。假设小样本数据数量极少,如仅占总体的1%,则即使小样本被错误地全部识别为大样本,在经验风险最小化策略下的分类器识别准确率仍能达到99%,但由于没有学习到小样本的特征,实际分类效果就会很差。
SMOTE方法是基于插值的方法,它可以为小样本类合成新的样本,主要流程为:
第一步:定义好特征空间,将每个样本对应到特征空间中的某一点,根据样本不平衡比例确定好一个采样倍率N;
第二步:对每一个小样本类样本(x,y),按欧氏距离找出K个最近邻样本,从中随机选取一个样本点,假设选择的近邻点为(xn,yn)。在特征空间中样本点与最近邻样本点的连线段上随机选取一点作为新样本点,满足以下公式:
第三步:重复以上的步骤,直到大、小样本数量平衡。
2) SamplePairing[2]
SamplePairing方法的原理非常简单,从训练集中随机抽取两张图片分别经过基础数据增强操作(如随机翻转等)处理后经像素以取平均值的形式叠加合成一个新的样本,标签为原样本标签中的一种。这两张图片甚至不限制为同一类别,这种方法对于医学图像比较有效。
经SamplePairing处理后可使训练集的规模从N扩增到N×N。实验结果表明,因SamplePairing数据增强操作可能引入不同标签的训练样本,导致在各数据集上使用SamplePairing训练的误差明显增加,而在验证集上误差则有较大幅度降低。尽管SamplePairing思路简单,性能上提升效果可观,符合奥卡姆剃刀原理,但遗憾的是可解释性不强。
3.增强后的训练、验证
假设我们想用训练一个模型用以猫狗图像分类,训练集来自与kaggle。共有两类(cats, dogs),25000张猫狗照片,猫和狗各12500张
假设训练集出现意料之外的损坏导致只有5000个样本且两类别的数量不平衡了(这一步我们可以通过采样模拟),我们仅有4568张cats,432张dogs。很明显这样的数据集是不平衡的,上文我们讨论了该问题很容易使得模型对小样本(dogs)失效。因此我们需要使用数据增强手段(翻转,旋转,裁剪,变形,缩放等)扩充小样本(dogs)至900张。当然并没有严格规定必须相等,只是最理想情况下相等的样本对模型效果最优。
数据增强后,两类样本平衡,各4568张,总共9136张。(如果有强迫症的同学可以把两类都增强为整数)然后我们将这9136张打乱顺序,使样本独立且随机分布。我们在此使用k交叉验证,关于k交叉验证的详细介绍可以参考:N折交叉验证的作用(如何使用交叉验证)https://zhuanlan.zhihu.com/p/96200651。实验中我们取k=5,那么就是要将所有的样本划分成5份(当然本例中5组不可能数目完全相等,最后一组取剩下的就好),即1827+1827+1827+1827+1828。
接下来我们开始训练,因为我们把样本划分成了5折,所以每个epoch里总共要训练五次,每一次里有四组做训练集,剩下一组做验证集。五次之后每组都做过一次验证集、四次训练集。训练模型可以用CNN,毕竟CNN可以很好的胜任分类任务,损失函数按照普通的CNN进行就可,训练过程仍然是损失函数更新网络权重,这点无需赘述。
我们关注的重点仍然是交叉验证,交叉验证最关键的作用是进行模型选择,也可以称为超参数选择,以为我们上面的CNN需要调超参数,普通情况下是根据经验设置,但是在交叉验证中我们可以交给验证集来判断,即哪个模型(超参组合)在验证集上表现最好,我们就选择哪一组。也就是说我们需要在训练集和验证集上对多种模型选择(超参数选择)进行验证,选出平均误差最小的模型(超参数)。
这个过程可以手动设置,但这里(强烈)推荐使用网格搜索(GridSearchCV, https://www.cnblogs.com/wj-1314/p/10422159.html)和随机搜索(Random Search, https://zhuanlan.zhihu.com/p/26964683)。
(1)网格搜索:在所有候选的参数选择中,通过循环遍历,尝试每一种可能性,表现最好的参数就是最终的结果。其原理就像是在数组里找到最大值。这种方法的主要缺点是比较耗时.所以网格搜索适用于三四个(或者更少)的超参数(当超参数的数量增长时,网格搜索的计算复杂度会呈现指数增长,这时候则使用随机搜索),用户列出一个较小的超参数值域,这些超参数至于的笛卡尔积(排列组合)为一组组超参数。网格搜索算法使用每组超参数训练模型并挑选验证集误差最小的超参数组合。
(2)随机搜索:与网格搜索相比,随机搜索并未尝试所有参数值,而是从指定的分布中采样固定数量的参数设置。它的理论依据是,如果随即样本点集足够大,那么也可以找到全局的最大或最小值,或它们的近似值。具体操作就是在超参调中将验证集用于测试,对于每一轮迭代,我们用随机搜索来调超参,直到满足迭代次数或其他停止条件被满足(比如模型已经达到了我们设置的理想accuracy等)。
使用上述方法搜索后,我们将表现最好参数应用于模型,并将把验证集加到模型中生成对剩余数据集最优的模型(训练集和验证集相加即我们可以用于训练的样本总和),然后再用测试集测试其泛化能力。这样即使剩余数据集处于某种原因丢失,我们也可以用已知的样本通过增强和验证的手段最大限度提高模型的泛化能力。
4.模型测试、评价
http://www.cnblogs.com/fengfenggirl/p/classification_evaluate.html
模型测试完之后得到测试集上的预测结果,我们需要根据一定的指标评估模型的能力,例如正确率。正确率虽然是一个很好很直观的评价指标,但是有时候正确率高并不能代表一个算法就好。比如某个地区某天地震的预测,假设我们有一堆的特征作为地震分类的属性,类别只有两个:0:不发生地震、1:发生地震。一个不加思考的分类器,对每一个测试用例都将类别划分为0,那那么它就可能达到99%的正确率,但真的地震来临时,这个分类器毫无察觉,这个分类带来的损失是巨大的。为什么99%的正确率的分类器却不是我们想要的,因为这里数据分布不均衡,类别1的数据太少,完全错分类别1依然可以达到很高的正确率却忽视了我们关注的东西。接下来详细介绍一下分类算法的评价指标。
评价指标
1、几个常用的术语
这里首先介绍几个常见的模型评价术语,现在假设我们的分类目标只有两类,计为正例(positive)和负例(negtive)分别是:
1)True positives(TP): 被正确地划分为正例的个数,即实际为正例且被分类器划分为正例的实例数(样本数);
2)False positives(FP): 被错误地划分为正例的个数,即实际为负例但被分类器划分为正例的实例数;
3)False negatives(FN):被错误地划分为负例的个数,即实际为正例但被分类器划分为负例的实例数;
4)True negatives(TN): 被正确地划分为负例的个数,即实际为负例且被分类器划分为负例的实例数。
上图是这四个术语的混淆矩阵,我只知道FP叫伪阳率,其他的怎么称呼就不详了。注意P=TP+FN表示实际为正例的样本个数,我曾经误以为实际为正例的样本数应该为TP+FP,这里只要记住True、False描述的是分类器是否判断正确,Positive、Negative是分类器的分类结果。如果正例计为1、负例计为-1,即positive=1、negtive=-1,用1表示True,-1表示False,那么实际的类标=TFPN,TF为true或false,PN为positive或negtive。例如True positives(TP)的实际类标=11=1为正例,False positives(FP)的实际类标=(-1)1=-1为负例,False negatives(FN)的实际类标=(-1)(-1)=1为正例,True negatives(TN)的实际类标=1*(-1)=-1为负例。
2、评价指标
1)正确率(accuracy)
正确率是我们最常见的评价指标,accuracy = (TP+TN)/(P+N),这个很容易理解,就是被分对的样本数除以所有的样本数,通常来说,正确率越高,分类器越好;
2)错误率(error rate)
错误率则与正确率相反,描述被分类器错分的比例,error rate = (FP+FN)/(P+N),对某一个实例来说,分对与分错是互斥事件,所以accuracy =1 - error rate;
3)灵敏度(sensitive)
sensitive = TP/P,表示的是所有正例中被分对的比例,衡量了分类器对正例的识别能力;
4)特效度(specificity)
specificity = TN/N,表示的是所有负例中被分对的比例,衡量了分类器对负例的识别能力;
5)精度(precision)
精度是精确性的度量,表示被分为正例的示例中实际为正例的比例,precision=TP/(TP+FP);
6)召回率(recall)
召回率是覆盖面的度量,度量有多个正例被分为正例,recall=TP/(TP+FN)=TP/P=sensitive,可以看到召回率与灵敏度是一样的。
7)其他评价指标
计算速度:分类器训练和预测需要的时间;
鲁棒性:处理缺失值和异常值的能力;
可扩展性:处理大数据集的能力;
可解释性:分类器的预测标准的可理解性,像决策树产生的规则就是很容易理解的,而神经网络的一堆参数就不好理解,我们只好把它看成一个黑盒子。
对于某个具体的分类器而言,我们不可能同时提高所有上面介绍的指标,当然,如果一个分类器能正确分对所有的实例,那么各项指标都已经达到最优,但这样的分类器往往不存在。比如我们开头说的地震预测,没有谁能准确预测地震的发生,但我们能容忍一定程度的误报,假设1000次预测中,有5次预测为发现地震,其中一次真的发生了地震,而其他4次为误报,那么正确率从原来的999/1000=99.9%下降到996/1000=99.6,但召回率从0/1=0%上升为1/1=100%,这样虽然谎报了几次地震,但真的地震来临时,我们没有错过,这样的分类器才是我们想要的,在一定正确率的前提下,我们要求分类器的召回率尽可能的高。
所以,具体使用哪个或哪些指标评价模型,并非固定的,必须要根据模型的目标需求和实际场景进行考虑。所以本例如果是单纯的猫狗分类,我们可以仅关注accuracy。如果是应用到其他特殊场景中,那就要视情况而论了。