深度学习学习笔记(三)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本篇博客内容主要是深度学习课程中的结构化机器学习项目的学习笔记


提示:以下是本篇文章正文内容,下面案例可供参考

一、机器学习策略

1.1 为什么是ML策略

当你开发了一个机器学习的系统,你需要进行相应的优化调试,来改善你的系统,此时,你会有许多的想法,比如收集更多的数据,调解神经网络的参数,dropout,L2正则化等等。

那么如何去选取一个有效的改善方式是值得我们学习的。

1.2 正交化

我们希望能够有方法,使得它只调节其中某个性质。
类似的
如果你的算法在成本函数上不能很好地拟合训练集,你可能可以训练更大的网络,或者可以切换到更好的优化算法,比如Adam优化算法。
如果发现算法对开发集的拟合很差,可以考虑正则化,dropout。

补充如果它在测试集上做得很好,但无法给你的猫图片应用用户提供良好的体验,这意味着你需要回去,改变开发集或成本函数。因为如果根据某个成本函数,系统在测试集上做的很好,但它无法反映你的算法在现实世界中的表现,这意味着要么你的开发集分布设置不正确,要么你的成本函数测量的指标不对

1.3 单一数字评估指标

查准率的定义是在你的分类器标记为猫的例子中,有多少真的是猫。
查全率就是,对于所有真猫的图片,你的分类器正确识别出了多少百分比。

结合查准率和查全率的指标F1
在这里插入图片描述
通过单一数字评估指标能够非常好的提高你的效率。

1.4 满足和优化指标

一般而言,找到一个能够有效评估所有需要考虑的值的单实数评估指标有时并不容易。所以我们需要考虑设立满足和优化指标。
通过定义优化和满足指标,就可以给你提供一个明确的方式,去选择“最好的”分类器。比如对于优化目标为时间和准确度,你可以将准确度设为优化指标,而令时间为满足指标,即在时间小于某个值时,最大化准确度。

更一般地说,如果你要考虑个指标,有时候选择其中一个指标做为优化指标是合理的。所以你想尽量优化那个指标,然后剩下个指标都是满足指标,意味着只要它们达到一定阈值。

总结来说,如果你需要顾及多个指标,比如说,有一个优化指标,你想尽可能优化的,然后还有一个或多个满足指标,需要满足的,需要达到一定的门槛。

1.5 训练/开发/测试集划分

补充 开发(dev)集也叫做开发集(development set),有时称为保留交叉验证集
开发集和测试集来自同一分布

对于小样本,数据的划分按照经验法即70/30 或者60/20/20分法是比较合理的。
对于大样本,比如一百万条数据,那么可以98/1/1来划分。

补充 测试集的目的是完成系统开发之后,测试集可以帮你评估投产系统的性能。方针就是,令你的测试集足够大,能够以高置信度评估系统整体性能。

1.6 更改开发集指标

在某些情况下,A的error误差小,但会发生某些非常严重的错误,B的error误差大,但不会发生这些严重的错误。
此时我们可以考虑进行加权,来惩罚这些严重错误,以此来得到相应的评估比如
在这里插入图片描述
一般而言,对于机器学习问题,我们第一步就是找到一个好的评估指标,然后才是后续的优化等步骤。

或者在代价函数中添加上权重或许还需要进行归一化该常数
在这里插入图片描述
如何定义J并不重要,关键在于正交化的思路,将定义指标看成一步,然后在定义了指标之后,你才能想如何优化系统来提高这个指标评分。比如改变你神经网络要优化的成本函数J。

补充
如果你在指标上表现很好,在当前开发集或者开发集和测试集分布中表现很好,但你的实际应用程序,你真正关注的地方表现不好,那么就需要修改指标或者你的开发测试集。

1.7 可避免偏差

随着时间的推移,当您继续训练算法时,可能模型越来越大,数据越来越多,但是性能无法超过某个理论上限,这就是所谓的贝叶斯最优错误率(Bayes optimal error)。

