吴恩达网课笔记1——机器学习策略

改善系统模型有很多方法,但怎样才能确保不浪费时间在对系统性能作用不大或无作用的方法上?怎样找到正确的改良方法?

  1. 正交化
  2. 单一数字评估标准
  3. 满足指标以及优化指标
  4. Train/Dev/Test 集合划分
  5. 设定基准
  6. 降低偏差/方差
  7. 误差分析
  8. 迁移学习
  9. 多任务学习
  10. 端到端的学习方法

收集更多数据、创建更多样化的训练集(不同姿势、不同方向、更多反例..)、优化算法、更深或更小的网络、使用dropout/L2正则化、修改网络架构(激活函数、隐藏单元数量...)...

但如果做出了错误的选择,可能只会浪费时间,而对结果没有丝毫的优化。

正交化:每个维度只控制一个变量的变化,且多个维度互不干扰;要弄好一个监督学习系统,通常需要调整系统的旋钮。

确保4件事:(1)Fit training set well on cost function. 可以训练更大的网络,或可以切换到更好的优化算法。(2)Fit dev set well on cost function. 增大训练集(3)Fit test set well on cost function. 更大的验证集——验证集结果不错,测试集不行,可能对验证集过拟合(4)Performs well in real world. 改变验证集或损失函数——要么验证集分布设置不正确,要么损失函数测量指标不对。

Early stopping会 影响对训练集的拟合 以及 改善验证集的表现,不够正交

单一数字评估标准(Single number evaluation metric)

出现多个评估标准(如查准率、查全率),在两者出现分歧时,很难中和如何选择。此时可以将两者结合(如F1,查准率P和查全率R的调和平均数)

满足和优化指标Satisfing and optimizing metrics

有时把所有顾及的指标组合成单一数字指标并不容易,而设立Satisfing and optimizing指标很重要(如准确率(Optimizing)、运行时间(Satisfing)),将运行时间和准确率组合成一个整体评估指标,或满足运行时间要求最大限度提高准确率。

有时需要考虑N个指标,从中选择一个指标作为优化指标是合理的,所以尽量优化那个指标,剩下N-1个指标都是满足指标。

Train/Dev/Test set划分

Dev/Test集尽量来自同一分布:将(不同分布的)所有数据随机洗牌,放入验证集和测试集。设立的验证集和测试集能够反映未来会得到的数据,设立了验证集和评估指标,就定义了要瞄准的目标,训练集的设立会影响你逼近那个目标有多快。

1e2-1e4:70/30,60/20/20

1e6以上 :98/1/1

机器学习任务:1. 设立目标,2. 瞄准和设计目标,优化系统来提高指标评分。

如果收集到的数据与实际应用中能够获取的数据不是同一分布,且收集到的与实际应用中同一分布的数据远小于整体数据集,如何划分训练集/验证集/测试集?

如,训练时收集的图片均来自高清图像,而在应用中用户上传的是低分辨率图片。得到的数据集中高清图像200k,低分辨率图像10k。划分方法:

(1) 将所有图像随机划分数据集,好处:训练集/测试集/验证集均来自同一分布,更好管理,坏处:得到的训练结果并不是你真正关心的数据分布。

(2) 训练集:高清200k+低分辨率5k,验证集/测试集:低分辨率2.5k。好处:现在瞄准的目标就是想要处理的目标,也是真正关心的图片分布。坏处:训练集、验证集、测试集并不是来自同一分布。但如此处理,在长期能带来更好的性能。

什么时候改变dev/test和指标

1. 评估指标无法正确评估好算法的排名——当前指标结果更佳的分类器触及更低的容忍度(如分类错误率更低却将色情图片当作当前分类进行发布)。修改:将评估指标加上权重(赋予色情图片更高的权重)

2. 在测试集、开发集或训练集分布中指标表现很好,但实际应用中,真正关注的地方并不好(如,使用高清图像进行训练、测试,但用户上传的是低像素图片)。

人的表现

贝叶斯错误率:无法超越的最佳错误率

定义人类水平错误率时,要弄清楚你的目标所在,如果要表明你可以超越单个人类(1%),那么就有理由在某些场合部署你的系统;但若想替代贝叶斯错误率,那么定义(经验丰富的团队-0.5%)才合适。

定义你的目标所在,可以在训练结果出来后针对性调整系统模型(如,训练错误率8%,验证错误率10%;目标错误率7%,则可避免偏差为1%,方差2%,接下来需要做的是降低方差,试试正则化;若目标错误率为1%,则重点放在降低偏差上,可以训练更大的网络,或跑久一点梯度下降)。

减少可避免偏差:使用规模更大的模型、使用更好的优化算法、寻找更好的新神经网络架构,或更好的参数(激活函数、网络层数、隐藏单元数)、使用其他模型/架构。

降低方差:收集更多数据、正则化(L2正则化/dropout)、使用不同的神经网络架构、 超参数搜索。

 误差分析

使用错误分析可以分辨出当前系统使用预定的改进方法是否会带来更佳的性能,或花费在该方法上的时间是否合理(如猫分类器错误率为10%,其中包含将狗分类错误的情况,此时准备就狗分类进行改进)。

