第三门课-结构化机器学习项目 第二周(重点总结)


注:图片来自网络

第二周:机器学习策略(2)(ML Strategy (2))

2.1 误差分析 (Carrying out error analysis)

错误分析: 如果你希望让学习算法能够胜任人类能做的任务,但你的学习算法还没有达到人类的表现,那么人工检查一下你的算法犯的错误也许可以让你了解接下来应该做什么。
简单的人工统计步骤,错误分析,可以节省大量时间,可以迅速决定什么是最重要的,或者最有希望的方向

找一组错误样本,可能在你的开发集里或者测试集里,观察错误标记的样本,看看假阳性(false positives)和假阴性(false negatives),统计属于不同错误类型的错误数量。通过统计不同错误标记类型占总数的百分比,可以帮你发现哪些问题需要优先解决,或者给你构思新优化方向的灵感。
优先解决哪个问题取决于其百分比,添加这些数据的容易程度以及您要考虑团队认为它会有多大帮助
在这里插入图片描述

2.2 清除标注错误的数据(Cleaning up incorrectly labeled data)

如果你发现你的数据有一些标记错误的样本,你该怎么办?
训练集:
浏览一下训练集,检查一下错误的标签,并修正它们也没什么害处。有时候修正这些错误是有价值的,有时候放着不管也可以,只要总数据集总足够大,实际错误率可能不会太高。
算法随机错误或近似随机错误对深度学习影响不大,系统性的错误影响较大。

开发集和测试集:
在错误分析时,添加一个额外的列,统计标签y=1错误的样本数
在这里插入图片描述
如果这些标记错误严重影响了你在开发集上评估算法的能力,那么就应该去花时间修正错误的标签。但是,如果它们没有严重影响到你用开发集评估成本偏差的能力,那么可能就不应该花宝贵的时间去处理。
建议:①不管用什么修正手段,都要同时作用到开发集和测试集上,因为开发和测试集必须来自相同的分布。②同时检验算法判断正确和判断错误的样本③修正训练集中的标签其实相对没那么重要,因为训练集很大,训练集来自稍微不同的分布是可以的。

2.3 快速搭建你的第一个系统,并进行迭代(Build your first system quickly, then iterate)

建立初始系统的意义: 它可以是一个快速和粗糙的实现(quick and dirty implementation),让你确定偏差方差的范围,就可以知道下一步应该优先做什么,让你能够进行错误分析,可以观察一些错误,然后想出所有能走的方向,哪些是实际上最有希望的方向。

当这个领域有很多可以借鉴的学术文献时,那么可以从现有大量学术文献为基础出发,一开始就搭建比较复杂的系统。

2.4 在不同的分布上的训练集和测试集 (Training and testing on different distributions)

训练集:其他来源的海量数据(+部分真正关心的数据)
开发集和测试集(同一分布):剩下的真正关心的数据

2.5 数据分布不匹配的偏差与方差分析 (Bias and Variance with mismatched data distributions)

从训练误差到开发误差,有两件事变了:①算法只见过训练集数据,没见过开发集数据。②开发集数据来自不同的分布。
当训练误差和开发误差相差较大时,难以判断是哪个因素起主导作用。
解决方法:
随机打散训练集,然后分出一部分训练集作为训练-开发集(training-dev)(不用于训练)
训练集和训练-开发集来自同一分布,而开发集和测试集来自同一分布。

训练集误差 1% 1% 10% 10%
训练-开发集误差 9% 1.5% 11% 11%
开发集误差 10% 10% 12% 20%
训练集误差 方差问题 数据不匹配问题 可避免方差问题 可避免方差和数据匹配问题

根据这些错误率之间差距有多大,你可以大概知道,可避免偏差、方差数据不匹配问题各自有多大。
对于测试集:由于开发集和测试集来自同一分布,如果算法在开发集上做的很好,比测试集好得多,那么你就可能对开发集过拟合了。如果是这种情况,那么你可能要往回退一步,然后收集更多开发集数据。
在这里插入图片描述

2.6 处理数据不匹配问题(Addressing data mismatch)

当训练集和开发集测试集来自不同的分布,如何处理数据不匹配还没有完全系统的解决方案,但我们可以看看一些可以尝试的事情。
从开发集入手:
开发集有可能跟训练集不同或者更难识别,那么可以①尝试把训练数据变得更像开发集一点②收集更多类似你的开发集和测试集的数据
①尝试收集更多和真正重要的场合相似的数据,这通常有助于解决很多问题。
②让训练数据更接近你的开发集:一种技术是人工合成数据(artificial data synthesis)(要注意对背景噪声的过拟合)

2.7 迁移学习 (Transfer learning)