一般而言对于未超过人类的机器学习算法,我们有许多的优化方法和工具,但是对于超过了人类的机器学习算法,此时,工具就没那么好用了。

我们考虑可避免偏差与方差如下
在这里插入图片描述

人的表现
但是如果您的目标是替代贝叶斯错误率,那么这个定义(经验丰富的医生团队——0.5%)才合适。
在这里插入图片描述

1.8 改善你的算法表现

在这里插入图片描述

二、机器学习策略(2)

2.1 误差分析

对于优化的方向,我们可以考虑使用误差分析来进行相应得探索。
比如,我们收集100个错误标记的开发集样本,然后手动检查。
并列出如下表(猫分类器例子)
在这里插入图片描述我们可以发现,其中针对模糊图像的优化方向更值得去尝试,应为他能够获得61%的替身。同样,你也可以在手动过程中,发现新的错误标记可能。

总结
进行错误分析,你应该找一组错误样本,可能在你的开发集里或者测试集里,观察错误标记的样本,看看假阳性(false positives)和假阴性(false negatives),统计属于不同错误类型的错误数量。
通过统计不同错误标记类型占总数的百分比,可以帮你发现哪些问题需要优先解决,或者给你构思新优化方向的灵感。

2.2 错误标记

一般而言,事实证明,深度学习算法对于训练集中的随机错误是相当健壮的。

补充:深度学习算法对随机误差很健壮,但对系统性的错误就没那么健壮了。系统性错误即对于某个类型的错误一直犯错。

但对于开发集,我们考虑如下方法
在这里插入图片描述我们对于之前的误差分析表格添加一列,针对于标记出错的样本,如果这些标记错误严重影响了你在开发集上评估算法的能力,那么就应该去花时间修正错误的标签。但是,如果它们没有严重影响到你用开发集评估成本偏差的能力,那么可能就不应该花宝贵的时间去处理。

比如下面这个例子
在这里插入图片描述

补充:如果你要去修正开发集数据,手动重新检查标签,并尝试修正一些标签,你需要同时对于测试集也这样做。 其次
要考虑同时检验算法判断正确和判断错误的样本,因为算法有可能因为运气好把某个东西判断对了。

2.3 快速搭建系统,并进行迭代

在这里插入图片描述
搭建快速而粗糙的实现,然后用它做偏差/方差分析,用它做错误分析,然后用分析结果确定下一步优先要做的方向。

补充
不过如果你在这个应用程序领域有很多经验,这个建议适用程度要低一些。还有一种情况适应程度更低,当这个领域有很多可以借鉴的学术文献,处理的问题和你要解决的几乎完全相同

2.4 使用来自不同分布的数据,进行训练和测试

一般而言,我们考虑如下方式设立训练集、开发集和测试集
在这里插入图片描述即将一部分开发集和测试集的数据加入到训练集中,剩余的数据作为开发集和测试集的数据。

通过这样的方式来使得你的训练集数据来自和开发集、测试集不同的分布,但这样你就可以有更多的训练数据。在这些样本中,这将改善你的学习算法。

2.5 数据分布不匹配时的偏差于方差分析

我们要做的是随机打散训练集,然后分出一部分训练集作为训练-开发集(training-dev),就像开发集和测试集来自同一分布,训练集、训练-开发集也来自同一分布。

通过对于训练-开发集的测试,来得到我们的误差分析的结论,即到底是方差问题还是数据不匹配的问题。
在这里插入图片描述上图说明,训练数据其实比你的开发集和测试集难识别得多。
在这里插入图片描述一般而言,之前的数据已经足够让你有着调整的方向,但更多的数据可以让你发现更多的特征,比如这里比较这两个数字(General speech recognition Human level 4%和rearview mirror speech data 6%),告诉我们对于人类来说,后视镜的语音数据实际上比一般语音识别更难,因为人类都有6%的错误,而不是4%的错误

