在构建一个系统时,正确率达到90%左右,下一步提高正确率有很多方式;机器学习策略可以使我们更高效地往正确的方向前进。
正交化
拿控制汽车运动的例子来说:
控制汽车运动有两方面因素,一个是方向–方向盘;一个是速度–油门和刹车。
建立直角坐标系,X轴和Y轴分别为方向和速度。
正交化即在此情况下(两者调整互不干扰),调整两者大小以得到自己想要的运动状态。
对于机器学习系统,根据四个部分的表现(一般和人类水平比较),有:
若在训练集上表现不好—-进行调整(更大网络,换算法例如Adam等);
若在验证集上表现不好—-在不影响上者的情况下改进(更大验证集合);
若在测试集上表现不好—-在不影响其他的情况下改进(更大测试集合);
若在实际中变现不好——在不影响其他的情况下改进(改变验证集或低价函数)
Tip:一般不用 early stopping :会影响对训练集的拟合;但也改善验证集。不正交化(同时影响两件事)
单一数字评估指标
如果有一个数字评估指标,在构建机器学习系统时,它会告诉我们新尝试的手段比之前的好还是坏。
拿分类器举例说明:
评估需要同时考虑查准率和查全率,一眼不易看出哪个算法更好(一般同时有好几个算法),所以需要单个数字作为评估指标。(一般是计算平均值)
在此例子中:
验证集+单一实数 进行评估指标,迭代会很快。
实际应用开发时,我们不能只考虑准确度,还应该考虑运行时间。让运行时间尽可能短,准确度尽可能高,在这中间找一个平衡点。
一般有:goal = 准确度 - 0.5*运行时间
Tip:应该在满足运行时间(某个阈值)情况下最大限度提高准确度。(N个指标,最优化一个,N-1个满足条件)
划分训练集/验证集/测试集
这一点在前面已经详细讲过,这里做一点补充。
1)要确保验证集和测试集符合同一分布:
A.将采集的数据混合,随机选取一部分作为验证集,一部分作为测试集。
B.选择数据集要能够反映未来的数据。
2)拿打靶举例,验证集和测试集是逼近靶心,训练集加快逼近。
什么时间更改验证集/测试集和指标合适
算法 A 评估指标好,但在实际中效果不好;算法 B 评估指标不好,但在实际中效果好。这时候该更改指标或验证/测试集。
步骤:
1)弄清楚如何定义一个指标来衡量你想做的事情的表现—-》设定目标
2)分开讨论如何改善系统在这个指标上的表现——》命中目标
实际中,应该先设立一个指标,并进行工作,过程中发现这个不好或想到更好的立即更换并继续。
理解人类水平表现
人类水平误差约等于贝叶斯误差所能达到的最小误差。
人类水平误差根据目标选择较高/低误差。
实际应用:对人类水平的大概估计—》估计贝叶斯误差—》更快做出决定—》减少偏差/方差
可避免偏差:
A:偏差;B,D:方差;C:可避免偏差
对于1:还有很大改进空间,可采取一些措施。
对于2 :差值很小,一般不需要再改进。
超越人类水平表现
接近人类水平时,进步会越来越慢。
在自然感知方面(图像,语言,语音,医疗等)超越人类较难。
改进模型表现
1.在训练集中拟合较好—-》可避免偏差
2.在验证/测试集中表现较好—》方差
两个方面,正交化改进表现。
具体如下:
进行误差分析
举例:猫分类器将狗分成猫
同时评估其他因素,例如狗被识别为猫;猫科类动物被识别为猫;图片模糊等,制作一个表格,统计这些情况,然后判断应该去处理哪一个。
总结:在集合中找出错误的例子,统计各个情况的错误数量,分析应该降低哪些误差。
修正错误标注的样本
深度学习算法对于训练集中的随机错误是相当鲁棒的(鲁棒–健壮,外界变化下维持性能),但对于系统性(例如一直把白色狗分类为猫)的错误就不鲁棒了。
标记出错对于判断哪个算法更好有较大的影响。
修正:
不管用什么办法,都要:
1)要同时作用到验证集和测试集(确保同一分布)。
2)同时检验算法检测正确和错误的例子。
3)修正后训练集和验证/测试集可能来自稍微不同的分布。
快速搭建系统并迭代
1)快速设立验证/测试集以及指标,开始训练。(快速建立初始系统,不要太复杂也不要太简单)
2)使用方差/偏差或误差分析去评估下一步方向。
另:若该领域/问题有很多解决办法(论文等),直接拿来实现并改善。
在不同分布上的训练和验证/测试集
例子1:猫分类器
假设200000个来自网页的猫图片;10000个来自用户自己拍的;总共210000个。
1)随机分配到训练集,验证/测试集。(训练集 205000个,验证集2500个,测试集2500个)
好处:来自同一分布
坏处:若验证集中大部分是来自网页的,而目的是处理用户上传的,并没有瞄准目标。
2)因为目的是处理用户上传的,所以训练集205000个(来自网页200000和用户拍的5000个),验证集5000个来自用户拍的,测试集5000个来自用户拍的。
一般使用第二种方法。
例子2:语音识别
有整理的500000段录音和20000段累积的用户的口令。
可分为训练集500000段录音加10000段口令,验证集和测试集分别5000段口令。
不匹配数据分布的偏差和方差
训练集和验证集来自不同分布。
假设人类误差为0%,当训练集误差和验证集误差相差较大(例如9%),则有两方面原因:算法没见到验证集的数据(即方差有问题);验证集数据不一样(即数据不匹配)。
解决办法:
定义新集合:训练-验证集:和训练集相同分布,但不用于训练。
则:
若
误差分析总结
对于数据不匹配问题:现在并没有系统性的解决办法。
做误差分析—》找出不同—》搜集更多数据—》人工合成数据
人工合成数据是一个办法,但是容易对小样本过拟合。
迁移学习
从一个任务中学习知识,并把这些知识应用到另一个独立的任务中。
假设已训练好图像识别:
若将其用于识别 X光片,则只需去掉最后一层,并为去掉之后的最后一层重新赋予随机权重,然后利用X光片训练集进行训练。(也可以在最后多加几层,视情况需要)
微调:预先初始化,在X光片上进行训练,更新权重。
低层次的特征(边缘检测等)已经学到,可以帮助X光片训练更快。
适用于:(从任务A迁移到任务B)
1)任务A和任务B有相同的输入X
2)任务A数据比任务B多得多才有意义
3)任务A低层次特征可以帮助到任务B
多任务学习
同时做多个任务,其中某个任务可以帮助到其他任务。
举例:自动驾驶
对于即时采集的图像,有行人/车子/交通灯/指示牌则为1,否则为0;则有
有些样本有标记,有些没有,也可以适用。(对没有标记的(例如树木等无关的),忽略不计入)
适用场合:
1)训练的数据可以共用低层次特征
2)每个任务的数据量很接近(最起码满足Am的数据量小于其他m-1个数据量的和)
3)可以训练一个足够大的神经网络;能够很好的工作
多任务学习使用频率小于迁移学习。
端到端的深度学习
一个学习系统需要多个阶段的处理,端到端即忽略这些不同的阶段,用一个神经网络代替它。
例子:语音识别
但是端到端方法得需要大量数据才可以表现的好。
优缺点:
1)让数据说话,减少人类成见的干扰。
2)所需手工设计的组件更少。
3)需要大量数据。
4)排除了可能有用的手工设计的组件。