3.结构化机器学习项目 第二周 ML策略2
2.1 进行误差分析
误差分析:如果希望让学习算法能够胜任人类能做的任务,但学习算法还没有达到人类的表现。那么,需要人工检查一下算法所犯的错误,也许可以知道接下来该如何是好。
根据能够达到的性能上限,判断Idea是否值得继续。评估某个想法是否值得解决。
有时在做误差分析时,也可以同时并行评估几个想法。
看各个错误类型所占的百分百,以及出错的原因,看是否值得去处理每个不同的错误类型。比如,因为模糊的原因导致的错误,那么可能就需要进行去模糊了。比如,是否使用了滤镜。of total 能看最多可以取得多少的性能提升。用这种误差分析方法挑出高优先级的任务,并了解每种手段对性能有多大提升空间。
上图最左边人工过一遍想分析的图像集,如想观察100张图片,对于要评估的想法放在右边,同时要有comments.
总之,进行误差分析,需要找一些错误例子,可能在dev set,观察错误标记的例子,统计不同错误类型的错误数量。在这个过程中,可能会得到启发,归纳出新的误差类型。
通过统计不同错误标记类型占总数的百分比,可以发现哪些问题需要优先解决,或者give you 构思新优化方向的灵感。
2.2 清楚标注错误的数据
Y出错。是否值得花时间修正这些标签呢?可能是人不小心标错了。
训练集:
如果数据足够大,放着这些错误标签不管也是没有问题的。因为深度学习算法对随机误差很鲁棒。但是值得注意的是,对系统性的错误就不会鲁棒了。所谓系统性的错误,比如,做标记的人一直故意标错。
那如果是在dev set 和 test set 中标记出错,该怎么办呢?
如果担心dev set or test set标记出错的例子带来的影响,一般建议在做误差分析时,额外增加一列:incorrectly labeled.
考察100个标记出错的例子(分类器的输出和dev set的标签不一致,可能是打错标签了,而不是分类器出错)的影响,
是否值得修正这incorrectly labeled 6%的误差呢?
建议:如果这些标记错误严重影响了在dev set上评估算法的能力,那么就应该花时间修正incorrect labels,如果没有影响到用dev set评估成本偏差的能力,就别处理了。
10%的6%是0.6%。评估标记出错对算法影响的百分比,
当确定要修正标签后,还有一些要注意的方针。
如,因为dev set和test set必须来自同一分布,所以要检查时,要同时检查两项。
再比如,同时检查算法正确和wrong的例子。检查算法出错的例子很容易,只需要看看那些例子是否需要修正。但是有可能有些例子没有判断对,也要修正。
if you only fix ones that your algorithms got wrong,那么对算法偏差估计可能会变大。
上图第二点(判断错误+判断正确,正确可能是因为算法运气好导致的,这让人无语啊)很难做到,通常不会这么做。如果分类器很准确,那么判断错的次数要比判断正确的次数要少很多。
修正标签,对train set,相对没有那么重要。很可能只决定修正dev and test set中的标签。因为,通常要比training set 小很多。
2.3 快速搭建你的第一个系统,并进行迭代
想搭建全新的机器学习程序,就要快速搭建好第一个系统,然后开始迭代。
快速建立dev/test set还有metric 指标。(决定目标所在,如果目标定错了,之后改也是可以的,但一定要设立某个目标)
然后,搭好一个机器学习系统原型。然后,找到training set,训练一下,在dev和test set,看评估指标表现如何。
当建好第一个系统后,可以用到之前说的bias/variance analysis,error analysis,来确定下一步优化做什么。
2.4 在不同的划分上进行训练并测试
在当今,dev and test set来自于不同的分布是很常见的一件事情。
这里也有一些方法应对训练集和测试集存在差异的情况。
不同分布
变成同一个分布
将其混合,重新划分train/dev/test set,这样分布一样,便于更好的管理。但坏处是,dev set(2500个样本),其中有很多图片来自网络,并不是真正关心的数据分布。真正要处理的是来自手机的图片。
要记住,设立开发集的目的是告诉团队要瞄准的目标,而瞄准的方式,而大部分精力用在了优化从网络上下载的图片。这不是期望的,这是在针对不同于实际关心的数据分布去优化啊。* Option 1:Pass*
而对于Option 2,training set全部来自网络,可能还会加入一部分手机相片。而dev set 和test set全部来自手机相片。
Option 2的好处是:dev set是真正关心的图片分布。试图搭建系统在处理手机上传图片分布时效果良好,可以有更好的系统性能。
Option 2的缺点:training set和dev set以及test set分布并不一样。
2.5 不匹配数据划分的偏差和方差
是不是要把所有收集的数据都用掉,it is not always yes。本段视频是一个反例。
估计学习算法的偏差和方差可以帮助确定接下来要优先做的方向。但是,当训练集来自和dev set和test set不同的分布时,分析偏差和方差的方式可能不一样。
如果dev data来自与training set相同的分布,那么这里有很大的方差问题。算法不能很好的从训练集出发进行泛化,在training set上很好,但处理dev set时效果很差了。
但是如果,训练数据和dev data来自不同的分布,就不能这样下结论了。特别是,也许算法在开发集上做的不错,可能因为training set都是高分辨率图片,而dev set包含更难精确分类的图片。
分析的两个角度:
One:算法没看到开发集中的数据(问题方差)
Two:开发集数据来自不同的分布
当同时改变这两件事时,很难确定这增加的9%误差的来源。为了弄清楚哪个影响更大,定义一组新的数据是有意义的。称为训练-开发集,这是一个新的数据子集,应该从训练集的分布里挖出来,但是不会用来训练网络。
上图,dev set和test set来自同一分布,而training set来自不同分布。要做的是:
随机打散training sets,然后,随机分出一部分training sets 作为 the training-dev set。不会在training-dev set上跑后向传播。
可以看出,是方差问题。
数据不匹配问题
bias问题
avoidable bias error大,方差问题小,但data mismatch问题大。
dev set过拟合,可能需要更大的dev set data。要记住,dev set和test set来自同一个分布。
如果有时候dev/test set分布要更加容易的话,那么可能
即,
2.6 定位数据不匹配
并没有特别系统的方法去解决data mismatch的问题,但可以try,可能会有帮助。
One:亲自做误差分析,尝试了解训练集和dev/test set的具体差异。To avoid overfitting the test set, 要做误差分析。要去看dev set,而不是test set。这里要了解dev set误差的性质,是因为car noise还是因为其他,如很难识别街道号。
Two:如果发现噪声是引起误差的来源,那么可以模拟车辆噪声的数据。如果是因为难以识别街道号,那么可以有意识地收集更多说数字的音频数据,加入训练集中。
如果想让数据相似,可以用的方法是人工合成数据。
如音频合成
通过人工数据合成,可以快速制造更多的训练数据。
人工数据合成的潜在问题:
学习算法对这1小时汽车噪音过拟合。只用了噪声的很小子集来合成数据。话有1000小时。这就叫从所有可能性的空间中只选了很小一部分去模拟数据。
总之,做误差分析,了解training set和 dev set的数据分布到底有什么不同,看看是否有办法收集更多看起来像dev set的数据做训练。一种方法是人工数据合成。
以下是如何从多种类型的数据中同时学习的方法。
2.7 迁移学习:多任务的串行学习,从task A中学到知识,迁移到task B中。
深度学习最强大的理念之一:
神经网络可以从一个任务中习得知识,然后将这些知识应用于另一个独立的任务中。如,从识别猫狗到识别X射线扫描图。图像识别到放射科的诊断。
要实现迁移学习,要做的就是把数据集换成新的x,y对。
用别人的参数、修改后的network和我们自己的数据,再进行训练,使得参数适应我们的数据,这样一个过程,通常称之为微调(fine tuning).
随机初始化最后一层的权重,在这个新数据集上重新训练网络。这是针对小数据。
如果数据大,重新训练网络的all参数。
pre-training(预训练网络weights) 和 fine-tuning。
input 图片 output 图片
input 音频 output 音频
2.8 多任务学习(并行)
同时开始学习的,试图让单个神经网络同时做多件事情。
并且希望这里每个任务都能帮到其他所有任务。(提供更多的知识)
99000的数据量提供了能力,对1000数据量的任务也是有帮助的。
现在可以做的就是train一个神经网络,来预测这些值。是四维的。
为训练这个神经网络,首先要做的就是定义神经网络的损失函数,
上图用的是logistic regress loss,和softmax regression不同,softmax把单个标签分配给单个样本。而这张图可以有很多不同的标签,并不是说每张图都只是一张行人图片。
要知道每张图片中究竟有啥(人,车,停车标志或交通灯),所以不是只给图片一个标签,而是需要遍历不同类型,查看每种类型的物体有没有出现在图中。
这里叫做多任务学习,mult-task learning。建议单个神经网络,观察每张图,然后解决4个问题。
另外,也可以训练四个不同的神经网络,而不是训练一个网络做四件事情。
多任务学习可以处理图像只有部分物体被标记的情况,方法是loss只对有标签的求和。
算loss只对有标签的相加,忽略?等不确定的数。
什么时候多任务学习有意义呢?
One:公用底层特征。
Two:每个任务的数据量很接近(不是那么对哦)。
如果专注于单项任务,想要从多任务学习中得到很大的性能提升,那么,其他任务加起来,必须要有比单个任务大得多的数据量。这就叫做:用其他任务的知识帮助改善本任务的性能。
Tree:网络足够大
多任务学习会降低性能的唯一情况(campared to training separate neural networks):神经网络还不够大。
如果可以训练一个足够大的神经网络,那么多任务学习肯定不会,或者说很少会降低性能。
我们的希望就是:用多任务的网络比单独训练的神经网络来单独完成各个任务性能要更好。
在实践中,multi-task learning的使用频率要低于transfer learning.Object detection是个例外。频率低的原因可能是因为很难找到那么多相似且数据量对等的任务可以用单一神经网络训练。
2.9 什么是端到端的深度学习
大的数据量能够让端到端学习发出耀眼光芒,否则用中间件or传统流水线方法也是不错的。
人脸识别之一步就位,端到端:数据不够
两步法
两步法更好的原因:
解决的两个问题,每个问题实际上要简单的多。两个子任务的训练数据都很多。
2.10 是否要使用端到端的深度学习
端到端学习的优缺点:
好处:
One:真的只让数据说话。
Two:需要手工设计的组件少,可简化设计工作的流程。
缺点:
One:可能需要大量的数据。
Two:排除了所有可能有用的手工设计组件。精心设计的人工组件可能非常有用,但也可能起反作用(如音位:c a t)。
手工设计的组件往往在训练集更小的时候帮助更大。
到底要不要应用端到端学习的方法呢?
complexity:复杂性