做法:首先,收集若干(如100个)错误标记的验证集样本,手动检查其中正确标记为狗的样本数量。若仅5%是狗,则即便解决了狗分类问题,最多将错误率降低到9.5%;若有50%为狗,解决后可降低到5%,如此可以确定花费时间是否合适。例中的9.5%与5%为改善算法性能上限

在一次误差分析中可以评估多个想法(如,猫科动物、模糊图片)。

(1) 错误标记的样本

训练集:深度学习算法对随机误差(错误标记出现时随机的)很健壮,但对系统性的错误(总是将有共同特征的图片错误标记)就没那么健壮了。

验证集/测试集:同样进行误差分析,得到错误标记样本的比例,判断是否值得去改进。

(2) 错误标记样本的修正:

在修正验证集时采用的方法同时作用于测试集,因为两者必须是相同的分布;

同时检验算法判断正确的样本和判断错误的样本;

是否将同样的方法作用于训练集可以考虑,因为训练集要大得多。

偏差、方差与数据不匹配问题

如果训练集与验证集来自同一分布,则系统结果的方差和偏差哪个更需要进行优化一目了然,但如果两者并不是同一分布,该如何判断?

训练集与验证集不是同一分布,则方差有两个来源

① 算法只见过训练集数据,没有见过验证集数据

② 验证集数据来自不同分布

为了搞清哪个因素影响更大,定义以组新的数据(训练-验证集),来自随机抽取的训练集,同时在训练时,不会让算法在训练-验证集上跑。此时的误差分析,需要看训练集、训练-验证集以及验证集上的误差。

如:(1)训练集误差1%,训练-验证集9%,验证集10%。此时即可说明,算法确实存在方差问题。(2)训练误差1%,训练-验证1.5%,验证10%。则说明,方差已经很小了,更多的是因为数据不匹配的问题。(3)训练误差10%,训练-验证11%,验证12%。高偏差。(4)训练误差10%,训练-验证11%,验证20%。可避免偏差高,且(方差小,数据不匹配问题很大)。

Human level & Training error 衡量偏差大小;Training error & Training-dev error 衡量方差大小;Training-dev error & Dev/Test error 衡量数据不匹配问题的大小

如何处理数据不匹配问题:

① 把训练数据变得更像验证集:人工合成数据(有可能从所有可能性的空间只选了很小的一部分去模拟数据),在使用时避免整合的数据过为单一,防止训练发生过拟合;

② 收集更多类似验证集和测试集的数据。

迁移学习:神经网络从一个任务中习得知识,并将这些知识应用到另一个独立的任务中。(将网络的输入换成需要迁移到的任务中,同时将最后一两层权重‘新的任务的数据集较小’随机赋值 或 重新训练剩下的所有层,这种训练是在原先任务迭代后得到的网络继续进行,可能通过之前习得的知识继续对当前数据集发挥作用)。

迁移学习起作用的场合:

① 两个任务有相同类型的输入;

② 在迁移来源问题中有很多数据,但迁移目标问题没有那么多数据;

③ 从来源问题习得的低层次特征可能对目标问题有用。

多任务学习:(多用于计算机视觉、物体检测)同时开始学习,试图让单个神经网络同时做几件事情,然后希望这里每个任务都能帮到其他任务。(如:从一个图像中识别多个物体。神经网络的早期特征,在识别不同物体时都会用到,以至于训练一个神经网络做4件事情比训练4个完全独立的神经网络分别做4件事情性能更好

多任务学习的适用场景:

① 训练的一组任务可以公用低层次特征;

② 每个任务的数据量很接近(不一定对);当你专注于单项任务时,若想得到很大性能提升,那么其他任务加起来必须要有比这个任务大很多的数据量;即,如果对于单个任务你已经有1000个样本了,那么对于所有其他任务,最后有超过1000个样本,这样其他任务的知识才能帮你改善这个任务的性能;

③ 足够大的神经网络;多任务学习会降低性能的唯一情况,和训练单一神经网络下相比性能更低的情况就是神经网络不够大。

端到端以前有一些数据处理系统或学习系统,它们需要多个阶段的处理,端到端的深度学习就是忽略这些阶段,用单个神经网络代替它。这个神经网络包括了所有的信息处理(如,音频,包括特征提取、找到音位、串联音位等,该网络输入一段音频,直接输出听写文本)。

好处:

① 可能更能够捕获数据中的任何统计信息,而不是被迫引入人类的成见;(如,音频需要找到音位,而音位可能并不是原本存在的,更可能时被创造出来的)

② 所需手工设计的组建更少。

缺点:

① 需要大量数据才能让系统表现良好;要直接学习x->y的映射,可能需要大量的(x,y)数据。

② 排除了可能有用的手工设计组件。如果你没有很多数据,你的学习算法就没办法从很小的训练集数据中获得洞察力。

在考虑使用端到端深度学习时,先考虑是否有足够的数据能够直接学到从x->y的足够复杂的函数。

猜你喜欢

转载自www.cnblogs.com/fanzhongjie/p/11248023.html
今日推荐