其中上述两个数据通过以下方式得到
1.让一些人自己标记他们的后视镜语音识别数据,看看人类在这个任务里能做多好
2.收集一些后视镜语音识别数据,把它放在训练集中,让神经网络去学习,然后测量那个数据子集上的错误率

2.6 处理数据不匹配问题

如果您的训练集来自和开发测试集不同的分布,如果错误分析显示你有一个数据不匹配的问题该怎么办?
一般而言,我们需要进行错误分析,去了解训练集和开发测试集的具体差异。
比如对于下面这个例子,你可能会发现很多开发集样本噪音很多,有很多汽车噪音,这是你的开发集和训练集差异之一,那么此时你就需要将训练数据变得更像开发数据一些,或者收集更多类似开发集和测试集的数据。比如录制了大量清晰的音频,不带车辆背景噪音的音频,然后合成数据。

对于收集更多数据,我们可以使用人工合成数据这一技术。通过人工数据合成,你可以快速制造更多的训练数据。但同样有个问题,有可能你从所有可能性的空间只选了很小一部分去模拟数据,这回导致你的神经网络对这些数据过拟合。比如上述例子,你如果只用了1000小时的噪音,然后重复组成100000的数据,那你的神经网络就会对噪音过拟合。

2.7 迁移学习

在深度学习中,神经网络能够从一个任务中习得知识,并将该知识应用到另一个独立的任务中。

一般而言,如果你有一个足够多的数据,那么可以重新训练网络中的所有参数,如果你只有一个小的数据集,那么久只训练输出层前的最后一层。

在这里插入图片描述

当然,有时你可以布置加入一个新的节点,也可以加入多个节点甚至多个层。

那么什么时候迁移学习是有意义的呢?

如果你想从任务A学习并迁移一些知识到任务B,那么当任务A和任务B都有同样的输入时,迁移学习是有意义的.
当你希望提高任务的B的性能时,我们通常需要任务A的数据量大得多才有帮助。
或者,如果你觉得任务A的低层次的特征,可以帮助任务B的学习,那么迁移学习同样有意义。

2.8 多任务学习

在多任务学习中,你是同时开始学习的,试图让单个神经网络同时做几件事情,然后希望这里每个任务都能帮到其他所有任务。
比如下面这个例子
在这里插入图片描述在这里插入图片描述当以下情况时,多任务学习时有意义的:

第一,如果你训练的一组任务,可以共用低层次特征。

第二,如果想要从多任务学习得到很大性能提升,那么其他任务加起来必须要有比单个任务大得多的数据量。即要么每个任务中的数据量很相近,要么其中某个任务的数据量非常大。

第三,你能够训练一个非常大的神经网络。

2.9 端到端深度学习

什么是端到端深度学习?
以前有一些数据处理系统或者学习系统,它们需要多个阶段的处理。那么端到端深度学习就是忽略所有这些不同的阶段,用单个神经网络代替它。

端到端深度学习的挑战之一是,你可能需要大量数据才能让系统表现良好。

比如门禁系统
研究人员发现,比起一步到位,一步学习,把这个问题分解成两个更简单的步骤。首先,是弄清楚脸在哪里。第二步是看着脸,弄清楚这是谁。
为什么两步法更好呢?实际上有两个原因。一是,你解决的两个问题,每个问题实际上要简单得多。但第二,两个子任务的训练数据都很多。而一步到位的数据对(X,Y)则少得多。

端到端深度学习的好处:
1.首先端到端学习真的只是让数据说话。而不是被迫引入人类的成见。
2.所需手工设计的组件更少,所以这也许能够简化你的设计工作流程,你不需要花太多时间去手工设计功能,手工设计这些中间表示方式。

缺点:
1.它可能需要大量的数据。
2.它排除了可能有用的手工设计组件。

是否决定使用端到端深度学习?
关键的问题是,你有足够的数据能够直接学到从映射到足够复杂的函数。

补充 如果每个图片中只有一个可能性:停止标志、减速带、人行横道、红绿灯,那么SoftMax将是一个很好的选择。由于不是这种情况,所以不能使用Softmax 激活函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值