利用机器学习策略改善深度神经网络
技交部 潘震宇
一、 进行误差分析
首先,咱们以上图为例。假设咱们今天又开发一个猫咪辨别器,目前的准确率是90%,错误率为10%,这离我们目标可差的老远了。所以,我们必须得想个法子来改善它。
在初期,人工辨别误差原因并不会让人感到low,与其花费大量的时间在迷雾中探路,还不如潜下心来造一个小电筒,至少能让我们避免踏入深渊。
回到例子中,由于已知错误率高达10%,那我们就得好好研究一下误差点在哪了。随便抽出几张错误辨识的图片,我们可以看到这俩张都是特别像猫咪的小狗。估计有人会说,哎!这简单!既然是在猫狗之间辨别出的问题,那我们训练一个更多狗狗照片的模型不就可以了吗?
别急,没这么简单呢。目前咱们只是获取了俩张图片,发现都是狗狗。但出错集如果有100张,而其中狗狗的图片只占了5%,那尽管你花费了大量的时间去训练出了一个对狗狗识别高的模型,但最高也就减少了0.5%的错误率。划算吗?当然不划算啦。
假如是100张错误集中有50张狗狗的图片,那经过改善后,错误率能从10%减小到5%,这或许是一个值得做的方法。但如果是很小的比例,那确实不值得去做。
我们应该去找寻一个能够提升最快的方向,把精力都花在刀刃上~因此,我们可以随意的做出一张分析表(如下图):
在此图中,最左一列为错误集中每一张图片,而右侧各列则表示你认为可能存在错误的方向,假设为狗狗,其他猫科动物、模糊图片、滤镜效果。紧接着,花费一定的时间,挨个去看每一张图片,并且做记录,在相应的位置上打勾,最后统计每一个改善方向的占比。
或许做这个表不能够让你很快的去改善你的模型,但是却能够带着你直接去走捷径,而不是花费时间去那些就算做完善了也改变不了多少的事情。
二、标注错误的数据
因为暂时咱们学习的都是监督式学习,数据集中必须存在一个y集合,而在误差分析中,我们发现了自己的数据集中,有小部分图片的标签打错了,例如下图中的白色小狗狗。
那么,这算不算是很关键的错误呢?其实并不一定,首先对于人工神经网络的学习来说,训练集的随机性错误并不会产生很大影响,只要训练集够大,错误够随机,那么一切都不是问题。
但是问题却来了,有没有必要对错误标记的图片进行更改呢?这个就要涉及到上部分所说的占比分析了。
如图所示,我们可以在右侧列添加一列因素为“标记不正确“,经过全局计算,这一项的错误占比为6%,而此模型开发集的错误率为10%,也就是说,标记错误在只占全部数据集的0.6%,就算我们挨个去修改,最后错误率最低也就9.4%,这是非常不值得的。
而假如开发集错误率被我们降到为2%,那么,标记错误占比为0.6%,其他错误占比为1.4%,从这个角度来看,这时候,修改数据集成为了我们为提高正确率的最好选择。
假设现在我们确定要去修改数据集中的标签,这里还存在一个问题。在之前我们曾提到,开发集与测试集只有来自于同一分布,才能够取得好效果,那咱们在错误修改的时候,就不能仅仅修改开发集中的错误,也必须得修改测试集中的。这样才能保证俩者之间的关系。
三、快速开发你的第一个系统,并且进行迭代
在开发新的应用时,或许我们会考虑很多东西,例如应该利用什么什么结构呀,集怎么划分啦,怎么处理噪声啦,等等等等,但是,对于我们这种初入门的新手来说,特别推荐的一个方法就是——快速开发。
快速的划分出训练集、开发集及测试集,做一个初始系统模型、并且直接跑数据,得出偏差和方差后通过之前学习到的方法进行优化处理,利用误差分析,进行修改及完善。
为什么我们要这样做呢,是因为对初学者目前的开发来说,自己所遇到的困难,大部分都是已经有人解决或许还发表了论文了的。那我们的目的不是建立一个全新的系统,而是建立一个效果更好的系统,为此,快速的开发第一个系统,并且迭代更新,才是我们初学者的选择。
四、在不同划分上进行训练并测试
数据集的划分,相比大家已经不陌生了,从曾经的622,到如今的982,又或者大家各有各自特别喜欢的比例。但这些都是针对同一分布的数据来说。假如不同分布呢?我们又该怎么去划分训练、开发、测试集呢。
如上图所示,假设我们正在开发一款app,用户上传猫咪照片,app返还结果。目前,我们已经得到了用户上传的约2万张不太清晰,模糊的图片,而利用爬虫爬去了网上高清的、拍摄角度专业的照片20万张。
有俩种分布的数据。我们应该怎么办呢?
1、 将俩部分的数据融为一体,再随机洗牌打乱,接着按常规比例划分
此方法理论说挺不错,但对于实际运用却不好,因为俩种分布的数据集量的大小差距太大,在划分后,我们如果训练,那么大部分的时间都会花在高清图上,而对于真正的目标(用户上传的图)却没做多少改进,因此此方法放弃。
2、 将二十万张网络爬去出来的图片全部放在训练集中,而将俩万张用户图,分50%作为开发集,50%作为测试集。(因为我们曾提过,开发集便是我们设立的靶点)这样就能够很好的瞄准咱们的目标进行迭代优化。
五、不匹配数据划分的偏差和方差
针对来自于不同分布的训练集,开发/测试集来说,计算偏差和方差方法不同。
开发集中数据来自不同分布的数据集。
模型只学习过训练集,而没有学习过开发集。
建立一个训练开发集,从训练集当中选择,但是不用于学习。
将模型在训练集、训练开发集、开发集上运行,得到准确率。
若训练集误差为1%,训练开发集误差为9%,开发集误差为10%
·模型在训练集和训练开发集上误差差距大,表示了模型没有识别出没学习过的数据,表示模型方差大。
·模型在训练开发集和开发集上误差差距不大,表示模型误差的差距不是由于数据分布不一样导致的。
若训练集误差为1%,训练开发集误差为1.5%,开发集误差为10%
·模型在训练集和训练开发集上误差差距不大,表示模型本身方差不大
·模型在训练开发集和开发集上误差差距很大,表示模型差距主要是由于数据不匹配。
六、定位数据不匹配
训练集和开发/测试集分别来自不同的分布,并且误差分析的结果表面有一个数据不匹配的问题,这个问题没有标准的解决方法,但是我们可以尝试一些我们可以做的一些事情。
·做误差分析,了解训练集和开发/测试集的具体差异
·人为的加工训练集(人工合成语音/图片),使其和开发/测试集更加的贴近,或者收集更多的类似与开发/测试集的数据。
·任何重复的噪音部分,容易造成模型对它的过拟合,最好不要总是重复噪音数,而是收集等长的数据,学习效果会更好。
·当用人工合成数据时,一定要记住可能人工合成的数据可能只是从所有可能性的空间中选取了很小的一部分去模拟。
七、迁移学习
何为迁移学习,如上图所示,一个本来是用于图像识别的模型,将最后一层输出层去掉以后,随机赋值最后一层w和b,并且把输入x和对应标签集y换了以后就可以用来作为放射科诊断模型。
而此图则表示一个语音识别模型,可以用来作为另一套识别系统。
在这俩种模型中,都有着几个重要的特点
1、 任务A和B都有着同样的输入x
例如第一个例子中都是输入图片文件
第二个例子中则都是输入音频文件
2、 你必须有着更多的数据在任务中,相对于B任务来说。
因为假如你在原本任务中的数据量还不如之后任务B的数据量,那相对而言,你能够提供的已经学习了的特征就不是那么的明显。
3、 A中特征为低层次特征,会更有益于学习B。
特征层次低,在对B的迭代中才能更好的将学习到的东西融入到新东西里。
才不容易造成紊乱的状况。
八、多任务学习
如上图所示,在无人驾驶技术中,物体检测是一个必须的模块。假如上图为一个输入的x,我们要检测出图片当中有无人、车、停车牌、红绿灯。
在输入图片后,得到输出列向量y,一个4维向量。
那这个网络结构就应该如上图所示。
在经过多隐层的计算后最终输出四个结果,y1,y2,y3,y4。分别代表着各类物体是否存在。
而损失函数则为上图中的y^(i)。
那么,多任务学习究竟有什么好处呢?它和迁移学习又有啥关系呢?
·
假设上图所示,对于A任务,需要分出100种物体,每种物体的数据只有1000份,如果针对每一项去进行辨别学习搭建模型,那么效果肯定会很差,但是如果采用多任务学习,就能够将99000份之前的数据进行学习,类似与迁移学习一样,将大批量的低层次特征获得后可以增强A100的学习效果。达到少量数据,高识别率的效果。
但是多任务学习最好是用在大规模的网络模型中,因为在小规模网络里,有时候学习效果反而会变得更差。从而达不到多任务学习的目的。
九、什么是端到端的深度学习
在于传统机器学习的领域中,对于每种任务通常都是采用分解为很多的小步骤。例如对于语音识别来说,传统方式为:
先通过mfcc,将各类特征提取出来,并且通过音位进行组合,转换为单词,再将单词拼接。
而如今的深度学习呢,则是直接输入一段音频,输出对应文本。中间的过程完全省略,自动的去寻找了一个x到y的映射函数。如下图所示:
这就是端到端的含义。
但也不代表端到端一定比传统分步机器学习的效果好,因为在数据集少量的情况下,传统机器学习的效果是真的很好,而深度学习则没那么理想,但是一旦数据集大量存在,对应的学习效果也会非常明显。
除上述情况外,在一些应用方面,通常也不会直接采用端到端的深度学习。例如公司的面部识别系统。
在此系统中,现实中的人们不是通过输入监控图像,输出是否为员工,而是转换为了俩步来实现。
第一步是将监控图像当中的面部给捕捉到,放大居中。
第二步才是判断是否为公司内部员工。
这是为什么呢?其实,这也是由于数据集的原因,在俩步方法中,俩种情况的对应数据集获取都非常的容易,并且实现起来也不难。但如果是直接端到端,那么监控获取图像和人的id这个数据键值对就非常难取得大量的数据。相比较而言,就采用了分步实现。
十、是否要使用端到端的深度学习
端对端的深度学习方法的特点有如下:
优点:
·让数据说话,能够无限制的让机器自己去寻找特征,规律来做数据翻译。而不是像传统机器学习一般的通过人为设计的例如音位这样的东西所束缚。
缺点:
·会需要大量的数据作为学习基础。
·会排除许多有用的人为设计的好的方法/模型。当数据量不够多时,一些人工设计出的模型会更好的提高准确率和效果。
选择是否使用端到端的深度学习方法的关键是 你是否拥有足够多的能够让你的机器学习出x到y的映射?
例如无人驾驶技术,在雷达识别的时候或许会采用端到端的方法,但是到了轨迹控制这一块,则采用更有效的算法进行处理。
毕竟,通过输入图像,来输出方向盘转多少度,油门压力多大,刹车压力多大的这些数据在目前看来还是不太显示,毕竟无法获得足够的数据来进行学习。
因此,端到端不是无敌的存在,它依据的是数据量。而有时候,我们需要的是,将二者结合起来,才能达到最好的效果。