迁移学习:也许你已经训练好一个神经网络,能够识别像猫这样的对象,然后使用那些知识,或者部分习得的知识去帮助您更好地阅读x射线扫描图。
假设你已经训练好一个图像识别神经网络,然后让它适应或者说迁移,在不同任务中学到的知识(比如放射科诊断),你可以做的是把神经网络最后的输出层删掉,然后为最后一层重新赋予随机权重,然后让它在放射诊断数据上训练。
在这里插入图片描述
具体来说,在第一阶段训练过程中,当你进行图像识别任务训练时,你可以训练神经网络的所有常用参数,所有的权重,所有的层,然后你就得到了一个能够做图像识别预测的网络。在训练了这个神经网络后,要实现迁移学习,你现在要做的是,把数据集换成新的(x,y)对,现在这些变成放射科图像,而是你想要预测的诊断,你要做的是初始化最后一层的权重,让我们称之为W[L]和b[L]随机初始化
如果你有一个小数据集,就只训练输出层前的最后一层,或者也许是最后一两层。但是如果你有很多数据,那么也许你可以重新训练网络中的所有参数
那么这个在图像识别数据的初期训练阶段,有时称为预训练(pre-training),因为你在用图像识别数据去预先初始化,或者预训练神经网络的权重。然后,如果你以后更新所有权重,然后在放射科数据上训练,有时这个过程叫微调(fine tuning)
在这里插入图片描述
迁移学习有意义: 如果你想从任务A迁移一些知识到任务B,①当A任务和B任务都有同样的输入时②当任务A的数据比任务B多得多时(你希望提高任务B的性能,因为任务B每个数据更有价值)③当任务A的低层次特征,可以帮助任务B的学习时

2.8 多任务学习(Multi-task learning)

迁移学习 中,你的步骤是串行的,你从任务A里学习只是然后迁移到任务B。
多任务学习 中,你是同时开始学习的,试图让单个神经网络同时做几件事情,然后希望这里每个任务都能帮到其他所有任务。
例如,同时检测行人、车辆、停车标志,还有交通灯。
在这里插入图片描述
此时每个样本的输出y(i)是一个4×1的列向量,输出矩阵Y的维度为4×m。
此时的损失函数:
在这里插入图片描述
此时的代价函数:
在这里插入图片描述
你现在做的是建立单个神经网络,观察每张图,然后解决四个问题,系统试图告诉你,每张图里面有没有这四个物体。另外你也可以训练四个不同的神经网络,而不是训练一个网络做四件事情。但神经网络一些早期特征,在识别不同物体时都会用到,然后你发现,训练一个神经网络做四件事情会比训练四个完全独立的神经网络分别做四件事性能要更好,这就是多任务学习的力量。
同时做多个任务时,有时一些图像只有一小部分标签,其他是问号。那么你就只对带0和1标签的值求和,忽略问号项,这样只对有标签的值求和。
在这里插入图片描述
多任务学习的意义:
1.当你训练的一组任务,可以共用低层次特征 时。
2.(这个准则没有那么绝对)如果你要完成100个任务,而你要做多任务学习,尝试同时识别100种不同类型的物体。你可能会发现,每个任务大概有1000个样本。所以如果你专注加强单个任务的性能,比如我们专注加强第100个任务的表现,我们用A100表示,如果你试图单独去做这个最后的任务,你只有1000个样本去训练这个任务,这是100项任务之一,而通过在其他99项任务的训练,这些加起来可以一共有99000个样本,这可能大幅提升算法性能,可以提供很多知识来增强这个任务的性能。
如果你专注于单项任务,如果想要从多任务学习得到很大性能提升,那么其他任务加起来必须要有比单个任务大得多的数据量,这样其他任务的知识才能帮你改善这个任务的性能。
3.当你可以训练一个足够大 的神经网络时,可以同时做好所有的工作,比单独训练神经网络来单独完成各个任务性能要更好。

多任务学习的替代方法是为每个任务训练一个单独的神经网络。多任务学习会降低性能的唯一情况,和训练单个神经网络相比性能更低的情况就是你的神经网络还不够大。
多任务学习的使用频率要低于迁移学习。两者都是强力工具。
(例外,在物体检测中,我们看到更多使用多任务学习的应用,其中一个神经网络尝试检测一大堆物体,比分别训练不同的神经网络检测物体更好。)

2.9 什么是端到端的深度学习? (What is end-to-end deep learning?)

以前有一些数据处理系统或者学习系统,它们需要多个阶段的处理。那么端到端深度学习就是忽略所有这些不同的阶段,用单个神经网络代替它。
端到端深度学习的挑战之一是,你可能需要大量数据才能让系统表现良好
解决方法:子问题分割

2.10 是否使用端到端的深度学习方法 (Whether to use end-to-end deep learning)

优点:
1.如果你有足够多的数据,那么不管从x到y最适合的函数映射是什么,直接从x到输入y去训练的神经网络可能更能够捕获数据中的任何统计信息,而不是被迫引入人类的成见。
2.所需手工设计的组件更少,简化设计工作流程

缺点:
1.需要大量的数据
2.排除了可能有用的手工设计组件。精心设计的人工组件可能非常有用,也有可能真的伤害到你的算法表现,但往往好处更多,手工设计的组件往往在训练集更小的时候帮助更大。

关键: 有没有足够的数据能够直接学到从x映射到y足够复杂的函数
纯粹的端到端深度学习方法,其实前景不如更复杂的多步方法。因为目前能收集到的数据,还有我们现在训练神经网络的能力是有局限的。

发布了1 篇原创文章 · 获赞 0 · 访问量 287

猜你喜欢

转载自blog.csdn.net/qq_35024702/article/details/104882516